What's New
18 features across 4 areas — closes the observability gap with all three competitors in one release.
Tracker integrations
- New
--trackerflag onsoup trainacceptsmlflow/swanlab/trackio(mutually exclusive with--wandb/--tensorboard). Closed allowlist viaMappingProxyType. - PostHog telemetry payload schema lands as opt-IN (
SOUP_TELEMETRY=1) with hardware-info-only fields — no model names, dataset paths, or config contents.
Eval metrics
- Pure-Python BLEU + ROUGE-1 / ROUGE-2 / ROUGE-L for
soup eval custom. effective_tokens_per_secondmetric —unmasked_tokens / wall_clock_seconds(returnsNonewhen wall_clock ≤ 0).- KL-divergence calibration framework (
soup_cli.eval.calibrate.run_calibration) with OK / MINOR / MAJOR thresholds at 0.05 / 0.20. - Model Arena Elo tournament (
soup_cli.eval.arena.Tournament, K=32, 256-model cap). ceval/cmmlu/aider_polyglotbenchmark name allowlist.
Profiling extras
memory_snapshot_contextwrapstorch.cuda.memory._record_memory_historywith cwd-confined snapshot path.nccl_bandwidth_checkreference table (h100 / a100 / v100 / rtx-series, NVLink + PCIe).write_vscode_launchwrites a.vscode/launch.jsonwithsoup train+ pytest configs, symlink-rejected at the target path.
Demo datasets
- New
soup data demolists 4 ready-to-use JSONL fixtures (alpaca / sharegpt / dpo / grpo).soup data demo alpaca_demo --output ./mine.jsonlcopies the bundle for instantsoup trainwarm-up.
Install / Upgrade
```bash
pip install -U soup-cli
```
Security
- New
--trackerallowlist +validate_tracker_name(null-byte / >32-char / unknown rejection). _REPORT_TO_BACKENDSregistry wrapped inMappingProxyType.- Tournament model names reject Rich markup metacharacters `[` and `]` so leaderboard rows can't be markup-injected.
resolve_snapshot_pathrejects null-byte /./../ path separators inrun_id;base_dirrejects null-byte / absolute /..segments before realpath join.write_vscode_launchusesos.lstat + S_ISLNKsymlink rejection at the target path regardless offorce(TOCTOU defence).copy_bundle_tostages writes to a sibling temp file with symlink rejection, thenos.replace-atomic rename — mid-stream rejection never leaves a partial file at the user-visible target.- Telemetry payload is closed-key (soup_version / command / python major.minor / os / arch / duration); no leak of model names, dataset paths, config contents.
memory_snapshot_contextnarrows theRuntimeErrorcatch torecord()entry only — defends against a wide-catch double-yield generator bug.
Known Limitations
- MLflow / SwanLab / Trackio live integration deferred to v0.43.1 — schema accepts the names and HF Trainer threads them through
report_to, but Soup does not bundle the upstream packages; HF raises a generic ImportError when the package is absent. - PostHog telemetry network code deferred to v0.43.1 — payload schema + opt-in env var ship; no network code yet.
- Aider Polyglot live runner deferred to v0.43.1 — name in the allowlist; live wiring requires upstream
aider-chat+ Docker. soup doctor --ncclmeasurement CLI deferred —nccl_bandwidth_checkaccepts a measured value and classifies it; live measurement viatorch.distributed.all_reduceis a follow-up.memory_snapshot_contextreal CUDA path only via mocks in unit tests — graceful fallback when torch / CUDA missing; real GPU snapshot requires a GPU runner.examples/data/fixtures shipped at the repo root (not as package data insidesoup_cli/);_bundle_source_pathderivesrepo_rootviastr(importlib.resources.files("soup_cli"))which is editable-install + wheel friendly but may break in zipapp / namespace-package installs.