soup-cli 0.72.2__tar.gz → 0.72.3__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.
Files changed (916) hide show
  1. {soup_cli-0.72.2 → soup_cli-0.72.3}/CHANGELOG.md +65 -0
  2. {soup_cli-0.72.2 → soup_cli-0.72.3}/CONTRIBUTING.md +1 -1
  3. {soup_cli-0.72.2 → soup_cli-0.72.3}/PKG-INFO +27 -24
  4. {soup_cli-0.72.2 → soup_cli-0.72.3}/README.md +23 -20
  5. {soup_cli-0.72.2 → soup_cli-0.72.3}/docs/commands.md +2 -2
  6. {soup_cli-0.72.2 → soup_cli-0.72.3}/docs/performance-and-quantization.md +69 -14
  7. {soup_cli-0.72.2 → soup_cli-0.72.3}/docs/training.md +4 -3
  8. {soup_cli-0.72.2 → soup_cli-0.72.3}/pyproject.toml +9 -2
  9. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/__init__.py +1 -1
  10. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/doctor.py +37 -2
  11. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/train.py +7 -17
  12. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/config/schema.py +24 -17
  13. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/sft.py +208 -17
  14. soup_cli-0.72.3/src/soup_cli/utils/layer_stream.py +844 -0
  15. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/layer_stream_runtime.py +272 -6
  16. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07200.py +52 -26
  17. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07201.py +34 -33
  18. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07202.py +42 -6
  19. soup_cli-0.72.3/tests/test_v07203.py +1386 -0
  20. soup_cli-0.72.2/src/soup_cli/utils/layer_stream.py +0 -401
  21. {soup_cli-0.72.2 → soup_cli-0.72.3}/.dockerignore +0 -0
  22. {soup_cli-0.72.2 → soup_cli-0.72.3}/.github/FUNDING.yml +0 -0
  23. {soup_cli-0.72.2 → soup_cli-0.72.3}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  24. {soup_cli-0.72.2 → soup_cli-0.72.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  25. {soup_cli-0.72.2 → soup_cli-0.72.3}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  26. {soup_cli-0.72.2 → soup_cli-0.72.3}/.github/pull_request_template.md +0 -0
  27. {soup_cli-0.72.2 → soup_cli-0.72.3}/.github/workflows/ci.yml +0 -0
  28. {soup_cli-0.72.2 → soup_cli-0.72.3}/.github/workflows/docker.yml +0 -0
  29. {soup_cli-0.72.2 → soup_cli-0.72.3}/.github/workflows/publish.yml +0 -0
  30. {soup_cli-0.72.2 → soup_cli-0.72.3}/.github/workflows/recipe-validation.yml +0 -0
  31. {soup_cli-0.72.2 → soup_cli-0.72.3}/.gitignore +0 -0
  32. {soup_cli-0.72.2 → soup_cli-0.72.3}/.mailmap +0 -0
  33. {soup_cli-0.72.2 → soup_cli-0.72.3}/.pre-commit-config.yaml +0 -0
  34. {soup_cli-0.72.2 → soup_cli-0.72.3}/AGENTS.md +0 -0
  35. {soup_cli-0.72.2 → soup_cli-0.72.3}/CODEOWNERS +0 -0
  36. {soup_cli-0.72.2 → soup_cli-0.72.3}/CODE_OF_CONDUCT.md +0 -0
  37. {soup_cli-0.72.2 → soup_cli-0.72.3}/CONTRIBUTORS.md +0 -0
  38. {soup_cli-0.72.2 → soup_cli-0.72.3}/Dockerfile +0 -0
  39. {soup_cli-0.72.2 → soup_cli-0.72.3}/LICENSE +0 -0
  40. {soup_cli-0.72.2 → soup_cli-0.72.3}/NOTICE +0 -0
  41. {soup_cli-0.72.2 → soup_cli-0.72.3}/SECURITY.md +0 -0
  42. {soup_cli-0.72.2 → soup_cli-0.72.3}/docker-compose.yml +0 -0
  43. {soup_cli-0.72.2 → soup_cli-0.72.3}/docs/README.md +0 -0
  44. {soup_cli-0.72.2 → soup_cli-0.72.3}/docs/adapters-and-governance.md +0 -0
  45. {soup_cli-0.72.2 → soup_cli-0.72.3}/docs/backends-and-ops.md +0 -0
  46. {soup_cli-0.72.2 → soup_cli-0.72.3}/docs/compliance.md +0 -0
  47. {soup_cli-0.72.2 → soup_cli-0.72.3}/docs/data.md +0 -0
  48. {soup_cli-0.72.2 → soup_cli-0.72.3}/docs/evaluation.md +0 -0
  49. {soup_cli-0.72.2 → soup_cli-0.72.3}/docs/models.md +0 -0
  50. {soup_cli-0.72.2 → soup_cli-0.72.3}/docs/peft-and-efficiency.md +0 -0
  51. {soup_cli-0.72.2 → soup_cli-0.72.3}/docs/serving-and-export.md +0 -0
  52. {soup_cli-0.72.2 → soup_cli-0.72.3}/examples/README.md +0 -0
  53. {soup_cli-0.72.2 → soup_cli-0.72.3}/examples/configs/dpo_chat.yaml +0 -0
  54. {soup_cli-0.72.2 → soup_cli-0.72.3}/examples/configs/dpo_example.yaml +0 -0
  55. {soup_cli-0.72.2 → soup_cli-0.72.3}/examples/configs/grpo_reasoning.yaml +0 -0
  56. {soup_cli-0.72.2 → soup_cli-0.72.3}/examples/configs/rlhf_step1_sft.yaml +0 -0
  57. {soup_cli-0.72.2 → soup_cli-0.72.3}/examples/configs/rlhf_step2_reward.yaml +0 -0
  58. {soup_cli-0.72.2 → soup_cli-0.72.3}/examples/configs/rlhf_step3_ppo.yaml +0 -0
  59. {soup_cli-0.72.2 → soup_cli-0.72.3}/examples/configs/sft_basic.yaml +0 -0
  60. {soup_cli-0.72.2 → soup_cli-0.72.3}/examples/configs/vision_llama.yaml +0 -0
  61. {soup_cli-0.72.2 → soup_cli-0.72.3}/examples/data/alpaca_tiny.jsonl +0 -0
  62. {soup_cli-0.72.2 → soup_cli-0.72.3}/examples/data/chat_preferences.jsonl +0 -0
  63. {soup_cli-0.72.2 → soup_cli-0.72.3}/examples/data/dpo_sample.jsonl +0 -0
  64. {soup_cli-0.72.2 → soup_cli-0.72.3}/examples/data/reasoning_math.jsonl +0 -0
  65. {soup_cli-0.72.2 → soup_cli-0.72.3}/examples/reward_hacking/rewards.py +0 -0
  66. {soup_cli-0.72.2 → soup_cli-0.72.3}/examples/synthetic_workflow.md +0 -0
  67. {soup_cli-0.72.2 → soup_cli-0.72.3}/examples/synthetic_workflow.yaml +0 -0
  68. {soup_cli-0.72.2 → soup_cli-0.72.3}/soup.png +0 -0
  69. {soup_cli-0.72.2 → soup_cli-0.72.3}/soup_logo_svg.svg +0 -0
  70. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/__main__.py +0 -0
  71. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/autopilot/__init__.py +0 -0
  72. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/autopilot/analyzer.py +0 -0
  73. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/autopilot/decisions.py +0 -0
  74. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/autopilot/generate_config.py +0 -0
  75. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/cans/__init__.py +0 -0
  76. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/cans/pack.py +0 -0
  77. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/cans/publish.py +0 -0
  78. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/cans/run.py +0 -0
  79. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/cans/schema.py +0 -0
  80. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/cans/unpack.py +0 -0
  81. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/cans/verify.py +0 -0
  82. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/cli.py +0 -0
  83. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/cloud/__init__.py +0 -0
  84. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/cloud/modal.py +0 -0
  85. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/__init__.py +0 -0
  86. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/_eval_v0550.py +0 -0
  87. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/_eval_v0610.py +0 -0
  88. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/_eval_v0650.py +0 -0
  89. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/_eval_v07110.py +0 -0
  90. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/_webhook_cli.py +0 -0
  91. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/ab.py +0 -0
  92. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/active_sample.py +0 -0
  93. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/adapters.py +0 -0
  94. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/advise.py +0 -0
  95. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/agent.py +0 -0
  96. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/airgap.py +0 -0
  97. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/apple_adapter.py +0 -0
  98. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/attest.py +0 -0
  99. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/audit_log.py +0 -0
  100. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/autopilot.py +0 -0
  101. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/bench.py +0 -0
  102. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/bom.py +0 -0
  103. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/build.py +0 -0
  104. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/can.py +0 -0
  105. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/card.py +0 -0
  106. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/chat.py +0 -0
  107. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/ci.py +0 -0
  108. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/compile_cmd.py +0 -0
  109. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/compile_tools.py +0 -0
  110. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/completions.py +0 -0
  111. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/cost.py +0 -0
  112. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/data.py +0 -0
  113. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/data_canary.py +0 -0
  114. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/data_doctor.py +0 -0
  115. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/data_forge.py +0 -0
  116. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/data_mix.py +0 -0
  117. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/data_score.py +0 -0
  118. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/data_topics.py +0 -0
  119. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/delinearize_llama4.py +0 -0
  120. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/deploy.py +0 -0
  121. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/diagnose.py +0 -0
  122. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/diff.py +0 -0
  123. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/distill_prompt.py +0 -0
  124. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/draft.py +0 -0
  125. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/drift_alarm.py +0 -0
  126. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/edit.py +0 -0
  127. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/env.py +0 -0
  128. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/eval.py +0 -0
  129. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/expect.py +0 -0
  130. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/export.py +0 -0
  131. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/fetch.py +0 -0
  132. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/generate.py +0 -0
  133. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/history.py +0 -0
  134. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/infer.py +0 -0
  135. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/ingest.py +0 -0
  136. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/init.py +0 -0
  137. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/iterative_dpo.py +0 -0
  138. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/license_advisor.py +0 -0
  139. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/llama.py +0 -0
  140. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/local_rl.py +0 -0
  141. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/lock.py +0 -0
  142. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/loop.py +0 -0
  143. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/mcp.py +0 -0
  144. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/merge.py +0 -0
  145. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
  146. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/migrate.py +0 -0
  147. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/monitor.py +0 -0
  148. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/plan.py +0 -0
  149. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/plugins.py +0 -0
  150. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/probe.py +0 -0
  151. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/profile.py +0 -0
  152. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/prune_prompt.py +0 -0
  153. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/push.py +0 -0
  154. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/quantize.py +0 -0
  155. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/quickstart.py +0 -0
  156. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/ra_dit.py +0 -0
  157. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/recipes.py +0 -0
  158. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/registry.py +0 -0
  159. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/reward.py +0 -0
  160. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/runs.py +0 -0
  161. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/serve.py +0 -0
  162. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/ship.py +0 -0
  163. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/shrink.py +0 -0
  164. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/spectrum.py +0 -0
  165. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/steer.py +0 -0
  166. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/sweep.py +0 -0
  167. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/tokenizer.py +0 -0
  168. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/tui.py +0 -0
  169. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/tunability.py +0 -0
  170. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/ui.py +0 -0
  171. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/commands/why.py +0 -0
  172. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/config/__init__.py +0 -0
  173. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/config/loader.py +0 -0
  174. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/__init__.py +0 -0
  175. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
  176. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
  177. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
  178. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
  179. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
  180. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
  181. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
  182. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
  183. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/gate/format_json.jsonl +0 -0
  184. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/gate/safety.jsonl +0 -0
  185. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/gate/tool_call.jsonl +0 -0
  186. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
  187. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
  188. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
  189. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
  190. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/augment.py +0 -0
  191. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/chat_templates.py +0 -0
  192. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/collators.py +0 -0
  193. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/formats.py +0 -0
  194. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/loader.py +0 -0
  195. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/loss_mask.py +0 -0
  196. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/providers/__init__.py +0 -0
  197. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/providers/_utils.py +0 -0
  198. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/providers/anthropic.py +0 -0
  199. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/providers/ollama.py +0 -0
  200. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/providers/vllm.py +0 -0
  201. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/sft_format.py +0 -0
  202. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/templates/__init__.py +0 -0
  203. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/templates/code.py +0 -0
  204. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/templates/conversation.py +0 -0
  205. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/templates/preference.py +0 -0
  206. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/templates/qa.py +0 -0
  207. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/templates/reasoning.py +0 -0
  208. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/templates/tool_calling.py +0 -0
  209. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/templates/verifiable.py +0 -0
  210. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/traces/__init__.py +0 -0
  211. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/traces/pair_builder.py +0 -0
  212. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/traces/parsers.py +0 -0
  213. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/traces/quality.py +0 -0
  214. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/data/validator.py +0 -0
  215. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/envs/__init__.py +0 -0
  216. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/envs/_common.py +0 -0
  217. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/envs/calculator.py +0 -0
  218. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/envs/guess_number.py +0 -0
  219. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/envs/retrieval_qa.py +0 -0
  220. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/eval/__init__.py +0 -0
  221. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/eval/arena.py +0 -0
  222. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
  223. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/eval/calibrate.py +0 -0
  224. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
  225. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/eval/custom.py +0 -0
  226. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/eval/forgetting.py +0 -0
  227. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/eval/gate.py +0 -0
  228. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/eval/gate_suites.py +0 -0
  229. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/eval/human.py +0 -0
  230. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/eval/judge.py +0 -0
  231. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/eval/leaderboard.py +0 -0
  232. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/eval/quant_check.py +0 -0
  233. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/experiment/__init__.py +0 -0
  234. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/experiment/tracker.py +0 -0
  235. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/mcp_server/__init__.py +0 -0
  236. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/mcp_server/registry.py +0 -0
  237. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/mcp_server/server.py +0 -0
  238. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/migrate/__init__.py +0 -0
  239. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/migrate/axolotl.py +0 -0
  240. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/migrate/common.py +0 -0
  241. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/migrate/llamafactory.py +0 -0
  242. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/migrate/unsloth.py +0 -0
  243. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/monitoring/__init__.py +0 -0
  244. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/monitoring/callback.py +0 -0
  245. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
  246. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/monitoring/display.py +0 -0
  247. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
  248. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/monitoring/hf_push.py +0 -0
  249. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/monitoring/plugin_callback.py +0 -0
  250. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/monitoring/trace_logger.py +0 -0
  251. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/plugins/__init__.py +0 -0
  252. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/py.typed +0 -0
  253. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/recipes/__init__.py +0 -0
  254. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/recipes/catalog.py +0 -0
  255. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/registry/__init__.py +0 -0
  256. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/registry/attach.py +0 -0
  257. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/registry/diff.py +0 -0
  258. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/registry/hashing.py +0 -0
  259. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/registry/store.py +0 -0
  260. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/__init__.py +0 -0
  261. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/audio.yaml +0 -0
  262. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/bco.yaml +0 -0
  263. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/chat.yaml +0 -0
  264. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/code.yaml +0 -0
  265. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/embedding.yaml +0 -0
  266. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/eu-ai-act.yaml +0 -0
  267. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
  268. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
  269. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
  270. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/hipaa.yaml +0 -0
  271. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/ipo.yaml +0 -0
  272. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/kto.yaml +0 -0
  273. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/longcontext.yaml +0 -0
  274. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/manifest.json +0 -0
  275. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/medical.yaml +0 -0
  276. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/moe.yaml +0 -0
  277. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/orpo.yaml +0 -0
  278. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/pretrain.yaml +0 -0
  279. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/reasoning.yaml +0 -0
  280. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/rlhf.yaml +0 -0
  281. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/simpo.yaml +0 -0
  282. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/soc2.yaml +0 -0
  283. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/sr-11-7.yaml +0 -0
  284. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/tool-calling.yaml +0 -0
  285. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/templates/vision.yaml +0 -0
  286. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/__init__.py +0 -0
  287. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/asr.py +0 -0
  288. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/bco.py +0 -0
  289. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/bitnet.py +0 -0
  290. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/classifier.py +0 -0
  291. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/distill.py +0 -0
  292. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/dpo.py +0 -0
  293. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/embedding.py +0 -0
  294. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/grpo.py +0 -0
  295. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/ipo.py +0 -0
  296. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/kto.py +0 -0
  297. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/mlx_dpo.py +0 -0
  298. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/mlx_grpo.py +0 -0
  299. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/mlx_routing.py +0 -0
  300. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/mlx_sft.py +0 -0
  301. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/mole_routing.py +0 -0
  302. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/online_dpo.py +0 -0
  303. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/orpo.py +0 -0
  304. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/ppo.py +0 -0
  305. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/preference.py +0 -0
  306. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/pretrain.py +0 -0
  307. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/prm.py +0 -0
  308. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/raft.py +0 -0
  309. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/reward_model.py +0 -0
  310. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/rewards.py +0 -0
  311. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/simpo.py +0 -0
  312. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/tts.py +0 -0
  313. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/trainer/unlearn.py +0 -0
  314. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/tui_app.py +0 -0
  315. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/ui/__init__.py +0 -0
  316. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/ui/app.py +0 -0
  317. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/ui/plugins/__init__.py +0 -0
  318. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/ui/static/app.js +0 -0
  319. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/ui/static/index.html +0 -0
  320. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/ui/static/logo.png +0 -0
  321. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/ui/static/logo.svg +0 -0
  322. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/ui/static/style.css +0 -0
  323. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/__init__.py +0 -0
  324. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/_eval_text.py +0 -0
  325. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/ab_test.py +0 -0
  326. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/activation_offload.py +0 -0
  327. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/active_sampler.py +0 -0
  328. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/adapter_arithmetic.py +0 -0
  329. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/adapter_bisect.py +0 -0
  330. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/adapter_branch.py +0 -0
  331. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/adapter_diff.py +0 -0
  332. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/adapter_fuse.py +0 -0
  333. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/adapter_merge.py +0 -0
  334. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/adapter_pr.py +0 -0
  335. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/adapter_scan.py +0 -0
  336. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/adapter_sign.py +0 -0
  337. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/advanced_precision.py +0 -0
  338. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/advise.py +0 -0
  339. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/advise_history.py +0 -0
  340. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/agent_forge.py +0 -0
  341. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/agent_rollout.py +0 -0
  342. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/agent_sandbox.py +0 -0
  343. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/airgap_bundle.py +0 -0
  344. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/annex_xi.py +0 -0
  345. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/anthropic_messages.py +0 -0
  346. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/apple_adapter.py +0 -0
  347. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/asr_metrics.py +0 -0
  348. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/attest.py +0 -0
  349. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/audit_log.py +0 -0
  350. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/auto_quant.py +0 -0
  351. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/backend_detect.py +0 -0
  352. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/batch_probe.py +0 -0
  353. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/behavior_battery.py +0 -0
  354. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/best_of_n.py +0 -0
  355. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/bitnet.py +0 -0
  356. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/blame.py +0 -0
  357. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/block_expansion.py +0 -0
  358. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/bom.py +0 -0
  359. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/brain_rot.py +0 -0
  360. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/brain_rot_lang.py +0 -0
  361. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/build_dag.py +0 -0
  362. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/canary.py +0 -0
  363. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/canary_discovery.py +0 -0
  364. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/canary_router.py +0 -0
  365. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/capability_suite.py +0 -0
  366. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/checklist_dsl.py +0 -0
  367. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
  368. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/ci_workflow.py +0 -0
  369. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/citation_faithful.py +0 -0
  370. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/classifier.py +0 -0
  371. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/cmaes_merge.py +0 -0
  372. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/compile_tools.py +0 -0
  373. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/completions.py +0 -0
  374. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/constants.py +0 -0
  375. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/convergence.py +0 -0
  376. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/crash.py +0 -0
  377. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/cross_doc_attn.py +0 -0
  378. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/curriculum.py +0 -0
  379. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
  380. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/cut_ce.py +0 -0
  381. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/data_doctor.py +0 -0
  382. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/data_forge.py +0 -0
  383. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/data_lint.py +0 -0
  384. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/data_mix.py +0 -0
  385. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/data_pipeline.py +0 -0
  386. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/data_score.py +0 -0
  387. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/deepspeed.py +0 -0
  388. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/delinearize_llama4.py +0 -0
  389. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/demo_bundles.py +0 -0
  390. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/deploy_autopilot.py +0 -0
  391. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/deploy_measure.py +0 -0
  392. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/__init__.py +0 -0
  393. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/_common.py +0 -0
  394. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/badge.py +0 -0
  395. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/citation.py +0 -0
  396. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/contamination.py +0 -0
  397. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
  398. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/format.py +0 -0
  399. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/live.py +0 -0
  400. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/memorization.py +0 -0
  401. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
  402. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/refusal.py +0 -0
  403. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/report.py +0 -0
  404. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/runner.py +0 -0
  405. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/distill.py +0 -0
  406. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/dpo_variants.py +0 -0
  407. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/draft.py +0 -0
  408. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/drift_alarm.py +0 -0
  409. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/ebft_gdpo.py +0 -0
  410. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/echo_trap.py +0 -0
  411. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/edit_diff.py +0 -0
  412. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/edit_governor.py +0 -0
  413. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/edit_kernels.py +0 -0
  414. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/embed.py +0 -0
  415. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/encoding.py +0 -0
  416. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/energy.py +0 -0
  417. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/env_lock.py +0 -0
  418. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/errors.py +0 -0
  419. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/eval_design.py +0 -0
  420. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/eval_gate_hook.py +0 -0
  421. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
  422. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/evolve.py +0 -0
  423. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/expectations.py +0 -0
  424. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/fetch_examples.py +0 -0
  425. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/flash_attn.py +0 -0
  426. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/fp8.py +0 -0
  427. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/freeze.py +0 -0
  428. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/fsdp.py +0 -0
  429. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
  430. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/galore.py +0 -0
  431. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/gguf_quant.py +0 -0
  432. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/gpu.py +0 -0
  433. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/gpu_monitor.py +0 -0
  434. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/grace_codebook.py +0 -0
  435. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/graceful_save.py +0 -0
  436. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/grad_accum.py +0 -0
  437. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/gradient_ckpt.py +0 -0
  438. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/grpo_long_context.py +0 -0
  439. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/grpo_variants.py +0 -0
  440. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/hardware_fit.py +0 -0
  441. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/harm_probe.py +0 -0
  442. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/hf.py +0 -0
  443. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/hf_space.py +0 -0
  444. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/hubs.py +0 -0
  445. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/ingest_sources.py +0 -0
  446. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/integrations.py +0 -0
  447. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/interference.py +0 -0
  448. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/interference_live.py +0 -0
  449. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/irt.py +0 -0
  450. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/iterative_dpo.py +0 -0
  451. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/jinja_analyzer.py +0 -0
  452. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/kernel_picker.py +0 -0
  453. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/knowledge_edit.py +0 -0
  454. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/kv_cache.py +0 -0
  455. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/launcher.py +0 -0
  456. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/layer_shard.py +0 -0
  457. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/license_advisor.py +0 -0
  458. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/license_matrix.py +0 -0
  459. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/liger.py +0 -0
  460. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/lisa.py +0 -0
  461. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/live_eval.py +0 -0
  462. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/llama_proxy.py +0 -0
  463. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/llama_server_timings.py +0 -0
  464. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/local_rl.py +0 -0
  465. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
  466. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/loftq_init.py +0 -0
  467. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/log_level.py +0 -0
  468. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/long_context.py +0 -0
  469. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/longlora.py +0 -0
  470. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/loop_budget.py +0 -0
  471. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/loop_daemon.py +0 -0
  472. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/loop_iteration.py +0 -0
  473. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/loop_stages.py +0 -0
  474. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/loop_state.py +0 -0
  475. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/lr_finder.py +0 -0
  476. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/lr_groups.py +0 -0
  477. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/magpie.py +0 -0
  478. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/metrics.py +0 -0
  479. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/mii.py +0 -0
  480. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/minillm.py +0 -0
  481. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/mix_proxy.py +0 -0
  482. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/mixed_precision.py +0 -0
  483. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/mlx.py +0 -0
  484. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/mod.py +0 -0
  485. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/moe.py +0 -0
  486. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/moe_quant.py +0 -0
  487. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/mole_routing.py +0 -0
  488. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/multipack.py +0 -0
  489. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/multipack_sampler.py +0 -0
  490. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/multipack_trainer.py +0 -0
  491. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/namespace_pin.py +0 -0
  492. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/neat_packing.py +0 -0
  493. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/ngram_spec.py +0 -0
  494. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/nlg_metrics.py +0 -0
  495. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/ollama.py +0 -0
  496. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/onboarding.py +0 -0
  497. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/optimizer_zoo.py +0 -0
  498. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/paths.py +0 -0
  499. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/peft_builder.py +0 -0
  500. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/peft_patches.py +0 -0
  501. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/peft_wiring.py +0 -0
  502. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/persona_hub.py +0 -0
  503. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/pipeline.py +0 -0
  504. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/preference_combine.py +0 -0
  505. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/prm.py +0 -0
  506. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/prm_reward.py +0 -0
  507. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/probe_kernel.py +0 -0
  508. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/probe_pack.py +0 -0
  509. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/profiler.py +0 -0
  510. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/profiling.py +0 -0
  511. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/profiling_v0_43.py +0 -0
  512. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/prompt_compile.py +0 -0
  513. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/prompt_distill.py +0 -0
  514. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/prune_prompt.py +0 -0
  515. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/qat.py +0 -0
  516. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/qr_url.py +0 -0
  517. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/quality.py +0 -0
  518. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/quant_menu.py +0 -0
  519. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/ra_dit.py +0 -0
  520. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/ra_dit_run.py +0 -0
  521. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/raft.py +0 -0
  522. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/reasoning_effort.py +0 -0
  523. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/reasoning_parser.py +0 -0
  524. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/recipe_dag.py +0 -0
  525. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/recipe_run.py +0 -0
  526. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/registry.py +0 -0
  527. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/rehearsal.py +0 -0
  528. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/relora.py +0 -0
  529. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/replay.py +0 -0
  530. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/repro_receipt.py +0 -0
  531. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/reward_hack_control.py +0 -0
  532. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/reward_hacking.py +0 -0
  533. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/reward_stress.py +0 -0
  534. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/reward_synth.py +0 -0
  535. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/ring_attention.py +0 -0
  536. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/rl_checkpoint.py +0 -0
  537. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
  538. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/run_cost.py +0 -0
  539. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/sae_diff.py +0 -0
  540. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/save_formats.py +0 -0
  541. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/semdedup.py +0 -0
  542. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/server_tools.py +0 -0
  543. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/sglang.py +0 -0
  544. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/ship_verdict.py +0 -0
  545. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/shortcuts.py +0 -0
  546. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/shrink.py +0 -0
  547. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/signing.py +0 -0
  548. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/sleeper_probe.py +0 -0
  549. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/soup_lock.py +0 -0
  550. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/spec_pairing.py +0 -0
  551. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/spectrum_scan.py +0 -0
  552. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/spike_recovery.py +0 -0
  553. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/sse_train_stream.py +0 -0
  554. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/steering.py +0 -0
  555. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/strict_safetensors.py +0 -0
  556. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/structured_output.py +0 -0
  557. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/sweep_config.py +0 -0
  558. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/tail_latency.py +0 -0
  559. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/terraform_plan.py +0 -0
  560. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/tool_outputs.py +0 -0
  561. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/topics.py +0 -0
  562. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/topology.py +0 -0
  563. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/tracing.py +0 -0
  564. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/trackers.py +0 -0
  565. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/train_event_buffer.py +0 -0
  566. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/trainer_plugins.py +0 -0
  567. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/trust_remote.py +0 -0
  568. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/truth_probe.py +0 -0
  569. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/tts.py +0 -0
  570. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/tts_codec.py +0 -0
  571. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/tunability.py +0 -0
  572. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/ui_env.py +0 -0
  573. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/uld.py +0 -0
  574. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/unlearn_kernels.py +0 -0
  575. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/unlearning.py +0 -0
  576. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/unlearning_eval.py +0 -0
  577. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/unsloth.py +0 -0
  578. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/v028_features.py +0 -0
  579. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/vector_bank.py +0 -0
  580. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/vllm.py +0 -0
  581. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/vscode_setup.py +0 -0
  582. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/warmup.py +0 -0
  583. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/webhooks.py +0 -0
  584. {soup_cli-0.72.2 → soup_cli-0.72.3}/src/soup_cli/utils/why.py +0 -0
  585. {soup_cli-0.72.2 → soup_cli-0.72.3}/templates/chat.yaml +0 -0
  586. {soup_cli-0.72.2 → soup_cli-0.72.3}/templates/code.yaml +0 -0
  587. {soup_cli-0.72.2 → soup_cli-0.72.3}/templates/medical.yaml +0 -0
  588. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/__init__.py +0 -0
  589. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/conftest.py +0 -0
  590. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/qa/v053_qa.md +0 -0
  591. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/qa/v07114_qa.md +0 -0
  592. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/qa/v0716_qa.md +0 -0
  593. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_adapters.py +0 -0
  594. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_advanced_peft.py +0 -0
  595. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_assistant_mask.py +0 -0
  596. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_audio.py +0 -0
  597. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_auto_tuning.py +0 -0
  598. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_autopilot.py +0 -0
  599. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_awq_gptq_export.py +0 -0
  600. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_batch_probe.py +0 -0
  601. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_bco.py +0 -0
  602. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_bench.py +0 -0
  603. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_brain_rot_multilingual.py +0 -0
  604. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_bugfixes.py +0 -0
  605. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_build_dag.py +0 -0
  606. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_callback.py +0 -0
  607. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_cans.py +0 -0
  608. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_chat.py +0 -0
  609. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_chat_template.py +0 -0
  610. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_cli.py +0 -0
  611. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_cli_startup_is_light.py +0 -0
  612. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_cli_subprocess.py +0 -0
  613. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_code_review_critical.py +0 -0
  614. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_code_review_deferred.py +0 -0
  615. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_code_review_high.py +0 -0
  616. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_code_review_medium_low.py +0 -0
  617. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_code_review_recurring.py +0 -0
  618. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_config.py +0 -0
  619. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_cost.py +0 -0
  620. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_crash_reporter.py +0 -0
  621. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_curriculum.py +0 -0
  622. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_data.py +0 -0
  623. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_data_augment.py +0 -0
  624. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_data_sample.py +0 -0
  625. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_data_split.py +0 -0
  626. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_data_tools.py +0 -0
  627. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_dataset_hub.py +0 -0
  628. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_dataset_registry.py +0 -0
  629. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_deepspeed.py +0 -0
  630. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_deploy_ollama.py +0 -0
  631. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_diff.py +0 -0
  632. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_display.py +0 -0
  633. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_doctor.py +0 -0
  634. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_dpo_example.py +0 -0
  635. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_dpo_variants.py +0 -0
  636. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_embedding.py +0 -0
  637. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_errors.py +0 -0
  638. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_eval.py +0 -0
  639. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_eval_gate.py +0 -0
  640. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_eval_platform.py +0 -0
  641. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_export.py +0 -0
  642. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_formats.py +0 -0
  643. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_fp8_recipe.py +0 -0
  644. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_freeze_training.py +0 -0
  645. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_generate.py +0 -0
  646. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_gpu.py +0 -0
  647. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_grpo.py +0 -0
  648. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_hf_integration.py +0 -0
  649. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_infer.py +0 -0
  650. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_inference_advanced.py +0 -0
  651. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_init.py +0 -0
  652. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_ipo.py +0 -0
  653. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_issue300_online_dpo_train.py +0 -0
  654. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_issue302_vision_pad_token.py +0 -0
  655. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_issue305_mixed_rank_arithmetic.py +0 -0
  656. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_issue308_callback_subclass.py +0 -0
  657. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_jinja_analyzer.py +0 -0
  658. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_kto.py +0 -0
  659. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_loader.py +0 -0
  660. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_log_level.py +0 -0
  661. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_loss_watchdog.py +0 -0
  662. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_merge.py +0 -0
  663. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_migrate.py +0 -0
  664. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_mlx_backend.py +0 -0
  665. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_moe.py +0 -0
  666. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_multi_adapter.py +0 -0
  667. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_multi_gpu.py +0 -0
  668. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_multipack_config.py +0 -0
  669. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_multipack_invariants.py +0 -0
  670. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_multipack_sampler.py +0 -0
  671. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_neat_packing.py +0 -0
  672. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_neftune_rslora.py +0 -0
  673. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_onnx_tensorrt_export.py +0 -0
  674. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_orpo.py +0 -0
  675. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_packing.py +0 -0
  676. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_part_a_wave1.py +0 -0
  677. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_part_a_wave2.py +0 -0
  678. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_part_b.py +0 -0
  679. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_part_c.py +0 -0
  680. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_part_d.py +0 -0
  681. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_part_e.py +0 -0
  682. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_part_f_hardening.py +0 -0
  683. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_peft_methods.py +0 -0
  684. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_peft_patches.py +0 -0
  685. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_performance.py +0 -0
  686. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_pissa_init.py +0 -0
  687. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_ppo.py +0 -0
  688. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_preference_dispatcher.py +0 -0
  689. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_preference_multi.py +0 -0
  690. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_preference_multi_runtime.py +0 -0
  691. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_pretrain.py +0 -0
  692. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_profile.py +0 -0
  693. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_profiling.py +0 -0
  694. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_progress.py +0 -0
  695. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_push.py +0 -0
  696. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_qat.py +0 -0
  697. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_quality_filter.py +0 -0
  698. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_quant_check.py +0 -0
  699. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_quant_menu.py +0 -0
  700. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_quickstart.py +0 -0
  701. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_rank_pattern.py +0 -0
  702. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_recipes.py +0 -0
  703. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_recipes_v031.py +0 -0
  704. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_refusal_multilingual.py +0 -0
  705. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_registry.py +0 -0
  706. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_relora.py +0 -0
  707. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_replay.py +0 -0
  708. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_resume.py +0 -0
  709. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_review_fixes_v07133.py +0 -0
  710. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_rlvr.py +0 -0
  711. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_run_cost.py +0 -0
  712. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_runs.py +0 -0
  713. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_serve.py +0 -0
  714. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_server_generate.py +0 -0
  715. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_sglang_serve.py +0 -0
  716. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_simpo.py +0 -0
  717. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_smoke_train.py +0 -0
  718. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_speculative_decoding.py +0 -0
  719. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_sweep.py +0 -0
  720. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_synth_data_pro.py +0 -0
  721. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_templates_yaml.py +0 -0
  722. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_tensorboard.py +0 -0
  723. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_tool_calling.py +0 -0
  724. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_trace_to_pref.py +0 -0
  725. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_tracker.py +0 -0
  726. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_trainer_coverage_v035.py +0 -0
  727. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_trainer_init.py +0 -0
  728. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_training_intelligence.py +0 -0
  729. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_training_speed.py +0 -0
  730. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_trust_remote_code.py +0 -0
  731. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_tui.py +0 -0
  732. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_ui.py +0 -0
  733. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_ui_chat.py +0 -0
  734. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_ui_config_builder.py +0 -0
  735. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_ui_live_monitor.py +0 -0
  736. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_ui_metrics.py +0 -0
  737. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_unsloth.py +0 -0
  738. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0401_part_c.py +0 -0
  739. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0401_part_d.py +0 -0
  740. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0401_part_e.py +0 -0
  741. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0402_part_a.py +0 -0
  742. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0402_part_b.py +0 -0
  743. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0403_part_a.py +0 -0
  744. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0403_part_b.py +0 -0
  745. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0403_part_c.py +0 -0
  746. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0404_part_a.py +0 -0
  747. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0404_part_b.py +0 -0
  748. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0405_part_a.py +0 -0
  749. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0406_part_a.py +0 -0
  750. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0410_part_a.py +0 -0
  751. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0410_part_b.py +0 -0
  752. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0410_part_c.py +0 -0
  753. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0420.py +0 -0
  754. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0430_part_a.py +0 -0
  755. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0430_part_b.py +0 -0
  756. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0430_part_c.py +0 -0
  757. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0430_part_d.py +0 -0
  758. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0440_part_a.py +0 -0
  759. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0440_part_b.py +0 -0
  760. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0440_part_c.py +0 -0
  761. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0440_part_d.py +0 -0
  762. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0440_review_followups.py +0 -0
  763. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0450.py +0 -0
  764. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0460_part_a.py +0 -0
  765. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0460_part_b.py +0 -0
  766. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0470_part_a.py +0 -0
  767. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0470_part_b.py +0 -0
  768. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0480_part_a.py +0 -0
  769. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0480_part_b.py +0 -0
  770. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0490.py +0 -0
  771. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0500_part_a.py +0 -0
  772. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0500_part_b.py +0 -0
  773. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0500_part_c.py +0 -0
  774. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0500_part_d.py +0 -0
  775. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0500_part_e.py +0 -0
  776. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0510.py +0 -0
  777. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0520.py +0 -0
  778. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0530.py +0 -0
  779. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v05310.py +0 -0
  780. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v05311.py +0 -0
  781. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0531_109.py +0 -0
  782. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0531_139.py +0 -0
  783. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0531_142.py +0 -0
  784. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0531_82.py +0 -0
  785. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0532.py +0 -0
  786. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0533.py +0 -0
  787. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0534.py +0 -0
  788. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0535.py +0 -0
  789. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0536.py +0 -0
  790. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0537.py +0 -0
  791. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0538.py +0 -0
  792. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0539.py +0 -0
  793. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0540.py +0 -0
  794. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0550.py +0 -0
  795. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0550_followups.py +0 -0
  796. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0560.py +0 -0
  797. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0570_part_a.py +0 -0
  798. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0570_part_b.py +0 -0
  799. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0570_part_c.py +0 -0
  800. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0570_part_d.py +0 -0
  801. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0580.py +0 -0
  802. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0590.py +0 -0
  803. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0600_part_a.py +0 -0
  804. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0600_part_b.py +0 -0
  805. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0600_part_c.py +0 -0
  806. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0600_part_d.py +0 -0
  807. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0600_part_e.py +0 -0
  808. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0600_part_f.py +0 -0
  809. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0610_part_a.py +0 -0
  810. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0610_part_b.py +0 -0
  811. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0610_part_c.py +0 -0
  812. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0610_part_d.py +0 -0
  813. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0610_part_e.py +0 -0
  814. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0620_followups.py +0 -0
  815. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0620_part_a.py +0 -0
  816. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0620_part_b.py +0 -0
  817. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0620_part_c.py +0 -0
  818. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0620_part_d.py +0 -0
  819. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0620_part_e.py +0 -0
  820. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0630_followups.py +0 -0
  821. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0630_part_a.py +0 -0
  822. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0630_part_b.py +0 -0
  823. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0630_part_c.py +0 -0
  824. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0630_part_d.py +0 -0
  825. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0630_part_e.py +0 -0
  826. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0631_206.py +0 -0
  827. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0640_followups.py +0 -0
  828. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0640_part_a.py +0 -0
  829. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0640_part_b.py +0 -0
  830. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0640_part_c.py +0 -0
  831. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0640_part_d.py +0 -0
  832. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0640_part_e.py +0 -0
  833. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0640_part_f.py +0 -0
  834. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0650_followups.py +0 -0
  835. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0650_part_a.py +0 -0
  836. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0650_part_b.py +0 -0
  837. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0650_part_c.py +0 -0
  838. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0650_part_d.py +0 -0
  839. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0650_part_e.py +0 -0
  840. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0660_cli.py +0 -0
  841. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0660_followups.py +0 -0
  842. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0660_part_a.py +0 -0
  843. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0660_part_b.py +0 -0
  844. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0660_part_c.py +0 -0
  845. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0660_part_d.py +0 -0
  846. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0660_part_e.py +0 -0
  847. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0670_followups.py +0 -0
  848. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0670_part_a.py +0 -0
  849. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0670_part_b.py +0 -0
  850. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0670_part_c.py +0 -0
  851. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0670_part_d.py +0 -0
  852. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0670_part_e.py +0 -0
  853. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0670_part_f.py +0 -0
  854. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0680_followups.py +0 -0
  855. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0680_part_a.py +0 -0
  856. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0680_part_b.py +0 -0
  857. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0680_part_c.py +0 -0
  858. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0680_part_d.py +0 -0
  859. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0680_part_e.py +0 -0
  860. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0690_part_a.py +0 -0
  861. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0690_part_b.py +0 -0
  862. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0690_part_c.py +0 -0
  863. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0690_part_d.py +0 -0
  864. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0690_part_e.py +0 -0
  865. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0700_part_a.py +0 -0
  866. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0700_part_b.py +0 -0
  867. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0700_part_c.py +0 -0
  868. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0700_part_d.py +0 -0
  869. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0700_part_e.py +0 -0
  870. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0700_part_f.py +0 -0
  871. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07110.py +0 -0
  872. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07111.py +0 -0
  873. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07112.py +0 -0
  874. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07113.py +0 -0
  875. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07114.py +0 -0
  876. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07115.py +0 -0
  877. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07116.py +0 -0
  878. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07117.py +0 -0
  879. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07118.py +0 -0
  880. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07119.py +0 -0
  881. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0712.py +0 -0
  882. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07120.py +0 -0
  883. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07121.py +0 -0
  884. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07122.py +0 -0
  885. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07123.py +0 -0
  886. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07124.py +0 -0
  887. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07125.py +0 -0
  888. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07126.py +0 -0
  889. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07127.py +0 -0
  890. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07128.py +0 -0
  891. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07129.py +0 -0
  892. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0713.py +0 -0
  893. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07130.py +0 -0
  894. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07131.py +0 -0
  895. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07132.py +0 -0
  896. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07133.py +0 -0
  897. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07134.py +0 -0
  898. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07135.py +0 -0
  899. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07136.py +0 -0
  900. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07137.py +0 -0
  901. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07138.py +0 -0
  902. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07139.py +0 -0
  903. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0714.py +0 -0
  904. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07140.py +0 -0
  905. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v07141.py +0 -0
  906. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0715.py +0 -0
  907. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0716.py +0 -0
  908. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0717.py +0 -0
  909. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0718.py +0 -0
  910. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_v0719.py +0 -0
  911. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_validator.py +0 -0
  912. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_vision.py +0 -0
  913. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_vllm_serve.py +0 -0
  914. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_warmup.py +0 -0
  915. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_why.py +0 -0
  916. {soup_cli-0.72.2 → soup_cli-0.72.3}/tests/test_windows_encoding.py +0 -0
@@ -12,6 +12,71 @@ reproducing 70+ versions of notes.
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
+ ## [0.72.3] - 2026-07-28
16
+
17
+ **Added — layer streaming breadth: more architectures, bigger batches, resume, and a
18
+ disk tier.**
19
+
20
+ Layer streaming (v0.72.0–.2) was deliberately narrow: Llama/Qwen only, batch 1, no
21
+ gradient accumulation, no resume, RAM only. This release lifts all of it, and each
22
+ capability was gated against a streamed-vs-resident bit-exactness reference before any
23
+ of it was written.
24
+
25
+ - **Six more model families.** `mistral`, `gemma`, `gemma2`, `gemma3_text`, `phi` and
26
+ `phi3` join the allowlist, each verified **bit-exact** against the same checkpoint
27
+ loaded resident, under both bf16 and NF4. Phi-3 is the notable one: it fuses Q/K/V
28
+ into a single `qkv_proj`, so there is no `q_proj` to find, and it is bit-exact anyway.
29
+ Multimodal `gemma3` is deliberately *not* accepted — only `gemma3_text`.
30
+ - **`batch_size` above 1, and gradient accumulation.** Both previously refused.
31
+ - **A pre-flight VRAM budget that accounts for batch and vocabulary.** Streaming bounds
32
+ the *weights*; activations and the logits tensor are untouched by it and both scale
33
+ with `batch × seq`. On a 152k-vocab model at batch 8 the logits term alone measured
34
+ **8.71 GB — 146× the entire layer-buffer pool**. `soup train` now predicts peak VRAM
35
+ and refuses a run that will not fit, naming the two knobs that scale it.
36
+ - **A throughput forecast**, quoted as a range from a GEMM ceiling measured on your own
37
+ card in that session, alongside the SM clock — never a compiled-in per-card constant.
38
+ - **`--resume` and `--hf-resume` work with streaming.**
39
+ - **A disk overflow tier.** `stream_source: auto` (the default) uses RAM when the base
40
+ fits and falls back to an NVMe disk tier when it does not, holding nothing resident.
41
+ `stream_source: ram` refuses instead of falling back. Non-NVMe disks are still
42
+ refused outright.
43
+ - **`soup doctor --disk`** reports the detected media type.
44
+
45
+ **Fixed**
46
+
47
+ - `estimate_logits_bytes` charged 6 bytes per logit element; the measured peak is **14**
48
+ (`transformers` holds the bf16 logits, the fp32 upcast, log-softmax's fp32 output and
49
+ the fp32 gradient live at once). The old figure under-predicted that term by 2.33×.
50
+ - Adapters could not be loaded *into* a streamed model: `load_state_dict` narrows keys
51
+ by child name, so a canonical checkpoint matched **0 of N** tensors and PEFT reported
52
+ only a warning — a resumed run reproduced the from-scratch loss curve exactly. The
53
+ streaming layer now redirects canonical keys at load time, mirroring the v0.72.1
54
+ save-side fix.
55
+ - The NVMe-only tier guard was wired to a hardcoded constant and could never fire.
56
+ - Streaming weight sources are now released when training ends **or raises**; the disk
57
+ tier holds one open shard handle per decoder layer.
58
+ - Subprocess helpers resolve tools to absolute paths (on Windows, `CreateProcess`
59
+ searches the current directory before `PATH`).
60
+ - The `[mcp]` extra is now capped at `mcp<2`. The SDK's 2.0.0 release removed
61
+ `mcp.shared.memory.create_connected_server_and_client_session` and dropped
62
+ `Server.list_tools`, breaking `soup mcp serve`'s round-trip tests for anyone
63
+ installing fresh. Support for the 2.x API is tracked separately.
64
+
65
+ **Known limitations**
66
+
67
+ - The **RAM-vs-disk performance gap is unmeasured** on the development hardware and no
68
+ number is claimed for it. safetensors memory-maps the shards, so the OS page cache
69
+ keeps them resident between steps on a machine with spare RAM, and at ~5 effective
70
+ TFLOPS the NVMe read hides under compute. The disk tier's *correctness* is verified
71
+ bit-exact against the RAM tier; its speed relative to RAM is not characterised.
72
+ - End-to-end `soup train --resume` could not be demonstrated on the development box:
73
+ `transformers` refuses `torch.load` below torch 2.6 (CVE-2025-32434), which blocks
74
+ **every** resume there, streaming or not. The streaming-specific half — the adapter
75
+ round-trip and loss continuity — is verified on the production CUDA path.
76
+ - Loading *into* a streamed model works; `named_parameters()` and `state_dict()` still
77
+ disagree in memory, which is the deliberate cost of a serialisation-only design.
78
+ - Layer streaming remains **BETA**.
79
+
15
80
  ## [0.72.2] - 2026-07-28
16
81
 
17
82
  **Added — NF4 layer streaming: fine-tune Llama-3.1-8B on a 4 GB laptop GPU.**
@@ -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 (326 files, 16840 tests)
123
+ tests/ - Test suite (330 files, 16977 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.2
3
+ Version: 0.72.3
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
@@ -29,7 +29,7 @@ Requires-Dist: bitsandbytes>=0.41.0; extra == 'all'
29
29
  Requires-Dist: datasets>=2.14.0; extra == 'all'
30
30
  Requires-Dist: datasketch>=1.6.0; extra == 'all'
31
31
  Requires-Dist: fastapi>=0.104.0; extra == 'all'
32
- Requires-Dist: mcp>=1.2.0; extra == 'all'
32
+ Requires-Dist: mcp<2,>=1.2.0; extra == 'all'
33
33
  Requires-Dist: peft>=0.7.0; extra == 'all'
34
34
  Requires-Dist: torch>=2.0.0; extra == 'all'
35
35
  Requires-Dist: transformers<5.0.0,>=4.36.0; extra == 'all'
@@ -61,7 +61,7 @@ Requires-Dist: bitsandbytes>=0.41.0; extra == 'dev'
61
61
  Requires-Dist: cryptography>=41.0.0; extra == 'dev'
62
62
  Requires-Dist: datasets>=2.14.0; extra == 'dev'
63
63
  Requires-Dist: httpx>=0.24.0; extra == 'dev'
64
- Requires-Dist: mcp>=1.2.0; extra == 'dev'
64
+ Requires-Dist: mcp<2,>=1.2.0; extra == 'dev'
65
65
  Requires-Dist: mypy>=1.8.0; extra == 'dev'
66
66
  Requires-Dist: peft>=0.7.0; extra == 'dev'
67
67
  Requires-Dist: pre-commit>=3.5.0; extra == 'dev'
@@ -83,7 +83,7 @@ Requires-Dist: auto-gptq>=0.7.0; extra == 'gptq'
83
83
  Provides-Extra: liger
84
84
  Requires-Dist: liger-kernel>=0.3.0; extra == 'liger'
85
85
  Provides-Extra: mcp
86
- Requires-Dist: mcp>=1.2.0; extra == 'mcp'
86
+ Requires-Dist: mcp<2,>=1.2.0; extra == 'mcp'
87
87
  Provides-Extra: mix
88
88
  Requires-Dist: scikit-optimize>=0.9.0; extra == 'mix'
89
89
  Provides-Extra: mlx
@@ -193,31 +193,34 @@ infrastructure instead of improving models. Soup fixes that.
193
193
 
194
194
  ## What's New
195
195
 
196
- **v0.72.2NF4 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.
196
+ **v0.72.3 — layer streaming grows up: more models, bigger batches, resume, and a disk
197
+ tier.** Layer streaming keeps the frozen base out of VRAM and feeds it to the GPU one
198
+ decoder layer at a time. v0.72.0–.2 kept the scope deliberately tiny to prove it worked;
199
+ this release removes the training wheels.
200
+
201
+ - **Six more model families** Mistral, Gemma / Gemma 2 / Gemma 3, and Phi / Phi-3 — each
202
+ verified **bit-exact** against the same checkpoint loaded resident, in bf16 *and* NF4.
203
+ - **`batch_size` above 1, gradient accumulation, and `--resume`** all work now.
204
+ - **A pre-flight that predicts peak VRAM and refuses a run that will not fit.** Streaming
205
+ bounds the *weights*; the logits tensor is not bounded by it and scales with
206
+ `batch × seq`. On a 152k-vocab model at batch 8 that single tensor measured **8.71 GB
207
+ 146× the entire layer-buffer pool.** The prediction was fitted to ten real runs and
208
+ never under-predicts any of them.
209
+ - **A throughput forecast measured on your card, in your session**, quoted as a range
210
+ next to the SM clock it was taken at — not a number compiled into the source.
211
+ - **A disk overflow tier.** When the base will not fit in RAM, `stream_source: auto`
212
+ streams it from NVMe instead of refusing. Honest caveat: its *correctness* is verified
213
+ bit-exact against the RAM tier, but **how much slower it is has not been measured** on
214
+ the development hardware, and no figure is claimed.
215
+ - Still BETA.
214
216
 
215
217
  ```yaml
216
218
  # soup.yaml — then just `soup train --config soup.yaml`
217
219
  training:
218
- stream_layers: true # base streams from RAM; only the adapter trains
220
+ stream_layers: true # base streams out of VRAM; only the adapter trains
219
221
  quantization: 4bit # NF4 — ~4x smaller store, so 8B fits a 4 GB card
220
- batch_size: 1
222
+ batch_size: 4 # v0.72.3: bigger batches amortise the weight read
223
+ stream_source: auto # RAM when it fits, NVMe disk when it does not
221
224
  ```
222
225
 
223
226
  > **Trained with `stream_layers: true` on v0.72.0?** That adapter is inert — its tensors were
@@ -49,31 +49,34 @@ infrastructure instead of improving models. Soup fixes that.
49
49
 
50
50
  ## What's New
51
51
 
52
- **v0.72.2NF4 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.
52
+ **v0.72.3 — layer streaming grows up: more models, bigger batches, resume, and a disk
53
+ tier.** Layer streaming keeps the frozen base out of VRAM and feeds it to the GPU one
54
+ decoder layer at a time. v0.72.0–.2 kept the scope deliberately tiny to prove it worked;
55
+ this release removes the training wheels.
56
+
57
+ - **Six more model families** Mistral, Gemma / Gemma 2 / Gemma 3, and Phi / Phi-3 — each
58
+ verified **bit-exact** against the same checkpoint loaded resident, in bf16 *and* NF4.
59
+ - **`batch_size` above 1, gradient accumulation, and `--resume`** all work now.
60
+ - **A pre-flight that predicts peak VRAM and refuses a run that will not fit.** Streaming
61
+ bounds the *weights*; the logits tensor is not bounded by it and scales with
62
+ `batch × seq`. On a 152k-vocab model at batch 8 that single tensor measured **8.71 GB
63
+ 146× the entire layer-buffer pool.** The prediction was fitted to ten real runs and
64
+ never under-predicts any of them.
65
+ - **A throughput forecast measured on your card, in your session**, quoted as a range
66
+ next to the SM clock it was taken at — not a number compiled into the source.
67
+ - **A disk overflow tier.** When the base will not fit in RAM, `stream_source: auto`
68
+ streams it from NVMe instead of refusing. Honest caveat: its *correctness* is verified
69
+ bit-exact against the RAM tier, but **how much slower it is has not been measured** on
70
+ the development hardware, and no figure is claimed.
71
+ - Still BETA.
70
72
 
71
73
  ```yaml
72
74
  # soup.yaml — then just `soup train --config soup.yaml`
73
75
  training:
74
- stream_layers: true # base streams from RAM; only the adapter trains
76
+ stream_layers: true # base streams out of VRAM; only the adapter trains
75
77
  quantization: 4bit # NF4 — ~4x smaller store, so 8B fits a 4 GB card
76
- batch_size: 1
78
+ batch_size: 4 # v0.72.3: bigger batches amortise the weight read
79
+ stream_source: auto # RAM when it fits, NVMe disk when it does not
77
80
  ```
78
81
 
79
82
  > **Trained with `stream_layers: true` on v0.72.0?** That adapter is inert — its tensors were
@@ -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; quantization: 4bit streams it as NF4, ~4x smaller (sft/transformers/text, batch 1) (v0.72.0; NF4 v0.72.2)
33
+ soup train --config sft.yaml # training.stream_layers: true [stream_source stream_buffers] BETA layer streaming — the frozen base streams from CPU RAM/NVMe 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, wider archs) (v0.72.0; NF4 v0.72.2; disk+batch+accum v0.72.3)
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
@@ -200,7 +200,7 @@ soup tokenizer train --input c.jsonl --vocab-size N Train BPE tokenizer (v0.53.
200
200
  soup bench <model> --p50 --p95 Bench with tail-latency percentiles (v0.53.9)
201
201
  soup bench <model> --backend auto Auto-detect transformers/mlx backend (v0.53.9)
202
202
  soup serve --reasoning-parser deepseek-r1 Strip <think> blocks from responses (v0.53.9)
203
- soup doctor [--nccl] Check environment (optionally check NCCL bandwidth)
203
+ soup doctor [--nccl] [--disk] Check environment (optionally check NCCL bandwidth, media type; --disk ~9s cold / ~2.4s warm)
204
204
  soup quickstart [--dry-run] Full demo
205
205
  soup adapters scan <adapter> Spectral backdoor scan (rank-1 dominance + outlier detection)
206
206
  soup adapters sign <adapter> [--backend unsigned|ed25519] [--key <pem>|--generate-key <pem>] Merkle manifest + ed25519 sign
@@ -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; NF4 v0.72.2)](#layer-streaming-beta-v0720-nf4-v0722)
17
+ - [Layer Streaming (BETA, v0.72.0; NF4 v0.72.2; disk + wider archs v0.72.3)](#layer-streaming-beta-v0720-nf4-v0722-disk--wider-archs-v0723)
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)
@@ -24,7 +24,7 @@
24
24
  - [MoE Expert Quantization + Router-Only Training (live in v0.71.20)](#moe-expert-quantization--router-only-training-live-in-v07120)
25
25
  - [Unsloth Dynamic 2.0 GGUF Ladder (v0.53.0)](#unsloth-dynamic-20-gguf-ladder-v0530)
26
26
  - [KV Cache Types (v0.53.0)](#kv-cache-types-v0530)
27
- - [FP8 Attention + NVFP4 + Native `unsloth_bnb_4bit` (v0.53.0)](#fp8-attention--nvfp4--native-unsloth_bnb_4bit-v0530)
27
+ - [FP8 Attention + NVFP4 + Native `unsloth_bnb_4bit` (v0.53.0)](#fp8-attention--nvfp4--native-unsloth_bnb_4bit)
28
28
  - [LF / Axolotl Quant Parity (v0.53.0)](#lf--axolotl-quant-parity-v0530)
29
29
  - [Advanced Save Formats (v0.53.0)](#advanced-save-formats-v0530)
30
30
  - [Quant Menu II + Export Pipeline (v0.53.1)](#quant-menu-ii--export-pipeline-v0531)
@@ -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; NF4 v0.72.2)
229
+ ## Layer Streaming (BETA, v0.72.0; NF4 v0.72.2; disk + wider archs v0.72.3)
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
 
@@ -272,26 +272,81 @@ Correctness is not a tradeoff here either: a streamed NF4 run is **bit-exact** a
272
272
 
273
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
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.
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 deferred beyond v0.72.3.
276
276
 
277
277
  **Honest scope:**
278
- - **RAM tier only.** `stream_source: ram` (`auto` resolves to it). The disk overflow tier ships in **v0.72.3**.
279
- - **Llama / Qwen only**, `task: sft`, `backend: transformers`, `modality: text`.
280
- - **`batch_size: 1`**, no gradient accumulation, no `--resume` all ship in **v0.72.3**.
278
+ - **RAM tier + disk overflow (v0.72.3).** `stream_source: auto` picks RAM when it fits, falls back to NVMe disk when not; SATA/HDD rejected. Correctness verified; disk performance unmeasured on the reference box.
279
+ - **Llama / Qwen / Mistral / Gemma / Gemma2 / Gemma3-Text / Phi / Phi3** (all verified bit-exact in bf16 and NF4), `task: sft`, `backend: transformers`, `modality: text`.
280
+ - **Batch sizes, gradient accumulation, `--resume` / `--hf-resume`** all now work (v0.72.3).
281
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.
282
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.
283
283
 
284
+ ### Sizing a streaming run (v0.72.3)
285
+
286
+ Streaming bounds the **weights**. It does nothing for activations or for the logits
287
+ tensor, and both scale with `batch × seq`. On a large-vocabulary model that second term
288
+ dominates everything else: measured on Qwen2.5-0.5B (vocab 151 936) at batch 8, S=512,
289
+ the logits alone are **8.71 GB — 146× the entire layer-buffer pool (0.060 GB)**. A
290
+ pre-flight that budgeted only weights and buffers would wave that configuration through.
291
+
292
+ So `soup train` predicts peak VRAM before building the model, and **refuses a run it
293
+ expects not to fit**:
294
+
295
+ ```
296
+ peak VRAM ~0.48 GB at batch 2 x seq 256 (logits 0.35 GB)
297
+ free VRAM 3.46 GB
298
+ forecast 5685-8361 tok/s — a compute-bound bound, not a promise
299
+ (from 6.75 TFLOPS measured on this card now @ 862 MHz)
300
+ ```
301
+
302
+ The prediction was fitted to ten real runs across two models, a 3.1× vocabulary contrast,
303
+ batch 1–8 and two sequence lengths: **worst error 0.85%, and it never under-predicts** —
304
+ the only safe direction for a number allowed to stop a run. The refusal names the two
305
+ knobs that actually scale it (`training.batch_size`, `data.max_length`).
306
+
307
+ Refusing rather than warning is deliberate. On Linux an over-budget step is a hard OOM.
308
+ On Windows it is worse: WDDM silently spills to host memory and the run merely becomes an
309
+ order of magnitude slower — measured here as a 9.27 GB peak on a 4.29 GB card with **no
310
+ exception raised at all**. Read as "streaming is slow", that would be exactly the wrong
311
+ conclusion.
312
+
313
+ The throughput line is a **bound, not a promise**. It comes from a bf16 GEMM benchmarked
314
+ on your card in that session and is printed with the SM clock it was taken at, because
315
+ this card alone produced 3.5 and 7.6 TFLOPS in two sessions at the same reported clock. A
316
+ per-card constant compiled into Soup would be a fabrication. Real streamed runs landed at
317
+ 68–100% of their measured ceiling.
318
+
319
+ ### Batch size vs gradient accumulation
320
+
321
+ Both work from v0.72.3, and they are not interchangeable. Measured on Qwen2.5-0.5B bf16,
322
+ S=256, pinned store, 50 steps after 10 warm-up:
323
+
324
+ | batch | accum | effective batch | throughput | peak VRAM |
325
+ |---|---|---|---|---|
326
+ | 1 | 1 | 1 | 556.6 tok/s | 0.842 GB |
327
+ | 1 | 4 | 4 | 540.1 tok/s | 0.846 GB |
328
+ | 4 | 1 | 4 | **1378.0 tok/s** | 2.28 GB |
329
+
330
+ Accumulation is **per-token I/O-neutral** — layer reads per 1000 tokens held constant
331
+ across accum 1, 2 and 4, because `accum=N` re-reads the base N times *and* processes N
332
+ times the tokens. Its cost is opportunity cost: at the **same effective batch of 4**,
333
+ raising `batch_size` instead was **2.52× faster**, because one weight read is amortised
334
+ over four times the tokens.
335
+
336
+ What accumulation buys is effective batch at **constant VRAM** (0.842 → 0.846 GB across
337
+ accum 1→4, where raising batch cost 0.842 → 2.28 GB). So the rule is: **raise
338
+ `batch_size` until the VRAM pre-flight refuses, then accumulate for the rest.** Soup
339
+ prints this advice when it sees you accumulating.
340
+
284
341
  **Rejected at config load (each names the release that lifts it):**
285
- - `stream_source: disk` → the disk tier is v0.72.3
342
+ - `batch_size: "auto"` → OOM-probes a resident model that streaming never loads; explicit batch sizes allowed (v0.72.3)
286
343
  - `quantization` other than `none` or `4bit` → other formats cannot be streamed into a pooled buffer
287
344
  - `backend: unsloth` / `backend: mlx` → streaming replaces the model-load path those backends own
288
345
  - `task` other than `sft` → preference losses are v0.72.4
289
- - `gradient_accumulation_steps > 1` → every micro-batch re-reads the whole base, so accumulation multiplies streaming IO linearly (v0.72.3)
290
- - `batch_size` other than `1` → v0.72.3
291
346
  - `lora.use_dora` / `lora.use_vera` / `lora.init_strategy` other than `random` → these initialise from the real base weight, which is on the meta device under streaming
292
347
  - `unfrozen_parameters`, `lisa_enabled`, `packing`, `multipack`, `use_fsdp2_compile`, `train_router_only`, `expand_layers` → each independently rewrites or re-freezes the same layers
293
348
  - `stream_source` / `stream_buffers` set while `stream_layers: false` → a footgun, refused
294
- - an architecture outside `llama` / `qwen2` / `qwen3` → named explicitly, with the allowlist
349
+ - an architecture outside the supported list (llama / qwen2 / qwen3 / mistral / gemma / gemma2 / gemma3_text / phi / phi3) → named explicitly
295
350
 
296
351
  **Config example:**
297
352
 
@@ -309,12 +364,12 @@ data:
309
364
  training:
310
365
  epochs: 3
311
366
  lr: 2e-5
312
- batch_size: 1 # required; larger batches in v0.72.3
313
- gradient_accumulation_steps: 1 # required; accumulation in v0.72.3
367
+ batch_size: 1 # explicit sizes allowed; "auto" rejected
368
+ gradient_accumulation_steps: 1 # values > 1 now allowed (v0.72.3)
314
369
  quantization: 4bit # NF4 — ~4x smaller RAM store than bf16 (or `none`)
315
370
  gradient_checkpointing: true # handled per-layer by the streamer
316
371
  stream_layers: true # Enable layer streaming
317
- stream_source: auto # RAM-based (disk in v0.72.3)
372
+ stream_source: auto # RAM with auto-fallback to NVMe disk (v0.72.3)
318
373
  stream_buffers: 2 # double-buffering
319
374
  lora:
320
375
  r: 64
@@ -5,9 +5,10 @@
5
5
  > SFT, DPO/GRPO/PPO/KTO/ORPO/SimPO/IPO/BCO, tool-calling, PRM, pre-training, distillation, classification, vision/audio/TTS, unlearning, RAFT/RA-DIT, and the loop-hardening detectors.
6
6
 
7
7
  > **Training a model bigger than your GPU?** `training.stream_layers: true` streams the
8
- > frozen base from CPU RAM one decoder layer at a time, so peak VRAM is bounded by one
9
- > layer instead of the whole model
10
- > see [Layer Streaming](performance-and-quantization.md#layer-streaming-beta-v0720).
8
+ > frozen base from CPU RAM (with NVMe disk overflow in v0.72.3) one decoder layer at a time,
9
+ > so peak VRAM is bounded by one layer instead of the whole model. Add `quantization: 4bit`
10
+ > and an 8B base fits a 4 GB card — see
11
+ > [Layer Streaming](performance-and-quantization.md#layer-streaming-beta-v0720-nf4-v0722-disk--wider-archs-v0723).
11
12
 
12
13
  **Contents:**
13
14
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "soup-cli"
7
- version = "0.72.2"
7
+ version = "0.72.3"
8
8
  description = "Fine-tune and post-train LLMs in one command. No SSH, no config hell."
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -105,7 +105,14 @@ modal = ["modal>=0.60.0"]
105
105
  # v0.71.28 - `soup mcp serve` MCP server. The official `mcp` python SDK is
106
106
  # lazy-imported (only src/soup_cli/mcp_server/server.py touches it), so the CLI
107
107
  # stays light without it. Floor pinned to guard against SDK API churn.
108
- mcp = ["mcp>=1.2.0"]
108
+ #
109
+ # v0.72.3: capped below 2.0. The floor alone was not enough — mcp 2.0.0 removed
110
+ # `mcp.shared.memory.create_connected_server_and_client_session` and dropped
111
+ # `Server.list_tools`, which broke every `soup mcp serve` round-trip test on all
112
+ # nine CI jobs the day it was published. 1.29.0 (the newest 1.x) still exposes
113
+ # both, verified directly. Migrating to the 2.x API is its own piece of work,
114
+ # and shipping against a major nobody has validated is not a substitute for it.
115
+ mcp = ["mcp>=1.2.0,<2"]
109
116
 
110
117
  [project.scripts]
111
118
  soup = "soup_cli.cli:run"
@@ -1,3 +1,3 @@
1
1
  """Soup CLI — Fine-tune and post-train LLMs in one command."""
2
2
 
3
- __version__ = "0.72.2"
3
+ __version__ = "0.72.3"
@@ -56,6 +56,15 @@ def doctor(
56
56
  nccl: bool = typer.Option(
57
57
  False, "--nccl", help="Measure NCCL bandwidth and check against reference table."
58
58
  ),
59
+ disk: bool = typer.Option(
60
+ False,
61
+ "--disk",
62
+ help=(
63
+ "Detect the disk media type (NVMe / SSD / HDD). Layer streaming's "
64
+ "disk overflow tier needs NVMe. Off by default: the probe costs ~9 s "
65
+ "on Windows."
66
+ ),
67
+ ),
59
68
  ):
60
69
  """Check system dependencies, GPU, and compatibility."""
61
70
  console.print("[bold]Soup Doctor[/] - checking your environment...\n")
@@ -75,7 +84,7 @@ def doctor(
75
84
  _check_gpu()
76
85
 
77
86
  # Resources check
78
- _check_resources()
87
+ _check_resources(probe_disk=disk)
79
88
 
80
89
  # Dependencies table
81
90
  table = Table(title="Dependencies")
@@ -367,7 +376,7 @@ def _get_ram_gb() -> str:
367
376
  return "Unknown"
368
377
 
369
378
 
370
- def _check_resources():
379
+ def _check_resources(probe_disk: bool = False):
371
380
  """Check RAM and Disk space and display info."""
372
381
  import shutil
373
382
 
@@ -384,6 +393,32 @@ def _check_resources():
384
393
  disk_str = "Unknown"
385
394
 
386
395
  table.add_row("Disk", disk_str)
396
+
397
+ # v0.72.3 — layer streaming's disk overflow tier needs NVMe: on a spinning
398
+ # disk each step costs 2 seeks per layer (plan P11), which does not merely
399
+ # run slower, it thrashes. Reported here so the refusal is not the first
400
+ # time an operator hears about it.
401
+ #
402
+ # Opt-in behind --disk, matching this command's own --nccl convention for
403
+ # expensive probes. Measured on the dev box: the Windows PowerShell query
404
+ # costs ~9 s cold and ~2.4 s warm (17.6 s -> 20.0 s on `soup doctor`), paid
405
+ # by every user including the majority who never touch layer streaming. A
406
+ # streaming run does its own lazy probe when the tier decision actually
407
+ # depends on the answer, so nothing is lost by defaulting this off.
408
+ if probe_disk:
409
+ try:
410
+ from soup_cli.utils.layer_stream import detect_disk_kind
411
+
412
+ kind = detect_disk_kind(".")
413
+ except Exception: # noqa: BLE001 — a diagnostic must never crash the report
414
+ kind = "unknown"
415
+ verdict = {
416
+ "nvme": "[green]NVMe[/] — layer streaming can use the disk overflow tier",
417
+ "ssd": "[yellow]SATA SSD[/] — layer streaming refuses the disk tier (RAM only)",
418
+ "hdd": "[red]HDD[/] — layer streaming refuses the disk tier (RAM only)",
419
+ }.get(kind, "[yellow]Unknown[/] — layer streaming will refuse the disk tier")
420
+ table.add_row("Disk type", verdict)
421
+
387
422
  console.print(table)
388
423
  console.print()
389
424
 
@@ -530,23 +530,13 @@ def train(
530
530
  console.print(f"[red]{markup_escape(str(exc))}[/]")
531
531
  raise typer.Exit(code=2) from exc
532
532
 
533
- # --- v0.72.0 BETA layer streaming does not support resume yet ---
534
- # Silently ignoring a resume would restart from scratch and look like it
535
- # worked, so refuse before any heavy work happens.
536
- #
537
- # v0.72.1: --hf-resume must be covered too. It sets resume_from through a
538
- # different branch (see prepare_hf_resume below), so a guard on --resume
539
- # alone let it through. That mattered more after the adapter-key fix: the
540
- # pushed checkpoint now carries canonical keys while a live streamed model
541
- # is still `.inner.`-shaped, so PEFT's strict=False load would match
542
- # NOTHING and silently continue with a freshly initialised adapter.
543
- if (resume or hf_resume) and cfg.training.stream_layers:
544
- console.print(
545
- "[red]--resume / --hf-resume are not supported with "
546
- "training.stream_layers[/] — checkpoint/resume for layer streaming "
547
- "lands in v0.72.3. Drop the flag, or set stream_layers: false."
548
- )
549
- raise typer.Exit(code=2)
533
+ # v0.72.3--resume / --hf-resume now work with layer streaming. v0.72.0-.2
534
+ # refused them because a streamed model's `named_parameters()` carry an
535
+ # `.inner.` segment that `load_state_dict` narrows away, so PEFT matched
536
+ # NOTHING and silently continued with a freshly initialised adapter (measured:
537
+ # 0 of 12 tensors, and a resumed loss curve byte-identical to a from-scratch
538
+ # one). `StreamedDecoderLayer` now redirects canonical keys at load time,
539
+ # mirroring the v0.72.1 save-side delegation.
550
540
 
551
541
  # --- RA-DIT generator-stage auto-link (v0.71.10 #200) ---
552
542
  # When a generator stage has no retriever model set, splice in the latest
@@ -4682,23 +4682,30 @@ class SoupConfig(BaseModel):
4682
4682
  f"store weights in formats that cannot be streamed into a "
4683
4683
  f"pooled buffer."
4684
4684
  )
4685
- if tcfg.stream_source == "disk":
4686
- raise ValueError(
4687
- "training.stream_source='disk' is not implemented yet "
4688
- "the disk overflow tier lands in v0.72.3. Use 'ram' or 'auto'."
4689
- )
4690
- if tcfg.batch_size != 1:
4691
- raise ValueError(
4692
- f"training.stream_layers requires batch_size=1 (got "
4693
- f"{tcfg.batch_size!r}); larger batches land in v0.72.3."
4694
- )
4695
- if tcfg.gradient_accumulation_steps != 1:
4696
- raise ValueError(
4697
- f"training.stream_layers requires gradient_accumulation_steps=1 "
4698
- f"(got {tcfg.gradient_accumulation_steps}); every micro-batch "
4699
- f"re-reads the entire base, so accumulation multiplies streaming "
4700
- f"IO linearly. Accumulation lands in v0.72.3."
4701
- )
4685
+ # v0.72.3: the disk overflow tier is live. It is still NVMe-only —
4686
+ # `choose_tier` refuses spinning disks, where each step costs two seeks
4687
+ # per layer (plan P11) and the run thrashes rather than merely running
4688
+ # slower. `soup doctor` reports the detected media type.
4689
+ # v0.72.3: any concrete batch size is supported — bigger batches are
4690
+ # where streaming PAYS OFF, since one weight read is amortised over more
4691
+ # tokens. "auto" is still refused: it resolves by OOM-probing a resident
4692
+ # model, and under streaming that model never loads, so the probe would
4693
+ # measure something that does not exist.
4694
+ if tcfg.batch_size == "auto":
4695
+ raise ValueError(
4696
+ "training.stream_layers cannot use batch_size='auto': the probe "
4697
+ "sizes a RESIDENT model, which a streaming run never loads. Set "
4698
+ "a concrete batch_size — the pre-flight predicts peak VRAM for "
4699
+ "it and refuses the run if it will not fit."
4700
+ )
4701
+ # v0.72.3: accumulation is supported. Measured on this box, it is
4702
+ # per-TOKEN I/O-neutral — layer reads per 1k tokens held constant across
4703
+ # accum 1/2/4 — because N micro-batches read the base N times but also
4704
+ # process N times the tokens. Its cost is opportunity cost: reaching the
4705
+ # same effective batch by raising batch_size was 2.52x faster. The
4706
+ # pre-flight says so rather than the schema refusing it, because
4707
+ # accumulation is the ONLY way to raise effective batch once the VRAM
4708
+ # budget is exhausted (peak moved 0.842 -> 0.846 GB across accum 1->4).
4702
4709
  if tcfg.lora.r < 1:
4703
4710
  raise ValueError(
4704
4711
  "training.stream_layers requires LoRA (training.lora.r >= 1) — "