Skip to content

Limits and tradeoffs

This is a working simple pipeline. A run that succeeds and a forecast you can trust are two different things, so here are the honest gaps.

  • It was easier to configure and use AWS managed services rather than using something like Kubernetes or a custom scheduler. The tradeoff is that the pipeline is not portable to another cloud or on-premise.
  • A lot of the pipeline is opinionated and tied to the SageMaker Processing job
  • My interpretation of this could be wrong as I lack domain expertise in weather forecasting, so the model may not be producing skillful forecasts.
  • Validation checks NaN and Inf across all 157 channels plus broad bounds on temperature, MSLP, wind, the jet, humidity, and dewpoint.
  • This catches broken tensors, not forecast skill: there is no comparison against ERA5 or another analysis at the valid time, so a finite but implausible upper-air value can pass.
  • Next step is per-variable range monitoring plus RMSE and anomaly correlation against a reference.
  • The channels are stored in log space; the inverse uses exp() and the product is capped at 1,000 mm.
  • In the verified run only 0.167% of cells hit the cap, but those cells held about 75% of the global precipitation mean, so aggregate precipitation is misleading.
  • The field stays marked precip_reliable=false with capped-fraction and mass diagnostics; for a real product I would verify the transform against training or drop precipitation from the file.
  • Surface fields must exist or preprocessing fails; missing pressure-level values sit at zero in normalized space, which is the training mean.
  • That is fine for known gaps like high-altitude GFS humidity, but the same fallback can hide an unexpected missing field.
  • A production gate should separate expected gaps from missing data and reject a cycle below a coverage threshold.
  • The job asks for the latest available GFS cycle and does not remember the last one processed.
  • If NOAA is delayed it can reprocess the same cycle, overwrite the partition, and still emit cycle_success=1.
  • The right fix is a gfs_cycle_age_hours metric with a duplicate-cycle check and an age-based alarm.
  • Exceptions emit cycle_success=0 and attempt an immediate SNS message; invalid output emits output_valid=0, quarantines, and attempts another.
  • CloudWatch and SNS failures are logged but do not fail inference, which protects forecast generation but means a notification can fail quietly apart from the run log.
  • I would add a heartbeat outside the forecast process and exercise the full OK -> ALARM -> OK path.
  • Validation tests cover NaN in an unselected channel, dewpoint violations, and extreme precipitation.
  • The CI self-test covers imports and mesh construction on CPU, not a GPU forward pass.
  • Quarantine publication, SNS calls, stale-GFS handling, and the scheduled workflow still need committed tests.