Repository navigation
Conversation
dynamical.org publishes ML-shaped weather Zarr with no published path into a training loop, and pointing the README quickstart at one fails three ways before a byte moves: the stores are Icechunk rather than plain Zarr, `variables=` stops being optional at 25 to 146 arrays per store, and the quickstart's `block_chunks=16` is sized to a 63 MiB chunk where NOAA GFS analysis has a 6.87 GiB one. The task is spatial downscaling of surface solar irradiance over a European window, with bilinear upsampling as the model-free baseline. It reads one variable because the geometry prices the second one at another 13.7 GiB of residency, and the example says so rather than picking a small store that would have hidden it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016eLANSQjFGbLQprE7LbyTJ
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds
examples/dynamical/— spatial downscaling of surface solar irradiance ondynamical.org's public NOAA GFS analysis, an Icechunk repository whose
stored chunk holds 1440 consecutive hourly global fields. It is the deep-chunk end of the
example set: one fetch and one decode serve 1440 samples, where a per-sample
__getitem__wouldre-read the same object every time.
It exists because pointing the README quickstart at one of these archives fails three ways
before a byte moves, and none of them raise:
obstore_store()is the wrong constructorvariables=stops being optional at 25–146 arrays per store (andsample_axis=then raiseson the 1-D coordinate arrays)
block_chunks=16is sized to a 63 MiB chunk; NOAA GFS analysis has a6.87 GiB one, and three variables at those defaults asks
print_summary()for 860 GiBof estimated peak — which it truthfully reports
The example reads one variable on purpose. A stored chunk is 878.9 MiB and assembles to
6.87 GiB resident; the floor is two blocks of them, so each variable costs ~13.7 GiB whatever the
batch size, and a shrinking
chunk_transformcannot buy it back (slot_charge_bytestakesmax(source tiles, assembled output), because the pool holds the source tiles until the fillcompletes — so a
Coarsen(4)leaves residency unchanged and raises peak). Picking a smallerstore would have hidden the one thing this geometry is here to teach.
Task is downscaling over a European window; baseline is bilinear upsampling — what the coarse
field gives you with no model, and a data fingerprint besides, since its RMSE depends only on the
bytes the loader handed over. Follows the
microscopy/shape:data.pyframework-neutral,train_torch.pythe only framework file, offline synthetic--sourceso it runs with no networkor credentials.
Docs,
examples/README.mdand a CHANGELOG bullet included. No engine code is touched — this isexamples, tests and docs only.
For reviewers
Most valuable second look:
slot_charge_bytesratherthan measuring a shrinking transform's peak RSS directly; the
describe()numbers agree withthe reading, but the arithmetic is worth a check.
region_index()— the European window wraps the prime meridian, so it returns wrappingcolumn indices rather than a slice.
test_region_crop_wraps_the_prime_meridianasserts exactlyone discontinuity; a plain slice would silently take the long way round the globe.
deterministic function of the smooth field, so the CNN beats bilinear by construction, which is
what makes the test fast and deterministic. That is stated in the docstring rather than implied.
Confident in: the geometry assertions, and that the real-archive path runs (log below).
Verification
All green locally on this branch:
uv run ruff check src tests bench examples✅uv run ruff format --check src tests bench examples✅uv run mypy src bench examples✅uv run pytest -q→ 673 passed, 9 skipped ✅uv run --extra docs mkdocs build --strict✅Example runs (these are demonstration runs, not a performance claim — no baseline engine is
being compared against):
--source synthetic(offline, 8 epochs)--source gfs(2 epochs, default 4-chunk range)The GFS run, on an 8 vCPU / 31 GiB
n2-standard-8in GCP readings3://dynamical-noaa-gfsinus-west-2(cross-cloud, so pessimistic): 90 batches in 102.7 s cold at 0% chunk hit, then93.0 s at 100% chunk hit with zero fetches and zero decodes.
print_summary()estimated19.78 GiB of peak on the defaults, which is what it took.
Author attestation
have verified the claims made in this description.
Left unchecked deliberately — this was AI-assisted and the attestation is the human author's to
tick.
Checklist
tests/test_dynamical.py, 5 tests, synthetic only (11 s)ruff check,ruff format --check,mypy,pytest -qandmkdocs build --strictgreenlocally
examples/dynamical/data.py)docs/examples.md(table row + section) andexamples/README.md## UnreleasedinCHANGELOG.mdBatchstays numpy, no dask, no reshard, no
xr.DataArrayChunkPool, the scheduler, or cross-thread readinessand store stated, not a comparison against another engine
🤖 Generated with Claude Code
https://claude.ai/code/session_016eLANSQjFGbLQprE7LbyTJ