Skip to content

Sudhanva's submission PR - #5

Open
nsudhanva wants to merge 20 commits into
windborne:mainfrom
nsudhanva:main
Open

Sudhanva's submission PR#5
nsudhanva wants to merge 20 commits into
windborne:mainfrom
nsudhanva:main

Conversation

@nsudhanva

Copy link
Copy Markdown

Please read: https://windborne.sudhanva.me for more details. Ignore this PR

nsudhanva and others added 20 commits July 10, 2026 12:27
- pyproject.toml + uv.lock: cross-platform uv env (macOS + Linux/CUDA),
  natten/matepoint gated to linux via markers with shi-labs TLS bypass
- notebooks/explore_dataset.ipynb: dataset exploration
- notebooks/inference.ipynb: reconstructed input pipeline + model inference

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- coastline overlay from land_mask (no cartopy)
- robust percentile color limits (no outlier blowout)
- add 500 hPa height + 250 hPa jet, MSLP isobars
- fix precip: exponentiate log-space 142_lsp back to mm
- label 6h increment honestly (ERA5 fcst - GFS analysis)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- gfs.py: byte-range GFS f000 fetch from noaa-gfs-bdp-pds via .idx
- preprocess.py: GFS -> both encoders (level mismatch via interp_levels), normalize
- inference/validate/outputs/s3io/metrics/run_cycle: full cycle + CloudWatch
- Dockerfile, README, requirements; validated fetch+preprocess locally (5568 gpm z500, N(0,1) normed)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- API variable names/units: temperature_2m, dewpoint_2m, pressure_msl,
  wind_{u,v,speed}_{10m,100m}, total_cloud_cover, total_precipitation_6h,
  and upper-level geopotential/temperature/wind_u/wind_v/specific_humidity
- (time, level[25 hPa], lat, lon) dims, CF-1.8, zlib-compressed
- run_cycle passes full output array + mesh to the writer

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- .dockerignore keeps weights/data/.venv out of the build context
- CI builds+pushes the pipeline image to ECR on native amd64 (manual trigger)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ook cron

- statemachine.json: EventBridge->StepFunctions->SageMaker Processing (retry, catch->SNS)
- cron-onstart.sh: 6-hourly cron on the notebook GPU as the interim 24h runner
- infra/README: deploy steps for both paths

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Decoder returns (1,720,1440,157); netCDF writer expected (720,1440,157).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- global attrs can't hold the nested validation dict -> json.dumps it
- exp() of log-space 6h precip could overflow -> clip to [0,2000] mm

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
exp() of log-space precip could overflow; clip to [0,2000] mm for the
validation/plot fields too (netCDF was already clipped).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Avoids apt/dpkg (flaky under emulation), ships torch 2.5.1 + CUDA 12.1,
then pip-installs natten + matepoint + pipeline deps.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- validate: report + fail on negative humidity, dewpoint>temp; finite precip metric
- outputs: clamp specific_humidity>=0 and dewpoint<=temperature in the netCDF
- cron-onstart: reinstall uv (does not survive notebook stop/start); emit
  cycle_success=0 on bootstrap-level failure
- smoke_fetch: exit non-zero on FAIL
- add server/infra/dash.json (was referenced but missing)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ntainer self-test, honest docs

- validate: finiteness over ALL 157 channels (catches NaN in any channel); precip
  validated on the SAME 6h-total quantity that's written, raw finiteness + capped-frac
  reported; precipitation flagged EXPERIMENTAL (precip_reliable), not vacuously passed
- outputs: single-source total_precip_6h_mm() (raw for validate, clamped for output at
  a credible 1000mm cap); overview plots the SAVED 6h total at a fixed scale
- run_cycle: --selftest (imports model + builds meshes, no GPU/weights); fetch weights
  from S3 so the container is self-sufficient; corrected emitted metric keys
- CI: run the container --selftest after push (demonstrates the image imports/builds)
- tests/test_validate.py: exercises the thresholds (NaN-in-unselected, Td>T, precip overflow)
- READMEs (root/server/infra): design-vs-live, quota reality, notebook runs source not the
  container, fixed docker command (S3 weights + creds)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…E runner

Can't finish+test SF/EB (Processing-job quota in manual review), and the notebook
cron already satisfies automation + 24h+. So: delete statemachine.json, reframe
infra around the cron, ensure crond is started, wire SNS alerts. SF/EB kept only as
a described "99.9% uptime" future, not as dead IaC.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…y shi-labs)

- shi-labs.com (expired cert) times out in CI -> build from an S3-vendored natten wheel
- workflow fetches the wheel before docker build; CI role granted S3 read
- selftest tolerates natten import failing on GPU-less CI runners (reports, no hard fail)
- .gitignore the 451MB wheel; document the local fetch step

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…entials v6,

setup-buildx v4, build-push v7)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… drift

- run_cycle/s3io: invalid forecasts go to a quarantine/ prefix and never update
  latest.json; SNS alert fires on invalid output (not just on crash)
- validate: precip_reliable stays False until the log inverse transform is verified
  (PRECIP_TRANSFORM_VERIFIED=False); also report precip_capped_mass_frac (the capped
  tail can dominate the mean even at <1% capped cells)
- docs/readme: remove "Step Functions IaC committed" (it was deleted), cron not SF
  in run_cycle docstring, precip cap 1000mm (was 2000), dashboard drops removed metric

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ocessing

Processing-job quota approved, so the pipeline now runs the ECR container on an
ephemeral g5 GPU on a 6-hourly schedule (verified: standalone Processing job produced
a valid forecast in 45.6s). Retires the notebook cron (kept for reference, notebook
stopped). Re-adds statemachine.json and documents the deployed resources.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…cle on error

EventBridge-started executions are named <uuid>_<uuid>, so States.Format('wm3-sfn-{}', Execution.Name)
produced an 81-char name with an underscore, which SageMaker rejects. Split on '_' and take the
first UUID for a valid 44-char name. Also route Alert -> Fail so a failed cycle reports FAILED
instead of a misleading SUCCEEDED.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant