What's Changed
Configuration
- Inference and one-step aggregators moved from boolean flags to typed, hierarchical metric configuration — each metric is a named field with its own config and
enabled/strictflags, and defaults are explicit rather than inferred at build time (#1126, #1150, #1154) - Training now takes lists of weighted inference and validation entries, each with its own loader, aggregator, epoch schedule, name, and weight. Weighted sums drive checkpoint selection and LR scheduling (#1128, #1149)
Stepper State
A new per-sample StepperState carried on BatchData enables several capabilities at once:
- Global dry-air mass can be pinned to its initial-condition value, a stronger constraint than per-step
conserve_dry_air(#1225) - Seedable random state makes stochastic inference reproducible and independent of
forward_steps_in_memory, with aseedoption on both inference entrypoints (#1330) - State is threaded through
CoupledStepperand serialized across segmented-inference restarts (#1367, #1341)
Models and Training
- Swin Transformer backbone added as a drop-in SFNO alternative (#1248); HEALPix UNet modernized (#1156)
- Correctors report their per-step effect as
delta = corrected - network_output, carried through to prediction output with an opt-in step-diagnostics netCDF writer (#1321, #1335) - Variable masking allows training across heterogeneous data sources with different available variables (#1160, #1329)
- Gradient clipping, per-channel loss reporting, and loud NaN failures at the network input boundary (#1265, #1159, #1297)
- Coupled models can now use the prognostic prescriber, enable-able at inference via overrides (#1030)
Diagnostics
Environment
- Shared conda environment, Docker image, and CI updated to Python 3.12 and torch 2.10. Minimum required dependency versions are unchanged (#1402)
Breaking Changes
Existing training YAML will need updating:
TrainConfig.inferenceandadditional_inferenceare replaced by a singleinference: list[InlineInferenceConfig];AdditionalInferenceConfigis removed (#1128, #1133)validation_loaderandvalidation_aggregatorare replaced byvalidationin bothfme.aceandfme.coupled(#1149)- Coupled
LossContributionsConfigis removed; its fields move ontoComponentTrainingConfig(#1158) fme.core.maskingrenamed tofme.core.spatial_masking, with corresponding class renames. Serialization keys and theinput_maskingYAML key are preserved (#1180)
Behavior changes that do not raise an error:
- Default
almost_fair_crps_alphachanged from 0.95 to 1.0, i.e. fair CRPS is now the default (#1139) - Segmented run subdirectories are labeled by start date rather than segment number (#1382)
- Shuffled data loading uses a different RNG, so batch sequences differ for the same seed (#1095)
mse_fractional_componentsvalidation metric removed in favor of true per-channel loss (#1380)n_ensemble_per_ic > 1is now rejected in segmented inference (#1300)
Full Changelog: v2026.5.1...v2026.8.0