Skip to content

v2026.4.0

Latest

Choose a tag to compare

@github-actions github-actions released this 29 Apr 09:44
· 40 commits to main since this release
0dbdd4c

Noether Release Notes

This release moves Noether to calendar-based versioning (#189) and ships a major round of new recipes, a higher-level training API, broader AB-UPT capabilities, and a measurable quality improvement on the DrivAerML baseline.

Highlights

Improved AB-UPT baseline on DrivAerML

RoPE scaling (#184) combined with the new Muon optimizer (#158) lifts AB-UPT performance on DrivAerML over the previous baseline. See the full comparison in the W&B report.

New recipes

  • AB-UPT showcase with scalable query-based inference (#153) — an end-to-end DrivAerML walkthrough covering data fetching, training, and evaluation. Designed to be the recommended starting point for AB-UPT users.
  • Heat transfer recipe (#146) — Neural surrogate for the SIMSHIFT Heatsink benchmark (819 simulations) predicting velocity, temperature, and pressure on 3D volume fields conditioned on simulation parameters. Supports both AB-UPT and Transolver++.
  • Emmi-Wing HF subset recipe (#159) — small, fast-to-iterate aerodynamics recipe backed by the public EmmiAI/Emmi-Wing HuggingFace dataset, with train/val/eval splits.
  • Aero CFD recipe (#143) — the previous tutorial promoted to a full recipe.

High-level training API

Training presets (#128) — DomainPreset encapsulates dataset stats, normalizers, pipeline defaults, and forward properties. Per-dataset training scripts (examples/train_*.py) now expose only experiment-level knobs (model, hidden dim, epochs, device, accelerator, paths).

AB-UPT capabilities

  • Untied physics blocks (#177) — self_untied, cross_untied, perceiver_untied variants with per-branch weights via UntiedLinear (batched or grouped matmul). Removes the need to configure decoder-block counts per domain and enables cross-attention between branches with untied weights.
  • Arbitrary domains (#139) (breaking) — replaces the hardcoded surface or volume split with a ModelDataSpecs dict, so AB-UPT can be applied to any number of named domains (gas, liquid, solid, multi-phase, …).
  • Optional geometry encoder (#150) and Muon optimizer support (#158) (breaking) — Muon is paired with a secondary optimizer for non-2D tensors. QKV is split into separate Q, K, V matrices (breaks old checkpoints).

Workflow and infrastructure

  • submitit-based multirun job submission (#164) (breaking) — replaces the custom sbatch --wrap path with submitit.AutoExecutor, giving Hydra multirun sweeps as SLURM array jobs with login-node validation. SlurmConfig field names now match AutoExecutor.update_parameters (name, slurm_partition, mem_gb, timeout_min, …).
  • Development CLI (#142) — noether-development runs individual modules (datasets, models, trainers) in isolation with verbose logging for fast iteration without the full pipeline.
  • EMA evaluation (#183, #192) — EmaCallback now accepts nested eval_callbacks that run on swapped-in EMA weights and emit metrics under an ema=<factor>/ prefix, removing the need for a separate eval run.
  • Profiling callback (#161) — wraps the PyTorch profiler as a standard callback.
  • Reproducibility (#179, #180) — DataLoader workers are seeded and use_deterministic_algorithms is enabled. Non-deterministic dataset ordering fixed.
  • Dataset hooks (#154) — pre_getitem and post_getitem hooks on the base Dataset for lightweight per-sample customization.

Breaking changes

  • #138 — shared attention renamed to self. Auto-converted with a deprecation warning during the transition.
  • #139 — fixed surface or volume domains generalized to arbitrary domains. Replace AeroDataSpecs with the ModelDataSpecs dict.
  • #142 — development CLI introduces new entry points (additive; review CLI docs).
  • #158 — Muon support splits QKV into separate Q, K, V matrices. Old AB-UPT checkpoints will not load.
  • #164 — submitit replaces the custom sbatch wrapper. Rename SlurmConfig fields. Remove --output and --error. Sweeps may not vary slurm: fields.
  • #189 — versioning switched to CalVer. Manual release process. Release-please config removed.

Detailed changes

Features

Fixes

  • Distributed training hanging with submit_job by @HennerM in #141
  • calculate_statistics compatibility with any dataset subclass by @HennerM in #147
  • Attempt HF download without HF_TOKEN by @HennerM in #152
  • Support configs without custom top-level schema in submit script by @HennerM in #151
  • move_item_to_device on MPS by @Ndles in #157
  • Log total parameter count for non-composite models by @HennerM in #155
  • Support normalization and denormalization on CUDA by @HennerM in #156
  • StopIteration error when training on fractional epoch by @HennerM in #162
  • Transolver uses Transolver attention, not regular attention by @MauritsBleeker in #166
  • Missed import rename by @HennerM in #168
  • Aero callback uses correct denormalization key by @MauritsBleeker in #169
  • aero_cfd ShapeNet recipe by @HennerM in #173
  • Default to unlimited job time by @HennerM in #176
  • Non-deterministic dataset order by @HennerM in #180
  • Avoid error when loading model with noether-eval due to stored computed fields by @kinggongzilla in #170
  • Catch OOM in slurm submission by @HennerM in #190
  • Flush tracker on eval and exception by @HennerM in #182
  • resume_from_checkpoint for eval callbacks by @HennerM in #193

Docs

Chore

CI

Tests