Closes every v0.48.0 BETA deferral with live wiring, plus the deepseek-v3-reasoning recipe.
What's New
- Dynamic curriculum is live — new
DynamicCurriculumCallback(HF TrainerCallback): per-step bucket stats, recompute every N steps, multi-rankall_reduce(SUM)coordination, atomiccurriculum_history.jsonlappend on rank 0. Visualise viasoup runs curriculum-curve <run_id>. - Curriculum-aware on every transformer trainer —
curriculum_dynamic: trueschema gate widened from{sft, pretrain}to all 13 transformer-backend wrappers (DPO / GRPO / KTO / ORPO / SimPO / IPO / BCO / RewardModel / Embedding / PPO / Distill included). MLX backend still rejected with a distinct error. soup data mix --liveruns real proxysoup trainsubprocesses for each Bayesian-search candidate. Argv-list invocation (no shell), per-candidate timeoutmin(budget/probes, 30 min), tracker-SQLite parse foreval_loss, atomic tmp-YAML cleanup. Requires--base-yaml <path>under cwd.- scikit-optimize Bayesian optimiser — when
scikit-optimizeis installed, the mix optimiser now drivesskopt.Optimizer(GP)through the existingOptimizerProtocol. Silent fallback to the Dirichlet sampler when absent. MixOptimizationReport.elapsed_secondsexcludes failed candidates — headline elapsed-time now sums only successful candidate wall-clock, so a single timed-out proxy can no longer inflate an otherwise quick run.deepseek-v3-reasoningrecipe — GRPO + reasoning template ondeepseek-ai/DeepSeek-V3withreward_fn=accuracy,format+ math verifiable domain.
Install / Upgrade
pip install --upgrade soup-cliOptional Bayesian backend:
pip install scikit-optimizeSecurity
DynamicCurriculumCallback.output_dirruns throughis_under_cwd+ null-byte / oversize / non-string rejection before any filesystem touch; rank-0 guard via_is_rank_zerodefends against multi-rank double-write;tempfile.mkstemp + os.replaceatomic JSONL append mirrors the v0.48.0write_mix_recipepolicy.proxy_run_for_weightsuses argv-listsubprocess.run(NO shell) — defends against shell injection via crafted dataset / base-yaml paths. Weights validated through simplex + finite + bool-rejected + per-element[0, 1]bounds.base_yaml_pathcwd-contained + null-byte-rejected before tmp YAML rendering.timeout_seconds ∈ [60, 30*60].SOUP_DB_PATHenv-override propagated to the child for per-candidate DB isolation.attach_curriculum_callbackusesis Noneguard (not falsy shortcut) so a schema-bypasscurriculum_dynamic=0surfaces loudly rather than silently no-op.- 7935 → 7998 tests (+63 net); four review agents (python / code / security / tdd) ran sequentially; every CRITICAL → LOW finding fixed.
Known Limitations
_pick_bucketis step-mod round-robin (BETA); loss-percentile / curriculum-metric routing tracked for a follow-up patch.validate_distributed_curriculumhelper still requires external callers to attestrank_coordinated=True; the new callback wiresall_reduceinternally so the schema invocation passes.proxy_run_for_weightsis single-shot — concurrent proxy runs would race on~/.soup/experiments.db; useSOUP_DB_PATHfor per-candidate isolation.scikit-optimizeis an optional dep, not bundled — silent fallback to Dirichlet sampler when absent.MixOptimizationReport.elapsed_secondsis a behaviour change — operators printing the headline elapsed must note it now excludes failed-candidate time (per-candidatewall_clock_secondsretains the per-trial timing).
🤖 Generated with Claude Code