soup-cli 0.72.1__tar.gz → 0.72.2__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.72.2/.github/FUNDING.yml +7 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/CHANGELOG.md +73 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/CONTRIBUTING.md +1 -1
- {soup_cli-0.72.1 → soup_cli-0.72.2}/PKG-INFO +44 -28
- {soup_cli-0.72.1 → soup_cli-0.72.2}/README.md +43 -27
- {soup_cli-0.72.1 → soup_cli-0.72.2}/docs/commands.md +1 -1
- {soup_cli-0.72.1 → soup_cli-0.72.2}/docs/performance-and-quantization.md +32 -18
- {soup_cli-0.72.1 → soup_cli-0.72.2}/pyproject.toml +1 -1
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/__init__.py +1 -1
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/config/schema.py +8 -8
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/sft.py +73 -11
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/layer_shard.py +332 -7
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/layer_stream.py +56 -5
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/layer_stream_runtime.py +455 -24
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/reward_stress.py +9 -4
- soup_cli-0.72.2/tests/test_cli_startup_is_light.py +207 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_issue308_callback_subclass.py +12 -3
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07200.py +14 -9
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07201.py +2 -1
- soup_cli-0.72.2/tests/test_v07202.py +1770 -0
- soup_cli-0.72.1/.github/FUNDING.yml +0 -1
- {soup_cli-0.72.1 → soup_cli-0.72.2}/.dockerignore +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/.github/pull_request_template.md +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/.github/workflows/ci.yml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/.github/workflows/docker.yml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/.github/workflows/publish.yml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/.github/workflows/recipe-validation.yml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/.gitignore +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/.mailmap +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/.pre-commit-config.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/AGENTS.md +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/CODEOWNERS +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/CODE_OF_CONDUCT.md +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/CONTRIBUTORS.md +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/Dockerfile +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/LICENSE +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/NOTICE +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/SECURITY.md +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/docker-compose.yml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/docs/README.md +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/docs/adapters-and-governance.md +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/docs/backends-and-ops.md +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/docs/compliance.md +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/docs/data.md +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/docs/evaluation.md +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/docs/models.md +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/docs/peft-and-efficiency.md +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/docs/serving-and-export.md +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/docs/training.md +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/examples/README.md +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/examples/configs/dpo_chat.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/examples/configs/dpo_example.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/examples/configs/grpo_reasoning.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/examples/configs/rlhf_step1_sft.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/examples/configs/rlhf_step2_reward.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/examples/configs/rlhf_step3_ppo.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/examples/configs/sft_basic.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/examples/configs/vision_llama.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/examples/data/alpaca_tiny.jsonl +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/examples/data/chat_preferences.jsonl +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/examples/data/dpo_sample.jsonl +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/examples/data/reasoning_math.jsonl +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/examples/reward_hacking/rewards.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/examples/synthetic_workflow.md +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/examples/synthetic_workflow.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/soup.png +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/soup_logo_svg.svg +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/__main__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/autopilot/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/autopilot/analyzer.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/autopilot/decisions.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/autopilot/generate_config.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/cans/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/cans/pack.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/cans/publish.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/cans/run.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/cans/schema.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/cans/unpack.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/cans/verify.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/cli.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/cloud/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/cloud/modal.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/_eval_v0550.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/_eval_v0610.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/_eval_v0650.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/_eval_v07110.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/_webhook_cli.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/ab.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/active_sample.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/adapters.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/advise.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/agent.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/airgap.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/apple_adapter.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/attest.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/audit_log.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/autopilot.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/bench.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/bom.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/build.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/can.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/card.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/chat.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/ci.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/compile_cmd.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/compile_tools.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/completions.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/cost.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/data.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/data_canary.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/data_doctor.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/data_forge.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/data_mix.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/data_score.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/data_topics.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/delinearize_llama4.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/deploy.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/diagnose.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/diff.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/distill_prompt.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/doctor.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/draft.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/drift_alarm.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/edit.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/env.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/eval.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/expect.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/export.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/fetch.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/generate.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/history.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/infer.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/ingest.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/init.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/iterative_dpo.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/license_advisor.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/llama.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/local_rl.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/lock.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/loop.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/mcp.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/merge.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/migrate.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/monitor.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/plan.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/plugins.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/probe.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/profile.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/prune_prompt.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/push.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/quantize.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/quickstart.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/ra_dit.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/recipes.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/registry.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/reward.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/runs.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/serve.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/ship.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/shrink.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/spectrum.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/steer.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/sweep.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/tokenizer.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/train.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/tui.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/tunability.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/ui.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/commands/why.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/config/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/config/loader.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/_fixtures/gate/format_json.jsonl +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/_fixtures/gate/safety.jsonl +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/_fixtures/gate/tool_call.jsonl +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/augment.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/chat_templates.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/collators.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/formats.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/loader.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/loss_mask.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/providers/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/providers/_utils.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/providers/anthropic.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/providers/ollama.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/providers/vllm.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/sft_format.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/templates/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/templates/code.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/templates/conversation.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/templates/preference.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/templates/qa.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/templates/reasoning.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/templates/tool_calling.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/templates/verifiable.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/traces/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/traces/pair_builder.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/traces/parsers.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/traces/quality.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/data/validator.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/envs/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/envs/_common.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/envs/calculator.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/envs/guess_number.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/envs/retrieval_qa.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/eval/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/eval/arena.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/eval/calibrate.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/eval/custom.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/eval/forgetting.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/eval/gate.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/eval/gate_suites.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/eval/human.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/eval/judge.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/eval/leaderboard.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/eval/quant_check.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/experiment/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/experiment/tracker.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/mcp_server/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/mcp_server/registry.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/mcp_server/server.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/migrate/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/migrate/axolotl.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/migrate/common.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/migrate/llamafactory.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/migrate/unsloth.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/monitoring/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/monitoring/callback.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/monitoring/display.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/monitoring/hf_push.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/monitoring/plugin_callback.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/monitoring/trace_logger.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/plugins/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/py.typed +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/recipes/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/recipes/catalog.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/registry/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/registry/attach.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/registry/diff.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/registry/hashing.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/registry/store.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/audio.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/bco.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/chat.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/code.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/embedding.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/eu-ai-act.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/hipaa.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/ipo.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/kto.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/longcontext.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/manifest.json +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/medical.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/moe.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/orpo.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/pretrain.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/reasoning.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/rlhf.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/simpo.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/soc2.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/sr-11-7.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/tool-calling.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/templates/vision.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/asr.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/bco.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/bitnet.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/classifier.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/distill.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/dpo.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/embedding.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/grpo.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/ipo.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/kto.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/mlx_dpo.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/mlx_grpo.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/mlx_routing.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/mlx_sft.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/mole_routing.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/online_dpo.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/orpo.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/ppo.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/preference.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/pretrain.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/prm.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/raft.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/reward_model.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/rewards.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/simpo.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/tts.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/trainer/unlearn.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/tui_app.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/ui/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/ui/app.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/ui/plugins/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/ui/static/app.js +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/ui/static/index.html +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/ui/static/logo.png +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/ui/static/logo.svg +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/ui/static/style.css +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/_eval_text.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/ab_test.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/activation_offload.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/active_sampler.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/adapter_arithmetic.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/adapter_bisect.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/adapter_branch.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/adapter_diff.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/adapter_fuse.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/adapter_merge.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/adapter_pr.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/adapter_scan.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/adapter_sign.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/advanced_precision.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/advise.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/advise_history.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/agent_forge.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/agent_rollout.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/agent_sandbox.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/airgap_bundle.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/annex_xi.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/anthropic_messages.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/apple_adapter.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/asr_metrics.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/attest.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/audit_log.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/auto_quant.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/backend_detect.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/batch_probe.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/behavior_battery.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/best_of_n.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/bitnet.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/blame.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/block_expansion.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/bom.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/brain_rot.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/brain_rot_lang.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/build_dag.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/canary.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/canary_discovery.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/canary_router.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/capability_suite.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/checklist_dsl.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/ci_workflow.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/citation_faithful.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/classifier.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/cmaes_merge.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/compile_tools.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/completions.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/constants.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/convergence.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/crash.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/cross_doc_attn.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/curriculum.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/cut_ce.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/data_doctor.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/data_forge.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/data_lint.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/data_mix.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/data_pipeline.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/data_score.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/deepspeed.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/delinearize_llama4.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/demo_bundles.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/deploy_autopilot.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/deploy_measure.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/diagnose/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/diagnose/_common.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/diagnose/badge.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/diagnose/citation.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/diagnose/contamination.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/diagnose/format.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/diagnose/live.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/diagnose/memorization.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/diagnose/refusal.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/diagnose/report.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/diagnose/runner.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/distill.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/dpo_variants.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/draft.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/drift_alarm.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/ebft_gdpo.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/echo_trap.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/edit_diff.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/edit_governor.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/edit_kernels.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/embed.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/encoding.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/energy.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/env_lock.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/errors.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/eval_design.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/eval_gate_hook.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/evolve.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/expectations.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/fetch_examples.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/flash_attn.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/fp8.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/freeze.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/fsdp.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/galore.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/gguf_quant.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/gpu.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/gpu_monitor.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/grace_codebook.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/graceful_save.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/grad_accum.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/gradient_ckpt.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/grpo_long_context.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/grpo_variants.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/hardware_fit.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/harm_probe.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/hf.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/hf_space.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/hubs.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/ingest_sources.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/integrations.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/interference.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/interference_live.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/irt.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/iterative_dpo.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/jinja_analyzer.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/kernel_picker.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/knowledge_edit.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/kv_cache.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/launcher.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/license_advisor.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/license_matrix.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/liger.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/lisa.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/live_eval.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/llama_proxy.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/llama_server_timings.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/local_rl.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/loftq_init.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/log_level.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/long_context.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/longlora.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/loop_budget.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/loop_daemon.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/loop_iteration.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/loop_stages.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/loop_state.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/lr_finder.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/lr_groups.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/magpie.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/metrics.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/mii.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/minillm.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/mix_proxy.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/mixed_precision.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/mlx.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/mod.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/moe.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/moe_quant.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/mole_routing.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/multipack.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/multipack_sampler.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/multipack_trainer.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/namespace_pin.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/neat_packing.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/ngram_spec.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/nlg_metrics.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/ollama.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/onboarding.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/optimizer_zoo.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/paths.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/peft_builder.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/peft_patches.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/peft_wiring.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/persona_hub.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/pipeline.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/preference_combine.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/prm.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/prm_reward.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/probe_kernel.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/probe_pack.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/profiler.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/profiling.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/profiling_v0_43.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/prompt_compile.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/prompt_distill.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/prune_prompt.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/qat.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/qr_url.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/quality.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/quant_menu.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/ra_dit.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/ra_dit_run.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/raft.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/reasoning_effort.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/reasoning_parser.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/recipe_dag.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/recipe_run.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/registry.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/rehearsal.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/relora.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/replay.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/repro_receipt.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/reward_hack_control.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/reward_hacking.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/reward_synth.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/ring_attention.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/rl_checkpoint.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/run_cost.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/sae_diff.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/save_formats.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/semdedup.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/server_tools.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/sglang.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/ship_verdict.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/shortcuts.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/shrink.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/signing.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/sleeper_probe.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/soup_lock.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/spec_pairing.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/spectrum_scan.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/spike_recovery.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/sse_train_stream.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/steering.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/strict_safetensors.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/structured_output.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/sweep_config.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/tail_latency.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/terraform_plan.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/tool_outputs.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/topics.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/topology.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/tracing.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/trackers.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/train_event_buffer.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/trainer_plugins.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/trust_remote.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/truth_probe.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/tts.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/tts_codec.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/tunability.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/ui_env.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/uld.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/unlearn_kernels.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/unlearning.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/unlearning_eval.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/unsloth.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/v028_features.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/vector_bank.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/vllm.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/vscode_setup.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/warmup.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/webhooks.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/src/soup_cli/utils/why.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/templates/chat.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/templates/code.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/templates/medical.yaml +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/__init__.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/conftest.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/qa/v053_qa.md +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/qa/v07114_qa.md +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/qa/v0716_qa.md +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_adapters.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_advanced_peft.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_assistant_mask.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_audio.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_auto_tuning.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_autopilot.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_awq_gptq_export.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_batch_probe.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_bco.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_bench.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_brain_rot_multilingual.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_bugfixes.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_build_dag.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_callback.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_cans.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_chat.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_chat_template.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_cli.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_cli_subprocess.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_code_review_critical.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_code_review_deferred.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_code_review_high.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_code_review_medium_low.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_code_review_recurring.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_config.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_cost.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_crash_reporter.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_curriculum.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_data.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_data_augment.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_data_sample.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_data_split.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_data_tools.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_dataset_hub.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_dataset_registry.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_deepspeed.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_deploy_ollama.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_diff.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_display.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_doctor.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_dpo_example.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_dpo_variants.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_embedding.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_errors.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_eval.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_eval_gate.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_eval_platform.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_export.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_formats.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_fp8_recipe.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_freeze_training.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_generate.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_gpu.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_grpo.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_hf_integration.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_infer.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_inference_advanced.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_init.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_ipo.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_issue300_online_dpo_train.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_issue302_vision_pad_token.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_issue305_mixed_rank_arithmetic.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_jinja_analyzer.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_kto.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_loader.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_log_level.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_loss_watchdog.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_merge.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_migrate.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_mlx_backend.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_moe.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_multi_adapter.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_multi_gpu.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_multipack_config.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_multipack_invariants.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_multipack_sampler.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_neat_packing.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_neftune_rslora.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_onnx_tensorrt_export.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_orpo.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_packing.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_part_a_wave1.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_part_a_wave2.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_part_c.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_part_d.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_part_e.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_part_f_hardening.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_peft_methods.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_peft_patches.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_performance.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_pissa_init.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_ppo.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_preference_dispatcher.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_preference_multi.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_preference_multi_runtime.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_pretrain.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_profile.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_profiling.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_progress.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_push.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_qat.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_quality_filter.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_quant_check.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_quant_menu.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_quickstart.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_rank_pattern.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_recipes.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_recipes_v031.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_refusal_multilingual.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_registry.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_relora.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_replay.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_resume.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_review_fixes_v07133.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_rlvr.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_run_cost.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_runs.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_serve.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_server_generate.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_sglang_serve.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_simpo.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_smoke_train.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_speculative_decoding.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_sweep.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_synth_data_pro.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_templates_yaml.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_tensorboard.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_tool_calling.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_trace_to_pref.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_tracker.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_trainer_coverage_v035.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_trainer_init.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_training_intelligence.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_training_speed.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_trust_remote_code.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_tui.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_ui.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_ui_chat.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_ui_config_builder.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_ui_live_monitor.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_ui_metrics.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_unsloth.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0401_part_c.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0401_part_d.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0401_part_e.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0402_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0402_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0403_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0403_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0403_part_c.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0404_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0404_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0405_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0406_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0410_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0410_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0410_part_c.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0420.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0430_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0430_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0430_part_c.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0430_part_d.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0440_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0440_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0440_part_c.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0440_part_d.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0440_review_followups.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0450.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0460_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0460_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0470_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0470_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0480_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0480_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0490.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0500_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0500_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0500_part_c.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0500_part_d.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0500_part_e.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0510.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0520.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0530.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v05310.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v05311.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0531_109.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0531_139.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0531_142.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0531_82.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0532.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0533.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0534.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0535.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0536.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0537.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0538.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0539.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0540.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0550.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0550_followups.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0560.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0570_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0570_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0570_part_c.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0570_part_d.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0580.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0590.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0600_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0600_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0600_part_c.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0600_part_d.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0600_part_e.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0600_part_f.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0610_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0610_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0610_part_c.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0610_part_d.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0610_part_e.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0620_followups.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0620_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0620_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0620_part_c.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0620_part_d.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0620_part_e.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0630_followups.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0630_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0630_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0630_part_c.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0630_part_d.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0630_part_e.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0631_206.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0640_followups.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0640_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0640_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0640_part_c.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0640_part_d.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0640_part_e.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0640_part_f.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0650_followups.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0650_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0650_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0650_part_c.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0650_part_d.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0650_part_e.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0660_cli.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0660_followups.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0660_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0660_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0660_part_c.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0660_part_d.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0660_part_e.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0670_followups.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0670_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0670_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0670_part_c.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0670_part_d.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0670_part_e.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0670_part_f.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0680_followups.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0680_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0680_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0680_part_c.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0680_part_d.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0680_part_e.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0690_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0690_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0690_part_c.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0690_part_d.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0690_part_e.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0700_part_a.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0700_part_b.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0700_part_c.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0700_part_d.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0700_part_e.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0700_part_f.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07110.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07111.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07112.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07113.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07114.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07115.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07116.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07117.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07118.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07119.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0712.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07120.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07121.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07122.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07123.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07124.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07125.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07126.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07127.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07128.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07129.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0713.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07130.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07131.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07132.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07133.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07134.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07135.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07136.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07137.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07138.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07139.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0714.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07140.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v07141.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0715.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0716.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0717.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0718.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_v0719.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_validator.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_vision.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_vllm_serve.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_warmup.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_why.py +0 -0
- {soup_cli-0.72.1 → soup_cli-0.72.2}/tests/test_windows_encoding.py +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Sponsor button shown in the repo sidebar and on every issue / PR.
|
|
2
|
+
#
|
|
3
|
+
# `github:` only renders once the account is enrolled in GitHub Sponsors
|
|
4
|
+
# (https://github.com/sponsors) — it is not, so it stays commented out.
|
|
5
|
+
# github: MakazhanAlpamys
|
|
6
|
+
|
|
7
|
+
custom: ["https://buy.stripe.com/4gMcN441k3pha3T19ye7m04"]
|
|
@@ -12,6 +12,79 @@ reproducing 70+ versions of notes.
|
|
|
12
12
|
|
|
13
13
|
## [Unreleased]
|
|
14
14
|
|
|
15
|
+
## [0.72.2] - 2026-07-28
|
|
16
|
+
|
|
17
|
+
**Added — NF4 layer streaming: fine-tune Llama-3.1-8B on a 4 GB laptop GPU.**
|
|
18
|
+
|
|
19
|
+
Layer streaming (v0.72.0) keeps the frozen base in CPU RAM and streams it to the
|
|
20
|
+
GPU one decoder layer at a time, so peak VRAM is bounded by one layer instead of
|
|
21
|
+
the whole model. It was bf16-only, which capped it at about 3B on a small card.
|
|
22
|
+
Quantising the streamed base to NF4 shrinks it ~4×, and that is what brings 8B
|
|
23
|
+
within reach.
|
|
24
|
+
|
|
25
|
+
Add one line to a streaming config:
|
|
26
|
+
|
|
27
|
+
```yaml
|
|
28
|
+
training:
|
|
29
|
+
stream_layers: true
|
|
30
|
+
quantization: 4bit # NF4
|
|
31
|
+
batch_size: 1
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**Measured on a 4 GB RTX 3050 Laptop** (Windows, batch 1, S=512, gradient
|
|
35
|
+
checkpointing, 50 steps after 10 warm-up, `PagedAdamW8bit`):
|
|
36
|
+
|
|
37
|
+
| Model | tok/s | Peak VRAM | RAM store | GPU util |
|
|
38
|
+
|---|---|---|---|---|
|
|
39
|
+
| Llama-3.1-8B-Instruct | 119.6 | 3.32 GB | 3.60 GB (page-locked) | 100% |
|
|
40
|
+
| Qwen2.5-3B | 264.2 | 1.76 GB | 1.43 GB (page-locked) | 100% |
|
|
41
|
+
|
|
42
|
+
For scale: 1M training tokens is about 2.3 h at 8B on that card (arithmetic from
|
|
43
|
+
the measured rate, not a separate measurement).
|
|
44
|
+
|
|
45
|
+
Qwen2.5-3B also got **1.85× faster** than the bf16 streaming path (264.2 vs
|
|
46
|
+
143.1 tok/s) — and the reason is not arithmetic. A 1.43 GB store fits under the
|
|
47
|
+
machine's page-locked memory ceiling where a 5.55 GB one did not, which restores
|
|
48
|
+
asynchronous host-to-device copies and lifts GPU utilisation from 79.3% to 100%.
|
|
49
|
+
|
|
50
|
+
**Correctness.** A streamed NF4 run is **bit-exact** against a resident NF4 run:
|
|
51
|
+
the same quantised bytes through the same bitsandbytes kernels. Logit equality,
|
|
52
|
+
non-zero gradients at layer 0, and a matching multi-step loss curve are all
|
|
53
|
+
regression tests, not one-off measurements.
|
|
54
|
+
|
|
55
|
+
The base is quantised once, offline, and cached under `~/.soup/layer-stream/`.
|
|
56
|
+
The cache is keyed to the quantisation *and* the source checkpoint, so switching
|
|
57
|
+
between `none` and `4bit`, or retraining a base in place, re-shards instead of
|
|
58
|
+
silently streaming the wrong bytes.
|
|
59
|
+
|
|
60
|
+
**Fixed — a streamed 4-bit run reported its parameter count ~6.5× too high.**
|
|
61
|
+
SmolLM2-135M printed "878,154,048 total" (true: 134,515,008). Display only —
|
|
62
|
+
training was unaffected — but at 8B it would have read ~52 B.
|
|
63
|
+
|
|
64
|
+
Scope is unchanged and still BETA: RAM tier, `task: sft`, Llama/Qwen,
|
|
65
|
+
`batch_size: 1`, no gradient accumulation, no `--resume`. Every rejected config
|
|
66
|
+
names the release that lifts it. `quantization` values other than `none` and
|
|
67
|
+
`4bit` are refused.
|
|
68
|
+
|
|
69
|
+
**Fixed — `soup --help` was 5x slower than it should be.** Since v0.72.0 the CLI
|
|
70
|
+
imported PyTorch on startup, taking **6.0 s** where it now takes **1.15 s**.
|
|
71
|
+
|
|
72
|
+
`soup reward stress` (v0.71.41) put `utils/reward_stress` on the light CLI path.
|
|
73
|
+
That module imported `utils/reward_hack_control` to reuse a single string
|
|
74
|
+
constant — and `reward_hack_control` resolves its `TrainerCallback` base class at
|
|
75
|
+
module scope, which pulls in `transformers` and `torch`. Importing a ~4.4 s
|
|
76
|
+
dependency for one constant made every `soup` invocation pay for the training
|
|
77
|
+
stack, including commands that never touch a model.
|
|
78
|
+
|
|
79
|
+
Nothing produced wrong results; this was purely startup latency. The light core
|
|
80
|
+
(`pip install soup-cli` without the `[train]` extra) was never broken — it fell
|
|
81
|
+
back cleanly when torch was absent, just slowly when it was present.
|
|
82
|
+
|
|
83
|
+
Added `tests/test_cli_startup_is_light.py`, which asserts the invariant at
|
|
84
|
+
runtime (`import soup_cli.cli` must not put `torch` in `sys.modules`) instead of
|
|
85
|
+
inspecting source text for `import torch`, which is what the previous guards did
|
|
86
|
+
and why this went unnoticed.
|
|
87
|
+
|
|
15
88
|
## [0.72.1] - 2026-07-27
|
|
16
89
|
|
|
17
90
|
**Fixed — layer-streaming adapters were saved in an unloadable form.** If you
|
|
@@ -120,7 +120,7 @@ src/soup_cli/
|
|
|
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 (326 files, 16840 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.72.
|
|
3
|
+
Version: 0.72.2
|
|
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,41 +193,38 @@ infrastructure instead of improving models. Soup fixes that.
|
|
|
193
193
|
|
|
194
194
|
## What's New
|
|
195
195
|
|
|
196
|
-
**v0.72.
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
- **
|
|
203
|
-
|
|
204
|
-
- **
|
|
205
|
-
|
|
206
|
-
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
`stream_source` (`ram` today; `disk` is v0.72.3) and `stream_buffers` (2–8, default 2).
|
|
215
|
-
- **Measured on a 4 GB RTX 3050 Laptop** (batch 1, gradient checkpointing on): 0.5B at
|
|
216
|
-
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.
|
|
217
|
-
- **Honest cost: 1.43× slower than resident**, measured at 0.5B — the only apples-to-apples
|
|
218
|
-
comparison available on that box, because 1.5B and above cannot run resident there at all.
|
|
219
|
-
- **Proof-of-mechanism at 3B.** Nothing above 3B was measured; no 8B/14B claim is supported.
|
|
220
|
-
Scope: RAM tier, bf16, `task: sft`, Llama/Qwen, batch size 1, no gradient accumulation, no
|
|
221
|
-
`--resume`. 4-bit (NF4) streaming is **v0.72.2** and is refused with a clear message today.
|
|
196
|
+
**v0.72.2 — NF4 layer streaming: fine-tune Llama-3.1-8B on a 4 GB laptop GPU.** Layer
|
|
197
|
+
streaming keeps the frozen base in CPU RAM and feeds it to the GPU one decoder layer at a time.
|
|
198
|
+
Quantising that base to NF4 shrinks it ~4×, which is what puts an 8B model within reach of a
|
|
199
|
+
card that cannot hold even a quarter of it.
|
|
200
|
+
|
|
201
|
+
- **Measured on a 4 GB RTX 3050 Laptop** (batch 1, S=512, gradient checkpointing, 50 steps
|
|
202
|
+
after 10 warm-up): **Llama-3.1-8B-Instruct at 119.6 tok/s, peak VRAM 3.32 GB**, base
|
|
203
|
+
page-locked at 3.60 GB, GPU 100% busy. Qwen2.5-3B: 264.2 tok/s, 1.76 GB.
|
|
204
|
+
- **Just add `quantization: 4bit`** to a streaming config. The base is quantised once, offline,
|
|
205
|
+
and cached; the cache re-shards by itself if the checkpoint changes underneath it.
|
|
206
|
+
- **Correctness is not traded away.** A streamed NF4 run is **bit-exact** against a resident
|
|
207
|
+
NF4 run — same quantised bytes, same bitsandbytes kernels — and that is a CI test, not a
|
|
208
|
+
one-off measurement.
|
|
209
|
+
- **Why 3B got 1.85× faster too** (264.2 vs 143.1 tok/s in bf16): not arithmetic. A 1.43 GB
|
|
210
|
+
store page-locks where a 5.55 GB one did not, which restores asynchronous copies and takes
|
|
211
|
+
GPU utilisation from 79.3% to 100%.
|
|
212
|
+
- Still BETA, and the scope is unchanged: RAM tier, `task: sft`, Llama/Qwen, batch size 1, no
|
|
213
|
+
gradient accumulation, no `--resume`. Every refusal names the release that lifts it.
|
|
222
214
|
|
|
223
215
|
```yaml
|
|
224
216
|
# soup.yaml — then just `soup train --config soup.yaml`
|
|
225
217
|
training:
|
|
226
218
|
stream_layers: true # base streams from RAM; only the adapter trains
|
|
219
|
+
quantization: 4bit # NF4 — ~4x smaller store, so 8B fits a 4 GB card
|
|
227
220
|
batch_size: 1
|
|
228
|
-
quantization: none # NF4 streaming lands in v0.72.2
|
|
229
221
|
```
|
|
230
222
|
|
|
223
|
+
> **Trained with `stream_layers: true` on v0.72.0?** That adapter is inert — its tensors were
|
|
224
|
+
> saved under keys with an extra `.inner.` segment, so every loader returned the untuned base.
|
|
225
|
+
> Fixed in v0.72.1; re-run or re-save. Check with:
|
|
226
|
+
> `python -c "from safetensors.torch import load_file; print([k for k in load_file('adapter_model.safetensors') if '.inner.' in k][:3])"`
|
|
227
|
+
|
|
231
228
|
<details>
|
|
232
229
|
<summary>Previous release — v0.71.40, soup reward synth (generate a reward verifier from your data)</summary>
|
|
233
230
|
|
|
@@ -495,6 +492,25 @@ pre-commit install # optional: ruff lint+format on commit
|
|
|
495
492
|
See [CONTRIBUTING.md](CONTRIBUTING.md) for the full workflow and [SECURITY.md](SECURITY.md) to
|
|
496
493
|
report a vulnerability.
|
|
497
494
|
|
|
495
|
+
## Support Soup
|
|
496
|
+
|
|
497
|
+
Soup is Apache-2.0 and free — and stays that way. It is built and maintained in the open on a
|
|
498
|
+
single 4 GB laptop, which is why every performance number in these docs is measured rather than
|
|
499
|
+
claimed.
|
|
500
|
+
|
|
501
|
+
If Soup saved you a training run, [starring the repo](https://github.com/MakazhanAlpamys/Soup)
|
|
502
|
+
helps most, and it costs nothing. If you would like to fund the work directly:
|
|
503
|
+
|
|
504
|
+
**[❤️ Donate](https://buy.stripe.com/4gMcN441k3pha3T19ye7m04)** — one-off, any amount (use
|
|
505
|
+
*Change amount* on the checkout page). Payments are processed by Stripe under the maintainer's
|
|
506
|
+
registered business, **MePlay, Inc.** — that name, not "Soup", is what appears on the checkout
|
|
507
|
+
page and on your card statement.
|
|
508
|
+
|
|
509
|
+
Donations fund GPU time for the hardware-gated work — multi-GPU, 8B+ validation, Apple
|
|
510
|
+
Silicon — that a single 4 GB laptop cannot reach. See the
|
|
511
|
+
[`help wanted`](https://github.com/MakazhanAlpamys/Soup/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22)
|
|
512
|
+
issues for exactly what is blocked on hardware today.
|
|
513
|
+
|
|
498
514
|
## Contributors
|
|
499
515
|
|
|
500
516
|
Built by the community ❤️ — thank you to everyone who has contributed. See
|
|
@@ -49,41 +49,38 @@ infrastructure instead of improving models. Soup fixes that.
|
|
|
49
49
|
|
|
50
50
|
## What's New
|
|
51
51
|
|
|
52
|
-
**v0.72.
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
- **
|
|
59
|
-
|
|
60
|
-
- **
|
|
61
|
-
|
|
62
|
-
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
`stream_source` (`ram` today; `disk` is v0.72.3) and `stream_buffers` (2–8, default 2).
|
|
71
|
-
- **Measured on a 4 GB RTX 3050 Laptop** (batch 1, gradient checkpointing on): 0.5B at
|
|
72
|
-
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.
|
|
73
|
-
- **Honest cost: 1.43× slower than resident**, measured at 0.5B — the only apples-to-apples
|
|
74
|
-
comparison available on that box, because 1.5B and above cannot run resident there at all.
|
|
75
|
-
- **Proof-of-mechanism at 3B.** Nothing above 3B was measured; no 8B/14B claim is supported.
|
|
76
|
-
Scope: RAM tier, bf16, `task: sft`, Llama/Qwen, batch size 1, no gradient accumulation, no
|
|
77
|
-
`--resume`. 4-bit (NF4) streaming is **v0.72.2** and is refused with a clear message today.
|
|
52
|
+
**v0.72.2 — NF4 layer streaming: fine-tune Llama-3.1-8B on a 4 GB laptop GPU.** Layer
|
|
53
|
+
streaming keeps the frozen base in CPU RAM and feeds it to the GPU one decoder layer at a time.
|
|
54
|
+
Quantising that base to NF4 shrinks it ~4×, which is what puts an 8B model within reach of a
|
|
55
|
+
card that cannot hold even a quarter of it.
|
|
56
|
+
|
|
57
|
+
- **Measured on a 4 GB RTX 3050 Laptop** (batch 1, S=512, gradient checkpointing, 50 steps
|
|
58
|
+
after 10 warm-up): **Llama-3.1-8B-Instruct at 119.6 tok/s, peak VRAM 3.32 GB**, base
|
|
59
|
+
page-locked at 3.60 GB, GPU 100% busy. Qwen2.5-3B: 264.2 tok/s, 1.76 GB.
|
|
60
|
+
- **Just add `quantization: 4bit`** to a streaming config. The base is quantised once, offline,
|
|
61
|
+
and cached; the cache re-shards by itself if the checkpoint changes underneath it.
|
|
62
|
+
- **Correctness is not traded away.** A streamed NF4 run is **bit-exact** against a resident
|
|
63
|
+
NF4 run — same quantised bytes, same bitsandbytes kernels — and that is a CI test, not a
|
|
64
|
+
one-off measurement.
|
|
65
|
+
- **Why 3B got 1.85× faster too** (264.2 vs 143.1 tok/s in bf16): not arithmetic. A 1.43 GB
|
|
66
|
+
store page-locks where a 5.55 GB one did not, which restores asynchronous copies and takes
|
|
67
|
+
GPU utilisation from 79.3% to 100%.
|
|
68
|
+
- Still BETA, and the scope is unchanged: RAM tier, `task: sft`, Llama/Qwen, batch size 1, no
|
|
69
|
+
gradient accumulation, no `--resume`. Every refusal names the release that lifts it.
|
|
78
70
|
|
|
79
71
|
```yaml
|
|
80
72
|
# soup.yaml — then just `soup train --config soup.yaml`
|
|
81
73
|
training:
|
|
82
74
|
stream_layers: true # base streams from RAM; only the adapter trains
|
|
75
|
+
quantization: 4bit # NF4 — ~4x smaller store, so 8B fits a 4 GB card
|
|
83
76
|
batch_size: 1
|
|
84
|
-
quantization: none # NF4 streaming lands in v0.72.2
|
|
85
77
|
```
|
|
86
78
|
|
|
79
|
+
> **Trained with `stream_layers: true` on v0.72.0?** That adapter is inert — its tensors were
|
|
80
|
+
> saved under keys with an extra `.inner.` segment, so every loader returned the untuned base.
|
|
81
|
+
> Fixed in v0.72.1; re-run or re-save. Check with:
|
|
82
|
+
> `python -c "from safetensors.torch import load_file; print([k for k in load_file('adapter_model.safetensors') if '.inner.' in k][:3])"`
|
|
83
|
+
|
|
87
84
|
<details>
|
|
88
85
|
<summary>Previous release — v0.71.40, soup reward synth (generate a reward verifier from your data)</summary>
|
|
89
86
|
|
|
@@ -351,6 +348,25 @@ pre-commit install # optional: ruff lint+format on commit
|
|
|
351
348
|
See [CONTRIBUTING.md](CONTRIBUTING.md) for the full workflow and [SECURITY.md](SECURITY.md) to
|
|
352
349
|
report a vulnerability.
|
|
353
350
|
|
|
351
|
+
## Support Soup
|
|
352
|
+
|
|
353
|
+
Soup is Apache-2.0 and free — and stays that way. It is built and maintained in the open on a
|
|
354
|
+
single 4 GB laptop, which is why every performance number in these docs is measured rather than
|
|
355
|
+
claimed.
|
|
356
|
+
|
|
357
|
+
If Soup saved you a training run, [starring the repo](https://github.com/MakazhanAlpamys/Soup)
|
|
358
|
+
helps most, and it costs nothing. If you would like to fund the work directly:
|
|
359
|
+
|
|
360
|
+
**[❤️ Donate](https://buy.stripe.com/4gMcN441k3pha3T19ye7m04)** — one-off, any amount (use
|
|
361
|
+
*Change amount* on the checkout page). Payments are processed by Stripe under the maintainer's
|
|
362
|
+
registered business, **MePlay, Inc.** — that name, not "Soup", is what appears on the checkout
|
|
363
|
+
page and on your card statement.
|
|
364
|
+
|
|
365
|
+
Donations fund GPU time for the hardware-gated work — multi-GPU, 8B+ validation, Apple
|
|
366
|
+
Silicon — that a single 4 GB laptop cannot reach. See the
|
|
367
|
+
[`help wanted`](https://github.com/MakazhanAlpamys/Soup/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22)
|
|
368
|
+
issues for exactly what is blocked on hardware today.
|
|
369
|
+
|
|
354
370
|
## Contributors
|
|
355
371
|
|
|
356
372
|
Built by the community ❤️ — thank you to everyone who has contributed. See
|
|
@@ -30,7 +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
|
|
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; quantization: 4bit streams it as NF4, ~4x smaller (sft/transformers/text, batch 1) (v0.72.0; NF4 v0.72.2)
|
|
34
34
|
soup export --model ./output --format gguf Export to GGUF (Ollama)
|
|
35
35
|
soup export --model ./output --deploy ollama Export GGUF + auto-deploy to Ollama
|
|
36
36
|
soup export --model ./output --format onnx Export to ONNX
|
|
@@ -14,7 +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
|
+
- [Layer Streaming (BETA, v0.72.0; NF4 v0.72.2)](#layer-streaming-beta-v0720-nf4-v0722)
|
|
18
18
|
- [Correctness First (v0.36.0)](#correctness-first-v0360)
|
|
19
19
|
- [Multi-GPU / DeepSpeed / FSDP](#multi-gpu--deepspeed--fsdp)
|
|
20
20
|
- [Performance + Long-Context](#performance--long-context)
|
|
@@ -226,7 +226,7 @@ training:
|
|
|
226
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).
|
|
227
227
|
|
|
228
228
|
|
|
229
|
-
## Layer Streaming (BETA, v0.72.0)
|
|
229
|
+
## Layer Streaming (BETA, v0.72.0; NF4 v0.72.2)
|
|
230
230
|
|
|
231
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
232
|
|
|
@@ -246,29 +246,44 @@ soup train --config soup.yaml
|
|
|
246
246
|
|
|
247
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
248
|
|
|
249
|
-
|
|
249
|
+
### NF4 streaming (`quantization: 4bit`)
|
|
250
250
|
|
|
251
|
-
|
|
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 |
|
|
251
|
+
Quantising the streamed base to NF4 makes the RAM store ~4× smaller. That matters for two reasons, and the second is the bigger one:
|
|
257
252
|
|
|
258
|
-
|
|
253
|
+
1. A bigger model fits in host RAM at all — an 8B base is ~3.6 GB of NF4 instead of ~16 GB of bf16.
|
|
254
|
+
2. **The store fits under the machine's page-locked memory ceiling.** Pinned host memory is what lets `copy_(non_blocking=True)` actually overlap with compute. The reference box tops out at ~7.1 GB of page-locked memory, so a 5.55 GB bf16 3B base fell back to pageable and lost overlap; the 1.43 GB NF4 store pins, and utilisation goes from 79.3% to 100%.
|
|
259
255
|
|
|
260
|
-
**
|
|
261
|
-
|
|
256
|
+
The base is quantised **once, offline**, one tensor at a time, and cached. The shard cache is keyed to the quantisation, the dtype, the quantisation device and a fingerprint of the source checkpoint, so switching `none` ⇄ `4bit` — or retraining a base in place — re-shards rather than silently streaming the wrong bytes.
|
|
257
|
+
|
|
258
|
+
Correctness is not a tradeoff here either: a streamed NF4 run is **bit-exact** against a *resident* NF4 run (the same quantised bytes through the same bitsandbytes kernels), and that is a regression test, not a one-off measurement.
|
|
259
|
+
|
|
260
|
+
**Measured numbers (RTX 3050 Laptop 4 GB, Windows 11, LoRA, batch 1, 50 steps after 10 warmup):**
|
|
261
|
+
|
|
262
|
+
| Model | Quant | Seq | Throughput | GPU Util | Peak VRAM | RAM store |
|
|
263
|
+
|---|---|---|---|---|---|---|
|
|
264
|
+
| **Llama-3.1-8B-Instruct** | **NF4** | 512 | **119.6 tok/s** | 100% | **3.32 GB** | 3.60 GB pinned |
|
|
265
|
+
| Qwen2.5-3B | NF4 | 512 | 264.2 tok/s | 100% | 1.76 GB | 1.43 GB pinned |
|
|
266
|
+
| Qwen2.5-3B | bf16 | 512 | 143.1 tok/s | 79.3% | 2.15 GB | 5.55 GB pageable |
|
|
267
|
+
| Qwen2.5-1.5B | bf16 | 512 | 525.0 tok/s | 96.8% | 1.82 GB | pinned |
|
|
268
|
+
| Qwen2.5-1.5B | bf16 | 1024 | 487.6 tok/s | 96.7% | 2.96 GB | pinned |
|
|
269
|
+
| Qwen2.5-0.5B | bf16 | 512 | 978.6 tok/s | 91.4% | 1.47 GB | pinned |
|
|
270
|
+
|
|
271
|
+
**Headline:** **Llama-3.1-8B fine-tunes on a 4 GB card at 119.6 tok/s in 3.32 GB.** For scale, 1M training tokens is ~2.3 h at 8B (arithmetic from the measured rate, not a separate measurement).
|
|
272
|
+
|
|
273
|
+
The 3B NF4-vs-bf16 rows differ by 1.85×, but attribute that to **pinning, not arithmetic** — see point 2 above. The two rows also come from different sessions, and this card's boost clock varies ~13% between sessions, so treat the factor as indicative and the mechanism as the claim.
|
|
274
|
+
|
|
275
|
+
Untied `embed_tokens` + `lm_head` stay resident and unquantised (2.10 GB of the 8B row's 3.32 GB), which is why 8B sits close to this card's ceiling; treating them as streamed large layers is a v0.72.3 item.
|
|
276
|
+
|
|
277
|
+
**Honest scope:**
|
|
262
278
|
- **RAM tier only.** `stream_source: ram` (`auto` resolves to it). The disk overflow tier ships in **v0.72.3**.
|
|
263
279
|
- **Llama / Qwen only**, `task: sft`, `backend: transformers`, `modality: text`.
|
|
264
280
|
- **`batch_size: 1`**, no gradient accumulation, no `--resume` — all ship in **v0.72.3**.
|
|
265
|
-
- **bf16
|
|
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.
|
|
281
|
+
- **The bf16 3B throughput above 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. NF4 lifts this at 3B: the store drops under the ceiling and pins.
|
|
267
282
|
- 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
283
|
|
|
269
284
|
**Rejected at config load (each names the release that lifts it):**
|
|
270
285
|
- `stream_source: disk` → the disk tier is v0.72.3
|
|
271
|
-
- `quantization` other than `none` →
|
|
286
|
+
- `quantization` other than `none` or `4bit` → other formats cannot be streamed into a pooled buffer
|
|
272
287
|
- `backend: unsloth` / `backend: mlx` → streaming replaces the model-load path those backends own
|
|
273
288
|
- `task` other than `sft` → preference losses are v0.72.4
|
|
274
289
|
- `gradient_accumulation_steps > 1` → every micro-batch re-reads the whole base, so accumulation multiplies streaming IO linearly (v0.72.3)
|
|
@@ -296,7 +311,7 @@ training:
|
|
|
296
311
|
lr: 2e-5
|
|
297
312
|
batch_size: 1 # required; larger batches in v0.72.3
|
|
298
313
|
gradient_accumulation_steps: 1 # required; accumulation in v0.72.3
|
|
299
|
-
quantization:
|
|
314
|
+
quantization: 4bit # NF4 — ~4x smaller RAM store than bf16 (or `none`)
|
|
300
315
|
gradient_checkpointing: true # handled per-layer by the streamer
|
|
301
316
|
stream_layers: true # Enable layer streaming
|
|
302
317
|
stream_source: auto # RAM-based (disk in v0.72.3)
|
|
@@ -325,11 +340,10 @@ output: ./output
|
|
|
325
340
|
**Troubleshooting:**
|
|
326
341
|
- **"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.3.
|
|
327
342
|
- **"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.
|
|
328
|
-
- **"layer streaming does not support model_type=…"** —
|
|
343
|
+
- **"layer streaming does not support model_type=…"** — Llama and Qwen only for now; more architectures land in v0.72.3.
|
|
329
344
|
- **Slower than you expected** — layer streaming trades time for memory. If the model already fits resident on your card, do not enable it.
|
|
330
345
|
|
|
331
346
|
**Roadmap (each refusal names its release):**
|
|
332
|
-
- 4-bit (NF4) streaming — **v0.72.2**, the first genuinely useful capability jump
|
|
333
347
|
- Disk overflow tier, batch size > 1, gradient accumulation, checkpoint/resume, more architectures (Mistral / Gemma / Phi) — **v0.72.3**
|
|
334
348
|
- Preference losses (DPO / ORPO / SimPO / KTO) — **v0.72.4**. GRPO and PPO are explicitly **not** planned: rollouts need generation, which re-reads the model per token
|
|
335
349
|
- 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
|
|
@@ -4660,7 +4660,7 @@ class SoupConfig(BaseModel):
|
|
|
4660
4660
|
return self
|
|
4661
4661
|
if self.task != "sft":
|
|
4662
4662
|
raise ValueError(
|
|
4663
|
-
f"training.stream_layers requires task='sft'
|
|
4663
|
+
f"training.stream_layers requires task='sft'; got "
|
|
4664
4664
|
f"task={self.task!r}. Preference losses (DPO/ORPO/SimPO/KTO) "
|
|
4665
4665
|
f"land in v0.72.4."
|
|
4666
4666
|
)
|
|
@@ -4675,21 +4675,21 @@ class SoupConfig(BaseModel):
|
|
|
4675
4675
|
f"training.stream_layers requires modality='text'; got "
|
|
4676
4676
|
f"modality={self.modality!r}."
|
|
4677
4677
|
)
|
|
4678
|
-
if tcfg.quantization
|
|
4678
|
+
if tcfg.quantization not in ("none", "4bit"):
|
|
4679
4679
|
raise ValueError(
|
|
4680
|
-
f"training.stream_layers
|
|
4681
|
-
f"
|
|
4682
|
-
f"
|
|
4683
|
-
f"
|
|
4680
|
+
f"training.stream_layers supports quantization='none' or "
|
|
4681
|
+
f"'4bit' (NF4); got {tcfg.quantization!r}. Other quantisations "
|
|
4682
|
+
f"store weights in formats that cannot be streamed into a "
|
|
4683
|
+
f"pooled buffer."
|
|
4684
4684
|
)
|
|
4685
4685
|
if tcfg.stream_source == "disk":
|
|
4686
4686
|
raise ValueError(
|
|
4687
|
-
"training.stream_source='disk' is not implemented
|
|
4687
|
+
"training.stream_source='disk' is not implemented yet — "
|
|
4688
4688
|
"the disk overflow tier lands in v0.72.3. Use 'ram' or 'auto'."
|
|
4689
4689
|
)
|
|
4690
4690
|
if tcfg.batch_size != 1:
|
|
4691
4691
|
raise ValueError(
|
|
4692
|
-
f"training.stream_layers requires batch_size=1
|
|
4692
|
+
f"training.stream_layers requires batch_size=1 (got "
|
|
4693
4693
|
f"{tcfg.batch_size!r}); larger batches land in v0.72.3."
|
|
4694
4694
|
)
|
|
4695
4695
|
if tcfg.gradient_accumulation_steps != 1:
|
|
@@ -228,6 +228,15 @@ class SFTTrainerWrapper:
|
|
|
228
228
|
p.numel() for p in self.model.parameters() if p.requires_grad
|
|
229
229
|
)
|
|
230
230
|
total = sum(p.numel() for p in self.model.parameters())
|
|
231
|
+
# v0.72.2 — under NF4 streaming PEFT's total is wrong by ~6.5x. It
|
|
232
|
+
# special-cases Params4bit as `numel * 2 * quant_storage.itemsize`,
|
|
233
|
+
# which is right for a RESIDENT one (whose numel is the packed count)
|
|
234
|
+
# but not for our `meta` placeholder, which still carries the LOGICAL
|
|
235
|
+
# shape. Measured on SmolLM2-135M: 878,154,048 vs a true 134,515,008.
|
|
236
|
+
# The sharder counted the real source elements, so use that.
|
|
237
|
+
stream_total = getattr(getattr(self, "_stream_runtime", None), "total_params", 0)
|
|
238
|
+
if stream_total:
|
|
239
|
+
total = stream_total
|
|
231
240
|
pct = 100 * trainable / total if total else 0.0
|
|
232
241
|
label = (
|
|
233
242
|
"Spectrum targeted FT" if tcfg.unfrozen_parameters else "LoRA applied"
|
|
@@ -969,6 +978,8 @@ class SFTTrainerWrapper:
|
|
|
969
978
|
from transformers import AutoConfig, AutoTokenizer
|
|
970
979
|
|
|
971
980
|
from soup_cli.utils.layer_shard import (
|
|
981
|
+
QUANT_NF4,
|
|
982
|
+
QUANT_NONE,
|
|
972
983
|
resolve_shard_dir,
|
|
973
984
|
shard_checkpoint,
|
|
974
985
|
source_weight_bytes,
|
|
@@ -978,14 +989,18 @@ class SFTTrainerWrapper:
|
|
|
978
989
|
TIER_RAM,
|
|
979
990
|
build_stream_plan,
|
|
980
991
|
dtype_bytes,
|
|
992
|
+
estimate_stream_store_bytes,
|
|
981
993
|
free_ram_bytes,
|
|
982
994
|
render_stream_panel,
|
|
983
995
|
stream_arch_of,
|
|
984
996
|
)
|
|
985
997
|
from soup_cli.utils.layer_stream_runtime import (
|
|
986
998
|
RamSource,
|
|
999
|
+
build_meta_skeleton,
|
|
987
1000
|
build_streamed_model,
|
|
1001
|
+
extras_resident_bytes,
|
|
988
1002
|
probe_expandable_segments,
|
|
1003
|
+
quantised_layer_suffixes,
|
|
989
1004
|
)
|
|
990
1005
|
from soup_cli.utils.spectrum_scan import resolve_model_weights
|
|
991
1006
|
|
|
@@ -1006,35 +1021,81 @@ class SFTTrainerWrapper:
|
|
|
1006
1021
|
on_cuda = str(self.device).startswith("cuda")
|
|
1007
1022
|
dtype = "bfloat16" if on_cuda else "float32"
|
|
1008
1023
|
|
|
1024
|
+
# v0.72.2 — NF4. The decoder linears ship as packed nibbles + per-block
|
|
1025
|
+
# absmax, so the RAM store is ~0.26x its bf16 size; embeddings, norms and
|
|
1026
|
+
# an untied head stay at `dtype`, exactly as replace_with_bnb_linear
|
|
1027
|
+
# leaves them.
|
|
1028
|
+
quant = QUANT_NF4 if tcfg.quantization == "4bit" else QUANT_NONE
|
|
1029
|
+
|
|
1009
1030
|
weights_dir = resolve_model_weights(cfg.base)
|
|
1010
1031
|
shard_dir = resolve_shard_dir(cfg.base)
|
|
1011
1032
|
|
|
1012
1033
|
# Cheap size probe BEFORE sharding: re-writing a checkpoint we are
|
|
1013
1034
|
# about to refuse for not fitting in RAM costs minutes of disk I/O.
|
|
1035
|
+
# Charged at the STREAMED rate, not the on-disk one — an 8B bf16
|
|
1036
|
+
# checkpoint is 16 GB on disk but only ~4.2 GB of NF4 store, and
|
|
1037
|
+
# comparing the raw file size would refuse exactly the runs NF4 enables.
|
|
1014
1038
|
early_free_ram = free_ram_bytes()
|
|
1015
1039
|
if early_free_ram is not None:
|
|
1016
1040
|
source_bytes = source_weight_bytes(weights_dir)
|
|
1017
|
-
|
|
1041
|
+
store_estimate = estimate_stream_store_bytes(
|
|
1042
|
+
source_bytes, dtype=dtype, quant=quant
|
|
1043
|
+
)
|
|
1044
|
+
if store_estimate >= early_free_ram * RAM_TIER_HEADROOM:
|
|
1045
|
+
as_streamed = (
|
|
1046
|
+
""
|
|
1047
|
+
if quant == QUANT_NONE
|
|
1048
|
+
else f" ({store_estimate / 1e9:.1f} GB once quantised to NF4)"
|
|
1049
|
+
)
|
|
1018
1050
|
raise ValueError(
|
|
1019
1051
|
f"layer streaming needs the base to fit in RAM: {cfg.base} is "
|
|
1020
|
-
f"{source_bytes / 1e9:.1f} GB on disk and only "
|
|
1052
|
+
f"{source_bytes / 1e9:.1f} GB on disk{as_streamed} and only "
|
|
1021
1053
|
f"{early_free_ram / 1e9:.1f} GB of RAM is free. The disk "
|
|
1022
1054
|
f"overflow tier lands in v0.72.3 — free RAM or pick a "
|
|
1023
1055
|
f"smaller base."
|
|
1024
1056
|
)
|
|
1025
1057
|
|
|
1026
|
-
|
|
1027
|
-
|
|
1058
|
+
# The authoritative list of weights to quantise is whatever
|
|
1059
|
+
# replace_with_bnb_linear actually converts, read off a meta skeleton —
|
|
1060
|
+
# not a hard-coded name list that would drift per architecture.
|
|
1061
|
+
#
|
|
1062
|
+
# This builds a second, throwaway skeleton (build_streamed_model makes
|
|
1063
|
+
# its own). Deliberate: a meta skeleton allocates NO weight storage, so
|
|
1064
|
+
# the cost is module-tree construction only, and threading a pre-built
|
|
1065
|
+
# model into build_streamed_model would couple suffix discovery to model
|
|
1066
|
+
# construction for no memory saving.
|
|
1067
|
+
quant_suffixes = ()
|
|
1068
|
+
if quant == QUANT_NF4:
|
|
1069
|
+
probe = build_meta_skeleton(
|
|
1070
|
+
cfg.base,
|
|
1071
|
+
dtype=dtype,
|
|
1072
|
+
quant=quant,
|
|
1073
|
+
trust_remote_code=self._trust_remote_code,
|
|
1074
|
+
)
|
|
1075
|
+
quant_suffixes = quantised_layer_suffixes(probe)
|
|
1076
|
+
del probe
|
|
1028
1077
|
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1078
|
+
console.print(f"[dim]Preparing layer shards -> {shard_dir}[/]")
|
|
1079
|
+
index = shard_checkpoint(
|
|
1080
|
+
weights_dir,
|
|
1081
|
+
shard_dir,
|
|
1082
|
+
dtype=dtype,
|
|
1083
|
+
arch=arch,
|
|
1084
|
+
quant=quant,
|
|
1085
|
+
quant_suffixes=quant_suffixes,
|
|
1086
|
+
# Quantise on the device that will run the model: CPU and CUDA agree
|
|
1087
|
+
# on the packed nibbles but not on every float32 nested statistic.
|
|
1088
|
+
quant_device=str(self.device),
|
|
1033
1089
|
)
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1090
|
+
|
|
1091
|
+
spec = RamSource.spec_from_shard(shard_dir)
|
|
1092
|
+
# Measured from the shard headers, not derived from `total_params`:
|
|
1093
|
+
# under NF4 a layer holds packed uint8 alongside float32 statistics, so
|
|
1094
|
+
# element counts no longer convert to bytes at a single rate.
|
|
1095
|
+
layer_bytes = sum(
|
|
1096
|
+
math.prod(shape) * dtype_bytes(stored) for shape, stored in spec.values()
|
|
1037
1097
|
)
|
|
1098
|
+
embed_bytes = extras_resident_bytes(shard_dir)
|
|
1038
1099
|
|
|
1039
1100
|
free_ram = free_ram_bytes()
|
|
1040
1101
|
if free_ram is None:
|
|
@@ -1101,6 +1162,7 @@ class SFTTrainerWrapper:
|
|
|
1101
1162
|
seed=tcfg.seed if getattr(tcfg, "seed", None) is not None else 0,
|
|
1102
1163
|
trust_remote_code=self._trust_remote_code,
|
|
1103
1164
|
console=console,
|
|
1165
|
+
quant=quant,
|
|
1104
1166
|
)
|
|
1105
1167
|
self.model = model
|
|
1106
1168
|
self._stream_runtime = runtime
|