What's New — Loop & lifecycle polish
Five fixes that tighten the autonomous-loop and lifecycle surface:
soup iterative-dpoconfig fix (#261) — the per-roundsoup trainsubprocess renderedoutput:as a{dir: ...}mapping that the config schema rejected, so every round failed at validation. Now rendered as a flat string; rounds train end-to-end.- CMA-ES merge base reuse (#246) —
soup adapters merge --strategy cmaesreloaded the base model once per candidate. It now loads the base once and reuses it across the whole population (each candidate only loads its small merged LoRA), cutting wall-clock and VRAM churn on a large search. soup loopcost gate (#245) —estimate_costwas a0.0placeholder, so the budget guard never tripped on cost. It now derives a forward estimate from the most recent completed run's GPU + duration; failures never crash the daemon.- Energy hand-off (#244) —
soup train --track-energy --energy-out <path>persists the codecarbon measurement as JSON sosoup bom emit --energy <path>can attach kWh / CO₂ / PUE to a CycloneDX/SPDX ML-BOM. - Multi-node diagnose gate (#170) —
soup train --diagnose-gatefired once per node on a shared-FS multi-node run. It is nowRANK-aware: gates once per cluster (RANK==0), falling back toLOCAL_RANK==0for single-node accelerate.
Validated end-to-end on SmolLM2-135M / RTX 3050.
Install / Upgrade
pip install --upgrade soup-cliSecurity
No new security surface. --energy-out writes through the shared cwd-contained, symlink-rejecting atomic writer.
Known Limitations
None new. Deferred items from earlier patches remain tracked in their respective release notes.