soup-cli 0.72.1__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 (918) hide show
  1. soup_cli-0.72.3/.github/FUNDING.yml +7 -0
  2. {soup_cli-0.72.1 → soup_cli-0.72.3}/CHANGELOG.md +138 -0
  3. {soup_cli-0.72.1 → soup_cli-0.72.3}/CONTRIBUTING.md +1 -1
  4. {soup_cli-0.72.1 → soup_cli-0.72.3}/PKG-INFO +52 -33
  5. {soup_cli-0.72.1 → soup_cli-0.72.3}/README.md +48 -29
  6. {soup_cli-0.72.1 → soup_cli-0.72.3}/docs/commands.md +2 -2
  7. {soup_cli-0.72.1 → soup_cli-0.72.3}/docs/performance-and-quantization.md +100 -31
  8. {soup_cli-0.72.1 → soup_cli-0.72.3}/docs/training.md +4 -3
  9. {soup_cli-0.72.1 → soup_cli-0.72.3}/pyproject.toml +9 -2
  10. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/__init__.py +1 -1
  11. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/doctor.py +37 -2
  12. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/train.py +7 -17
  13. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/config/schema.py +32 -25
  14. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/sft.py +280 -27
  15. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/layer_shard.py +332 -7
  16. soup_cli-0.72.3/src/soup_cli/utils/layer_stream.py +844 -0
  17. soup_cli-0.72.3/src/soup_cli/utils/layer_stream_runtime.py +1350 -0
  18. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/reward_stress.py +9 -4
  19. soup_cli-0.72.3/tests/test_cli_startup_is_light.py +207 -0
  20. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_issue308_callback_subclass.py +12 -3
  21. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07200.py +66 -35
  22. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07201.py +34 -32
  23. soup_cli-0.72.3/tests/test_v07202.py +1806 -0
  24. soup_cli-0.72.3/tests/test_v07203.py +1386 -0
  25. soup_cli-0.72.1/.github/FUNDING.yml +0 -1
  26. soup_cli-0.72.1/src/soup_cli/utils/layer_stream.py +0 -350
  27. soup_cli-0.72.1/src/soup_cli/utils/layer_stream_runtime.py +0 -653
  28. {soup_cli-0.72.1 → soup_cli-0.72.3}/.dockerignore +0 -0
  29. {soup_cli-0.72.1 → soup_cli-0.72.3}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  30. {soup_cli-0.72.1 → soup_cli-0.72.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  31. {soup_cli-0.72.1 → soup_cli-0.72.3}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  32. {soup_cli-0.72.1 → soup_cli-0.72.3}/.github/pull_request_template.md +0 -0
  33. {soup_cli-0.72.1 → soup_cli-0.72.3}/.github/workflows/ci.yml +0 -0
  34. {soup_cli-0.72.1 → soup_cli-0.72.3}/.github/workflows/docker.yml +0 -0
  35. {soup_cli-0.72.1 → soup_cli-0.72.3}/.github/workflows/publish.yml +0 -0
  36. {soup_cli-0.72.1 → soup_cli-0.72.3}/.github/workflows/recipe-validation.yml +0 -0
  37. {soup_cli-0.72.1 → soup_cli-0.72.3}/.gitignore +0 -0
  38. {soup_cli-0.72.1 → soup_cli-0.72.3}/.mailmap +0 -0
  39. {soup_cli-0.72.1 → soup_cli-0.72.3}/.pre-commit-config.yaml +0 -0
  40. {soup_cli-0.72.1 → soup_cli-0.72.3}/AGENTS.md +0 -0
  41. {soup_cli-0.72.1 → soup_cli-0.72.3}/CODEOWNERS +0 -0
  42. {soup_cli-0.72.1 → soup_cli-0.72.3}/CODE_OF_CONDUCT.md +0 -0
  43. {soup_cli-0.72.1 → soup_cli-0.72.3}/CONTRIBUTORS.md +0 -0
  44. {soup_cli-0.72.1 → soup_cli-0.72.3}/Dockerfile +0 -0
  45. {soup_cli-0.72.1 → soup_cli-0.72.3}/LICENSE +0 -0
  46. {soup_cli-0.72.1 → soup_cli-0.72.3}/NOTICE +0 -0
  47. {soup_cli-0.72.1 → soup_cli-0.72.3}/SECURITY.md +0 -0
  48. {soup_cli-0.72.1 → soup_cli-0.72.3}/docker-compose.yml +0 -0
  49. {soup_cli-0.72.1 → soup_cli-0.72.3}/docs/README.md +0 -0
  50. {soup_cli-0.72.1 → soup_cli-0.72.3}/docs/adapters-and-governance.md +0 -0
  51. {soup_cli-0.72.1 → soup_cli-0.72.3}/docs/backends-and-ops.md +0 -0
  52. {soup_cli-0.72.1 → soup_cli-0.72.3}/docs/compliance.md +0 -0
  53. {soup_cli-0.72.1 → soup_cli-0.72.3}/docs/data.md +0 -0
  54. {soup_cli-0.72.1 → soup_cli-0.72.3}/docs/evaluation.md +0 -0
  55. {soup_cli-0.72.1 → soup_cli-0.72.3}/docs/models.md +0 -0
  56. {soup_cli-0.72.1 → soup_cli-0.72.3}/docs/peft-and-efficiency.md +0 -0
  57. {soup_cli-0.72.1 → soup_cli-0.72.3}/docs/serving-and-export.md +0 -0
  58. {soup_cli-0.72.1 → soup_cli-0.72.3}/examples/README.md +0 -0
  59. {soup_cli-0.72.1 → soup_cli-0.72.3}/examples/configs/dpo_chat.yaml +0 -0
  60. {soup_cli-0.72.1 → soup_cli-0.72.3}/examples/configs/dpo_example.yaml +0 -0
  61. {soup_cli-0.72.1 → soup_cli-0.72.3}/examples/configs/grpo_reasoning.yaml +0 -0
  62. {soup_cli-0.72.1 → soup_cli-0.72.3}/examples/configs/rlhf_step1_sft.yaml +0 -0
  63. {soup_cli-0.72.1 → soup_cli-0.72.3}/examples/configs/rlhf_step2_reward.yaml +0 -0
  64. {soup_cli-0.72.1 → soup_cli-0.72.3}/examples/configs/rlhf_step3_ppo.yaml +0 -0
  65. {soup_cli-0.72.1 → soup_cli-0.72.3}/examples/configs/sft_basic.yaml +0 -0
  66. {soup_cli-0.72.1 → soup_cli-0.72.3}/examples/configs/vision_llama.yaml +0 -0
  67. {soup_cli-0.72.1 → soup_cli-0.72.3}/examples/data/alpaca_tiny.jsonl +0 -0
  68. {soup_cli-0.72.1 → soup_cli-0.72.3}/examples/data/chat_preferences.jsonl +0 -0
  69. {soup_cli-0.72.1 → soup_cli-0.72.3}/examples/data/dpo_sample.jsonl +0 -0
  70. {soup_cli-0.72.1 → soup_cli-0.72.3}/examples/data/reasoning_math.jsonl +0 -0
  71. {soup_cli-0.72.1 → soup_cli-0.72.3}/examples/reward_hacking/rewards.py +0 -0
  72. {soup_cli-0.72.1 → soup_cli-0.72.3}/examples/synthetic_workflow.md +0 -0
  73. {soup_cli-0.72.1 → soup_cli-0.72.3}/examples/synthetic_workflow.yaml +0 -0
  74. {soup_cli-0.72.1 → soup_cli-0.72.3}/soup.png +0 -0
  75. {soup_cli-0.72.1 → soup_cli-0.72.3}/soup_logo_svg.svg +0 -0
  76. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/__main__.py +0 -0
  77. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/autopilot/__init__.py +0 -0
  78. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/autopilot/analyzer.py +0 -0
  79. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/autopilot/decisions.py +0 -0
  80. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/autopilot/generate_config.py +0 -0
  81. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/cans/__init__.py +0 -0
  82. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/cans/pack.py +0 -0
  83. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/cans/publish.py +0 -0
  84. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/cans/run.py +0 -0
  85. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/cans/schema.py +0 -0
  86. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/cans/unpack.py +0 -0
  87. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/cans/verify.py +0 -0
  88. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/cli.py +0 -0
  89. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/cloud/__init__.py +0 -0
  90. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/cloud/modal.py +0 -0
  91. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/__init__.py +0 -0
  92. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/_eval_v0550.py +0 -0
  93. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/_eval_v0610.py +0 -0
  94. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/_eval_v0650.py +0 -0
  95. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/_eval_v07110.py +0 -0
  96. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/_webhook_cli.py +0 -0
  97. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/ab.py +0 -0
  98. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/active_sample.py +0 -0
  99. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/adapters.py +0 -0
  100. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/advise.py +0 -0
  101. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/agent.py +0 -0
  102. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/airgap.py +0 -0
  103. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/apple_adapter.py +0 -0
  104. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/attest.py +0 -0
  105. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/audit_log.py +0 -0
  106. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/autopilot.py +0 -0
  107. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/bench.py +0 -0
  108. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/bom.py +0 -0
  109. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/build.py +0 -0
  110. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/can.py +0 -0
  111. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/card.py +0 -0
  112. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/chat.py +0 -0
  113. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/ci.py +0 -0
  114. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/compile_cmd.py +0 -0
  115. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/compile_tools.py +0 -0
  116. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/completions.py +0 -0
  117. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/cost.py +0 -0
  118. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/data.py +0 -0
  119. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/data_canary.py +0 -0
  120. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/data_doctor.py +0 -0
  121. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/data_forge.py +0 -0
  122. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/data_mix.py +0 -0
  123. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/data_score.py +0 -0
  124. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/data_topics.py +0 -0
  125. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/delinearize_llama4.py +0 -0
  126. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/deploy.py +0 -0
  127. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/diagnose.py +0 -0
  128. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/diff.py +0 -0
  129. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/distill_prompt.py +0 -0
  130. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/draft.py +0 -0
  131. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/drift_alarm.py +0 -0
  132. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/edit.py +0 -0
  133. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/env.py +0 -0
  134. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/eval.py +0 -0
  135. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/expect.py +0 -0
  136. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/export.py +0 -0
  137. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/fetch.py +0 -0
  138. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/generate.py +0 -0
  139. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/history.py +0 -0
  140. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/infer.py +0 -0
  141. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/ingest.py +0 -0
  142. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/init.py +0 -0
  143. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/iterative_dpo.py +0 -0
  144. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/license_advisor.py +0 -0
  145. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/llama.py +0 -0
  146. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/local_rl.py +0 -0
  147. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/lock.py +0 -0
  148. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/loop.py +0 -0
  149. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/mcp.py +0 -0
  150. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/merge.py +0 -0
  151. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
  152. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/migrate.py +0 -0
  153. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/monitor.py +0 -0
  154. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/plan.py +0 -0
  155. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/plugins.py +0 -0
  156. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/probe.py +0 -0
  157. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/profile.py +0 -0
  158. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/prune_prompt.py +0 -0
  159. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/push.py +0 -0
  160. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/quantize.py +0 -0
  161. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/quickstart.py +0 -0
  162. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/ra_dit.py +0 -0
  163. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/recipes.py +0 -0
  164. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/registry.py +0 -0
  165. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/reward.py +0 -0
  166. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/runs.py +0 -0
  167. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/serve.py +0 -0
  168. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/ship.py +0 -0
  169. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/shrink.py +0 -0
  170. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/spectrum.py +0 -0
  171. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/steer.py +0 -0
  172. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/sweep.py +0 -0
  173. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/tokenizer.py +0 -0
  174. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/tui.py +0 -0
  175. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/tunability.py +0 -0
  176. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/ui.py +0 -0
  177. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/commands/why.py +0 -0
  178. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/config/__init__.py +0 -0
  179. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/config/loader.py +0 -0
  180. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/__init__.py +0 -0
  181. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
  182. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
  183. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
  184. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
  185. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
  186. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
  187. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
  188. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
  189. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/gate/format_json.jsonl +0 -0
  190. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/gate/safety.jsonl +0 -0
  191. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/gate/tool_call.jsonl +0 -0
  192. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
  193. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
  194. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
  195. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
  196. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/augment.py +0 -0
  197. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/chat_templates.py +0 -0
  198. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/collators.py +0 -0
  199. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/formats.py +0 -0
  200. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/loader.py +0 -0
  201. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/loss_mask.py +0 -0
  202. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/providers/__init__.py +0 -0
  203. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/providers/_utils.py +0 -0
  204. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/providers/anthropic.py +0 -0
  205. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/providers/ollama.py +0 -0
  206. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/providers/vllm.py +0 -0
  207. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/sft_format.py +0 -0
  208. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/templates/__init__.py +0 -0
  209. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/templates/code.py +0 -0
  210. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/templates/conversation.py +0 -0
  211. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/templates/preference.py +0 -0
  212. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/templates/qa.py +0 -0
  213. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/templates/reasoning.py +0 -0
  214. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/templates/tool_calling.py +0 -0
  215. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/templates/verifiable.py +0 -0
  216. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/traces/__init__.py +0 -0
  217. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/traces/pair_builder.py +0 -0
  218. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/traces/parsers.py +0 -0
  219. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/traces/quality.py +0 -0
  220. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/data/validator.py +0 -0
  221. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/envs/__init__.py +0 -0
  222. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/envs/_common.py +0 -0
  223. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/envs/calculator.py +0 -0
  224. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/envs/guess_number.py +0 -0
  225. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/envs/retrieval_qa.py +0 -0
  226. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/eval/__init__.py +0 -0
  227. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/eval/arena.py +0 -0
  228. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
  229. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/eval/calibrate.py +0 -0
  230. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
  231. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/eval/custom.py +0 -0
  232. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/eval/forgetting.py +0 -0
  233. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/eval/gate.py +0 -0
  234. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/eval/gate_suites.py +0 -0
  235. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/eval/human.py +0 -0
  236. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/eval/judge.py +0 -0
  237. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/eval/leaderboard.py +0 -0
  238. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/eval/quant_check.py +0 -0
  239. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/experiment/__init__.py +0 -0
  240. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/experiment/tracker.py +0 -0
  241. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/mcp_server/__init__.py +0 -0
  242. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/mcp_server/registry.py +0 -0
  243. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/mcp_server/server.py +0 -0
  244. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/migrate/__init__.py +0 -0
  245. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/migrate/axolotl.py +0 -0
  246. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/migrate/common.py +0 -0
  247. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/migrate/llamafactory.py +0 -0
  248. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/migrate/unsloth.py +0 -0
  249. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/monitoring/__init__.py +0 -0
  250. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/monitoring/callback.py +0 -0
  251. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
  252. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/monitoring/display.py +0 -0
  253. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
  254. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/monitoring/hf_push.py +0 -0
  255. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/monitoring/plugin_callback.py +0 -0
  256. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/monitoring/trace_logger.py +0 -0
  257. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/plugins/__init__.py +0 -0
  258. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/py.typed +0 -0
  259. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/recipes/__init__.py +0 -0
  260. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/recipes/catalog.py +0 -0
  261. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/registry/__init__.py +0 -0
  262. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/registry/attach.py +0 -0
  263. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/registry/diff.py +0 -0
  264. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/registry/hashing.py +0 -0
  265. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/registry/store.py +0 -0
  266. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/__init__.py +0 -0
  267. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/audio.yaml +0 -0
  268. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/bco.yaml +0 -0
  269. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/chat.yaml +0 -0
  270. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/code.yaml +0 -0
  271. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/embedding.yaml +0 -0
  272. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/eu-ai-act.yaml +0 -0
  273. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
  274. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
  275. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
  276. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/hipaa.yaml +0 -0
  277. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/ipo.yaml +0 -0
  278. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/kto.yaml +0 -0
  279. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/longcontext.yaml +0 -0
  280. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/manifest.json +0 -0
  281. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/medical.yaml +0 -0
  282. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/moe.yaml +0 -0
  283. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/orpo.yaml +0 -0
  284. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/pretrain.yaml +0 -0
  285. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/reasoning.yaml +0 -0
  286. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/rlhf.yaml +0 -0
  287. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/simpo.yaml +0 -0
  288. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/soc2.yaml +0 -0
  289. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/sr-11-7.yaml +0 -0
  290. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/tool-calling.yaml +0 -0
  291. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/templates/vision.yaml +0 -0
  292. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/__init__.py +0 -0
  293. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/asr.py +0 -0
  294. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/bco.py +0 -0
  295. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/bitnet.py +0 -0
  296. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/classifier.py +0 -0
  297. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/distill.py +0 -0
  298. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/dpo.py +0 -0
  299. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/embedding.py +0 -0
  300. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/grpo.py +0 -0
  301. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/ipo.py +0 -0
  302. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/kto.py +0 -0
  303. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/mlx_dpo.py +0 -0
  304. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/mlx_grpo.py +0 -0
  305. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/mlx_routing.py +0 -0
  306. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/mlx_sft.py +0 -0
  307. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/mole_routing.py +0 -0
  308. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/online_dpo.py +0 -0
  309. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/orpo.py +0 -0
  310. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/ppo.py +0 -0
  311. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/preference.py +0 -0
  312. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/pretrain.py +0 -0
  313. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/prm.py +0 -0
  314. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/raft.py +0 -0
  315. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/reward_model.py +0 -0
  316. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/rewards.py +0 -0
  317. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/simpo.py +0 -0
  318. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/tts.py +0 -0
  319. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/trainer/unlearn.py +0 -0
  320. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/tui_app.py +0 -0
  321. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/ui/__init__.py +0 -0
  322. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/ui/app.py +0 -0
  323. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/ui/plugins/__init__.py +0 -0
  324. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/ui/static/app.js +0 -0
  325. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/ui/static/index.html +0 -0
  326. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/ui/static/logo.png +0 -0
  327. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/ui/static/logo.svg +0 -0
  328. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/ui/static/style.css +0 -0
  329. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/__init__.py +0 -0
  330. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/_eval_text.py +0 -0
  331. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/ab_test.py +0 -0
  332. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/activation_offload.py +0 -0
  333. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/active_sampler.py +0 -0
  334. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/adapter_arithmetic.py +0 -0
  335. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/adapter_bisect.py +0 -0
  336. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/adapter_branch.py +0 -0
  337. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/adapter_diff.py +0 -0
  338. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/adapter_fuse.py +0 -0
  339. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/adapter_merge.py +0 -0
  340. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/adapter_pr.py +0 -0
  341. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/adapter_scan.py +0 -0
  342. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/adapter_sign.py +0 -0
  343. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/advanced_precision.py +0 -0
  344. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/advise.py +0 -0
  345. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/advise_history.py +0 -0
  346. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/agent_forge.py +0 -0
  347. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/agent_rollout.py +0 -0
  348. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/agent_sandbox.py +0 -0
  349. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/airgap_bundle.py +0 -0
  350. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/annex_xi.py +0 -0
  351. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/anthropic_messages.py +0 -0
  352. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/apple_adapter.py +0 -0
  353. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/asr_metrics.py +0 -0
  354. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/attest.py +0 -0
  355. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/audit_log.py +0 -0
  356. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/auto_quant.py +0 -0
  357. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/backend_detect.py +0 -0
  358. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/batch_probe.py +0 -0
  359. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/behavior_battery.py +0 -0
  360. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/best_of_n.py +0 -0
  361. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/bitnet.py +0 -0
  362. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/blame.py +0 -0
  363. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/block_expansion.py +0 -0
  364. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/bom.py +0 -0
  365. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/brain_rot.py +0 -0
  366. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/brain_rot_lang.py +0 -0
  367. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/build_dag.py +0 -0
  368. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/canary.py +0 -0
  369. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/canary_discovery.py +0 -0
  370. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/canary_router.py +0 -0
  371. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/capability_suite.py +0 -0
  372. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/checklist_dsl.py +0 -0
  373. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
  374. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/ci_workflow.py +0 -0
  375. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/citation_faithful.py +0 -0
  376. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/classifier.py +0 -0
  377. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/cmaes_merge.py +0 -0
  378. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/compile_tools.py +0 -0
  379. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/completions.py +0 -0
  380. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/constants.py +0 -0
  381. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/convergence.py +0 -0
  382. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/crash.py +0 -0
  383. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/cross_doc_attn.py +0 -0
  384. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/curriculum.py +0 -0
  385. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
  386. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/cut_ce.py +0 -0
  387. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/data_doctor.py +0 -0
  388. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/data_forge.py +0 -0
  389. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/data_lint.py +0 -0
  390. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/data_mix.py +0 -0
  391. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/data_pipeline.py +0 -0
  392. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/data_score.py +0 -0
  393. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/deepspeed.py +0 -0
  394. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/delinearize_llama4.py +0 -0
  395. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/demo_bundles.py +0 -0
  396. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/deploy_autopilot.py +0 -0
  397. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/deploy_measure.py +0 -0
  398. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/__init__.py +0 -0
  399. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/_common.py +0 -0
  400. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/badge.py +0 -0
  401. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/citation.py +0 -0
  402. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/contamination.py +0 -0
  403. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
  404. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/format.py +0 -0
  405. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/live.py +0 -0
  406. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/memorization.py +0 -0
  407. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
  408. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/refusal.py +0 -0
  409. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/report.py +0 -0
  410. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/diagnose/runner.py +0 -0
  411. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/distill.py +0 -0
  412. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/dpo_variants.py +0 -0
  413. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/draft.py +0 -0
  414. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/drift_alarm.py +0 -0
  415. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/ebft_gdpo.py +0 -0
  416. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/echo_trap.py +0 -0
  417. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/edit_diff.py +0 -0
  418. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/edit_governor.py +0 -0
  419. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/edit_kernels.py +0 -0
  420. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/embed.py +0 -0
  421. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/encoding.py +0 -0
  422. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/energy.py +0 -0
  423. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/env_lock.py +0 -0
  424. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/errors.py +0 -0
  425. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/eval_design.py +0 -0
  426. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/eval_gate_hook.py +0 -0
  427. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
  428. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/evolve.py +0 -0
  429. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/expectations.py +0 -0
  430. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/fetch_examples.py +0 -0
  431. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/flash_attn.py +0 -0
  432. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/fp8.py +0 -0
  433. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/freeze.py +0 -0
  434. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/fsdp.py +0 -0
  435. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
  436. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/galore.py +0 -0
  437. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/gguf_quant.py +0 -0
  438. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/gpu.py +0 -0
  439. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/gpu_monitor.py +0 -0
  440. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/grace_codebook.py +0 -0
  441. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/graceful_save.py +0 -0
  442. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/grad_accum.py +0 -0
  443. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/gradient_ckpt.py +0 -0
  444. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/grpo_long_context.py +0 -0
  445. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/grpo_variants.py +0 -0
  446. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/hardware_fit.py +0 -0
  447. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/harm_probe.py +0 -0
  448. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/hf.py +0 -0
  449. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/hf_space.py +0 -0
  450. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/hubs.py +0 -0
  451. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/ingest_sources.py +0 -0
  452. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/integrations.py +0 -0
  453. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/interference.py +0 -0
  454. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/interference_live.py +0 -0
  455. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/irt.py +0 -0
  456. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/iterative_dpo.py +0 -0
  457. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/jinja_analyzer.py +0 -0
  458. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/kernel_picker.py +0 -0
  459. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/knowledge_edit.py +0 -0
  460. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/kv_cache.py +0 -0
  461. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/launcher.py +0 -0
  462. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/license_advisor.py +0 -0
  463. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/license_matrix.py +0 -0
  464. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/liger.py +0 -0
  465. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/lisa.py +0 -0
  466. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/live_eval.py +0 -0
  467. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/llama_proxy.py +0 -0
  468. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/llama_server_timings.py +0 -0
  469. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/local_rl.py +0 -0
  470. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
  471. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/loftq_init.py +0 -0
  472. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/log_level.py +0 -0
  473. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/long_context.py +0 -0
  474. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/longlora.py +0 -0
  475. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/loop_budget.py +0 -0
  476. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/loop_daemon.py +0 -0
  477. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/loop_iteration.py +0 -0
  478. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/loop_stages.py +0 -0
  479. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/loop_state.py +0 -0
  480. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/lr_finder.py +0 -0
  481. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/lr_groups.py +0 -0
  482. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/magpie.py +0 -0
  483. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/metrics.py +0 -0
  484. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/mii.py +0 -0
  485. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/minillm.py +0 -0
  486. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/mix_proxy.py +0 -0
  487. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/mixed_precision.py +0 -0
  488. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/mlx.py +0 -0
  489. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/mod.py +0 -0
  490. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/moe.py +0 -0
  491. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/moe_quant.py +0 -0
  492. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/mole_routing.py +0 -0
  493. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/multipack.py +0 -0
  494. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/multipack_sampler.py +0 -0
  495. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/multipack_trainer.py +0 -0
  496. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/namespace_pin.py +0 -0
  497. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/neat_packing.py +0 -0
  498. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/ngram_spec.py +0 -0
  499. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/nlg_metrics.py +0 -0
  500. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/ollama.py +0 -0
  501. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/onboarding.py +0 -0
  502. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/optimizer_zoo.py +0 -0
  503. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/paths.py +0 -0
  504. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/peft_builder.py +0 -0
  505. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/peft_patches.py +0 -0
  506. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/peft_wiring.py +0 -0
  507. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/persona_hub.py +0 -0
  508. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/pipeline.py +0 -0
  509. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/preference_combine.py +0 -0
  510. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/prm.py +0 -0
  511. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/prm_reward.py +0 -0
  512. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/probe_kernel.py +0 -0
  513. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/probe_pack.py +0 -0
  514. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/profiler.py +0 -0
  515. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/profiling.py +0 -0
  516. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/profiling_v0_43.py +0 -0
  517. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/prompt_compile.py +0 -0
  518. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/prompt_distill.py +0 -0
  519. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/prune_prompt.py +0 -0
  520. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/qat.py +0 -0
  521. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/qr_url.py +0 -0
  522. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/quality.py +0 -0
  523. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/quant_menu.py +0 -0
  524. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/ra_dit.py +0 -0
  525. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/ra_dit_run.py +0 -0
  526. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/raft.py +0 -0
  527. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/reasoning_effort.py +0 -0
  528. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/reasoning_parser.py +0 -0
  529. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/recipe_dag.py +0 -0
  530. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/recipe_run.py +0 -0
  531. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/registry.py +0 -0
  532. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/rehearsal.py +0 -0
  533. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/relora.py +0 -0
  534. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/replay.py +0 -0
  535. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/repro_receipt.py +0 -0
  536. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/reward_hack_control.py +0 -0
  537. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/reward_hacking.py +0 -0
  538. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/reward_synth.py +0 -0
  539. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/ring_attention.py +0 -0
  540. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/rl_checkpoint.py +0 -0
  541. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
  542. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/run_cost.py +0 -0
  543. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/sae_diff.py +0 -0
  544. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/save_formats.py +0 -0
  545. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/semdedup.py +0 -0
  546. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/server_tools.py +0 -0
  547. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/sglang.py +0 -0
  548. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/ship_verdict.py +0 -0
  549. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/shortcuts.py +0 -0
  550. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/shrink.py +0 -0
  551. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/signing.py +0 -0
  552. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/sleeper_probe.py +0 -0
  553. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/soup_lock.py +0 -0
  554. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/spec_pairing.py +0 -0
  555. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/spectrum_scan.py +0 -0
  556. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/spike_recovery.py +0 -0
  557. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/sse_train_stream.py +0 -0
  558. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/steering.py +0 -0
  559. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/strict_safetensors.py +0 -0
  560. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/structured_output.py +0 -0
  561. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/sweep_config.py +0 -0
  562. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/tail_latency.py +0 -0
  563. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/terraform_plan.py +0 -0
  564. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/tool_outputs.py +0 -0
  565. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/topics.py +0 -0
  566. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/topology.py +0 -0
  567. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/tracing.py +0 -0
  568. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/trackers.py +0 -0
  569. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/train_event_buffer.py +0 -0
  570. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/trainer_plugins.py +0 -0
  571. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/trust_remote.py +0 -0
  572. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/truth_probe.py +0 -0
  573. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/tts.py +0 -0
  574. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/tts_codec.py +0 -0
  575. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/tunability.py +0 -0
  576. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/ui_env.py +0 -0
  577. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/uld.py +0 -0
  578. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/unlearn_kernels.py +0 -0
  579. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/unlearning.py +0 -0
  580. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/unlearning_eval.py +0 -0
  581. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/unsloth.py +0 -0
  582. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/v028_features.py +0 -0
  583. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/vector_bank.py +0 -0
  584. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/vllm.py +0 -0
  585. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/vscode_setup.py +0 -0
  586. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/warmup.py +0 -0
  587. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/webhooks.py +0 -0
  588. {soup_cli-0.72.1 → soup_cli-0.72.3}/src/soup_cli/utils/why.py +0 -0
  589. {soup_cli-0.72.1 → soup_cli-0.72.3}/templates/chat.yaml +0 -0
  590. {soup_cli-0.72.1 → soup_cli-0.72.3}/templates/code.yaml +0 -0
  591. {soup_cli-0.72.1 → soup_cli-0.72.3}/templates/medical.yaml +0 -0
  592. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/__init__.py +0 -0
  593. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/conftest.py +0 -0
  594. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/qa/v053_qa.md +0 -0
  595. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/qa/v07114_qa.md +0 -0
  596. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/qa/v0716_qa.md +0 -0
  597. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_adapters.py +0 -0
  598. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_advanced_peft.py +0 -0
  599. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_assistant_mask.py +0 -0
  600. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_audio.py +0 -0
  601. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_auto_tuning.py +0 -0
  602. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_autopilot.py +0 -0
  603. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_awq_gptq_export.py +0 -0
  604. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_batch_probe.py +0 -0
  605. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_bco.py +0 -0
  606. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_bench.py +0 -0
  607. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_brain_rot_multilingual.py +0 -0
  608. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_bugfixes.py +0 -0
  609. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_build_dag.py +0 -0
  610. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_callback.py +0 -0
  611. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_cans.py +0 -0
  612. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_chat.py +0 -0
  613. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_chat_template.py +0 -0
  614. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_cli.py +0 -0
  615. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_cli_subprocess.py +0 -0
  616. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_code_review_critical.py +0 -0
  617. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_code_review_deferred.py +0 -0
  618. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_code_review_high.py +0 -0
  619. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_code_review_medium_low.py +0 -0
  620. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_code_review_recurring.py +0 -0
  621. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_config.py +0 -0
  622. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_cost.py +0 -0
  623. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_crash_reporter.py +0 -0
  624. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_curriculum.py +0 -0
  625. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_data.py +0 -0
  626. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_data_augment.py +0 -0
  627. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_data_sample.py +0 -0
  628. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_data_split.py +0 -0
  629. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_data_tools.py +0 -0
  630. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_dataset_hub.py +0 -0
  631. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_dataset_registry.py +0 -0
  632. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_deepspeed.py +0 -0
  633. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_deploy_ollama.py +0 -0
  634. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_diff.py +0 -0
  635. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_display.py +0 -0
  636. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_doctor.py +0 -0
  637. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_dpo_example.py +0 -0
  638. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_dpo_variants.py +0 -0
  639. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_embedding.py +0 -0
  640. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_errors.py +0 -0
  641. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_eval.py +0 -0
  642. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_eval_gate.py +0 -0
  643. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_eval_platform.py +0 -0
  644. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_export.py +0 -0
  645. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_formats.py +0 -0
  646. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_fp8_recipe.py +0 -0
  647. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_freeze_training.py +0 -0
  648. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_generate.py +0 -0
  649. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_gpu.py +0 -0
  650. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_grpo.py +0 -0
  651. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_hf_integration.py +0 -0
  652. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_infer.py +0 -0
  653. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_inference_advanced.py +0 -0
  654. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_init.py +0 -0
  655. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_ipo.py +0 -0
  656. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_issue300_online_dpo_train.py +0 -0
  657. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_issue302_vision_pad_token.py +0 -0
  658. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_issue305_mixed_rank_arithmetic.py +0 -0
  659. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_jinja_analyzer.py +0 -0
  660. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_kto.py +0 -0
  661. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_loader.py +0 -0
  662. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_log_level.py +0 -0
  663. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_loss_watchdog.py +0 -0
  664. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_merge.py +0 -0
  665. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_migrate.py +0 -0
  666. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_mlx_backend.py +0 -0
  667. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_moe.py +0 -0
  668. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_multi_adapter.py +0 -0
  669. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_multi_gpu.py +0 -0
  670. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_multipack_config.py +0 -0
  671. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_multipack_invariants.py +0 -0
  672. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_multipack_sampler.py +0 -0
  673. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_neat_packing.py +0 -0
  674. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_neftune_rslora.py +0 -0
  675. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_onnx_tensorrt_export.py +0 -0
  676. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_orpo.py +0 -0
  677. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_packing.py +0 -0
  678. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_part_a_wave1.py +0 -0
  679. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_part_a_wave2.py +0 -0
  680. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_part_b.py +0 -0
  681. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_part_c.py +0 -0
  682. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_part_d.py +0 -0
  683. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_part_e.py +0 -0
  684. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_part_f_hardening.py +0 -0
  685. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_peft_methods.py +0 -0
  686. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_peft_patches.py +0 -0
  687. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_performance.py +0 -0
  688. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_pissa_init.py +0 -0
  689. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_ppo.py +0 -0
  690. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_preference_dispatcher.py +0 -0
  691. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_preference_multi.py +0 -0
  692. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_preference_multi_runtime.py +0 -0
  693. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_pretrain.py +0 -0
  694. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_profile.py +0 -0
  695. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_profiling.py +0 -0
  696. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_progress.py +0 -0
  697. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_push.py +0 -0
  698. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_qat.py +0 -0
  699. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_quality_filter.py +0 -0
  700. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_quant_check.py +0 -0
  701. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_quant_menu.py +0 -0
  702. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_quickstart.py +0 -0
  703. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_rank_pattern.py +0 -0
  704. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_recipes.py +0 -0
  705. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_recipes_v031.py +0 -0
  706. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_refusal_multilingual.py +0 -0
  707. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_registry.py +0 -0
  708. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_relora.py +0 -0
  709. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_replay.py +0 -0
  710. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_resume.py +0 -0
  711. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_review_fixes_v07133.py +0 -0
  712. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_rlvr.py +0 -0
  713. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_run_cost.py +0 -0
  714. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_runs.py +0 -0
  715. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_serve.py +0 -0
  716. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_server_generate.py +0 -0
  717. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_sglang_serve.py +0 -0
  718. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_simpo.py +0 -0
  719. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_smoke_train.py +0 -0
  720. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_speculative_decoding.py +0 -0
  721. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_sweep.py +0 -0
  722. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_synth_data_pro.py +0 -0
  723. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_templates_yaml.py +0 -0
  724. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_tensorboard.py +0 -0
  725. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_tool_calling.py +0 -0
  726. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_trace_to_pref.py +0 -0
  727. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_tracker.py +0 -0
  728. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_trainer_coverage_v035.py +0 -0
  729. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_trainer_init.py +0 -0
  730. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_training_intelligence.py +0 -0
  731. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_training_speed.py +0 -0
  732. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_trust_remote_code.py +0 -0
  733. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_tui.py +0 -0
  734. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_ui.py +0 -0
  735. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_ui_chat.py +0 -0
  736. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_ui_config_builder.py +0 -0
  737. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_ui_live_monitor.py +0 -0
  738. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_ui_metrics.py +0 -0
  739. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_unsloth.py +0 -0
  740. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0401_part_c.py +0 -0
  741. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0401_part_d.py +0 -0
  742. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0401_part_e.py +0 -0
  743. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0402_part_a.py +0 -0
  744. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0402_part_b.py +0 -0
  745. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0403_part_a.py +0 -0
  746. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0403_part_b.py +0 -0
  747. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0403_part_c.py +0 -0
  748. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0404_part_a.py +0 -0
  749. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0404_part_b.py +0 -0
  750. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0405_part_a.py +0 -0
  751. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0406_part_a.py +0 -0
  752. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0410_part_a.py +0 -0
  753. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0410_part_b.py +0 -0
  754. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0410_part_c.py +0 -0
  755. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0420.py +0 -0
  756. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0430_part_a.py +0 -0
  757. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0430_part_b.py +0 -0
  758. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0430_part_c.py +0 -0
  759. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0430_part_d.py +0 -0
  760. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0440_part_a.py +0 -0
  761. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0440_part_b.py +0 -0
  762. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0440_part_c.py +0 -0
  763. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0440_part_d.py +0 -0
  764. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0440_review_followups.py +0 -0
  765. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0450.py +0 -0
  766. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0460_part_a.py +0 -0
  767. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0460_part_b.py +0 -0
  768. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0470_part_a.py +0 -0
  769. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0470_part_b.py +0 -0
  770. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0480_part_a.py +0 -0
  771. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0480_part_b.py +0 -0
  772. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0490.py +0 -0
  773. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0500_part_a.py +0 -0
  774. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0500_part_b.py +0 -0
  775. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0500_part_c.py +0 -0
  776. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0500_part_d.py +0 -0
  777. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0500_part_e.py +0 -0
  778. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0510.py +0 -0
  779. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0520.py +0 -0
  780. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0530.py +0 -0
  781. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v05310.py +0 -0
  782. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v05311.py +0 -0
  783. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0531_109.py +0 -0
  784. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0531_139.py +0 -0
  785. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0531_142.py +0 -0
  786. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0531_82.py +0 -0
  787. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0532.py +0 -0
  788. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0533.py +0 -0
  789. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0534.py +0 -0
  790. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0535.py +0 -0
  791. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0536.py +0 -0
  792. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0537.py +0 -0
  793. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0538.py +0 -0
  794. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0539.py +0 -0
  795. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0540.py +0 -0
  796. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0550.py +0 -0
  797. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0550_followups.py +0 -0
  798. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0560.py +0 -0
  799. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0570_part_a.py +0 -0
  800. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0570_part_b.py +0 -0
  801. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0570_part_c.py +0 -0
  802. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0570_part_d.py +0 -0
  803. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0580.py +0 -0
  804. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0590.py +0 -0
  805. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0600_part_a.py +0 -0
  806. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0600_part_b.py +0 -0
  807. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0600_part_c.py +0 -0
  808. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0600_part_d.py +0 -0
  809. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0600_part_e.py +0 -0
  810. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0600_part_f.py +0 -0
  811. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0610_part_a.py +0 -0
  812. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0610_part_b.py +0 -0
  813. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0610_part_c.py +0 -0
  814. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0610_part_d.py +0 -0
  815. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0610_part_e.py +0 -0
  816. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0620_followups.py +0 -0
  817. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0620_part_a.py +0 -0
  818. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0620_part_b.py +0 -0
  819. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0620_part_c.py +0 -0
  820. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0620_part_d.py +0 -0
  821. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0620_part_e.py +0 -0
  822. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0630_followups.py +0 -0
  823. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0630_part_a.py +0 -0
  824. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0630_part_b.py +0 -0
  825. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0630_part_c.py +0 -0
  826. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0630_part_d.py +0 -0
  827. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0630_part_e.py +0 -0
  828. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0631_206.py +0 -0
  829. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0640_followups.py +0 -0
  830. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0640_part_a.py +0 -0
  831. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0640_part_b.py +0 -0
  832. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0640_part_c.py +0 -0
  833. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0640_part_d.py +0 -0
  834. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0640_part_e.py +0 -0
  835. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0640_part_f.py +0 -0
  836. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0650_followups.py +0 -0
  837. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0650_part_a.py +0 -0
  838. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0650_part_b.py +0 -0
  839. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0650_part_c.py +0 -0
  840. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0650_part_d.py +0 -0
  841. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0650_part_e.py +0 -0
  842. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0660_cli.py +0 -0
  843. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0660_followups.py +0 -0
  844. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0660_part_a.py +0 -0
  845. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0660_part_b.py +0 -0
  846. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0660_part_c.py +0 -0
  847. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0660_part_d.py +0 -0
  848. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0660_part_e.py +0 -0
  849. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0670_followups.py +0 -0
  850. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0670_part_a.py +0 -0
  851. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0670_part_b.py +0 -0
  852. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0670_part_c.py +0 -0
  853. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0670_part_d.py +0 -0
  854. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0670_part_e.py +0 -0
  855. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0670_part_f.py +0 -0
  856. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0680_followups.py +0 -0
  857. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0680_part_a.py +0 -0
  858. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0680_part_b.py +0 -0
  859. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0680_part_c.py +0 -0
  860. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0680_part_d.py +0 -0
  861. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0680_part_e.py +0 -0
  862. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0690_part_a.py +0 -0
  863. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0690_part_b.py +0 -0
  864. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0690_part_c.py +0 -0
  865. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0690_part_d.py +0 -0
  866. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0690_part_e.py +0 -0
  867. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0700_part_a.py +0 -0
  868. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0700_part_b.py +0 -0
  869. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0700_part_c.py +0 -0
  870. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0700_part_d.py +0 -0
  871. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0700_part_e.py +0 -0
  872. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0700_part_f.py +0 -0
  873. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07110.py +0 -0
  874. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07111.py +0 -0
  875. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07112.py +0 -0
  876. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07113.py +0 -0
  877. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07114.py +0 -0
  878. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07115.py +0 -0
  879. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07116.py +0 -0
  880. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07117.py +0 -0
  881. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07118.py +0 -0
  882. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07119.py +0 -0
  883. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0712.py +0 -0
  884. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07120.py +0 -0
  885. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07121.py +0 -0
  886. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07122.py +0 -0
  887. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07123.py +0 -0
  888. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07124.py +0 -0
  889. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07125.py +0 -0
  890. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07126.py +0 -0
  891. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07127.py +0 -0
  892. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07128.py +0 -0
  893. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07129.py +0 -0
  894. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0713.py +0 -0
  895. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07130.py +0 -0
  896. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07131.py +0 -0
  897. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07132.py +0 -0
  898. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07133.py +0 -0
  899. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07134.py +0 -0
  900. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07135.py +0 -0
  901. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07136.py +0 -0
  902. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07137.py +0 -0
  903. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07138.py +0 -0
  904. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07139.py +0 -0
  905. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0714.py +0 -0
  906. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07140.py +0 -0
  907. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v07141.py +0 -0
  908. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0715.py +0 -0
  909. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0716.py +0 -0
  910. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0717.py +0 -0
  911. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0718.py +0 -0
  912. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_v0719.py +0 -0
  913. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_validator.py +0 -0
  914. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_vision.py +0 -0
  915. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_vllm_serve.py +0 -0
  916. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_warmup.py +0 -0
  917. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_why.py +0 -0
  918. {soup_cli-0.72.1 → soup_cli-0.72.3}/tests/test_windows_encoding.py +0 -0
@@ -0,0 +1,7 @@
1
+ # Sponsor button shown in the repo sidebar and on every issue / PR.
2
+ #
3
+ # `github:` only renders once the account is enrolled in GitHub Sponsors
4
+ # (https://github.com/sponsors) — it is not, so it stays commented out.
5
+ # github: MakazhanAlpamys
6
+
7
+ custom: ["https://buy.stripe.com/4gMcN441k3pha3T19ye7m04"]
@@ -12,6 +12,144 @@ 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
+
80
+ ## [0.72.2] - 2026-07-28
81
+
82
+ **Added — NF4 layer streaming: fine-tune Llama-3.1-8B on a 4 GB laptop GPU.**
83
+
84
+ Layer streaming (v0.72.0) keeps the frozen base in CPU RAM and streams it to the
85
+ GPU one decoder layer at a time, so peak VRAM is bounded by one layer instead of
86
+ the whole model. It was bf16-only, which capped it at about 3B on a small card.
87
+ Quantising the streamed base to NF4 shrinks it ~4×, and that is what brings 8B
88
+ within reach.
89
+
90
+ Add one line to a streaming config:
91
+
92
+ ```yaml
93
+ training:
94
+ stream_layers: true
95
+ quantization: 4bit # NF4
96
+ batch_size: 1
97
+ ```
98
+
99
+ **Measured on a 4 GB RTX 3050 Laptop** (Windows, batch 1, S=512, gradient
100
+ checkpointing, 50 steps after 10 warm-up, `PagedAdamW8bit`):
101
+
102
+ | Model | tok/s | Peak VRAM | RAM store | GPU util |
103
+ |---|---|---|---|---|
104
+ | Llama-3.1-8B-Instruct | 119.6 | 3.32 GB | 3.60 GB (page-locked) | 100% |
105
+ | Qwen2.5-3B | 264.2 | 1.76 GB | 1.43 GB (page-locked) | 100% |
106
+
107
+ For scale: 1M training tokens is about 2.3 h at 8B on that card (arithmetic from
108
+ the measured rate, not a separate measurement).
109
+
110
+ Qwen2.5-3B also got **1.85× faster** than the bf16 streaming path (264.2 vs
111
+ 143.1 tok/s) — and the reason is not arithmetic. A 1.43 GB store fits under the
112
+ machine's page-locked memory ceiling where a 5.55 GB one did not, which restores
113
+ asynchronous host-to-device copies and lifts GPU utilisation from 79.3% to 100%.
114
+
115
+ **Correctness.** A streamed NF4 run is **bit-exact** against a resident NF4 run:
116
+ the same quantised bytes through the same bitsandbytes kernels. Logit equality,
117
+ non-zero gradients at layer 0, and a matching multi-step loss curve are all
118
+ regression tests, not one-off measurements.
119
+
120
+ The base is quantised once, offline, and cached under `~/.soup/layer-stream/`.
121
+ The cache is keyed to the quantisation *and* the source checkpoint, so switching
122
+ between `none` and `4bit`, or retraining a base in place, re-shards instead of
123
+ silently streaming the wrong bytes.
124
+
125
+ **Fixed — a streamed 4-bit run reported its parameter count ~6.5× too high.**
126
+ SmolLM2-135M printed "878,154,048 total" (true: 134,515,008). Display only —
127
+ training was unaffected — but at 8B it would have read ~52 B.
128
+
129
+ Scope is unchanged and still BETA: RAM tier, `task: sft`, Llama/Qwen,
130
+ `batch_size: 1`, no gradient accumulation, no `--resume`. Every rejected config
131
+ names the release that lifts it. `quantization` values other than `none` and
132
+ `4bit` are refused.
133
+
134
+ **Fixed — `soup --help` was 5x slower than it should be.** Since v0.72.0 the CLI
135
+ imported PyTorch on startup, taking **6.0 s** where it now takes **1.15 s**.
136
+
137
+ `soup reward stress` (v0.71.41) put `utils/reward_stress` on the light CLI path.
138
+ That module imported `utils/reward_hack_control` to reuse a single string
139
+ constant — and `reward_hack_control` resolves its `TrainerCallback` base class at
140
+ module scope, which pulls in `transformers` and `torch`. Importing a ~4.4 s
141
+ dependency for one constant made every `soup` invocation pay for the training
142
+ stack, including commands that never touch a model.
143
+
144
+ Nothing produced wrong results; this was purely startup latency. The light core
145
+ (`pip install soup-cli` without the `[train]` extra) was never broken — it fell
146
+ back cleanly when torch was absent, just slowly when it was present.
147
+
148
+ Added `tests/test_cli_startup_is_light.py`, which asserts the invariant at
149
+ runtime (`import soup_cli.cli` must not put `torch` in `sys.modules`) instead of
150
+ inspecting source text for `import torch`, which is what the previous guards did
151
+ and why this went unnoticed.
152
+
15
153
  ## [0.72.1] - 2026-07-27
16
154
 
17
155
  **Fixed — layer-streaming adapters were saved in an unloadable form.** If you
@@ -120,7 +120,7 @@ src/soup_cli/
120
120
  templates/ - 21 built-in soup.yaml templates (YAML + manifest.json) with load_template loader (v0.39.0, +bco v0.40.0, +4 compliance v0.71.35)
121
121
  ui/ - Web UI (FastAPI + HTML/JS SPA)
122
122
 
123
- tests/ - Test suite (325 files, 16752 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.1
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,41 +193,41 @@ infrastructure instead of improving models. Soup fixes that.
193
193
 
194
194
  ## What's New
195
195
 
196
- **v0.72.1Fix: layer-streaming adapters were saved unloadable.** If you trained with
197
- `stream_layers: true` on v0.72.0, that adapter is **inert** every tensor was written under a
198
- key with an extra `.inner.` segment, so `soup merge`, `soup serve`, `soup chat` and
199
- `PeftModel.from_pretrained` loaded **zero** tensors and silently returned the untuned base.
200
- Only a `UserWarning` was emitted.
201
-
202
- - **The training was correct; only the saved file was affected.** v0.72.0's bit-exactness
203
- results still stand.
204
- - **Check an existing adapter:** if `adapter_model.safetensors` has keys containing `.inner.`,
205
- it is affected re-run or re-save it on v0.72.1.
206
- - Streamed adapters now save in exactly the same layout as an ordinary LoRA run.
207
-
208
- **Layer streaming (BETA), from v0.72.0.** Fine-tune models that don't fit in your card. The
209
- frozen base streams from CPU RAM one decoder layer at a time into a small pool of VRAM buffers
210
- while the LoRA adapters stay resident, so peak VRAM is bounded by one layer rather than the
211
- whole model. **Qwen2.5-3B trains in 2.15 GB on a 4 GB card, where a resident run OOMs.**
212
-
213
- - **`training.stream_layers: true`** a config key, not a CLI flag. Tune with
214
- `stream_source` (`ram` today; `disk` is v0.72.3) and `stream_buffers` (2–8, default 2).
215
- - **Measured on a 4 GB RTX 3050 Laptop** (batch 1, gradient checkpointing on): 0.5B at
216
- 978.6 tok/s / 1.47 GB, 1.5B at 525.0 tok/s / 1.82 GB, 3B at 143.1 tok/s / 2.15 GB.
217
- - **Honest cost: 1.43× slower than resident**, measured at 0.5B — the only apples-to-apples
218
- comparison available on that box, because 1.5B and above cannot run resident there at all.
219
- - **Proof-of-mechanism at 3B.** Nothing above 3B was measured; no 8B/14B claim is supported.
220
- Scope: RAM tier, bf16, `task: sft`, Llama/Qwen, batch size 1, no gradient accumulation, no
221
- `--resume`. 4-bit (NF4) streaming is **v0.72.2** and is refused with a clear message today.
196
+ **v0.72.3layer 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.
222
216
 
223
217
  ```yaml
224
218
  # soup.yaml — then just `soup train --config soup.yaml`
225
219
  training:
226
- stream_layers: true # base streams from RAM; only the adapter trains
227
- batch_size: 1
228
- quantization: none # NF4 streaming lands in v0.72.2
220
+ stream_layers: true # base streams out of VRAM; only the adapter trains
221
+ quantization: 4bit # NF4 — ~4x smaller store, so 8B fits a 4 GB card
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
229
224
  ```
230
225
 
226
+ > **Trained with `stream_layers: true` on v0.72.0?** That adapter is inert — its tensors were
227
+ > saved under keys with an extra `.inner.` segment, so every loader returned the untuned base.
228
+ > Fixed in v0.72.1; re-run or re-save. Check with:
229
+ > `python -c "from safetensors.torch import load_file; print([k for k in load_file('adapter_model.safetensors') if '.inner.' in k][:3])"`
230
+
231
231
  <details>
232
232
  <summary>Previous release — v0.71.40, soup reward synth (generate a reward verifier from your data)</summary>
233
233
 
@@ -495,6 +495,25 @@ pre-commit install # optional: ruff lint+format on commit
495
495
  See [CONTRIBUTING.md](CONTRIBUTING.md) for the full workflow and [SECURITY.md](SECURITY.md) to
496
496
  report a vulnerability.
497
497
 
498
+ ## Support Soup
499
+
500
+ Soup is Apache-2.0 and free — and stays that way. It is built and maintained in the open on a
501
+ single 4 GB laptop, which is why every performance number in these docs is measured rather than
502
+ claimed.
503
+
504
+ If Soup saved you a training run, [starring the repo](https://github.com/MakazhanAlpamys/Soup)
505
+ helps most, and it costs nothing. If you would like to fund the work directly:
506
+
507
+ **[❤️ Donate](https://buy.stripe.com/4gMcN441k3pha3T19ye7m04)** — one-off, any amount (use
508
+ *Change amount* on the checkout page). Payments are processed by Stripe under the maintainer's
509
+ registered business, **MePlay, Inc.** — that name, not "Soup", is what appears on the checkout
510
+ page and on your card statement.
511
+
512
+ Donations fund GPU time for the hardware-gated work — multi-GPU, 8B+ validation, Apple
513
+ Silicon — that a single 4 GB laptop cannot reach. See the
514
+ [`help wanted`](https://github.com/MakazhanAlpamys/Soup/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22)
515
+ issues for exactly what is blocked on hardware today.
516
+
498
517
  ## Contributors
499
518
 
500
519
  Built by the community ❤️ — thank you to everyone who has contributed. See
@@ -49,41 +49,41 @@ infrastructure instead of improving models. Soup fixes that.
49
49
 
50
50
  ## What's New
51
51
 
52
- **v0.72.1Fix: layer-streaming adapters were saved unloadable.** If you trained with
53
- `stream_layers: true` on v0.72.0, that adapter is **inert** every tensor was written under a
54
- key with an extra `.inner.` segment, so `soup merge`, `soup serve`, `soup chat` and
55
- `PeftModel.from_pretrained` loaded **zero** tensors and silently returned the untuned base.
56
- Only a `UserWarning` was emitted.
57
-
58
- - **The training was correct; only the saved file was affected.** v0.72.0's bit-exactness
59
- results still stand.
60
- - **Check an existing adapter:** if `adapter_model.safetensors` has keys containing `.inner.`,
61
- it is affected re-run or re-save it on v0.72.1.
62
- - Streamed adapters now save in exactly the same layout as an ordinary LoRA run.
63
-
64
- **Layer streaming (BETA), from v0.72.0.** Fine-tune models that don't fit in your card. The
65
- frozen base streams from CPU RAM one decoder layer at a time into a small pool of VRAM buffers
66
- while the LoRA adapters stay resident, so peak VRAM is bounded by one layer rather than the
67
- whole model. **Qwen2.5-3B trains in 2.15 GB on a 4 GB card, where a resident run OOMs.**
68
-
69
- - **`training.stream_layers: true`** a config key, not a CLI flag. Tune with
70
- `stream_source` (`ram` today; `disk` is v0.72.3) and `stream_buffers` (2–8, default 2).
71
- - **Measured on a 4 GB RTX 3050 Laptop** (batch 1, gradient checkpointing on): 0.5B at
72
- 978.6 tok/s / 1.47 GB, 1.5B at 525.0 tok/s / 1.82 GB, 3B at 143.1 tok/s / 2.15 GB.
73
- - **Honest cost: 1.43× slower than resident**, measured at 0.5B — the only apples-to-apples
74
- comparison available on that box, because 1.5B and above cannot run resident there at all.
75
- - **Proof-of-mechanism at 3B.** Nothing above 3B was measured; no 8B/14B claim is supported.
76
- Scope: RAM tier, bf16, `task: sft`, Llama/Qwen, batch size 1, no gradient accumulation, no
77
- `--resume`. 4-bit (NF4) streaming is **v0.72.2** and is refused with a clear message today.
52
+ **v0.72.3layer 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.
78
72
 
79
73
  ```yaml
80
74
  # soup.yaml — then just `soup train --config soup.yaml`
81
75
  training:
82
- stream_layers: true # base streams from RAM; only the adapter trains
83
- batch_size: 1
84
- quantization: none # NF4 streaming lands in v0.72.2
76
+ stream_layers: true # base streams out of VRAM; only the adapter trains
77
+ quantization: 4bit # NF4 — ~4x smaller store, so 8B fits a 4 GB card
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
85
80
  ```
86
81
 
82
+ > **Trained with `stream_layers: true` on v0.72.0?** That adapter is inert — its tensors were
83
+ > saved under keys with an extra `.inner.` segment, so every loader returned the untuned base.
84
+ > Fixed in v0.72.1; re-run or re-save. Check with:
85
+ > `python -c "from safetensors.torch import load_file; print([k for k in load_file('adapter_model.safetensors') if '.inner.' in k][:3])"`
86
+
87
87
  <details>
88
88
  <summary>Previous release — v0.71.40, soup reward synth (generate a reward verifier from your data)</summary>
89
89
 
@@ -351,6 +351,25 @@ pre-commit install # optional: ruff lint+format on commit
351
351
  See [CONTRIBUTING.md](CONTRIBUTING.md) for the full workflow and [SECURITY.md](SECURITY.md) to
352
352
  report a vulnerability.
353
353
 
354
+ ## Support Soup
355
+
356
+ Soup is Apache-2.0 and free — and stays that way. It is built and maintained in the open on a
357
+ single 4 GB laptop, which is why every performance number in these docs is measured rather than
358
+ claimed.
359
+
360
+ If Soup saved you a training run, [starring the repo](https://github.com/MakazhanAlpamys/Soup)
361
+ helps most, and it costs nothing. If you would like to fund the work directly:
362
+
363
+ **[❤️ Donate](https://buy.stripe.com/4gMcN441k3pha3T19ye7m04)** — one-off, any amount (use
364
+ *Change amount* on the checkout page). Payments are processed by Stripe under the maintainer's
365
+ registered business, **MePlay, Inc.** — that name, not "Soup", is what appears on the checkout
366
+ page and on your card statement.
367
+
368
+ Donations fund GPU time for the hardware-gated work — multi-GPU, 8B+ validation, Apple
369
+ Silicon — that a single 4 GB laptop cannot reach. See the
370
+ [`help wanted`](https://github.com/MakazhanAlpamys/Soup/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22)
371
+ issues for exactly what is blocked on hardware today.
372
+
354
373
  ## Contributors
355
374
 
356
375
  Built by the community ❤️ — thank you to everyone who has contributed. See
@@ -30,7 +30,7 @@ soup merge-sharded-fsdp-weights ./shards -o merged.safetensors Consolidate FSDP
30
30
  soup delinearize-llama4 ./src --target ./out [--num-experts N] [--plan-only] Live Llama-4 fused-expert reshape [E*din,dout] -> [E,din,dout] + sidecar copy (v0.71.21)
31
31
  soup spectrum scan --model <id|path> --top-percent 50 [--modules mlp,attn] [-o patch.yaml] Spectrum SNR scan (no model load) -> training.unfrozen_parameters YAML patch (v0.71.23)
32
32
  soup train --config sft.yaml # training.lisa_enabled: true [lisa_num_layers lisa_interval_steps] LISA layerwise importance sampling — full-FT quality at LoRA-like memory (sft/transformers/text/quantization=none) (v0.71.34)
33
- soup train --config sft.yaml # training.stream_layers: true [stream_source stream_buffers] BETA layer streaming — the frozen base streams from CPU RAM one decoder layer at a time, so peak VRAM is bounded by ONE layer (sft/transformers/text/quantization=none, batch 1) (v0.72.0)
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)](#layer-streaming-beta-v0720)
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)
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
 
@@ -246,37 +246,107 @@ soup train --config soup.yaml
246
246
 
247
247
  The tradeoff: **1.43× slower than resident training**, measured at 0.5B — the only apples-to-apples comparison available on the reference box, because 1.5B and above cannot run resident there at all.
248
248
 
249
- **Measured numbers (RTX 3050 Laptop 4 GB, Windows 11, bf16 LoRA, batch 1, 50 steps after 10 warmup):**
249
+ ### NF4 streaming (`quantization: 4bit`)
250
250
 
251
- | Model | Seq Length | Throughput | GPU Util | Peak VRAM |
252
- |---|---|---|---|---|
253
- | Qwen2.5-0.5B | 512 | 978.6 tok/s | 91.4% | 1.47 GB |
254
- | Qwen2.5-1.5B | 512 | 525.0 tok/s | 96.8% | 1.82 GB |
255
- | Qwen2.5-1.5B | 1024 | 487.6 tok/s | 96.7% | 2.96 GB |
256
- | Qwen2.5-3B | 512 | 143.1 tok/s | 79.3% | 2.15 GB |
257
-
258
- **Headline:** Qwen2.5-3B trains in **2.15 GB** on a 4 GB card, where a resident run OOMs.
259
-
260
- **Honest scope (v0.72.0 = proof-of-mechanism):**
261
- - **Models measured:** Qwen2.5-0.5B, 1.5B and 3B, plus a live `soup train` on SmolLM2-135M. **Nothing above 3B was measured, and no 8B / 14B / 70B claim is supported.**
262
- - **RAM tier only.** `stream_source: ram` (`auto` resolves to it). The disk overflow tier ships in **v0.72.3**.
263
- - **Llama / Qwen only**, `task: sft`, `backend: transformers`, `modality: text`.
264
- - **`batch_size: 1`**, no gradient accumulation, no `--resume` all ship in **v0.72.3**.
265
- - **bf16 base; `quantization: none` is required.** 4-bit (NF4) weights carry a quantisation state and cannot be byte-copied into a plain buffer, so NF4 streaming is **v0.72.2**. A `4bit` config is refused today with a message saying exactly that.
266
- - **The 3B throughput is a LOWER BOUND.** The reference box could not page-lock the 5.55 GB base (its measured page-locked ceiling is 7.65 GB, and a CUDA context plus the model skeleton did not leave room), so that run fell back to a pageable store. Pageable memory makes the host-to-device copy synchronous, which costs overlap — visible as the GPU-utilisation drop from 96.8% (1.5B, pinned) to 79.3% (3B, pageable). Soup does this fallback automatically **and prints the cost** rather than absorbing it silently.
251
+ Quantising the streamed base to NF4 makes the RAM store ~4× smaller. That matters for two reasons, and the second is the bigger one:
252
+
253
+ 1. A bigger model fits in host RAM at all — an 8B base is ~3.6 GB of NF4 instead of ~16 GB of bf16.
254
+ 2. **The store fits under the machine's page-locked memory ceiling.** Pinned host memory is what lets `copy_(non_blocking=True)` actually overlap with compute. The reference box tops out at ~7.1 GB of page-locked memory, so a 5.55 GB bf16 3B base fell back to pageable and lost overlap; the 1.43 GB NF4 store pins, and utilisation goes from 79.3% to 100%.
255
+
256
+ The base is quantised **once, offline**, one tensor at a time, and cached. The shard cache is keyed to the quantisation, the dtype, the quantisation device and a fingerprint of the source checkpoint, so switching `none` ⇄ `4bit` — or retraining a base in place — re-shards rather than silently streaming the wrong bytes.
257
+
258
+ Correctness is not a tradeoff here either: a streamed NF4 run is **bit-exact** against a *resident* NF4 run (the same quantised bytes through the same bitsandbytes kernels), and that is a regression test, not a one-off measurement.
259
+
260
+ **Measured numbers (RTX 3050 Laptop 4 GB, Windows 11, LoRA, batch 1, 50 steps after 10 warmup):**
261
+
262
+ | Model | Quant | Seq | Throughput | GPU Util | Peak VRAM | RAM store |
263
+ |---|---|---|---|---|---|---|
264
+ | **Llama-3.1-8B-Instruct** | **NF4** | 512 | **119.6 tok/s** | 100% | **3.32 GB** | 3.60 GB pinned |
265
+ | Qwen2.5-3B | NF4 | 512 | 264.2 tok/s | 100% | 1.76 GB | 1.43 GB pinned |
266
+ | Qwen2.5-3B | bf16 | 512 | 143.1 tok/s | 79.3% | 2.15 GB | 5.55 GB pageable |
267
+ | Qwen2.5-1.5B | bf16 | 512 | 525.0 tok/s | 96.8% | 1.82 GB | pinned |
268
+ | Qwen2.5-1.5B | bf16 | 1024 | 487.6 tok/s | 96.7% | 2.96 GB | pinned |
269
+ | Qwen2.5-0.5B | bf16 | 512 | 978.6 tok/s | 91.4% | 1.47 GB | pinned |
270
+
271
+ **Headline:** **Llama-3.1-8B fine-tunes on a 4 GB card at 119.6 tok/s in 3.32 GB.** For scale, 1M training tokens is ~2.3 h at 8B (arithmetic from the measured rate, not a separate measurement).
272
+
273
+ The 3B NF4-vs-bf16 rows differ by 1.85×, but attribute that to **pinning, not arithmetic** — see point 2 above. The two rows also come from different sessions, and this card's boost clock varies ~13% between sessions, so treat the factor as indicative and the mechanism as the claim.
274
+
275
+ Untied `embed_tokens` + `lm_head` stay resident and unquantised (2.10 GB of the 8B row's 3.32 GB), which is why 8B sits close to this card's ceiling; treating them as streamed large layers is deferred beyond v0.72.3.
276
+
277
+ **Honest scope:**
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
+ - **The bf16 3B throughput above is a LOWER BOUND.** The reference box could not page-lock the 5.55 GB base (its measured page-locked ceiling is 7.65 GB, and a CUDA context plus the model skeleton did not leave room), so that run fell back to a pageable store. Pageable memory makes the host-to-device copy synchronous, which costs overlap — visible as the GPU-utilisation drop from 96.8% (1.5B, pinned) to 79.3% (3B, pageable). Soup does this fallback automatically **and prints the cost** rather than absorbing it silently. NF4 lifts this at 3B: the store drops under the ceiling and pins.
267
282
  - Numbers are Windows/WDDM and therefore systematically pessimistic versus Linux. `expandable_segments:True` is silently ignored on Windows; Soup detects that and does not claim it is active.
268
283
 
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
+
269
341
  **Rejected at config load (each names the release that lifts it):**
270
- - `stream_source: disk` → the disk tier is v0.72.3
271
- - `quantization` other than `none` → NF4 streaming is v0.72.2
342
+ - `batch_size: "auto"` → OOM-probes a resident model that streaming never loads; explicit batch sizes allowed (v0.72.3)
343
+ - `quantization` other than `none` or `4bit` other formats cannot be streamed into a pooled buffer
272
344
  - `backend: unsloth` / `backend: mlx` → streaming replaces the model-load path those backends own
273
345
  - `task` other than `sft` → preference losses are v0.72.4
274
- - `gradient_accumulation_steps > 1` → every micro-batch re-reads the whole base, so accumulation multiplies streaming IO linearly (v0.72.3)
275
- - `batch_size` other than `1` → v0.72.3
276
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
277
347
  - `unfrozen_parameters`, `lisa_enabled`, `packing`, `multipack`, `use_fsdp2_compile`, `train_router_only`, `expand_layers` → each independently rewrites or re-freezes the same layers
278
348
  - `stream_source` / `stream_buffers` set while `stream_layers: false` → a footgun, refused
279
- - 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
280
350
 
281
351
  **Config example:**
282
352
 
@@ -294,12 +364,12 @@ data:
294
364
  training:
295
365
  epochs: 3
296
366
  lr: 2e-5
297
- batch_size: 1 # required; larger batches in v0.72.3
298
- gradient_accumulation_steps: 1 # required; accumulation in v0.72.3
299
- quantization: none # required; NF4 streaming is v0.72.2
367
+ batch_size: 1 # explicit sizes allowed; "auto" rejected
368
+ gradient_accumulation_steps: 1 # values > 1 now allowed (v0.72.3)
369
+ quantization: 4bit # NF4 ~4x smaller RAM store than bf16 (or `none`)
300
370
  gradient_checkpointing: true # handled per-layer by the streamer
301
371
  stream_layers: true # Enable layer streaming
302
- stream_source: auto # RAM-based (disk in v0.72.3)
372
+ stream_source: auto # RAM with auto-fallback to NVMe disk (v0.72.3)
303
373
  stream_buffers: 2 # double-buffering
304
374
  lora:
305
375
  r: 64
@@ -325,11 +395,10 @@ output: ./output
325
395
  **Troubleshooting:**
326
396
  - **"layer streaming needs the base to fit in RAM"** — the base is larger than free RAM. Free RAM or pick a smaller base; the disk overflow tier is v0.72.3.
327
397
  - **"could not page-lock the base … falling back to a PAGEABLE RAM store"** — expected on a busy machine. Training continues, more slowly. Close other applications to keep the pinned store.
328
- - **"layer streaming does not support model_type=…"** — v0.72.0 covers Llama and Qwen only.
398
+ - **"layer streaming does not support model_type=…"** — Llama and Qwen only for now; more architectures land in v0.72.3.
329
399
  - **Slower than you expected** — layer streaming trades time for memory. If the model already fits resident on your card, do not enable it.
330
400
 
331
401
  **Roadmap (each refusal names its release):**
332
- - 4-bit (NF4) streaming — **v0.72.2**, the first genuinely useful capability jump
333
402
  - Disk overflow tier, batch size > 1, gradient accumulation, checkpoint/resume, more architectures (Mistral / Gemma / Phi) — **v0.72.3**
334
403
  - Preference losses (DPO / ORPO / SimPO / KTO) — **v0.72.4**. GRPO and PPO are explicitly **not** planned: rollouts need generation, which re-reads the model per token
335
404
  - A published 14B-on-8 GB reference benchmark — hardware-blocked; it needs an 8 GB card and 32 GB of RAM, which the development box does not have