soup-cli 0.71.41__tar.gz → 0.72.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {soup_cli-0.71.41 → soup_cli-0.72.0}/CHANGELOG.md +67 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/CONTRIBUTING.md +2 -2
- {soup_cli-0.71.41 → soup_cli-0.72.0}/PKG-INFO +22 -20
- {soup_cli-0.71.41 → soup_cli-0.72.0}/README.md +21 -19
- {soup_cli-0.71.41 → soup_cli-0.72.0}/SECURITY.md +2 -2
- {soup_cli-0.71.41 → soup_cli-0.72.0}/docs/README.md +1 -1
- {soup_cli-0.71.41 → soup_cli-0.72.0}/docs/commands.md +1 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/docs/performance-and-quantization.md +103 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/docs/training.md +5 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/pyproject.toml +1 -1
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/__init__.py +1 -1
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/adapters.py +76 -14
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/train.py +19 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/config/schema.py +167 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/monitoring/hf_push.py +24 -6
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/recipes/catalog.py +6 -4
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/sft.py +240 -1
- soup_cli-0.72.0/src/soup_cli/utils/adapter_arithmetic.py +609 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/adapter_merge.py +13 -0
- soup_cli-0.72.0/src/soup_cli/utils/layer_shard.py +392 -0
- soup_cli-0.72.0/src/soup_cli/utils/layer_stream.py +350 -0
- soup_cli-0.72.0/src/soup_cli/utils/layer_stream_runtime.py +609 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/relora.py +24 -5
- soup_cli-0.72.0/tests/test_issue300_online_dpo_train.py +144 -0
- soup_cli-0.72.0/tests/test_issue302_vision_pad_token.py +214 -0
- soup_cli-0.72.0/tests/test_issue305_mixed_rank_arithmetic.py +595 -0
- soup_cli-0.72.0/tests/test_issue308_callback_subclass.py +189 -0
- soup_cli-0.72.0/tests/test_v07200.py +2160 -0
- soup_cli-0.71.41/src/soup_cli/utils/adapter_arithmetic.py +0 -288
- {soup_cli-0.71.41 → soup_cli-0.72.0}/.dockerignore +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/.github/FUNDING.yml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/.github/pull_request_template.md +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/.github/workflows/ci.yml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/.github/workflows/docker.yml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/.github/workflows/publish.yml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/.github/workflows/recipe-validation.yml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/.gitignore +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/.mailmap +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/.pre-commit-config.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/AGENTS.md +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/CODEOWNERS +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/CODE_OF_CONDUCT.md +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/CONTRIBUTORS.md +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/Dockerfile +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/LICENSE +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/NOTICE +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/docker-compose.yml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/docs/adapters-and-governance.md +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/docs/backends-and-ops.md +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/docs/compliance.md +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/docs/data.md +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/docs/evaluation.md +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/docs/models.md +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/docs/peft-and-efficiency.md +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/docs/serving-and-export.md +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/examples/README.md +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/examples/configs/dpo_chat.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/examples/configs/dpo_example.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/examples/configs/grpo_reasoning.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/examples/configs/rlhf_step1_sft.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/examples/configs/rlhf_step2_reward.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/examples/configs/rlhf_step3_ppo.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/examples/configs/sft_basic.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/examples/configs/vision_llama.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/examples/data/alpaca_tiny.jsonl +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/examples/data/chat_preferences.jsonl +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/examples/data/dpo_sample.jsonl +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/examples/data/reasoning_math.jsonl +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/examples/reward_hacking/rewards.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/examples/synthetic_workflow.md +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/examples/synthetic_workflow.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/soup.png +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/soup_logo_svg.svg +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/__main__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/autopilot/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/autopilot/analyzer.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/autopilot/decisions.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/autopilot/generate_config.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/cans/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/cans/pack.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/cans/publish.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/cans/run.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/cans/schema.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/cans/unpack.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/cans/verify.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/cli.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/cloud/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/cloud/modal.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/_eval_v0550.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/_eval_v0610.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/_eval_v0650.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/_eval_v07110.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/_webhook_cli.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/ab.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/active_sample.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/advise.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/agent.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/airgap.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/apple_adapter.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/attest.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/audit_log.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/autopilot.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/bench.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/bom.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/build.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/can.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/card.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/chat.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/ci.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/compile_cmd.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/compile_tools.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/completions.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/cost.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/data.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/data_canary.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/data_doctor.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/data_forge.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/data_mix.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/data_score.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/data_topics.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/delinearize_llama4.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/deploy.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/diagnose.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/diff.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/distill_prompt.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/doctor.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/draft.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/drift_alarm.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/edit.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/env.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/eval.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/expect.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/export.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/fetch.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/generate.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/history.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/infer.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/ingest.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/init.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/iterative_dpo.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/license_advisor.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/llama.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/local_rl.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/lock.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/loop.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/mcp.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/merge.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/migrate.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/monitor.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/plan.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/plugins.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/probe.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/profile.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/prune_prompt.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/push.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/quantize.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/quickstart.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/ra_dit.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/recipes.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/registry.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/reward.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/runs.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/serve.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/ship.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/shrink.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/spectrum.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/steer.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/sweep.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/tokenizer.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/tui.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/tunability.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/ui.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/commands/why.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/config/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/config/loader.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/gate/format_json.jsonl +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/gate/safety.jsonl +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/gate/tool_call.jsonl +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/augment.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/chat_templates.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/collators.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/formats.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/loader.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/loss_mask.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/providers/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/providers/_utils.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/providers/anthropic.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/providers/ollama.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/providers/vllm.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/sft_format.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/templates/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/templates/code.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/templates/conversation.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/templates/preference.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/templates/qa.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/templates/reasoning.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/templates/tool_calling.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/templates/verifiable.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/traces/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/traces/pair_builder.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/traces/parsers.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/traces/quality.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/data/validator.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/envs/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/envs/_common.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/envs/calculator.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/envs/guess_number.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/envs/retrieval_qa.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/eval/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/eval/arena.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/eval/calibrate.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/eval/custom.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/eval/forgetting.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/eval/gate.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/eval/gate_suites.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/eval/human.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/eval/judge.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/eval/leaderboard.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/eval/quant_check.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/experiment/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/experiment/tracker.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/mcp_server/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/mcp_server/registry.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/mcp_server/server.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/migrate/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/migrate/axolotl.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/migrate/common.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/migrate/llamafactory.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/migrate/unsloth.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/monitoring/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/monitoring/callback.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/monitoring/display.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/monitoring/plugin_callback.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/monitoring/trace_logger.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/plugins/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/py.typed +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/recipes/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/registry/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/registry/attach.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/registry/diff.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/registry/hashing.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/registry/store.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/audio.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/bco.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/chat.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/code.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/embedding.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/eu-ai-act.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/hipaa.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/ipo.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/kto.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/longcontext.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/manifest.json +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/medical.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/moe.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/orpo.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/pretrain.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/reasoning.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/rlhf.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/simpo.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/soc2.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/sr-11-7.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/tool-calling.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/templates/vision.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/asr.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/bco.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/bitnet.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/classifier.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/distill.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/dpo.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/embedding.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/grpo.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/ipo.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/kto.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/mlx_dpo.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/mlx_grpo.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/mlx_routing.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/mlx_sft.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/mole_routing.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/online_dpo.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/orpo.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/ppo.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/preference.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/pretrain.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/prm.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/raft.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/reward_model.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/rewards.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/simpo.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/tts.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/trainer/unlearn.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/tui_app.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/ui/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/ui/app.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/ui/plugins/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/ui/static/app.js +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/ui/static/index.html +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/ui/static/logo.png +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/ui/static/logo.svg +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/ui/static/style.css +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/_eval_text.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/ab_test.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/activation_offload.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/active_sampler.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/adapter_bisect.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/adapter_branch.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/adapter_diff.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/adapter_fuse.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/adapter_pr.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/adapter_scan.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/adapter_sign.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/advanced_precision.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/advise.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/advise_history.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/agent_forge.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/agent_rollout.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/agent_sandbox.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/airgap_bundle.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/annex_xi.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/anthropic_messages.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/apple_adapter.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/asr_metrics.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/attest.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/audit_log.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/auto_quant.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/backend_detect.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/batch_probe.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/behavior_battery.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/best_of_n.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/bitnet.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/blame.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/block_expansion.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/bom.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/brain_rot.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/brain_rot_lang.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/build_dag.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/canary.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/canary_discovery.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/canary_router.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/capability_suite.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/checklist_dsl.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/ci_workflow.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/citation_faithful.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/classifier.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/cmaes_merge.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/compile_tools.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/completions.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/constants.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/convergence.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/crash.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/cross_doc_attn.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/curriculum.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/cut_ce.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/data_doctor.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/data_forge.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/data_lint.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/data_mix.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/data_pipeline.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/data_score.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/deepspeed.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/delinearize_llama4.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/demo_bundles.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/deploy_autopilot.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/deploy_measure.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/_common.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/badge.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/citation.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/contamination.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/format.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/live.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/memorization.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/refusal.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/report.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/runner.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/distill.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/dpo_variants.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/draft.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/drift_alarm.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/ebft_gdpo.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/echo_trap.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/edit_diff.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/edit_governor.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/edit_kernels.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/embed.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/encoding.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/energy.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/env_lock.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/errors.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/eval_design.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/eval_gate_hook.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/evolve.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/expectations.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/fetch_examples.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/flash_attn.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/fp8.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/freeze.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/fsdp.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/galore.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/gguf_quant.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/gpu.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/gpu_monitor.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/grace_codebook.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/graceful_save.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/grad_accum.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/gradient_ckpt.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/grpo_long_context.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/grpo_variants.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/hardware_fit.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/harm_probe.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/hf.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/hf_space.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/hubs.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/ingest_sources.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/integrations.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/interference.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/interference_live.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/irt.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/iterative_dpo.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/jinja_analyzer.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/kernel_picker.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/knowledge_edit.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/kv_cache.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/launcher.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/license_advisor.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/license_matrix.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/liger.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/lisa.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/live_eval.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/llama_proxy.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/llama_server_timings.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/local_rl.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/loftq_init.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/log_level.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/long_context.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/longlora.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/loop_budget.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/loop_daemon.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/loop_iteration.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/loop_stages.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/loop_state.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/lr_finder.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/lr_groups.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/magpie.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/metrics.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/mii.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/minillm.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/mix_proxy.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/mixed_precision.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/mlx.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/mod.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/moe.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/moe_quant.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/mole_routing.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/multipack.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/multipack_sampler.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/multipack_trainer.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/namespace_pin.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/neat_packing.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/ngram_spec.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/nlg_metrics.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/ollama.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/onboarding.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/optimizer_zoo.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/paths.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/peft_builder.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/peft_patches.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/peft_wiring.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/persona_hub.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/pipeline.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/preference_combine.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/prm.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/prm_reward.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/probe_kernel.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/probe_pack.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/profiler.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/profiling.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/profiling_v0_43.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/prompt_compile.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/prompt_distill.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/prune_prompt.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/qat.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/qr_url.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/quality.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/quant_menu.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/ra_dit.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/ra_dit_run.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/raft.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/reasoning_effort.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/reasoning_parser.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/recipe_dag.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/recipe_run.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/registry.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/rehearsal.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/replay.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/repro_receipt.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/reward_hack_control.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/reward_hacking.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/reward_stress.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/reward_synth.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/ring_attention.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/rl_checkpoint.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/run_cost.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/sae_diff.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/save_formats.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/semdedup.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/server_tools.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/sglang.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/ship_verdict.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/shortcuts.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/shrink.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/signing.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/sleeper_probe.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/soup_lock.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/spec_pairing.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/spectrum_scan.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/spike_recovery.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/sse_train_stream.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/steering.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/strict_safetensors.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/structured_output.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/sweep_config.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/tail_latency.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/terraform_plan.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/tool_outputs.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/topics.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/topology.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/tracing.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/trackers.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/train_event_buffer.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/trainer_plugins.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/trust_remote.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/truth_probe.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/tts.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/tts_codec.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/tunability.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/ui_env.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/uld.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/unlearn_kernels.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/unlearning.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/unlearning_eval.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/unsloth.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/v028_features.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/vector_bank.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/vllm.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/vscode_setup.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/warmup.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/webhooks.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/src/soup_cli/utils/why.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/templates/chat.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/templates/code.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/templates/medical.yaml +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/__init__.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/conftest.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/qa/v053_qa.md +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/qa/v07114_qa.md +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/qa/v0716_qa.md +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_adapters.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_advanced_peft.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_assistant_mask.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_audio.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_auto_tuning.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_autopilot.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_awq_gptq_export.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_batch_probe.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_bco.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_bench.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_brain_rot_multilingual.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_bugfixes.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_build_dag.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_callback.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_cans.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_chat.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_chat_template.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_cli.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_cli_subprocess.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_code_review_critical.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_code_review_deferred.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_code_review_high.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_code_review_medium_low.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_code_review_recurring.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_config.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_cost.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_crash_reporter.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_curriculum.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_data.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_data_augment.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_data_sample.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_data_split.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_data_tools.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_dataset_hub.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_dataset_registry.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_deepspeed.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_deploy_ollama.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_diff.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_display.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_doctor.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_dpo_example.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_dpo_variants.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_embedding.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_errors.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_eval.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_eval_gate.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_eval_platform.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_export.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_formats.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_fp8_recipe.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_freeze_training.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_generate.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_gpu.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_grpo.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_hf_integration.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_infer.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_inference_advanced.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_init.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_ipo.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_jinja_analyzer.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_kto.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_loader.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_log_level.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_loss_watchdog.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_merge.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_migrate.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_mlx_backend.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_moe.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_multi_adapter.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_multi_gpu.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_multipack_config.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_multipack_invariants.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_multipack_sampler.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_neat_packing.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_neftune_rslora.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_onnx_tensorrt_export.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_orpo.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_packing.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_part_a_wave1.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_part_a_wave2.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_part_c.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_part_d.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_part_e.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_part_f_hardening.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_peft_methods.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_peft_patches.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_performance.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_pissa_init.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_ppo.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_preference_dispatcher.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_preference_multi.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_preference_multi_runtime.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_pretrain.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_profile.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_profiling.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_progress.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_push.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_qat.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_quality_filter.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_quant_check.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_quant_menu.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_quickstart.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_rank_pattern.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_recipes.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_recipes_v031.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_refusal_multilingual.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_registry.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_relora.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_replay.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_resume.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_review_fixes_v07133.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_rlvr.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_run_cost.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_runs.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_serve.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_server_generate.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_sglang_serve.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_simpo.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_smoke_train.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_speculative_decoding.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_sweep.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_synth_data_pro.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_templates_yaml.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_tensorboard.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_tool_calling.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_trace_to_pref.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_tracker.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_trainer_coverage_v035.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_trainer_init.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_training_intelligence.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_training_speed.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_trust_remote_code.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_tui.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_ui.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_ui_chat.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_ui_config_builder.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_ui_live_monitor.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_ui_metrics.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_unsloth.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0401_part_c.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0401_part_d.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0401_part_e.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0402_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0402_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0403_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0403_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0403_part_c.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0404_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0404_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0405_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0406_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0410_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0410_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0410_part_c.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0420.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0430_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0430_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0430_part_c.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0430_part_d.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0440_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0440_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0440_part_c.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0440_part_d.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0440_review_followups.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0450.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0460_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0460_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0470_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0470_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0480_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0480_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0490.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0500_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0500_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0500_part_c.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0500_part_d.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0500_part_e.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0510.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0520.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0530.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v05310.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v05311.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0531_109.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0531_139.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0531_142.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0531_82.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0532.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0533.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0534.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0535.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0536.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0537.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0538.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0539.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0540.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0550.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0550_followups.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0560.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0570_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0570_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0570_part_c.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0570_part_d.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0580.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0590.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0600_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0600_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0600_part_c.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0600_part_d.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0600_part_e.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0600_part_f.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0610_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0610_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0610_part_c.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0610_part_d.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0610_part_e.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0620_followups.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0620_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0620_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0620_part_c.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0620_part_d.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0620_part_e.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0630_followups.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0630_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0630_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0630_part_c.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0630_part_d.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0630_part_e.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0631_206.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0640_followups.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0640_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0640_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0640_part_c.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0640_part_d.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0640_part_e.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0640_part_f.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0650_followups.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0650_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0650_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0650_part_c.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0650_part_d.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0650_part_e.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0660_cli.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0660_followups.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0660_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0660_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0660_part_c.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0660_part_d.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0660_part_e.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0670_followups.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0670_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0670_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0670_part_c.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0670_part_d.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0670_part_e.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0670_part_f.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0680_followups.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0680_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0680_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0680_part_c.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0680_part_d.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0680_part_e.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0690_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0690_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0690_part_c.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0690_part_d.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0690_part_e.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0700_part_a.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0700_part_b.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0700_part_c.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0700_part_d.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0700_part_e.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0700_part_f.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07110.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07111.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07112.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07113.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07114.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07115.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07116.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07117.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07118.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07119.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0712.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07120.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07121.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07122.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07123.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07124.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07125.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07126.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07127.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07128.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07129.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0713.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07130.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07131.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07132.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07133.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07134.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07135.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07136.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07137.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07138.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07139.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0714.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07140.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v07141.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0715.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0716.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0717.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0718.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_v0719.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_validator.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_vision.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_vllm_serve.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_warmup.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_why.py +0 -0
- {soup_cli-0.71.41 → soup_cli-0.72.0}/tests/test_windows_encoding.py +0 -0
|
@@ -12,6 +12,73 @@ reproducing 70+ versions of notes.
|
|
|
12
12
|
|
|
13
13
|
## [Unreleased]
|
|
14
14
|
|
|
15
|
+
## [0.72.0] - 2026-07-26
|
|
16
|
+
|
|
17
|
+
**Layer streaming (BETA) — fine-tune models that don't fit in your card.** The
|
|
18
|
+
frozen base lives in CPU RAM and is streamed into two pre-allocated VRAM buffers
|
|
19
|
+
one decoder layer at a time, so peak VRAM is bounded by the size of *one layer*
|
|
20
|
+
instead of the whole model. Only the LoRA adapters, their gradients and
|
|
21
|
+
optimizer state stay resident. Slower than resident training — but these models
|
|
22
|
+
did not run on the card at all.
|
|
23
|
+
|
|
24
|
+
Measured on the development box (**RTX 3050 Laptop 4 GB**, Windows 11, 16.9 GB
|
|
25
|
+
RAM), batch 1, gradient checkpointing on, 50 steps after 10 warm-up:
|
|
26
|
+
|
|
27
|
+
| Model | S | tok/s | GPU util | Peak VRAM |
|
|
28
|
+
|---|---|---|---|---|
|
|
29
|
+
| Qwen2.5-0.5B | 512 | 978.6 | 91.4% | 1.47 GB |
|
|
30
|
+
| Qwen2.5-1.5B | 512 | 525.0 | 96.8% | 1.82 GB |
|
|
31
|
+
| Qwen2.5-1.5B | 1024 | 487.6 | 96.7% | 2.96 GB |
|
|
32
|
+
| Qwen2.5-3B | 512 | 143.1 | 79.3% | **2.15 GB** |
|
|
33
|
+
|
|
34
|
+
**Qwen2.5-3B trains in 2.15 GB on a 4 GB card where a resident run OOMs.** The
|
|
35
|
+
honest cost: **1.43× slower than resident**, measured at 0.5B — the only
|
|
36
|
+
apples-to-apples comparison available on this box, because 1.5B and above cannot
|
|
37
|
+
run resident here at all.
|
|
38
|
+
|
|
39
|
+
### Added
|
|
40
|
+
|
|
41
|
+
- **`training.stream_layers: true`** — stream the frozen base layer-by-layer
|
|
42
|
+
from CPU RAM. `training.stream_source` (`auto`/`ram`/`disk`) and
|
|
43
|
+
`training.stream_buffers` (2–8, default 2 = double buffering) tune it.
|
|
44
|
+
- `soup_cli/utils/layer_stream.py` — tier choice, pinned-vs-pageable decision,
|
|
45
|
+
architecture allowlist, VRAM/throughput arithmetic (no torch import).
|
|
46
|
+
- `soup_cli/utils/layer_shard.py` — rewrites an HF checkpoint into one
|
|
47
|
+
safetensors shard per decoder layer, one tensor at a time, so sharding a model
|
|
48
|
+
that does not fit never needs it to fit.
|
|
49
|
+
- `soup_cli/utils/layer_stream_runtime.py` — buffer pool, CPU-RAM weight source,
|
|
50
|
+
prefetch scheduler on a dedicated CUDA stream, and the streamed layer wrapper.
|
|
51
|
+
- Shards are cached under `~/.soup/layer-stream/` (override with
|
|
52
|
+
`SOUP_LAYER_STREAM_CACHE_DIR`) and keyed to the source checkpoint's
|
|
53
|
+
fingerprint, so a base retrained in place re-shards instead of silently
|
|
54
|
+
training against stale weights.
|
|
55
|
+
- When the base cannot be page-locked, the RAM store falls back to pageable
|
|
56
|
+
memory **and says so**, including the measured cost (GPU utilisation
|
|
57
|
+
~97% → ~79%).
|
|
58
|
+
|
|
59
|
+
### Changed
|
|
60
|
+
|
|
61
|
+
- The pre-flight hardware-fit gate is skipped for streaming runs: it models a
|
|
62
|
+
resident run and would otherwise refuse exactly the runs streaming enables.
|
|
63
|
+
- Gradient checkpointing is handled per-layer by the streamer; the HF Trainer's
|
|
64
|
+
own is left off so layers are not recomputed twice.
|
|
65
|
+
|
|
66
|
+
### Known limitations
|
|
67
|
+
|
|
68
|
+
- **BETA, and proof-of-mechanism at 3B.** Nothing above 3B was measured. No
|
|
69
|
+
8B/14B claim is supported.
|
|
70
|
+
- Scope: RAM tier, bf16, `task: sft`, Llama/Qwen, batch size 1, no gradient
|
|
71
|
+
accumulation, no `--resume`. Every refusal names the release that lifts it.
|
|
72
|
+
- 4-bit (NF4) streaming is **v0.72.1** — NF4 weights carry a quantisation state
|
|
73
|
+
and cannot be byte-copied into a plain buffer.
|
|
74
|
+
- The disk overflow tier, larger batches, gradient accumulation and
|
|
75
|
+
checkpoint/resume are **v0.72.2**.
|
|
76
|
+
- The 3B number used a **pageable** store (this box cannot page-lock 5.55 GB),
|
|
77
|
+
so it is a lower bound.
|
|
78
|
+
- `expandable_segments:True` is silently ignored on Windows; Soup detects this
|
|
79
|
+
and does not claim it is active.
|
|
80
|
+
- Numbers are Windows/WDDM and therefore systematically pessimistic vs Linux.
|
|
81
|
+
|
|
15
82
|
## [0.71.41] - 2026-07-19
|
|
16
83
|
|
|
17
84
|
**`soup reward stress`: is your reward verifier gameable?** Turn the reward-hacking
|
|
@@ -116,11 +116,11 @@ src/soup_cli/
|
|
|
116
116
|
cans/ - Shareable .can artifact format + run/publish orchestrator (v0.26.0 + v0.33.0)
|
|
117
117
|
data/traces/ - Trace-to-Preference harvester (v0.26.0)
|
|
118
118
|
data/collators.py - CrossDocCollator for sample packing (v0.33.0)
|
|
119
|
-
utils/ - GPU, errors, MoE, GaLore, QAT, Unsloth, vLLM, SGLang, Liger, FlashAttn, FSDP, Ring Attention, long-context, quality, curriculum, freeze, dataset-registry, mlx, peft_builder, paths, topology, launcher, mii, pipeline, cut_ce, fp8, gradient_ckpt, kernel_picker, cross_doc_attn, activation_offload, hf, spec_pairing, structured_output, metrics, tracing, auto_quant, lr_finder, grad_accum, mixed_precision, warmup, spike_recovery, convergence, v028_features, multipack_sampler, multipack, neat_packing, jinja_analyzer, quant_menu, relora, peft_patches, peft_wiring, dpo_variants, optimizer_zoo, lr_groups, loftq_init, block_expansion, tts, classifier, distill, bitnet, ebft_gdpo, moe_quant, reasoning_effort, gguf_quant, kv_cache, advanced_precision, save_formats, deploy_measure, advise, advise_history, adapter_diff, adapter_merge, blame, adapter_branch, unlearning, unlearning_eval, knowledge_edit, edit_governor, edit_diff, ra_dit, steering, citation_faithful, grace_codebook, ingest_sources, prune_prompt, active_sampler, ab_test, drift_alarm, tunability, terraform_plan, env_lock, hardware_fit, completions, license_advisor, behavior_battery, capability_suite, checklist_dsl, irt, sae_diff, sleeper_probe, interference, probe_pack, cmaes_merge, vector_bank, mole_routing, adapter_pr, soup_lock, adapter_bisect, prompt_compile, prompt_distill, compile_tools, apple_adapter, local_rl, build_dag, expectations, magpie, persona_hub, brain_rot, reward_hacking, uld, minillm, rl_checkpoint, iterative_dpo, echo_trap, mod, local_rl_scheduler, spectrum_scan, ship_verdict, reward_hack_control, data_doctor, data_lint, shrink, best_of_n, evolve, reward_synth
|
|
119
|
+
utils/ - GPU, errors, MoE, GaLore, QAT, Unsloth, vLLM, SGLang, Liger, FlashAttn, FSDP, Ring Attention, long-context, quality, curriculum, freeze, dataset-registry, mlx, peft_builder, paths, topology, launcher, mii, pipeline, cut_ce, fp8, gradient_ckpt, kernel_picker, cross_doc_attn, activation_offload, hf, spec_pairing, structured_output, metrics, tracing, auto_quant, lr_finder, grad_accum, mixed_precision, warmup, spike_recovery, convergence, v028_features, multipack_sampler, multipack, neat_packing, jinja_analyzer, quant_menu, relora, peft_patches, peft_wiring, dpo_variants, optimizer_zoo, lr_groups, loftq_init, block_expansion, tts, classifier, distill, bitnet, ebft_gdpo, moe_quant, reasoning_effort, gguf_quant, kv_cache, advanced_precision, save_formats, deploy_measure, advise, advise_history, adapter_diff, adapter_merge, blame, adapter_branch, unlearning, unlearning_eval, knowledge_edit, edit_governor, edit_diff, ra_dit, steering, citation_faithful, grace_codebook, ingest_sources, prune_prompt, active_sampler, ab_test, drift_alarm, tunability, terraform_plan, env_lock, hardware_fit, completions, license_advisor, behavior_battery, capability_suite, checklist_dsl, irt, sae_diff, sleeper_probe, interference, probe_pack, cmaes_merge, vector_bank, mole_routing, adapter_pr, soup_lock, adapter_bisect, prompt_compile, prompt_distill, compile_tools, apple_adapter, local_rl, build_dag, expectations, magpie, persona_hub, brain_rot, reward_hacking, uld, minillm, rl_checkpoint, iterative_dpo, echo_trap, mod, local_rl_scheduler, spectrum_scan, ship_verdict, reward_hack_control, data_doctor, data_lint, shrink, best_of_n, evolve, reward_synth, reward_stress, layer_stream, layer_shard, layer_stream_runtime
|
|
120
120
|
templates/ - 21 built-in soup.yaml templates (YAML + manifest.json) with load_template loader (v0.39.0, +bco v0.40.0, +4 compliance v0.71.35)
|
|
121
121
|
ui/ - Web UI (FastAPI + HTML/JS SPA)
|
|
122
122
|
|
|
123
|
-
tests/ - Test suite (
|
|
123
|
+
tests/ - Test suite (324 files, 16735 tests)
|
|
124
124
|
examples/ - Real-world config examples and datasets
|
|
125
125
|
```
|
|
126
126
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: soup-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.72.0
|
|
4
4
|
Summary: Fine-tune and post-train LLMs in one command. No SSH, no config hell.
|
|
5
5
|
Project-URL: Homepage, https://github.com/MakazhanAlpamys/Soup
|
|
6
6
|
Project-URL: Repository, https://github.com/MakazhanAlpamys/Soup
|
|
@@ -193,25 +193,27 @@ infrastructure instead of improving models. Soup fixes that.
|
|
|
193
193
|
|
|
194
194
|
## What's New
|
|
195
195
|
|
|
196
|
-
**v0.
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
- **
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
`--
|
|
196
|
+
**v0.72.0 — Layer streaming (BETA).** Fine-tune models that don't fit in your card. The frozen
|
|
197
|
+
base streams from CPU RAM one decoder layer at a time into a small pool of VRAM buffers while the
|
|
198
|
+
LoRA adapters stay resident, so peak VRAM is bounded by one layer rather than the whole model.
|
|
199
|
+
**Qwen2.5-3B trains in 2.15 GB on a 4 GB card, where a resident run OOMs.**
|
|
200
|
+
|
|
201
|
+
- **`training.stream_layers: true`** — a config key, not a CLI flag. Tune with
|
|
202
|
+
`stream_source` (`ram` in v0.72.0; `disk` is v0.72.2) and `stream_buffers` (2–8, default 2).
|
|
203
|
+
- **Measured on a 4 GB RTX 3050 Laptop** (batch 1, gradient checkpointing on): 0.5B at
|
|
204
|
+
978.6 tok/s / 1.47 GB, 1.5B at 525.0 tok/s / 1.82 GB, 3B at 143.1 tok/s / 2.15 GB.
|
|
205
|
+
- **Honest cost: 1.43× slower than resident**, measured at 0.5B — the only apples-to-apples
|
|
206
|
+
comparison available on that box, because 1.5B and above cannot run resident there at all.
|
|
207
|
+
- **Proof-of-mechanism at 3B.** Nothing above 3B was measured; no 8B/14B claim is supported.
|
|
208
|
+
Scope: RAM tier, bf16, `task: sft`, Llama/Qwen, batch size 1, no gradient accumulation, no
|
|
209
|
+
`--resume`. 4-bit (NF4) streaming is **v0.72.1** and is refused with a clear message today.
|
|
210
210
|
|
|
211
|
-
```
|
|
212
|
-
#
|
|
213
|
-
|
|
214
|
-
#
|
|
211
|
+
```yaml
|
|
212
|
+
# soup.yaml — then just `soup train --config soup.yaml`
|
|
213
|
+
training:
|
|
214
|
+
stream_layers: true # base streams from RAM; only the adapter trains
|
|
215
|
+
batch_size: 1
|
|
216
|
+
quantization: none # NF4 streaming lands in v0.72.1
|
|
215
217
|
```
|
|
216
218
|
|
|
217
219
|
<details>
|
|
@@ -372,7 +374,7 @@ The full feature reference lives in [`docs/`](docs/). Start here:
|
|
|
372
374
|
|---|---|
|
|
373
375
|
| [Training tasks & methods](docs/training.md) | SFT, DPO/GRPO/PPO/KTO/ORPO/SimPO/IPO/BCO, tool-calling, PRM, pre-training, distillation, classification, vision/audio/TTS, unlearning, RAFT/RA-DIT, loop-hardening detectors |
|
|
374
376
|
| [PEFT, long context & efficiency](docs/peft-and-efficiency.md) | DoRA, LoRA+, rsLoRA, VeRA, OLoRA, NEFTune, PiSSA, ReLoRA, optimizer & PEFT zoo, LLaMA Pro, GaLore, YaRN/LongLoRA, packing, curriculum, auto-tuning |
|
|
375
|
-
| [Performance & quantization](docs/performance-and-quantization.md) | QAT, FP8, Quant Menu (I + II), KV-cache, NVFP4, save formats, Cut Cross-Entropy, gradient checkpointing, kernels, activation offloading, multi-GPU / DeepSpeed / FSDP |
|
|
377
|
+
| [Performance & quantization](docs/performance-and-quantization.md) | QAT, FP8, Quant Menu (I + II), KV-cache, NVFP4, save formats, Cut Cross-Entropy, gradient checkpointing, kernels, activation offloading, layer streaming, multi-GPU / DeepSpeed / FSDP |
|
|
376
378
|
| [Data engineering](docs/data.md) | Formats, the Axolotl/LF-parity pipeline, data tools, synthetic generation & forge, quality scorecards, trace tooling, remote datasets, mixing, recipe DAGs |
|
|
377
379
|
| [Evaluation & probes](docs/evaluation.md) | Eval design/gate, eval-gated training, benchmarks, NLG metrics, calibration, Elo arena, diagnose, post-train X-ray probes, A/B, drift, tunability, `soup advise` |
|
|
378
380
|
| [Serving & export](docs/serving-and-export.md) | OpenAI-compatible server, batch inference, benchmarking, merge/export, Anthropic Messages endpoint, speculative decoding (train + measure your own draft), deploy autopilot, Web UI, Agent Forge |
|
|
@@ -49,25 +49,27 @@ infrastructure instead of improving models. Soup fixes that.
|
|
|
49
49
|
|
|
50
50
|
## What's New
|
|
51
51
|
|
|
52
|
-
**v0.
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
- **
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
`--
|
|
52
|
+
**v0.72.0 — Layer streaming (BETA).** Fine-tune models that don't fit in your card. The frozen
|
|
53
|
+
base streams from CPU RAM one decoder layer at a time into a small pool of VRAM buffers while the
|
|
54
|
+
LoRA adapters stay resident, so peak VRAM is bounded by one layer rather than the whole model.
|
|
55
|
+
**Qwen2.5-3B trains in 2.15 GB on a 4 GB card, where a resident run OOMs.**
|
|
56
|
+
|
|
57
|
+
- **`training.stream_layers: true`** — a config key, not a CLI flag. Tune with
|
|
58
|
+
`stream_source` (`ram` in v0.72.0; `disk` is v0.72.2) and `stream_buffers` (2–8, default 2).
|
|
59
|
+
- **Measured on a 4 GB RTX 3050 Laptop** (batch 1, gradient checkpointing on): 0.5B at
|
|
60
|
+
978.6 tok/s / 1.47 GB, 1.5B at 525.0 tok/s / 1.82 GB, 3B at 143.1 tok/s / 2.15 GB.
|
|
61
|
+
- **Honest cost: 1.43× slower than resident**, measured at 0.5B — the only apples-to-apples
|
|
62
|
+
comparison available on that box, because 1.5B and above cannot run resident there at all.
|
|
63
|
+
- **Proof-of-mechanism at 3B.** Nothing above 3B was measured; no 8B/14B claim is supported.
|
|
64
|
+
Scope: RAM tier, bf16, `task: sft`, Llama/Qwen, batch size 1, no gradient accumulation, no
|
|
65
|
+
`--resume`. 4-bit (NF4) streaming is **v0.72.1** and is refused with a clear message today.
|
|
66
66
|
|
|
67
|
-
```
|
|
68
|
-
#
|
|
69
|
-
|
|
70
|
-
#
|
|
67
|
+
```yaml
|
|
68
|
+
# soup.yaml — then just `soup train --config soup.yaml`
|
|
69
|
+
training:
|
|
70
|
+
stream_layers: true # base streams from RAM; only the adapter trains
|
|
71
|
+
batch_size: 1
|
|
72
|
+
quantization: none # NF4 streaming lands in v0.72.1
|
|
71
73
|
```
|
|
72
74
|
|
|
73
75
|
<details>
|
|
@@ -228,7 +230,7 @@ The full feature reference lives in [`docs/`](docs/). Start here:
|
|
|
228
230
|
|---|---|
|
|
229
231
|
| [Training tasks & methods](docs/training.md) | SFT, DPO/GRPO/PPO/KTO/ORPO/SimPO/IPO/BCO, tool-calling, PRM, pre-training, distillation, classification, vision/audio/TTS, unlearning, RAFT/RA-DIT, loop-hardening detectors |
|
|
230
232
|
| [PEFT, long context & efficiency](docs/peft-and-efficiency.md) | DoRA, LoRA+, rsLoRA, VeRA, OLoRA, NEFTune, PiSSA, ReLoRA, optimizer & PEFT zoo, LLaMA Pro, GaLore, YaRN/LongLoRA, packing, curriculum, auto-tuning |
|
|
231
|
-
| [Performance & quantization](docs/performance-and-quantization.md) | QAT, FP8, Quant Menu (I + II), KV-cache, NVFP4, save formats, Cut Cross-Entropy, gradient checkpointing, kernels, activation offloading, multi-GPU / DeepSpeed / FSDP |
|
|
233
|
+
| [Performance & quantization](docs/performance-and-quantization.md) | QAT, FP8, Quant Menu (I + II), KV-cache, NVFP4, save formats, Cut Cross-Entropy, gradient checkpointing, kernels, activation offloading, layer streaming, multi-GPU / DeepSpeed / FSDP |
|
|
232
234
|
| [Data engineering](docs/data.md) | Formats, the Axolotl/LF-parity pipeline, data tools, synthetic generation & forge, quality scorecards, trace tooling, remote datasets, mixing, recipe DAGs |
|
|
233
235
|
| [Evaluation & probes](docs/evaluation.md) | Eval design/gate, eval-gated training, benchmarks, NLG metrics, calibration, Elo arena, diagnose, post-train X-ray probes, A/B, drift, tunability, `soup advise` |
|
|
234
236
|
| [Serving & export](docs/serving-and-export.md) | OpenAI-compatible server, batch inference, benchmarking, merge/export, Anthropic Messages endpoint, speculative decoding (train + measure your own draft), deploy autopilot, Web UI, Agent Forge |
|
|
@@ -7,8 +7,8 @@ running the most recent version from PyPI (`pip install -U soup-cli`).
|
|
|
7
7
|
|
|
8
8
|
| Version | Supported |
|
|
9
9
|
| ------- | ------------------ |
|
|
10
|
-
| 0.
|
|
11
|
-
| < 0.
|
|
10
|
+
| 0.72.x | :white_check_mark: |
|
|
11
|
+
| < 0.72 | :x: |
|
|
12
12
|
|
|
13
13
|
## Reporting a Vulnerability
|
|
14
14
|
|
|
@@ -9,7 +9,7 @@ feature reference — every `soup` capability, grouped by area.
|
|
|
9
9
|
|---|---|
|
|
10
10
|
| [Training tasks & methods](training.md) | SFT, DPO/GRPO/PPO/KTO/ORPO/SimPO/IPO/BCO, tool-calling, PRM, pre-training, distillation, classification, vision/audio/TTS, unlearning, RAFT/RA-DIT, loop-hardening detectors, reward-verifier synthesis |
|
|
11
11
|
| [PEFT, long context & efficiency](peft-and-efficiency.md) | DoRA, LoRA+, rsLoRA, VeRA, OLoRA, NEFTune, PiSSA, ReLoRA, optimizer & PEFT zoo, LLaMA Pro, GaLore, YaRN/LongLoRA, packing, curriculum, auto-tuning, depth pruning + distill-heal (`soup shrink`) |
|
|
12
|
-
| [Performance & quantization](performance-and-quantization.md) | QAT, FP8, Quant Menu (I + II), KV-cache, NVFP4, save formats, Cut Cross-Entropy, gradient checkpointing, kernels, activation offloading, multi-GPU / DeepSpeed / FSDP |
|
|
12
|
+
| [Performance & quantization](performance-and-quantization.md) | QAT, FP8, Quant Menu (I + II), KV-cache, NVFP4, save formats, Cut Cross-Entropy, gradient checkpointing, kernels, activation offloading, layer streaming, multi-GPU / DeepSpeed / FSDP |
|
|
13
13
|
| [Data engineering](data.md) | Formats, the Axolotl/LF-parity pipeline, data tools, synthetic generation & forge, quality scorecards, trace tooling, remote datasets, mixing, recipe DAGs |
|
|
14
14
|
| [Evaluation & probes](evaluation.md) | Eval design/gate, eval-gated training, benchmarks, NLG metrics, calibration, Elo arena, diagnose, `soup ship` verdict, post-train X-ray probes, A/B, drift, tunability, `soup advise` |
|
|
15
15
|
| [Serving & export](serving-and-export.md) | OpenAI-compatible server, batch inference, benchmarking, merge/export, Anthropic Messages endpoint, speculative decoding (train + measure your own draft), deploy autopilot, Web UI, Agent Forge |
|
|
@@ -30,6 +30,7 @@ soup merge-sharded-fsdp-weights ./shards -o merged.safetensors Consolidate FSDP
|
|
|
30
30
|
soup delinearize-llama4 ./src --target ./out [--num-experts N] [--plan-only] Live Llama-4 fused-expert reshape [E*din,dout] -> [E,din,dout] + sidecar copy (v0.71.21)
|
|
31
31
|
soup spectrum scan --model <id|path> --top-percent 50 [--modules mlp,attn] [-o patch.yaml] Spectrum SNR scan (no model load) -> training.unfrozen_parameters YAML patch (v0.71.23)
|
|
32
32
|
soup train --config sft.yaml # training.lisa_enabled: true [lisa_num_layers lisa_interval_steps] LISA layerwise importance sampling — full-FT quality at LoRA-like memory (sft/transformers/text/quantization=none) (v0.71.34)
|
|
33
|
+
soup train --config sft.yaml # training.stream_layers: true [stream_source stream_buffers] BETA layer streaming — the frozen base streams from CPU RAM one decoder layer at a time, so peak VRAM is bounded by ONE layer (sft/transformers/text/quantization=none, batch 1) (v0.72.0)
|
|
33
34
|
soup export --model ./output --format gguf Export to GGUF (Ollama)
|
|
34
35
|
soup export --model ./output --deploy ollama Export GGUF + auto-deploy to Ollama
|
|
35
36
|
soup export --model ./output --format onnx Export to ONNX
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
- [Cross-Document Attention Masking](#cross-document-attention-masking)
|
|
15
15
|
- [Quant Menu — 9 Quantization Formats](#quant-menu--9-quantization-formats)
|
|
16
16
|
- [Activation Offloading (Small-VRAM Large-Batch)](#activation-offloading-small-vram-large-batch)
|
|
17
|
+
- [Layer Streaming (BETA, v0.72.0)](#layer-streaming-beta-v0720)
|
|
17
18
|
- [Correctness First (v0.36.0)](#correctness-first-v0360)
|
|
18
19
|
- [Multi-GPU / DeepSpeed / FSDP](#multi-gpu--deepspeed--fsdp)
|
|
19
20
|
- [Performance + Long-Context](#performance--long-context)
|
|
@@ -225,6 +226,108 @@ training:
|
|
|
225
226
|
Not compatible with unsloth (own memory manager) or mlx. Wired across every transformer-backend trainer (SFT, DPO, GRPO, KTO, ORPO, SimPO, IPO, PPO, Reward-Model, Embedding, Pretrain).
|
|
226
227
|
|
|
227
228
|
|
|
229
|
+
## Layer Streaming (BETA, v0.72.0)
|
|
230
|
+
|
|
231
|
+
Stream frozen base-model decoder layers ONE at a time from CPU RAM into small VRAM buffers instead of keeping the whole base resident. Peak VRAM is bounded by the size of a single layer, not the entire model — so models that don't fit resident on your GPU can now train at all.
|
|
232
|
+
|
|
233
|
+
```yaml
|
|
234
|
+
training:
|
|
235
|
+
stream_layers: true # Enable layer streaming
|
|
236
|
+
stream_source: auto # 'auto' (same-host RAM), 'ram', 'disk' (v0.72.2)
|
|
237
|
+
stream_buffers: 2 # Double-buffering; range [2, 8]
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
```bash
|
|
241
|
+
# Layer streaming is a CONFIG key, not a CLI flag — just train normally:
|
|
242
|
+
soup train --config soup.yaml
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
**How it works.** LoRA adapters + their gradients + optimizer state stay resident in VRAM (they are small). The frozen base lives in CPU RAM, page-locked when the machine allows it, and is streamed: each decoder layer is copied into one of two pre-allocated VRAM buffers on a dedicated CUDA stream while the previous layer is still computing, so the load overlaps the compute. Each layer is read **twice** per step — once in the forward pass and once when the backward pass recomputes it — because `dL/dx = Wᵀ · dL/dy` needs the weights to reach the layers below. That is physics, not an implementation detail, and it is why streaming costs time.
|
|
246
|
+
|
|
247
|
+
The tradeoff: **1.43× slower than resident training**, measured at 0.5B — the only apples-to-apples comparison available on the reference box, because 1.5B and above cannot run resident there at all.
|
|
248
|
+
|
|
249
|
+
**Measured numbers (RTX 3050 Laptop 4 GB, Windows 11, bf16 LoRA, batch 1, 50 steps after 10 warmup):**
|
|
250
|
+
|
|
251
|
+
| Model | Seq Length | Throughput | GPU Util | Peak VRAM |
|
|
252
|
+
|---|---|---|---|---|
|
|
253
|
+
| Qwen2.5-0.5B | 512 | 978.6 tok/s | 91.4% | 1.47 GB |
|
|
254
|
+
| Qwen2.5-1.5B | 512 | 525.0 tok/s | 96.8% | 1.82 GB |
|
|
255
|
+
| Qwen2.5-1.5B | 1024 | 487.6 tok/s | 96.7% | 2.96 GB |
|
|
256
|
+
| Qwen2.5-3B | 512 | 143.1 tok/s | 79.3% | 2.15 GB |
|
|
257
|
+
|
|
258
|
+
**Headline:** Qwen2.5-3B trains in **2.15 GB** on a 4 GB card, where a resident run OOMs.
|
|
259
|
+
|
|
260
|
+
**Honest scope (v0.72.0 = proof-of-mechanism):**
|
|
261
|
+
- **Models measured:** Qwen2.5-0.5B, 1.5B and 3B, plus a live `soup train` on SmolLM2-135M. **Nothing above 3B was measured, and no 8B / 14B / 70B claim is supported.**
|
|
262
|
+
- **RAM tier only.** `stream_source: ram` (`auto` resolves to it). The disk overflow tier ships in **v0.72.2**.
|
|
263
|
+
- **Llama / Qwen only**, `task: sft`, `backend: transformers`, `modality: text`.
|
|
264
|
+
- **`batch_size: 1`**, no gradient accumulation, no `--resume` — all ship in **v0.72.2**.
|
|
265
|
+
- **bf16 base; `quantization: none` is required.** 4-bit (NF4) weights carry a quantisation state and cannot be byte-copied into a plain buffer, so NF4 streaming is **v0.72.1**. A `4bit` config is refused today with a message saying exactly that.
|
|
266
|
+
- **The 3B throughput is a LOWER BOUND.** The reference box could not page-lock the 5.55 GB base (its measured page-locked ceiling is 7.65 GB, and a CUDA context plus the model skeleton did not leave room), so that run fell back to a pageable store. Pageable memory makes the host-to-device copy synchronous, which costs overlap — visible as the GPU-utilisation drop from 96.8% (1.5B, pinned) to 79.3% (3B, pageable). Soup does this fallback automatically **and prints the cost** rather than absorbing it silently.
|
|
267
|
+
- Numbers are Windows/WDDM and therefore systematically pessimistic versus Linux. `expandable_segments:True` is silently ignored on Windows; Soup detects that and does not claim it is active.
|
|
268
|
+
|
|
269
|
+
**Rejected at config load (each names the release that lifts it):**
|
|
270
|
+
- `stream_source: disk` → the disk tier is v0.72.2
|
|
271
|
+
- `quantization` other than `none` → NF4 streaming is v0.72.1
|
|
272
|
+
- `backend: unsloth` / `backend: mlx` → streaming replaces the model-load path those backends own
|
|
273
|
+
- `task` other than `sft` → preference losses are v0.72.3
|
|
274
|
+
- `gradient_accumulation_steps > 1` → every micro-batch re-reads the whole base, so accumulation multiplies streaming IO linearly (v0.72.2)
|
|
275
|
+
- `batch_size` other than `1` → v0.72.2
|
|
276
|
+
- `lora.use_dora` / `lora.use_vera` / `lora.init_strategy` other than `random` → these initialise from the real base weight, which is on the meta device under streaming
|
|
277
|
+
- `unfrozen_parameters`, `lisa_enabled`, `packing`, `multipack`, `use_fsdp2_compile`, `train_router_only`, `expand_layers` → each independently rewrites or re-freezes the same layers
|
|
278
|
+
- `stream_source` / `stream_buffers` set while `stream_layers: false` → a footgun, refused
|
|
279
|
+
- an architecture outside `llama` / `qwen2` / `qwen3` → named explicitly, with the allowlist
|
|
280
|
+
|
|
281
|
+
**Config example:**
|
|
282
|
+
|
|
283
|
+
```yaml
|
|
284
|
+
base: Qwen/Qwen2.5-3B
|
|
285
|
+
task: sft
|
|
286
|
+
backend: transformers
|
|
287
|
+
|
|
288
|
+
data:
|
|
289
|
+
train: ./data.jsonl
|
|
290
|
+
format: alpaca
|
|
291
|
+
max_length: 512
|
|
292
|
+
val_split: 0.1
|
|
293
|
+
|
|
294
|
+
training:
|
|
295
|
+
epochs: 3
|
|
296
|
+
lr: 2e-5
|
|
297
|
+
batch_size: 1 # required; larger batches in v0.72.2
|
|
298
|
+
gradient_accumulation_steps: 1 # required; accumulation in v0.72.2
|
|
299
|
+
quantization: none # required; NF4 streaming is v0.72.1
|
|
300
|
+
gradient_checkpointing: true # handled per-layer by the streamer
|
|
301
|
+
stream_layers: true # Enable layer streaming
|
|
302
|
+
stream_source: auto # RAM-based (disk in v0.72.2)
|
|
303
|
+
stream_buffers: 2 # double-buffering
|
|
304
|
+
lora:
|
|
305
|
+
r: 64
|
|
306
|
+
alpha: 16
|
|
307
|
+
|
|
308
|
+
output: ./output
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
**Performance notes:**
|
|
312
|
+
- 1.43× slower than resident training, measured at 0.5B (the only size on the reference box where a resident baseline genuinely fits in 4 GB and is therefore a fair comparison).
|
|
313
|
+
- The 1.5B runs sit at ~97% GPU utilisation, i.e. compute-bound: with a page-locked store the layer loads hide almost completely behind compute. The 3B run's 79.3% is **not** a model-size effect — it is the cost of the pageable-store fallback on that particular box.
|
|
314
|
+
- Correctness is not a tradeoff: streamed and resident forward passes were verified **bit-exact**, and a 100-step streamed loss curve matched resident exactly. Streaming substitutes the same weight bytes into the same kernels.
|
|
315
|
+
|
|
316
|
+
**Troubleshooting:**
|
|
317
|
+
- **"layer streaming needs the base to fit in RAM"** — the base is larger than free RAM. Free RAM or pick a smaller base; the disk overflow tier is v0.72.2.
|
|
318
|
+
- **"could not page-lock the base … falling back to a PAGEABLE RAM store"** — expected on a busy machine. Training continues, more slowly. Close other applications to keep the pinned store.
|
|
319
|
+
- **"layer streaming does not support model_type=…"** — v0.72.0 covers Llama and Qwen only.
|
|
320
|
+
- **Slower than you expected** — layer streaming trades time for memory. If the model already fits resident on your card, do not enable it.
|
|
321
|
+
|
|
322
|
+
**Roadmap (each refusal names its release):**
|
|
323
|
+
- 4-bit (NF4) streaming — **v0.72.1**, the first genuinely useful capability jump
|
|
324
|
+
- Disk overflow tier, batch size > 1, gradient accumulation, checkpoint/resume, more architectures (Mistral / Gemma / Phi) — **v0.72.2**
|
|
325
|
+
- Preference losses (DPO / ORPO / SimPO / KTO) — **v0.72.3**. GRPO and PPO are explicitly **not** planned: rollouts need generation, which re-reads the model per token
|
|
326
|
+
- A published 14B-on-8 GB reference benchmark — hardware-blocked; it needs an 8 GB card and 32 GB of RAM, which the development box does not have
|
|
327
|
+
|
|
328
|
+
**Shard cache.** The first streaming run rewrites the checkpoint into one safetensors shard per decoder layer under `~/.soup/layer-stream/` (override with `SOUP_LAYER_STREAM_CACHE_DIR`). That costs disk space roughly equal to the base. The cache is keyed to a fingerprint of the source checkpoint, so a base retrained in place re-shards instead of silently training against stale weights.
|
|
329
|
+
|
|
330
|
+
|
|
228
331
|
## Correctness First (v0.36.0)
|
|
229
332
|
|
|
230
333
|
Four silent-failure modes Soup had → loud failures.
|
|
@@ -4,6 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
> SFT, DPO/GRPO/PPO/KTO/ORPO/SimPO/IPO/BCO, tool-calling, PRM, pre-training, distillation, classification, vision/audio/TTS, unlearning, RAFT/RA-DIT, and the loop-hardening detectors.
|
|
6
6
|
|
|
7
|
+
> **Training a model bigger than your GPU?** `training.stream_layers: true` streams the
|
|
8
|
+
> frozen base from CPU RAM one decoder layer at a time, so peak VRAM is bounded by one
|
|
9
|
+
> layer instead of the whole model —
|
|
10
|
+
> see [Layer Streaming](performance-and-quantization.md#layer-streaming-beta-v0720).
|
|
11
|
+
|
|
7
12
|
**Contents:**
|
|
8
13
|
|
|
9
14
|
- [Continual-learning rehearsal (`--replay`)](#continual-learning-rehearsal---replay)
|
|
@@ -692,6 +692,18 @@ def arithmetic(
|
|
|
692
692
|
output: str = typer.Option(
|
|
693
693
|
..., "--output", "-o", help="Output directory for the merged adapter"
|
|
694
694
|
),
|
|
695
|
+
rank: Optional[int] = typer.Option(
|
|
696
|
+
None,
|
|
697
|
+
"--rank",
|
|
698
|
+
min=1,
|
|
699
|
+
help=(
|
|
700
|
+
"Truncated-SVD rank cap. Passing it routes the merge through the "
|
|
701
|
+
"exact concat path and caps the output rank at N via SVD (works for "
|
|
702
|
+
"same-rank AND mixed-rank inputs). Without it, mixed-rank inputs keep "
|
|
703
|
+
"the full concatenated rank (Σ rᵢ) and same-rank inputs use the fast "
|
|
704
|
+
"element-wise path."
|
|
705
|
+
),
|
|
706
|
+
),
|
|
695
707
|
allow_unscanned: bool = typer.Option(
|
|
696
708
|
False,
|
|
697
709
|
"--allow-unscanned",
|
|
@@ -712,23 +724,29 @@ def arithmetic(
|
|
|
712
724
|
):
|
|
713
725
|
"""Task-vector arithmetic over LoRA adapters (add / scale / negate) (v0.71.34).
|
|
714
726
|
|
|
715
|
-
Applies task arithmetic (arXiv:2212.04089)
|
|
716
|
-
|
|
727
|
+
Applies task arithmetic (arXiv:2212.04089) to LoRA deltas. Same-rank adapters
|
|
728
|
+
take a fast element-wise path; mixed-rank adapters take an exact
|
|
729
|
+
concatenation path (#305) so ``B_out @ A_out = Σ cᵢ·(Bᵢ@Aᵢ)`` for any
|
|
730
|
+
per-adapter rank — pass ``--rank N`` to cap the concatenated rank via
|
|
731
|
+
truncated SVD. Example:
|
|
717
732
|
|
|
718
733
|
soup adapters arithmetic "coder + 0.5*math - toxic" \\
|
|
719
734
|
--adapter coder=./coder --adapter math=./math \\
|
|
720
735
|
--adapter toxic=./toxic -o ./merged
|
|
721
736
|
|
|
722
|
-
Exit 0 = success, 1 = any refusal (bad expression, unknown adapter,
|
|
737
|
+
Exit 0 = success, 1 = any refusal (bad expression, unknown adapter, shape
|
|
723
738
|
mismatch, cross-base without --allow-cross-base, scan FAIL, path escape).
|
|
724
739
|
"""
|
|
725
740
|
import re
|
|
726
741
|
|
|
727
742
|
from soup_cli.utils.adapter_arithmetic import (
|
|
728
743
|
ArithmeticReport,
|
|
744
|
+
_detect_lora_rank,
|
|
729
745
|
merge_task_arithmetic,
|
|
746
|
+
merge_task_arithmetic_concat,
|
|
730
747
|
parse_expression,
|
|
731
748
|
read_adapter_base,
|
|
749
|
+
read_adapter_lora_scaling,
|
|
732
750
|
)
|
|
733
751
|
from soup_cli.utils.adapter_diff import load_adapter_weights
|
|
734
752
|
from soup_cli.utils.adapter_merge import write_merged_adapter
|
|
@@ -849,19 +867,63 @@ def arithmetic(
|
|
|
849
867
|
console.print(f"[red]Could not load adapter weights: {escape(str(exc))}[/]")
|
|
850
868
|
raise typer.Exit(1) from exc
|
|
851
869
|
coeffs = [t.coeff for t in terms]
|
|
870
|
+
|
|
871
|
+
# Route: mixed-rank inputs (or an explicit --rank truncation) take the exact
|
|
872
|
+
# concat path (#305); same-rank inputs keep the fast element-wise path.
|
|
873
|
+
ranks = [_detect_lora_rank(w) for w in weights_list]
|
|
874
|
+
distinct_ranks = {r for r in ranks if r is not None}
|
|
875
|
+
use_concat = len(distinct_ranks) > 1 or rank is not None
|
|
876
|
+
config_overrides: Optional[dict[str, object]] = None
|
|
877
|
+
|
|
878
|
+
if use_concat:
|
|
879
|
+
# Bake each adapter's own decode-time scaling (lora_alpha/r) into its A
|
|
880
|
+
# block so a single-scaling output reproduces Σ cᵢ·(effective ΔWᵢ). Use
|
|
881
|
+
# an explicit `is None` fallback so a valid scaling of 0.0 (lora_alpha=0,
|
|
882
|
+
# r>0 — an intentionally zeroed task vector) is NOT silently promoted to
|
|
883
|
+
# 1.0 by `or`.
|
|
884
|
+
scalings = []
|
|
885
|
+
for n in referenced:
|
|
886
|
+
s = read_adapter_lora_scaling(mapping[n])
|
|
887
|
+
scalings.append(s if s is not None else 1.0)
|
|
888
|
+
try:
|
|
889
|
+
merged, skipped, new_rank = merge_task_arithmetic_concat(
|
|
890
|
+
weights_list, coeffs, scalings=scalings, rank=rank
|
|
891
|
+
)
|
|
892
|
+
except ValueError as exc:
|
|
893
|
+
console.print(f"[red]Merge failed: {escape(str(exc))}[/]")
|
|
894
|
+
raise typer.Exit(1) from exc
|
|
895
|
+
if not merged:
|
|
896
|
+
console.print(
|
|
897
|
+
"[red]No shared LoRA A/B pairs across the referenced adapters — "
|
|
898
|
+
"nothing to merge.[/]"
|
|
899
|
+
)
|
|
900
|
+
raise typer.Exit(1)
|
|
901
|
+
# Output is a single-scaling adapter: r == lora_alpha == new_rank. Clear
|
|
902
|
+
# any per-module rank_pattern/alpha_pattern (v0.39.0) carried over from
|
|
903
|
+
# the template source — the concat output is uniform-rank, so stale
|
|
904
|
+
# per-module overrides would mis-scale it.
|
|
905
|
+
config_overrides = {
|
|
906
|
+
"r": new_rank,
|
|
907
|
+
"lora_alpha": new_rank,
|
|
908
|
+
"rank_pattern": {},
|
|
909
|
+
"alpha_pattern": {},
|
|
910
|
+
}
|
|
911
|
+
else:
|
|
912
|
+
try:
|
|
913
|
+
merged, skipped = merge_task_arithmetic(weights_list, coeffs)
|
|
914
|
+
except ValueError as exc:
|
|
915
|
+
console.print(f"[red]Merge failed: {escape(str(exc))}[/]")
|
|
916
|
+
raise typer.Exit(1) from exc
|
|
917
|
+
if not merged:
|
|
918
|
+
console.print(
|
|
919
|
+
"[red]No shared LoRA tensors across the referenced adapters — "
|
|
920
|
+
"nothing to merge.[/]"
|
|
921
|
+
)
|
|
922
|
+
raise typer.Exit(1)
|
|
852
923
|
try:
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
console.print(f"[red]Merge failed: {escape(str(exc))}[/]")
|
|
856
|
-
raise typer.Exit(1) from exc
|
|
857
|
-
if not merged:
|
|
858
|
-
console.print(
|
|
859
|
-
"[red]No shared LoRA tensors across the referenced adapters — "
|
|
860
|
-
"nothing to merge.[/]"
|
|
924
|
+
write_merged_adapter(
|
|
925
|
+
output, ref_paths[0], merged, config_overrides=config_overrides
|
|
861
926
|
)
|
|
862
|
-
raise typer.Exit(1)
|
|
863
|
-
try:
|
|
864
|
-
write_merged_adapter(output, ref_paths[0], merged)
|
|
865
927
|
except (ValueError, RuntimeError, OSError) as exc:
|
|
866
928
|
console.print(f"[red]Could not write merged adapter: {escape(str(exc))}[/]")
|
|
867
929
|
raise typer.Exit(1) from exc
|
|
@@ -94,6 +94,14 @@ def _hardware_fit_preflight(cfg, gpu_info, *, allow_oom_attempt: bool) -> None:
|
|
|
94
94
|
statically predictable, so CI and small runs are unaffected. Honors the
|
|
95
95
|
documented ``--allow-oom-attempt`` opt-out.
|
|
96
96
|
"""
|
|
97
|
+
# v0.72.0 — layer streaming bounds peak VRAM by ONE decoder layer, so the
|
|
98
|
+
# resident prediction (full weights + optimizer + grads on the card) is the
|
|
99
|
+
# wrong model entirely: it refuses exactly the runs streaming exists to
|
|
100
|
+
# enable. The streaming path runs its own pre-flight instead (RAM-tier fit
|
|
101
|
+
# + the plan panel in _setup_streaming_transformers).
|
|
102
|
+
if getattr(cfg.training, "stream_layers", False):
|
|
103
|
+
return
|
|
104
|
+
|
|
97
105
|
total_bytes = 0
|
|
98
106
|
try:
|
|
99
107
|
total_bytes = int(gpu_info.get("memory_total_bytes", 0) or 0)
|
|
@@ -522,6 +530,17 @@ def train(
|
|
|
522
530
|
console.print(f"[red]{markup_escape(str(exc))}[/]")
|
|
523
531
|
raise typer.Exit(code=2) from exc
|
|
524
532
|
|
|
533
|
+
# --- v0.72.0 BETA — layer streaming does not support resume yet ---
|
|
534
|
+
# Silently ignoring --resume would restart from scratch and look like it
|
|
535
|
+
# worked, so refuse before any heavy work happens.
|
|
536
|
+
if resume and cfg.training.stream_layers:
|
|
537
|
+
console.print(
|
|
538
|
+
"[red]--resume is not supported with training.stream_layers in "
|
|
539
|
+
"v0.72.0[/] — checkpoint/resume for layer streaming lands in "
|
|
540
|
+
"v0.72.2. Drop --resume, or set stream_layers: false."
|
|
541
|
+
)
|
|
542
|
+
raise typer.Exit(code=2)
|
|
543
|
+
|
|
525
544
|
# --- RA-DIT generator-stage auto-link (v0.71.10 #200) ---
|
|
526
545
|
# When a generator stage has no retriever model set, splice in the latest
|
|
527
546
|
# RA-DIT retriever output from the Registry. A manual value always wins.
|