soup-cli 0.71.40__tar.gz → 0.72.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (912) hide show
  1. {soup_cli-0.71.40 → soup_cli-0.72.0}/CHANGELOG.md +95 -0
  2. {soup_cli-0.71.40 → soup_cli-0.72.0}/CONTRIBUTING.md +3 -3
  3. {soup_cli-0.71.40 → soup_cli-0.72.0}/PKG-INFO +34 -17
  4. {soup_cli-0.71.40 → soup_cli-0.72.0}/README.md +34 -17
  5. {soup_cli-0.71.40 → soup_cli-0.72.0}/SECURITY.md +2 -2
  6. {soup_cli-0.71.40 → soup_cli-0.72.0}/docs/README.md +2 -2
  7. {soup_cli-0.71.40 → soup_cli-0.72.0}/docs/backends-and-ops.md +2 -8
  8. {soup_cli-0.71.40 → soup_cli-0.72.0}/docs/commands.md +5 -0
  9. {soup_cli-0.71.40 → soup_cli-0.72.0}/docs/performance-and-quantization.md +103 -0
  10. {soup_cli-0.71.40 → soup_cli-0.72.0}/docs/training.md +30 -0
  11. {soup_cli-0.71.40 → soup_cli-0.72.0}/pyproject.toml +1 -1
  12. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/__init__.py +1 -1
  13. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/adapters.py +76 -14
  14. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/reward.py +130 -2
  15. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/train.py +19 -0
  16. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/config/schema.py +167 -0
  17. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/monitoring/hf_push.py +24 -6
  18. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/recipes/catalog.py +6 -4
  19. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/sft.py +240 -1
  20. soup_cli-0.72.0/src/soup_cli/utils/adapter_arithmetic.py +609 -0
  21. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/adapter_merge.py +13 -0
  22. soup_cli-0.72.0/src/soup_cli/utils/layer_shard.py +392 -0
  23. soup_cli-0.72.0/src/soup_cli/utils/layer_stream.py +350 -0
  24. soup_cli-0.72.0/src/soup_cli/utils/layer_stream_runtime.py +609 -0
  25. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/relora.py +24 -5
  26. soup_cli-0.72.0/src/soup_cli/utils/reward_stress.py +190 -0
  27. soup_cli-0.72.0/tests/test_issue300_online_dpo_train.py +144 -0
  28. soup_cli-0.72.0/tests/test_issue302_vision_pad_token.py +214 -0
  29. soup_cli-0.72.0/tests/test_issue305_mixed_rank_arithmetic.py +595 -0
  30. soup_cli-0.72.0/tests/test_issue308_callback_subclass.py +189 -0
  31. soup_cli-0.72.0/tests/test_v07141.py +423 -0
  32. soup_cli-0.72.0/tests/test_v07200.py +2160 -0
  33. soup_cli-0.71.40/src/soup_cli/utils/adapter_arithmetic.py +0 -288
  34. {soup_cli-0.71.40 → soup_cli-0.72.0}/.dockerignore +0 -0
  35. {soup_cli-0.71.40 → soup_cli-0.72.0}/.github/FUNDING.yml +0 -0
  36. {soup_cli-0.71.40 → soup_cli-0.72.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  37. {soup_cli-0.71.40 → soup_cli-0.72.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  38. {soup_cli-0.71.40 → soup_cli-0.72.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  39. {soup_cli-0.71.40 → soup_cli-0.72.0}/.github/pull_request_template.md +0 -0
  40. {soup_cli-0.71.40 → soup_cli-0.72.0}/.github/workflows/ci.yml +0 -0
  41. {soup_cli-0.71.40 → soup_cli-0.72.0}/.github/workflows/docker.yml +0 -0
  42. {soup_cli-0.71.40 → soup_cli-0.72.0}/.github/workflows/publish.yml +0 -0
  43. {soup_cli-0.71.40 → soup_cli-0.72.0}/.github/workflows/recipe-validation.yml +0 -0
  44. {soup_cli-0.71.40 → soup_cli-0.72.0}/.gitignore +0 -0
  45. {soup_cli-0.71.40 → soup_cli-0.72.0}/.mailmap +0 -0
  46. {soup_cli-0.71.40 → soup_cli-0.72.0}/.pre-commit-config.yaml +0 -0
  47. {soup_cli-0.71.40 → soup_cli-0.72.0}/AGENTS.md +0 -0
  48. {soup_cli-0.71.40 → soup_cli-0.72.0}/CODEOWNERS +0 -0
  49. {soup_cli-0.71.40 → soup_cli-0.72.0}/CODE_OF_CONDUCT.md +0 -0
  50. {soup_cli-0.71.40 → soup_cli-0.72.0}/CONTRIBUTORS.md +0 -0
  51. {soup_cli-0.71.40 → soup_cli-0.72.0}/Dockerfile +0 -0
  52. {soup_cli-0.71.40 → soup_cli-0.72.0}/LICENSE +0 -0
  53. {soup_cli-0.71.40 → soup_cli-0.72.0}/NOTICE +0 -0
  54. {soup_cli-0.71.40 → soup_cli-0.72.0}/docker-compose.yml +0 -0
  55. {soup_cli-0.71.40 → soup_cli-0.72.0}/docs/adapters-and-governance.md +0 -0
  56. {soup_cli-0.71.40 → soup_cli-0.72.0}/docs/compliance.md +0 -0
  57. {soup_cli-0.71.40 → soup_cli-0.72.0}/docs/data.md +0 -0
  58. {soup_cli-0.71.40 → soup_cli-0.72.0}/docs/evaluation.md +0 -0
  59. {soup_cli-0.71.40 → soup_cli-0.72.0}/docs/models.md +0 -0
  60. {soup_cli-0.71.40 → soup_cli-0.72.0}/docs/peft-and-efficiency.md +0 -0
  61. {soup_cli-0.71.40 → soup_cli-0.72.0}/docs/serving-and-export.md +0 -0
  62. {soup_cli-0.71.40 → soup_cli-0.72.0}/examples/README.md +0 -0
  63. {soup_cli-0.71.40 → soup_cli-0.72.0}/examples/configs/dpo_chat.yaml +0 -0
  64. {soup_cli-0.71.40 → soup_cli-0.72.0}/examples/configs/dpo_example.yaml +0 -0
  65. {soup_cli-0.71.40 → soup_cli-0.72.0}/examples/configs/grpo_reasoning.yaml +0 -0
  66. {soup_cli-0.71.40 → soup_cli-0.72.0}/examples/configs/rlhf_step1_sft.yaml +0 -0
  67. {soup_cli-0.71.40 → soup_cli-0.72.0}/examples/configs/rlhf_step2_reward.yaml +0 -0
  68. {soup_cli-0.71.40 → soup_cli-0.72.0}/examples/configs/rlhf_step3_ppo.yaml +0 -0
  69. {soup_cli-0.71.40 → soup_cli-0.72.0}/examples/configs/sft_basic.yaml +0 -0
  70. {soup_cli-0.71.40 → soup_cli-0.72.0}/examples/configs/vision_llama.yaml +0 -0
  71. {soup_cli-0.71.40 → soup_cli-0.72.0}/examples/data/alpaca_tiny.jsonl +0 -0
  72. {soup_cli-0.71.40 → soup_cli-0.72.0}/examples/data/chat_preferences.jsonl +0 -0
  73. {soup_cli-0.71.40 → soup_cli-0.72.0}/examples/data/dpo_sample.jsonl +0 -0
  74. {soup_cli-0.71.40 → soup_cli-0.72.0}/examples/data/reasoning_math.jsonl +0 -0
  75. {soup_cli-0.71.40 → soup_cli-0.72.0}/examples/reward_hacking/rewards.py +0 -0
  76. {soup_cli-0.71.40 → soup_cli-0.72.0}/examples/synthetic_workflow.md +0 -0
  77. {soup_cli-0.71.40 → soup_cli-0.72.0}/examples/synthetic_workflow.yaml +0 -0
  78. {soup_cli-0.71.40 → soup_cli-0.72.0}/soup.png +0 -0
  79. {soup_cli-0.71.40 → soup_cli-0.72.0}/soup_logo_svg.svg +0 -0
  80. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/__main__.py +0 -0
  81. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/autopilot/__init__.py +0 -0
  82. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/autopilot/analyzer.py +0 -0
  83. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/autopilot/decisions.py +0 -0
  84. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/autopilot/generate_config.py +0 -0
  85. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/cans/__init__.py +0 -0
  86. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/cans/pack.py +0 -0
  87. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/cans/publish.py +0 -0
  88. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/cans/run.py +0 -0
  89. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/cans/schema.py +0 -0
  90. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/cans/unpack.py +0 -0
  91. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/cans/verify.py +0 -0
  92. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/cli.py +0 -0
  93. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/cloud/__init__.py +0 -0
  94. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/cloud/modal.py +0 -0
  95. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/__init__.py +0 -0
  96. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/_eval_v0550.py +0 -0
  97. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/_eval_v0610.py +0 -0
  98. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/_eval_v0650.py +0 -0
  99. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/_eval_v07110.py +0 -0
  100. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/_webhook_cli.py +0 -0
  101. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/ab.py +0 -0
  102. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/active_sample.py +0 -0
  103. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/advise.py +0 -0
  104. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/agent.py +0 -0
  105. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/airgap.py +0 -0
  106. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/apple_adapter.py +0 -0
  107. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/attest.py +0 -0
  108. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/audit_log.py +0 -0
  109. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/autopilot.py +0 -0
  110. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/bench.py +0 -0
  111. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/bom.py +0 -0
  112. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/build.py +0 -0
  113. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/can.py +0 -0
  114. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/card.py +0 -0
  115. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/chat.py +0 -0
  116. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/ci.py +0 -0
  117. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/compile_cmd.py +0 -0
  118. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/compile_tools.py +0 -0
  119. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/completions.py +0 -0
  120. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/cost.py +0 -0
  121. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/data.py +0 -0
  122. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/data_canary.py +0 -0
  123. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/data_doctor.py +0 -0
  124. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/data_forge.py +0 -0
  125. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/data_mix.py +0 -0
  126. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/data_score.py +0 -0
  127. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/data_topics.py +0 -0
  128. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/delinearize_llama4.py +0 -0
  129. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/deploy.py +0 -0
  130. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/diagnose.py +0 -0
  131. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/diff.py +0 -0
  132. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/distill_prompt.py +0 -0
  133. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/doctor.py +0 -0
  134. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/draft.py +0 -0
  135. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/drift_alarm.py +0 -0
  136. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/edit.py +0 -0
  137. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/env.py +0 -0
  138. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/eval.py +0 -0
  139. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/expect.py +0 -0
  140. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/export.py +0 -0
  141. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/fetch.py +0 -0
  142. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/generate.py +0 -0
  143. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/history.py +0 -0
  144. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/infer.py +0 -0
  145. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/ingest.py +0 -0
  146. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/init.py +0 -0
  147. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/iterative_dpo.py +0 -0
  148. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/license_advisor.py +0 -0
  149. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/llama.py +0 -0
  150. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/local_rl.py +0 -0
  151. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/lock.py +0 -0
  152. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/loop.py +0 -0
  153. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/mcp.py +0 -0
  154. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/merge.py +0 -0
  155. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
  156. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/migrate.py +0 -0
  157. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/monitor.py +0 -0
  158. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/plan.py +0 -0
  159. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/plugins.py +0 -0
  160. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/probe.py +0 -0
  161. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/profile.py +0 -0
  162. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/prune_prompt.py +0 -0
  163. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/push.py +0 -0
  164. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/quantize.py +0 -0
  165. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/quickstart.py +0 -0
  166. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/ra_dit.py +0 -0
  167. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/recipes.py +0 -0
  168. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/registry.py +0 -0
  169. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/runs.py +0 -0
  170. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/serve.py +0 -0
  171. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/ship.py +0 -0
  172. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/shrink.py +0 -0
  173. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/spectrum.py +0 -0
  174. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/steer.py +0 -0
  175. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/sweep.py +0 -0
  176. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/tokenizer.py +0 -0
  177. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/tui.py +0 -0
  178. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/tunability.py +0 -0
  179. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/ui.py +0 -0
  180. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/commands/why.py +0 -0
  181. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/config/__init__.py +0 -0
  182. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/config/loader.py +0 -0
  183. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/__init__.py +0 -0
  184. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
  185. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
  186. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
  187. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
  188. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
  189. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
  190. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
  191. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
  192. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/gate/format_json.jsonl +0 -0
  193. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/gate/safety.jsonl +0 -0
  194. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/gate/tool_call.jsonl +0 -0
  195. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
  196. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
  197. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
  198. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
  199. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/augment.py +0 -0
  200. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/chat_templates.py +0 -0
  201. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/collators.py +0 -0
  202. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/formats.py +0 -0
  203. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/loader.py +0 -0
  204. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/loss_mask.py +0 -0
  205. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/providers/__init__.py +0 -0
  206. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/providers/_utils.py +0 -0
  207. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/providers/anthropic.py +0 -0
  208. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/providers/ollama.py +0 -0
  209. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/providers/vllm.py +0 -0
  210. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/sft_format.py +0 -0
  211. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/templates/__init__.py +0 -0
  212. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/templates/code.py +0 -0
  213. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/templates/conversation.py +0 -0
  214. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/templates/preference.py +0 -0
  215. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/templates/qa.py +0 -0
  216. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/templates/reasoning.py +0 -0
  217. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/templates/tool_calling.py +0 -0
  218. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/templates/verifiable.py +0 -0
  219. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/traces/__init__.py +0 -0
  220. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/traces/pair_builder.py +0 -0
  221. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/traces/parsers.py +0 -0
  222. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/traces/quality.py +0 -0
  223. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/data/validator.py +0 -0
  224. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/envs/__init__.py +0 -0
  225. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/envs/_common.py +0 -0
  226. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/envs/calculator.py +0 -0
  227. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/envs/guess_number.py +0 -0
  228. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/envs/retrieval_qa.py +0 -0
  229. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/eval/__init__.py +0 -0
  230. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/eval/arena.py +0 -0
  231. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
  232. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/eval/calibrate.py +0 -0
  233. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
  234. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/eval/custom.py +0 -0
  235. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/eval/forgetting.py +0 -0
  236. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/eval/gate.py +0 -0
  237. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/eval/gate_suites.py +0 -0
  238. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/eval/human.py +0 -0
  239. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/eval/judge.py +0 -0
  240. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/eval/leaderboard.py +0 -0
  241. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/eval/quant_check.py +0 -0
  242. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/experiment/__init__.py +0 -0
  243. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/experiment/tracker.py +0 -0
  244. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/mcp_server/__init__.py +0 -0
  245. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/mcp_server/registry.py +0 -0
  246. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/mcp_server/server.py +0 -0
  247. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/migrate/__init__.py +0 -0
  248. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/migrate/axolotl.py +0 -0
  249. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/migrate/common.py +0 -0
  250. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/migrate/llamafactory.py +0 -0
  251. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/migrate/unsloth.py +0 -0
  252. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/monitoring/__init__.py +0 -0
  253. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/monitoring/callback.py +0 -0
  254. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
  255. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/monitoring/display.py +0 -0
  256. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
  257. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/monitoring/plugin_callback.py +0 -0
  258. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/monitoring/trace_logger.py +0 -0
  259. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/plugins/__init__.py +0 -0
  260. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/py.typed +0 -0
  261. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/recipes/__init__.py +0 -0
  262. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/registry/__init__.py +0 -0
  263. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/registry/attach.py +0 -0
  264. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/registry/diff.py +0 -0
  265. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/registry/hashing.py +0 -0
  266. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/registry/store.py +0 -0
  267. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/__init__.py +0 -0
  268. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/audio.yaml +0 -0
  269. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/bco.yaml +0 -0
  270. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/chat.yaml +0 -0
  271. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/code.yaml +0 -0
  272. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/embedding.yaml +0 -0
  273. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/eu-ai-act.yaml +0 -0
  274. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
  275. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
  276. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
  277. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/hipaa.yaml +0 -0
  278. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/ipo.yaml +0 -0
  279. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/kto.yaml +0 -0
  280. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/longcontext.yaml +0 -0
  281. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/manifest.json +0 -0
  282. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/medical.yaml +0 -0
  283. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/moe.yaml +0 -0
  284. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/orpo.yaml +0 -0
  285. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/pretrain.yaml +0 -0
  286. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/reasoning.yaml +0 -0
  287. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/rlhf.yaml +0 -0
  288. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/simpo.yaml +0 -0
  289. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/soc2.yaml +0 -0
  290. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/sr-11-7.yaml +0 -0
  291. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/tool-calling.yaml +0 -0
  292. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/templates/vision.yaml +0 -0
  293. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/__init__.py +0 -0
  294. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/asr.py +0 -0
  295. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/bco.py +0 -0
  296. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/bitnet.py +0 -0
  297. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/classifier.py +0 -0
  298. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/distill.py +0 -0
  299. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/dpo.py +0 -0
  300. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/embedding.py +0 -0
  301. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/grpo.py +0 -0
  302. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/ipo.py +0 -0
  303. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/kto.py +0 -0
  304. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/mlx_dpo.py +0 -0
  305. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/mlx_grpo.py +0 -0
  306. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/mlx_routing.py +0 -0
  307. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/mlx_sft.py +0 -0
  308. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/mole_routing.py +0 -0
  309. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/online_dpo.py +0 -0
  310. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/orpo.py +0 -0
  311. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/ppo.py +0 -0
  312. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/preference.py +0 -0
  313. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/pretrain.py +0 -0
  314. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/prm.py +0 -0
  315. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/raft.py +0 -0
  316. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/reward_model.py +0 -0
  317. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/rewards.py +0 -0
  318. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/simpo.py +0 -0
  319. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/tts.py +0 -0
  320. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/trainer/unlearn.py +0 -0
  321. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/tui_app.py +0 -0
  322. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/ui/__init__.py +0 -0
  323. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/ui/app.py +0 -0
  324. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/ui/plugins/__init__.py +0 -0
  325. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/ui/static/app.js +0 -0
  326. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/ui/static/index.html +0 -0
  327. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/ui/static/logo.png +0 -0
  328. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/ui/static/logo.svg +0 -0
  329. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/ui/static/style.css +0 -0
  330. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/__init__.py +0 -0
  331. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/_eval_text.py +0 -0
  332. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/ab_test.py +0 -0
  333. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/activation_offload.py +0 -0
  334. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/active_sampler.py +0 -0
  335. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/adapter_bisect.py +0 -0
  336. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/adapter_branch.py +0 -0
  337. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/adapter_diff.py +0 -0
  338. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/adapter_fuse.py +0 -0
  339. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/adapter_pr.py +0 -0
  340. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/adapter_scan.py +0 -0
  341. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/adapter_sign.py +0 -0
  342. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/advanced_precision.py +0 -0
  343. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/advise.py +0 -0
  344. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/advise_history.py +0 -0
  345. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/agent_forge.py +0 -0
  346. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/agent_rollout.py +0 -0
  347. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/agent_sandbox.py +0 -0
  348. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/airgap_bundle.py +0 -0
  349. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/annex_xi.py +0 -0
  350. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/anthropic_messages.py +0 -0
  351. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/apple_adapter.py +0 -0
  352. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/asr_metrics.py +0 -0
  353. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/attest.py +0 -0
  354. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/audit_log.py +0 -0
  355. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/auto_quant.py +0 -0
  356. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/backend_detect.py +0 -0
  357. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/batch_probe.py +0 -0
  358. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/behavior_battery.py +0 -0
  359. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/best_of_n.py +0 -0
  360. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/bitnet.py +0 -0
  361. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/blame.py +0 -0
  362. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/block_expansion.py +0 -0
  363. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/bom.py +0 -0
  364. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/brain_rot.py +0 -0
  365. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/brain_rot_lang.py +0 -0
  366. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/build_dag.py +0 -0
  367. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/canary.py +0 -0
  368. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/canary_discovery.py +0 -0
  369. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/canary_router.py +0 -0
  370. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/capability_suite.py +0 -0
  371. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/checklist_dsl.py +0 -0
  372. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
  373. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/ci_workflow.py +0 -0
  374. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/citation_faithful.py +0 -0
  375. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/classifier.py +0 -0
  376. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/cmaes_merge.py +0 -0
  377. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/compile_tools.py +0 -0
  378. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/completions.py +0 -0
  379. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/constants.py +0 -0
  380. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/convergence.py +0 -0
  381. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/crash.py +0 -0
  382. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/cross_doc_attn.py +0 -0
  383. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/curriculum.py +0 -0
  384. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
  385. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/cut_ce.py +0 -0
  386. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/data_doctor.py +0 -0
  387. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/data_forge.py +0 -0
  388. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/data_lint.py +0 -0
  389. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/data_mix.py +0 -0
  390. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/data_pipeline.py +0 -0
  391. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/data_score.py +0 -0
  392. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/deepspeed.py +0 -0
  393. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/delinearize_llama4.py +0 -0
  394. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/demo_bundles.py +0 -0
  395. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/deploy_autopilot.py +0 -0
  396. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/deploy_measure.py +0 -0
  397. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/__init__.py +0 -0
  398. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/_common.py +0 -0
  399. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/badge.py +0 -0
  400. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/citation.py +0 -0
  401. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/contamination.py +0 -0
  402. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
  403. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/format.py +0 -0
  404. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/live.py +0 -0
  405. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/memorization.py +0 -0
  406. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
  407. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/refusal.py +0 -0
  408. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/report.py +0 -0
  409. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/diagnose/runner.py +0 -0
  410. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/distill.py +0 -0
  411. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/dpo_variants.py +0 -0
  412. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/draft.py +0 -0
  413. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/drift_alarm.py +0 -0
  414. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/ebft_gdpo.py +0 -0
  415. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/echo_trap.py +0 -0
  416. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/edit_diff.py +0 -0
  417. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/edit_governor.py +0 -0
  418. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/edit_kernels.py +0 -0
  419. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/embed.py +0 -0
  420. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/encoding.py +0 -0
  421. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/energy.py +0 -0
  422. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/env_lock.py +0 -0
  423. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/errors.py +0 -0
  424. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/eval_design.py +0 -0
  425. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/eval_gate_hook.py +0 -0
  426. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
  427. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/evolve.py +0 -0
  428. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/expectations.py +0 -0
  429. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/fetch_examples.py +0 -0
  430. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/flash_attn.py +0 -0
  431. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/fp8.py +0 -0
  432. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/freeze.py +0 -0
  433. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/fsdp.py +0 -0
  434. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
  435. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/galore.py +0 -0
  436. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/gguf_quant.py +0 -0
  437. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/gpu.py +0 -0
  438. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/gpu_monitor.py +0 -0
  439. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/grace_codebook.py +0 -0
  440. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/graceful_save.py +0 -0
  441. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/grad_accum.py +0 -0
  442. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/gradient_ckpt.py +0 -0
  443. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/grpo_long_context.py +0 -0
  444. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/grpo_variants.py +0 -0
  445. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/hardware_fit.py +0 -0
  446. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/harm_probe.py +0 -0
  447. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/hf.py +0 -0
  448. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/hf_space.py +0 -0
  449. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/hubs.py +0 -0
  450. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/ingest_sources.py +0 -0
  451. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/integrations.py +0 -0
  452. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/interference.py +0 -0
  453. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/interference_live.py +0 -0
  454. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/irt.py +0 -0
  455. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/iterative_dpo.py +0 -0
  456. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/jinja_analyzer.py +0 -0
  457. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/kernel_picker.py +0 -0
  458. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/knowledge_edit.py +0 -0
  459. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/kv_cache.py +0 -0
  460. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/launcher.py +0 -0
  461. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/license_advisor.py +0 -0
  462. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/license_matrix.py +0 -0
  463. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/liger.py +0 -0
  464. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/lisa.py +0 -0
  465. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/live_eval.py +0 -0
  466. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/llama_proxy.py +0 -0
  467. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/llama_server_timings.py +0 -0
  468. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/local_rl.py +0 -0
  469. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
  470. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/loftq_init.py +0 -0
  471. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/log_level.py +0 -0
  472. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/long_context.py +0 -0
  473. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/longlora.py +0 -0
  474. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/loop_budget.py +0 -0
  475. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/loop_daemon.py +0 -0
  476. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/loop_iteration.py +0 -0
  477. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/loop_stages.py +0 -0
  478. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/loop_state.py +0 -0
  479. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/lr_finder.py +0 -0
  480. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/lr_groups.py +0 -0
  481. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/magpie.py +0 -0
  482. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/metrics.py +0 -0
  483. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/mii.py +0 -0
  484. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/minillm.py +0 -0
  485. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/mix_proxy.py +0 -0
  486. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/mixed_precision.py +0 -0
  487. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/mlx.py +0 -0
  488. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/mod.py +0 -0
  489. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/moe.py +0 -0
  490. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/moe_quant.py +0 -0
  491. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/mole_routing.py +0 -0
  492. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/multipack.py +0 -0
  493. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/multipack_sampler.py +0 -0
  494. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/multipack_trainer.py +0 -0
  495. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/namespace_pin.py +0 -0
  496. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/neat_packing.py +0 -0
  497. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/ngram_spec.py +0 -0
  498. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/nlg_metrics.py +0 -0
  499. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/ollama.py +0 -0
  500. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/onboarding.py +0 -0
  501. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/optimizer_zoo.py +0 -0
  502. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/paths.py +0 -0
  503. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/peft_builder.py +0 -0
  504. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/peft_patches.py +0 -0
  505. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/peft_wiring.py +0 -0
  506. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/persona_hub.py +0 -0
  507. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/pipeline.py +0 -0
  508. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/preference_combine.py +0 -0
  509. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/prm.py +0 -0
  510. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/prm_reward.py +0 -0
  511. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/probe_kernel.py +0 -0
  512. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/probe_pack.py +0 -0
  513. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/profiler.py +0 -0
  514. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/profiling.py +0 -0
  515. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/profiling_v0_43.py +0 -0
  516. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/prompt_compile.py +0 -0
  517. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/prompt_distill.py +0 -0
  518. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/prune_prompt.py +0 -0
  519. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/qat.py +0 -0
  520. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/qr_url.py +0 -0
  521. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/quality.py +0 -0
  522. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/quant_menu.py +0 -0
  523. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/ra_dit.py +0 -0
  524. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/ra_dit_run.py +0 -0
  525. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/raft.py +0 -0
  526. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/reasoning_effort.py +0 -0
  527. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/reasoning_parser.py +0 -0
  528. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/recipe_dag.py +0 -0
  529. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/recipe_run.py +0 -0
  530. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/registry.py +0 -0
  531. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/rehearsal.py +0 -0
  532. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/replay.py +0 -0
  533. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/repro_receipt.py +0 -0
  534. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/reward_hack_control.py +0 -0
  535. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/reward_hacking.py +0 -0
  536. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/reward_synth.py +0 -0
  537. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/ring_attention.py +0 -0
  538. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/rl_checkpoint.py +0 -0
  539. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
  540. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/run_cost.py +0 -0
  541. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/sae_diff.py +0 -0
  542. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/save_formats.py +0 -0
  543. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/semdedup.py +0 -0
  544. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/server_tools.py +0 -0
  545. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/sglang.py +0 -0
  546. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/ship_verdict.py +0 -0
  547. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/shortcuts.py +0 -0
  548. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/shrink.py +0 -0
  549. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/signing.py +0 -0
  550. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/sleeper_probe.py +0 -0
  551. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/soup_lock.py +0 -0
  552. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/spec_pairing.py +0 -0
  553. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/spectrum_scan.py +0 -0
  554. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/spike_recovery.py +0 -0
  555. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/sse_train_stream.py +0 -0
  556. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/steering.py +0 -0
  557. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/strict_safetensors.py +0 -0
  558. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/structured_output.py +0 -0
  559. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/sweep_config.py +0 -0
  560. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/tail_latency.py +0 -0
  561. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/terraform_plan.py +0 -0
  562. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/tool_outputs.py +0 -0
  563. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/topics.py +0 -0
  564. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/topology.py +0 -0
  565. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/tracing.py +0 -0
  566. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/trackers.py +0 -0
  567. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/train_event_buffer.py +0 -0
  568. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/trainer_plugins.py +0 -0
  569. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/trust_remote.py +0 -0
  570. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/truth_probe.py +0 -0
  571. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/tts.py +0 -0
  572. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/tts_codec.py +0 -0
  573. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/tunability.py +0 -0
  574. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/ui_env.py +0 -0
  575. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/uld.py +0 -0
  576. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/unlearn_kernels.py +0 -0
  577. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/unlearning.py +0 -0
  578. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/unlearning_eval.py +0 -0
  579. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/unsloth.py +0 -0
  580. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/v028_features.py +0 -0
  581. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/vector_bank.py +0 -0
  582. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/vllm.py +0 -0
  583. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/vscode_setup.py +0 -0
  584. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/warmup.py +0 -0
  585. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/webhooks.py +0 -0
  586. {soup_cli-0.71.40 → soup_cli-0.72.0}/src/soup_cli/utils/why.py +0 -0
  587. {soup_cli-0.71.40 → soup_cli-0.72.0}/templates/chat.yaml +0 -0
  588. {soup_cli-0.71.40 → soup_cli-0.72.0}/templates/code.yaml +0 -0
  589. {soup_cli-0.71.40 → soup_cli-0.72.0}/templates/medical.yaml +0 -0
  590. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/__init__.py +0 -0
  591. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/conftest.py +0 -0
  592. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/qa/v053_qa.md +0 -0
  593. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/qa/v07114_qa.md +0 -0
  594. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/qa/v0716_qa.md +0 -0
  595. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_adapters.py +0 -0
  596. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_advanced_peft.py +0 -0
  597. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_assistant_mask.py +0 -0
  598. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_audio.py +0 -0
  599. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_auto_tuning.py +0 -0
  600. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_autopilot.py +0 -0
  601. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_awq_gptq_export.py +0 -0
  602. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_batch_probe.py +0 -0
  603. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_bco.py +0 -0
  604. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_bench.py +0 -0
  605. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_brain_rot_multilingual.py +0 -0
  606. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_bugfixes.py +0 -0
  607. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_build_dag.py +0 -0
  608. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_callback.py +0 -0
  609. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_cans.py +0 -0
  610. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_chat.py +0 -0
  611. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_chat_template.py +0 -0
  612. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_cli.py +0 -0
  613. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_cli_subprocess.py +0 -0
  614. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_code_review_critical.py +0 -0
  615. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_code_review_deferred.py +0 -0
  616. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_code_review_high.py +0 -0
  617. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_code_review_medium_low.py +0 -0
  618. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_code_review_recurring.py +0 -0
  619. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_config.py +0 -0
  620. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_cost.py +0 -0
  621. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_crash_reporter.py +0 -0
  622. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_curriculum.py +0 -0
  623. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_data.py +0 -0
  624. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_data_augment.py +0 -0
  625. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_data_sample.py +0 -0
  626. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_data_split.py +0 -0
  627. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_data_tools.py +0 -0
  628. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_dataset_hub.py +0 -0
  629. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_dataset_registry.py +0 -0
  630. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_deepspeed.py +0 -0
  631. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_deploy_ollama.py +0 -0
  632. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_diff.py +0 -0
  633. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_display.py +0 -0
  634. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_doctor.py +0 -0
  635. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_dpo_example.py +0 -0
  636. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_dpo_variants.py +0 -0
  637. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_embedding.py +0 -0
  638. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_errors.py +0 -0
  639. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_eval.py +0 -0
  640. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_eval_gate.py +0 -0
  641. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_eval_platform.py +0 -0
  642. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_export.py +0 -0
  643. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_formats.py +0 -0
  644. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_fp8_recipe.py +0 -0
  645. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_freeze_training.py +0 -0
  646. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_generate.py +0 -0
  647. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_gpu.py +0 -0
  648. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_grpo.py +0 -0
  649. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_hf_integration.py +0 -0
  650. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_infer.py +0 -0
  651. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_inference_advanced.py +0 -0
  652. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_init.py +0 -0
  653. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_ipo.py +0 -0
  654. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_jinja_analyzer.py +0 -0
  655. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_kto.py +0 -0
  656. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_loader.py +0 -0
  657. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_log_level.py +0 -0
  658. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_loss_watchdog.py +0 -0
  659. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_merge.py +0 -0
  660. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_migrate.py +0 -0
  661. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_mlx_backend.py +0 -0
  662. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_moe.py +0 -0
  663. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_multi_adapter.py +0 -0
  664. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_multi_gpu.py +0 -0
  665. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_multipack_config.py +0 -0
  666. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_multipack_invariants.py +0 -0
  667. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_multipack_sampler.py +0 -0
  668. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_neat_packing.py +0 -0
  669. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_neftune_rslora.py +0 -0
  670. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_onnx_tensorrt_export.py +0 -0
  671. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_orpo.py +0 -0
  672. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_packing.py +0 -0
  673. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_part_a_wave1.py +0 -0
  674. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_part_a_wave2.py +0 -0
  675. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_part_b.py +0 -0
  676. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_part_c.py +0 -0
  677. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_part_d.py +0 -0
  678. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_part_e.py +0 -0
  679. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_part_f_hardening.py +0 -0
  680. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_peft_methods.py +0 -0
  681. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_peft_patches.py +0 -0
  682. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_performance.py +0 -0
  683. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_pissa_init.py +0 -0
  684. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_ppo.py +0 -0
  685. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_preference_dispatcher.py +0 -0
  686. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_preference_multi.py +0 -0
  687. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_preference_multi_runtime.py +0 -0
  688. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_pretrain.py +0 -0
  689. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_profile.py +0 -0
  690. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_profiling.py +0 -0
  691. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_progress.py +0 -0
  692. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_push.py +0 -0
  693. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_qat.py +0 -0
  694. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_quality_filter.py +0 -0
  695. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_quant_check.py +0 -0
  696. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_quant_menu.py +0 -0
  697. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_quickstart.py +0 -0
  698. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_rank_pattern.py +0 -0
  699. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_recipes.py +0 -0
  700. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_recipes_v031.py +0 -0
  701. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_refusal_multilingual.py +0 -0
  702. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_registry.py +0 -0
  703. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_relora.py +0 -0
  704. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_replay.py +0 -0
  705. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_resume.py +0 -0
  706. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_review_fixes_v07133.py +0 -0
  707. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_rlvr.py +0 -0
  708. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_run_cost.py +0 -0
  709. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_runs.py +0 -0
  710. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_serve.py +0 -0
  711. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_server_generate.py +0 -0
  712. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_sglang_serve.py +0 -0
  713. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_simpo.py +0 -0
  714. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_smoke_train.py +0 -0
  715. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_speculative_decoding.py +0 -0
  716. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_sweep.py +0 -0
  717. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_synth_data_pro.py +0 -0
  718. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_templates_yaml.py +0 -0
  719. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_tensorboard.py +0 -0
  720. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_tool_calling.py +0 -0
  721. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_trace_to_pref.py +0 -0
  722. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_tracker.py +0 -0
  723. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_trainer_coverage_v035.py +0 -0
  724. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_trainer_init.py +0 -0
  725. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_training_intelligence.py +0 -0
  726. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_training_speed.py +0 -0
  727. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_trust_remote_code.py +0 -0
  728. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_tui.py +0 -0
  729. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_ui.py +0 -0
  730. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_ui_chat.py +0 -0
  731. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_ui_config_builder.py +0 -0
  732. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_ui_live_monitor.py +0 -0
  733. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_ui_metrics.py +0 -0
  734. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_unsloth.py +0 -0
  735. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0401_part_c.py +0 -0
  736. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0401_part_d.py +0 -0
  737. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0401_part_e.py +0 -0
  738. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0402_part_a.py +0 -0
  739. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0402_part_b.py +0 -0
  740. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0403_part_a.py +0 -0
  741. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0403_part_b.py +0 -0
  742. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0403_part_c.py +0 -0
  743. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0404_part_a.py +0 -0
  744. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0404_part_b.py +0 -0
  745. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0405_part_a.py +0 -0
  746. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0406_part_a.py +0 -0
  747. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0410_part_a.py +0 -0
  748. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0410_part_b.py +0 -0
  749. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0410_part_c.py +0 -0
  750. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0420.py +0 -0
  751. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0430_part_a.py +0 -0
  752. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0430_part_b.py +0 -0
  753. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0430_part_c.py +0 -0
  754. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0430_part_d.py +0 -0
  755. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0440_part_a.py +0 -0
  756. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0440_part_b.py +0 -0
  757. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0440_part_c.py +0 -0
  758. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0440_part_d.py +0 -0
  759. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0440_review_followups.py +0 -0
  760. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0450.py +0 -0
  761. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0460_part_a.py +0 -0
  762. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0460_part_b.py +0 -0
  763. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0470_part_a.py +0 -0
  764. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0470_part_b.py +0 -0
  765. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0480_part_a.py +0 -0
  766. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0480_part_b.py +0 -0
  767. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0490.py +0 -0
  768. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0500_part_a.py +0 -0
  769. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0500_part_b.py +0 -0
  770. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0500_part_c.py +0 -0
  771. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0500_part_d.py +0 -0
  772. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0500_part_e.py +0 -0
  773. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0510.py +0 -0
  774. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0520.py +0 -0
  775. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0530.py +0 -0
  776. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v05310.py +0 -0
  777. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v05311.py +0 -0
  778. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0531_109.py +0 -0
  779. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0531_139.py +0 -0
  780. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0531_142.py +0 -0
  781. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0531_82.py +0 -0
  782. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0532.py +0 -0
  783. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0533.py +0 -0
  784. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0534.py +0 -0
  785. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0535.py +0 -0
  786. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0536.py +0 -0
  787. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0537.py +0 -0
  788. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0538.py +0 -0
  789. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0539.py +0 -0
  790. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0540.py +0 -0
  791. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0550.py +0 -0
  792. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0550_followups.py +0 -0
  793. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0560.py +0 -0
  794. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0570_part_a.py +0 -0
  795. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0570_part_b.py +0 -0
  796. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0570_part_c.py +0 -0
  797. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0570_part_d.py +0 -0
  798. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0580.py +0 -0
  799. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0590.py +0 -0
  800. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0600_part_a.py +0 -0
  801. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0600_part_b.py +0 -0
  802. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0600_part_c.py +0 -0
  803. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0600_part_d.py +0 -0
  804. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0600_part_e.py +0 -0
  805. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0600_part_f.py +0 -0
  806. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0610_part_a.py +0 -0
  807. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0610_part_b.py +0 -0
  808. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0610_part_c.py +0 -0
  809. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0610_part_d.py +0 -0
  810. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0610_part_e.py +0 -0
  811. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0620_followups.py +0 -0
  812. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0620_part_a.py +0 -0
  813. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0620_part_b.py +0 -0
  814. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0620_part_c.py +0 -0
  815. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0620_part_d.py +0 -0
  816. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0620_part_e.py +0 -0
  817. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0630_followups.py +0 -0
  818. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0630_part_a.py +0 -0
  819. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0630_part_b.py +0 -0
  820. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0630_part_c.py +0 -0
  821. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0630_part_d.py +0 -0
  822. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0630_part_e.py +0 -0
  823. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0631_206.py +0 -0
  824. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0640_followups.py +0 -0
  825. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0640_part_a.py +0 -0
  826. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0640_part_b.py +0 -0
  827. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0640_part_c.py +0 -0
  828. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0640_part_d.py +0 -0
  829. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0640_part_e.py +0 -0
  830. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0640_part_f.py +0 -0
  831. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0650_followups.py +0 -0
  832. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0650_part_a.py +0 -0
  833. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0650_part_b.py +0 -0
  834. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0650_part_c.py +0 -0
  835. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0650_part_d.py +0 -0
  836. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0650_part_e.py +0 -0
  837. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0660_cli.py +0 -0
  838. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0660_followups.py +0 -0
  839. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0660_part_a.py +0 -0
  840. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0660_part_b.py +0 -0
  841. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0660_part_c.py +0 -0
  842. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0660_part_d.py +0 -0
  843. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0660_part_e.py +0 -0
  844. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0670_followups.py +0 -0
  845. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0670_part_a.py +0 -0
  846. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0670_part_b.py +0 -0
  847. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0670_part_c.py +0 -0
  848. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0670_part_d.py +0 -0
  849. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0670_part_e.py +0 -0
  850. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0670_part_f.py +0 -0
  851. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0680_followups.py +0 -0
  852. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0680_part_a.py +0 -0
  853. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0680_part_b.py +0 -0
  854. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0680_part_c.py +0 -0
  855. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0680_part_d.py +0 -0
  856. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0680_part_e.py +0 -0
  857. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0690_part_a.py +0 -0
  858. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0690_part_b.py +0 -0
  859. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0690_part_c.py +0 -0
  860. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0690_part_d.py +0 -0
  861. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0690_part_e.py +0 -0
  862. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0700_part_a.py +0 -0
  863. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0700_part_b.py +0 -0
  864. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0700_part_c.py +0 -0
  865. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0700_part_d.py +0 -0
  866. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0700_part_e.py +0 -0
  867. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0700_part_f.py +0 -0
  868. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07110.py +0 -0
  869. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07111.py +0 -0
  870. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07112.py +0 -0
  871. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07113.py +0 -0
  872. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07114.py +0 -0
  873. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07115.py +0 -0
  874. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07116.py +0 -0
  875. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07117.py +0 -0
  876. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07118.py +0 -0
  877. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07119.py +0 -0
  878. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0712.py +0 -0
  879. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07120.py +0 -0
  880. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07121.py +0 -0
  881. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07122.py +0 -0
  882. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07123.py +0 -0
  883. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07124.py +0 -0
  884. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07125.py +0 -0
  885. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07126.py +0 -0
  886. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07127.py +0 -0
  887. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07128.py +0 -0
  888. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07129.py +0 -0
  889. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0713.py +0 -0
  890. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07130.py +0 -0
  891. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07131.py +0 -0
  892. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07132.py +0 -0
  893. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07133.py +0 -0
  894. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07134.py +0 -0
  895. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07135.py +0 -0
  896. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07136.py +0 -0
  897. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07137.py +0 -0
  898. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07138.py +0 -0
  899. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07139.py +0 -0
  900. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0714.py +0 -0
  901. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v07140.py +0 -0
  902. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0715.py +0 -0
  903. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0716.py +0 -0
  904. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0717.py +0 -0
  905. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0718.py +0 -0
  906. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_v0719.py +0 -0
  907. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_validator.py +0 -0
  908. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_vision.py +0 -0
  909. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_vllm_serve.py +0 -0
  910. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_warmup.py +0 -0
  911. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_why.py +0 -0
  912. {soup_cli-0.71.40 → soup_cli-0.72.0}/tests/test_windows_encoding.py +0 -0
@@ -12,6 +12,101 @@ reproducing 70+ versions of notes.
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
+ ## [0.72.0] - 2026-07-26
16
+
17
+ **Layer streaming (BETA) — fine-tune models that don't fit in your card.** The
18
+ frozen base lives in CPU RAM and is streamed into two pre-allocated VRAM buffers
19
+ one decoder layer at a time, so peak VRAM is bounded by the size of *one layer*
20
+ instead of the whole model. Only the LoRA adapters, their gradients and
21
+ optimizer state stay resident. Slower than resident training — but these models
22
+ did not run on the card at all.
23
+
24
+ Measured on the development box (**RTX 3050 Laptop 4 GB**, Windows 11, 16.9 GB
25
+ RAM), batch 1, gradient checkpointing on, 50 steps after 10 warm-up:
26
+
27
+ | Model | S | tok/s | GPU util | Peak VRAM |
28
+ |---|---|---|---|---|
29
+ | Qwen2.5-0.5B | 512 | 978.6 | 91.4% | 1.47 GB |
30
+ | Qwen2.5-1.5B | 512 | 525.0 | 96.8% | 1.82 GB |
31
+ | Qwen2.5-1.5B | 1024 | 487.6 | 96.7% | 2.96 GB |
32
+ | Qwen2.5-3B | 512 | 143.1 | 79.3% | **2.15 GB** |
33
+
34
+ **Qwen2.5-3B trains in 2.15 GB on a 4 GB card where a resident run OOMs.** The
35
+ honest cost: **1.43× slower than resident**, measured at 0.5B — the only
36
+ apples-to-apples comparison available on this box, because 1.5B and above cannot
37
+ run resident here at all.
38
+
39
+ ### Added
40
+
41
+ - **`training.stream_layers: true`** — stream the frozen base layer-by-layer
42
+ from CPU RAM. `training.stream_source` (`auto`/`ram`/`disk`) and
43
+ `training.stream_buffers` (2–8, default 2 = double buffering) tune it.
44
+ - `soup_cli/utils/layer_stream.py` — tier choice, pinned-vs-pageable decision,
45
+ architecture allowlist, VRAM/throughput arithmetic (no torch import).
46
+ - `soup_cli/utils/layer_shard.py` — rewrites an HF checkpoint into one
47
+ safetensors shard per decoder layer, one tensor at a time, so sharding a model
48
+ that does not fit never needs it to fit.
49
+ - `soup_cli/utils/layer_stream_runtime.py` — buffer pool, CPU-RAM weight source,
50
+ prefetch scheduler on a dedicated CUDA stream, and the streamed layer wrapper.
51
+ - Shards are cached under `~/.soup/layer-stream/` (override with
52
+ `SOUP_LAYER_STREAM_CACHE_DIR`) and keyed to the source checkpoint's
53
+ fingerprint, so a base retrained in place re-shards instead of silently
54
+ training against stale weights.
55
+ - When the base cannot be page-locked, the RAM store falls back to pageable
56
+ memory **and says so**, including the measured cost (GPU utilisation
57
+ ~97% → ~79%).
58
+
59
+ ### Changed
60
+
61
+ - The pre-flight hardware-fit gate is skipped for streaming runs: it models a
62
+ resident run and would otherwise refuse exactly the runs streaming enables.
63
+ - Gradient checkpointing is handled per-layer by the streamer; the HF Trainer's
64
+ own is left off so layers are not recomputed twice.
65
+
66
+ ### Known limitations
67
+
68
+ - **BETA, and proof-of-mechanism at 3B.** Nothing above 3B was measured. No
69
+ 8B/14B claim is supported.
70
+ - Scope: RAM tier, bf16, `task: sft`, Llama/Qwen, batch size 1, no gradient
71
+ accumulation, no `--resume`. Every refusal names the release that lifts it.
72
+ - 4-bit (NF4) streaming is **v0.72.1** — NF4 weights carry a quantisation state
73
+ and cannot be byte-copied into a plain buffer.
74
+ - The disk overflow tier, larger batches, gradient accumulation and
75
+ checkpoint/resume are **v0.72.2**.
76
+ - The 3B number used a **pageable** store (this box cannot page-lock 5.55 GB),
77
+ so it is a lower bound.
78
+ - `expandable_segments:True` is silently ignored on Windows; Soup detects this
79
+ and does not claim it is active.
80
+ - Numbers are Windows/WDDM and therefore systematically pessimistic vs Linux.
81
+
82
+ ## [0.71.41] - 2026-07-19
83
+
84
+ **`soup reward stress`: is your reward verifier gameable?** Turn the reward-hacking
85
+ detector on the *verifier itself*. `soup reward synth` (v0.71.40) proves a verifier
86
+ separates your references from friendly perturbations; `stress` asks the adversarial
87
+ question a reward-hacking model asks at train time — *does the verifier pay out for
88
+ degenerate junk?* It feeds empty, length-padded, repetition, and sentinel-spam
89
+ completions and flags any the verifier accepts. Pure, offline, exit 0 = robust /
90
+ 2 = gameable / 1 = error. Nothing in TRL / Unsloth / Axolotl / OpenRLHF tests a
91
+ verifier for gameability.
92
+
93
+ ### Added
94
+
95
+ - **`soup reward stress <reward.py|builtin> [--references golds.jsonl]`** — adversarial
96
+ verifier probe. Attacks (`--attacks empty,length,repetition,sentinel`, `--sentinel`)
97
+ are scored against the real gold, so numeric / tool_call / json_schema verifiers get a
98
+ valid target and still must reject the junk. Reports a per-attack accept-rate table +
99
+ an overall gameability verdict (`--max-gameable`, `--threshold`, `--output-report`).
100
+ Loads the target through the existing reward loader, so it probes a synthesized `.py`
101
+ **and** a builtin (`accuracy` / `format` / `verifiable`). A gold-requiring verifier
102
+ probed with no `--references` is a hard error, never a false "robust".
103
+
104
+ ### Fixed
105
+
106
+ - Corrected the Telemetry section in the ops docs: Soup's telemetry primitives exist but
107
+ are **not wired to any command** — no data is ever sent today (the previous wording
108
+ implied a live opt-in sender). Wiring is deferred until a public privacy policy ships.
109
+
15
110
  ## [0.71.40] - 2026-07-19
16
111
 
17
112
  **`soup reward synth`: auto-generate a deterministic reward verifier from your data.**
@@ -116,11 +116,11 @@ src/soup_cli/
116
116
  cans/ - Shareable .can artifact format + run/publish orchestrator (v0.26.0 + v0.33.0)
117
117
  data/traces/ - Trace-to-Preference harvester (v0.26.0)
118
118
  data/collators.py - CrossDocCollator for sample packing (v0.33.0)
119
- utils/ - GPU, errors, MoE, GaLore, QAT, Unsloth, vLLM, SGLang, Liger, FlashAttn, FSDP, Ring Attention, long-context, quality, curriculum, freeze, dataset-registry, mlx, peft_builder, paths, topology, launcher, mii, pipeline, cut_ce, fp8, gradient_ckpt, kernel_picker, cross_doc_attn, activation_offload, hf, spec_pairing, structured_output, metrics, tracing, auto_quant, lr_finder, grad_accum, mixed_precision, warmup, spike_recovery, convergence, v028_features, multipack_sampler, multipack, neat_packing, jinja_analyzer, quant_menu, relora, peft_patches, peft_wiring, dpo_variants, optimizer_zoo, lr_groups, loftq_init, block_expansion, tts, classifier, distill, bitnet, ebft_gdpo, moe_quant, reasoning_effort, gguf_quant, kv_cache, advanced_precision, save_formats, deploy_measure, advise, advise_history, adapter_diff, adapter_merge, blame, adapter_branch, unlearning, unlearning_eval, knowledge_edit, edit_governor, edit_diff, ra_dit, steering, citation_faithful, grace_codebook, ingest_sources, prune_prompt, active_sampler, ab_test, drift_alarm, tunability, terraform_plan, env_lock, hardware_fit, completions, license_advisor, behavior_battery, capability_suite, checklist_dsl, irt, sae_diff, sleeper_probe, interference, probe_pack, cmaes_merge, vector_bank, mole_routing, adapter_pr, soup_lock, adapter_bisect, prompt_compile, prompt_distill, compile_tools, apple_adapter, local_rl, build_dag, expectations, magpie, persona_hub, brain_rot, reward_hacking, uld, minillm, rl_checkpoint, iterative_dpo, echo_trap, mod, local_rl_scheduler, spectrum_scan, ship_verdict, reward_hack_control, data_doctor, data_lint, shrink, best_of_n, evolve
119
+ utils/ - GPU, errors, MoE, GaLore, QAT, Unsloth, vLLM, SGLang, Liger, FlashAttn, FSDP, Ring Attention, long-context, quality, curriculum, freeze, dataset-registry, mlx, peft_builder, paths, topology, launcher, mii, pipeline, cut_ce, fp8, gradient_ckpt, kernel_picker, cross_doc_attn, activation_offload, hf, spec_pairing, structured_output, metrics, tracing, auto_quant, lr_finder, grad_accum, mixed_precision, warmup, spike_recovery, convergence, v028_features, multipack_sampler, multipack, neat_packing, jinja_analyzer, quant_menu, relora, peft_patches, peft_wiring, dpo_variants, optimizer_zoo, lr_groups, loftq_init, block_expansion, tts, classifier, distill, bitnet, ebft_gdpo, moe_quant, reasoning_effort, gguf_quant, kv_cache, advanced_precision, save_formats, deploy_measure, advise, advise_history, adapter_diff, adapter_merge, blame, adapter_branch, unlearning, unlearning_eval, knowledge_edit, edit_governor, edit_diff, ra_dit, steering, citation_faithful, grace_codebook, ingest_sources, prune_prompt, active_sampler, ab_test, drift_alarm, tunability, terraform_plan, env_lock, hardware_fit, completions, license_advisor, behavior_battery, capability_suite, checklist_dsl, irt, sae_diff, sleeper_probe, interference, probe_pack, cmaes_merge, vector_bank, mole_routing, adapter_pr, soup_lock, adapter_bisect, prompt_compile, prompt_distill, compile_tools, apple_adapter, local_rl, build_dag, expectations, magpie, persona_hub, brain_rot, reward_hacking, uld, minillm, rl_checkpoint, iterative_dpo, echo_trap, mod, local_rl_scheduler, spectrum_scan, ship_verdict, reward_hack_control, data_doctor, data_lint, shrink, best_of_n, evolve, reward_synth, reward_stress, layer_stream, layer_shard, layer_stream_runtime
120
120
  templates/ - 21 built-in soup.yaml templates (YAML + manifest.json) with load_template loader (v0.39.0, +bco v0.40.0, +4 compliance v0.71.35)
121
121
  ui/ - Web UI (FastAPI + HTML/JS SPA)
122
122
 
123
- tests/ - Test suite (318 files, 16490 tests)
123
+ tests/ - Test suite (324 files, 16735 tests)
124
124
  examples/ - Real-world config examples and datasets
125
125
  ```
126
126
 
@@ -150,7 +150,7 @@ pytest tests/test_data.py::test_detect_alpaca_format -v
150
150
  pytest tests/ --cov=soup_cli --cov-report=html
151
151
  ```
152
152
 
153
- ### Test Files (313 files)
153
+ ### Test Files (318 files)
154
154
 
155
155
  > A representative sample of the suite below. Run `pytest tests/ -v` for the complete list.
156
156
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: soup-cli
3
- Version: 0.71.40
3
+ Version: 0.72.0
4
4
  Summary: Fine-tune and post-train LLMs in one command. No SSH, no config hell.
5
5
  Project-URL: Homepage, https://github.com/MakazhanAlpamys/Soup
6
6
  Project-URL: Repository, https://github.com/MakazhanAlpamys/Soup
@@ -193,27 +193,44 @@ infrastructure instead of improving models. Soup fixes that.
193
193
 
194
194
  ## What's New
195
195
 
196
- **v0.71.40`soup reward synth`: generate a reward verifier from your data.** Point it at a JSONL of reference (gold) outputs and it infers a deterministic verifier, writes a readable / committable `.py` reward function, and — the part nobody else does — *refuses* to emit one that can't tell your references from bad answers. Nothing in TRL / Unsloth / Axolotl synthesizes a reward.
196
+ **v0.72.0Layer streaming (BETA).** Fine-tune models that don't fit in your card. The frozen
197
+ base streams from CPU RAM one decoder layer at a time into a small pool of VRAM buffers while the
198
+ LoRA adapters stay resident, so peak VRAM is bounded by one layer rather than the whole model.
199
+ **Qwen2.5-3B trains in 2.15 GB on a 4 GB card, where a resident run OOMs.**
200
+
201
+ - **`training.stream_layers: true`** — a config key, not a CLI flag. Tune with
202
+ `stream_source` (`ram` in v0.72.0; `disk` is v0.72.2) and `stream_buffers` (2–8, default 2).
203
+ - **Measured on a 4 GB RTX 3050 Laptop** (batch 1, gradient checkpointing on): 0.5B at
204
+ 978.6 tok/s / 1.47 GB, 1.5B at 525.0 tok/s / 1.82 GB, 3B at 143.1 tok/s / 2.15 GB.
205
+ - **Honest cost: 1.43× slower than resident**, measured at 0.5B — the only apples-to-apples
206
+ comparison available on that box, because 1.5B and above cannot run resident there at all.
207
+ - **Proof-of-mechanism at 3B.** Nothing above 3B was measured; no 8B/14B claim is supported.
208
+ Scope: RAM tier, bf16, `task: sft`, Llama/Qwen, batch size 1, no gradient accumulation, no
209
+ `--resume`. 4-bit (NF4) streaming is **v0.72.1** and is refused with a clear message today.
197
210
 
198
- - **Four families, auto-detected** (or pick with `--kind`): `numeric` (`\boxed{}` / `####` / last-number,
199
- exact or `--tolerance`), `json_schema` (induced keys + types + required), `regex`, and `tool_call`
200
- (per-tool `required`/`allowed` argument binding — a call can't borrow another tool's keys).
201
- - **A calibration report is the moat.** The verifier is loaded back and run against its own references
202
- (must accept ≥ 90%) and auto-generated bad answers (must reject). A degenerate always-accept verifier
203
- is **refused** (exit 2), never silently shipped. `--plan-only` previews; `--output-report` saves the JSON.
204
- - **No new exec surface.** The emitted file rides the existing `reward_fn: reward.py` path — you read,
205
- edit, commit, and diff it like any other reward.
206
- - **Reward ensembles now train.** `reward_fn: "accuracy,format"` loads as multiple rewards (and unlocks
207
- the `rm_ensemble` reward-hack detector) a recipe that shipped exactly this used to crash. (#311)
211
+ ```yaml
212
+ # soup.yaml then just `soup train --config soup.yaml`
213
+ training:
214
+ stream_layers: true # base streams from RAM; only the adapter trains
215
+ batch_size: 1
216
+ quantization: none # NF4 streaming lands in v0.72.1
217
+ ```
218
+
219
+ <details>
220
+ <summary>Previous release v0.71.40, soup reward synth (generate a reward verifier from your data)</summary>
221
+
222
+ Point `soup reward synth` at a JSONL of reference outputs and it infers a deterministic verifier,
223
+ writes a readable / committable `.py` reward function, and — the part nobody else does — *refuses* to
224
+ emit one that can't tell your references from bad answers (four families: `numeric` / `json_schema` /
225
+ `regex` / `tool_call`; a mandatory calibration report is the moat). Reward ensembles
226
+ (`reward_fn: "accuracy,format"`) also train now. (#311)
208
227
 
209
228
  ```bash
210
- # synth a verifier from reference answers, calibrate it, keep it only if it discriminates
211
229
  soup reward synth references.jsonl -o reward.py --output-report calib.json
212
-
213
- # then train against the reward you just generated
214
- # training: { reward_fn: reward.py } (or an ensemble: reward_fn: "accuracy,format")
215
230
  ```
216
231
 
232
+ </details>
233
+
217
234
  <details>
218
235
  <summary>Previous release — v0.71.39, CI for weights not prompts (emit + provenance-bind the ship verdict)</summary>
219
236
 
@@ -357,7 +374,7 @@ The full feature reference lives in [`docs/`](docs/). Start here:
357
374
  |---|---|
358
375
  | [Training tasks & methods](docs/training.md) | SFT, DPO/GRPO/PPO/KTO/ORPO/SimPO/IPO/BCO, tool-calling, PRM, pre-training, distillation, classification, vision/audio/TTS, unlearning, RAFT/RA-DIT, loop-hardening detectors |
359
376
  | [PEFT, long context & efficiency](docs/peft-and-efficiency.md) | DoRA, LoRA+, rsLoRA, VeRA, OLoRA, NEFTune, PiSSA, ReLoRA, optimizer & PEFT zoo, LLaMA Pro, GaLore, YaRN/LongLoRA, packing, curriculum, auto-tuning |
360
- | [Performance & quantization](docs/performance-and-quantization.md) | QAT, FP8, Quant Menu (I + II), KV-cache, NVFP4, save formats, Cut Cross-Entropy, gradient checkpointing, kernels, activation offloading, multi-GPU / DeepSpeed / FSDP |
377
+ | [Performance & quantization](docs/performance-and-quantization.md) | QAT, FP8, Quant Menu (I + II), KV-cache, NVFP4, save formats, Cut Cross-Entropy, gradient checkpointing, kernels, activation offloading, layer streaming, multi-GPU / DeepSpeed / FSDP |
361
378
  | [Data engineering](docs/data.md) | Formats, the Axolotl/LF-parity pipeline, data tools, synthetic generation & forge, quality scorecards, trace tooling, remote datasets, mixing, recipe DAGs |
362
379
  | [Evaluation & probes](docs/evaluation.md) | Eval design/gate, eval-gated training, benchmarks, NLG metrics, calibration, Elo arena, diagnose, post-train X-ray probes, A/B, drift, tunability, `soup advise` |
363
380
  | [Serving & export](docs/serving-and-export.md) | OpenAI-compatible server, batch inference, benchmarking, merge/export, Anthropic Messages endpoint, speculative decoding (train + measure your own draft), deploy autopilot, Web UI, Agent Forge |
@@ -49,27 +49,44 @@ infrastructure instead of improving models. Soup fixes that.
49
49
 
50
50
  ## What's New
51
51
 
52
- **v0.71.40`soup reward synth`: generate a reward verifier from your data.** Point it at a JSONL of reference (gold) outputs and it infers a deterministic verifier, writes a readable / committable `.py` reward function, and — the part nobody else does — *refuses* to emit one that can't tell your references from bad answers. Nothing in TRL / Unsloth / Axolotl synthesizes a reward.
53
-
54
- - **Four families, auto-detected** (or pick with `--kind`): `numeric` (`\boxed{}` / `####` / last-number,
55
- exact or `--tolerance`), `json_schema` (induced keys + types + required), `regex`, and `tool_call`
56
- (per-tool `required`/`allowed` argument binding — a call can't borrow another tool's keys).
57
- - **A calibration report is the moat.** The verifier is loaded back and run against its own references
58
- (must accept 90%) and auto-generated bad answers (must reject). A degenerate always-accept verifier
59
- is **refused** (exit 2), never silently shipped. `--plan-only` previews; `--output-report` saves the JSON.
60
- - **No new exec surface.** The emitted file rides the existing `reward_fn: reward.py` path you read,
61
- edit, commit, and diff it like any other reward.
62
- - **Reward ensembles now train.** `reward_fn: "accuracy,format"` loads as multiple rewards (and unlocks
63
- the `rm_ensemble` reward-hack detector) a recipe that shipped exactly this used to crash. (#311)
52
+ **v0.72.0Layer streaming (BETA).** Fine-tune models that don't fit in your card. The frozen
53
+ base streams from CPU RAM one decoder layer at a time into a small pool of VRAM buffers while the
54
+ LoRA adapters stay resident, so peak VRAM is bounded by one layer rather than the whole model.
55
+ **Qwen2.5-3B trains in 2.15 GB on a 4 GB card, where a resident run OOMs.**
56
+
57
+ - **`training.stream_layers: true`** a config key, not a CLI flag. Tune with
58
+ `stream_source` (`ram` in v0.72.0; `disk` is v0.72.2) and `stream_buffers` (2–8, default 2).
59
+ - **Measured on a 4 GB RTX 3050 Laptop** (batch 1, gradient checkpointing on): 0.5B at
60
+ 978.6 tok/s / 1.47 GB, 1.5B at 525.0 tok/s / 1.82 GB, 3B at 143.1 tok/s / 2.15 GB.
61
+ - **Honest cost: 1.43× slower than resident**, measured at 0.5B — the only apples-to-apples
62
+ comparison available on that box, because 1.5B and above cannot run resident there at all.
63
+ - **Proof-of-mechanism at 3B.** Nothing above 3B was measured; no 8B/14B claim is supported.
64
+ Scope: RAM tier, bf16, `task: sft`, Llama/Qwen, batch size 1, no gradient accumulation, no
65
+ `--resume`. 4-bit (NF4) streaming is **v0.72.1** and is refused with a clear message today.
66
+
67
+ ```yaml
68
+ # soup.yaml — then just `soup train --config soup.yaml`
69
+ training:
70
+ stream_layers: true # base streams from RAM; only the adapter trains
71
+ batch_size: 1
72
+ quantization: none # NF4 streaming lands in v0.72.1
73
+ ```
74
+
75
+ <details>
76
+ <summary>Previous release — v0.71.40, soup reward synth (generate a reward verifier from your data)</summary>
77
+
78
+ Point `soup reward synth` at a JSONL of reference outputs and it infers a deterministic verifier,
79
+ writes a readable / committable `.py` reward function, and — the part nobody else does — *refuses* to
80
+ emit one that can't tell your references from bad answers (four families: `numeric` / `json_schema` /
81
+ `regex` / `tool_call`; a mandatory calibration report is the moat). Reward ensembles
82
+ (`reward_fn: "accuracy,format"`) also train now. (#311)
64
83
 
65
84
  ```bash
66
- # synth a verifier from reference answers, calibrate it, keep it only if it discriminates
67
85
  soup reward synth references.jsonl -o reward.py --output-report calib.json
68
-
69
- # then train against the reward you just generated
70
- # training: { reward_fn: reward.py } (or an ensemble: reward_fn: "accuracy,format")
71
86
  ```
72
87
 
88
+ </details>
89
+
73
90
  <details>
74
91
  <summary>Previous release — v0.71.39, CI for weights not prompts (emit + provenance-bind the ship verdict)</summary>
75
92
 
@@ -213,7 +230,7 @@ The full feature reference lives in [`docs/`](docs/). Start here:
213
230
  |---|---|
214
231
  | [Training tasks & methods](docs/training.md) | SFT, DPO/GRPO/PPO/KTO/ORPO/SimPO/IPO/BCO, tool-calling, PRM, pre-training, distillation, classification, vision/audio/TTS, unlearning, RAFT/RA-DIT, loop-hardening detectors |
215
232
  | [PEFT, long context & efficiency](docs/peft-and-efficiency.md) | DoRA, LoRA+, rsLoRA, VeRA, OLoRA, NEFTune, PiSSA, ReLoRA, optimizer & PEFT zoo, LLaMA Pro, GaLore, YaRN/LongLoRA, packing, curriculum, auto-tuning |
216
- | [Performance & quantization](docs/performance-and-quantization.md) | QAT, FP8, Quant Menu (I + II), KV-cache, NVFP4, save formats, Cut Cross-Entropy, gradient checkpointing, kernels, activation offloading, multi-GPU / DeepSpeed / FSDP |
233
+ | [Performance & quantization](docs/performance-and-quantization.md) | QAT, FP8, Quant Menu (I + II), KV-cache, NVFP4, save formats, Cut Cross-Entropy, gradient checkpointing, kernels, activation offloading, layer streaming, multi-GPU / DeepSpeed / FSDP |
217
234
  | [Data engineering](docs/data.md) | Formats, the Axolotl/LF-parity pipeline, data tools, synthetic generation & forge, quality scorecards, trace tooling, remote datasets, mixing, recipe DAGs |
218
235
  | [Evaluation & probes](docs/evaluation.md) | Eval design/gate, eval-gated training, benchmarks, NLG metrics, calibration, Elo arena, diagnose, post-train X-ray probes, A/B, drift, tunability, `soup advise` |
219
236
  | [Serving & export](docs/serving-and-export.md) | OpenAI-compatible server, batch inference, benchmarking, merge/export, Anthropic Messages endpoint, speculative decoding (train + measure your own draft), deploy autopilot, Web UI, Agent Forge |
@@ -7,8 +7,8 @@ running the most recent version from PyPI (`pip install -U soup-cli`).
7
7
 
8
8
  | Version | Supported |
9
9
  | ------- | ------------------ |
10
- | 0.71.x | :white_check_mark: |
11
- | < 0.71 | :x: |
10
+ | 0.72.x | :white_check_mark: |
11
+ | < 0.72 | :x: |
12
12
 
13
13
  ## Reporting a Vulnerability
14
14
 
@@ -7,9 +7,9 @@ feature reference — every `soup` capability, grouped by area.
7
7
 
8
8
  | Guide | Covers |
9
9
  |---|---|
10
- | [Training tasks & methods](training.md) | SFT, DPO/GRPO/PPO/KTO/ORPO/SimPO/IPO/BCO, tool-calling, PRM, pre-training, distillation, classification, vision/audio/TTS, unlearning, RAFT/RA-DIT, loop-hardening detectors |
10
+ | [Training tasks & methods](training.md) | SFT, DPO/GRPO/PPO/KTO/ORPO/SimPO/IPO/BCO, tool-calling, PRM, pre-training, distillation, classification, vision/audio/TTS, unlearning, RAFT/RA-DIT, loop-hardening detectors, reward-verifier synthesis |
11
11
  | [PEFT, long context & efficiency](peft-and-efficiency.md) | DoRA, LoRA+, rsLoRA, VeRA, OLoRA, NEFTune, PiSSA, ReLoRA, optimizer & PEFT zoo, LLaMA Pro, GaLore, YaRN/LongLoRA, packing, curriculum, auto-tuning, depth pruning + distill-heal (`soup shrink`) |
12
- | [Performance & quantization](performance-and-quantization.md) | QAT, FP8, Quant Menu (I + II), KV-cache, NVFP4, save formats, Cut Cross-Entropy, gradient checkpointing, kernels, activation offloading, multi-GPU / DeepSpeed / FSDP |
12
+ | [Performance & quantization](performance-and-quantization.md) | QAT, FP8, Quant Menu (I + II), KV-cache, NVFP4, save formats, Cut Cross-Entropy, gradient checkpointing, kernels, activation offloading, layer streaming, multi-GPU / DeepSpeed / FSDP |
13
13
  | [Data engineering](data.md) | Formats, the Axolotl/LF-parity pipeline, data tools, synthetic generation & forge, quality scorecards, trace tooling, remote datasets, mixing, recipe DAGs |
14
14
  | [Evaluation & probes](evaluation.md) | Eval design/gate, eval-gated training, benchmarks, NLG metrics, calibration, Elo arena, diagnose, `soup ship` verdict, post-train X-ray probes, A/B, drift, tunability, `soup advise` |
15
15
  | [Serving & export](serving-and-export.md) | OpenAI-compatible server, batch inference, benchmarking, merge/export, Anthropic Messages endpoint, speculative decoding (train + measure your own draft), deploy autopilot, Web UI, Agent Forge |
@@ -743,15 +743,9 @@ pip install soup-cli[trackers] # mlflow + swanlab + trackio
743
743
  ```
744
744
 
745
745
 
746
- ## Telemetry (opt-IN, hardware-info-only)
746
+ ## Telemetry (not yet wired)
747
747
 
748
- Soup ships an opt-IN telemetry sender that POSTs hardware-info-only payloads (`soup_version` / `command` / `python` major.minor / `os` / `arch` / optional `duration_seconds`)no dataset paths, model names, or config contents. Enable per-shell:
749
-
750
- ```bash
751
- SOUP_TELEMETRY=1 soup train --config soup.yaml
752
- ```
753
-
754
- The sender uses a 1-second hard timeout, HTTPS-only with private-IP / link-local rejection (same SSRF policy as hub endpoints), and swallows every exception silently — telemetry can never crash training. Disabled by default until a public privacy policy ships.
748
+ Soup contains opt-in, hardware-info-only telemetry primitives in `utils/trackers.py` (`build_telemetry_payload` / `send_telemetry_payload`), but they are **not wired to any command** — no data is ever sent, and no environment variable enables sending today. When wired, the payload will carry only `soup_version` / `command` / `python` major.minor / `os` / `arch` / optional `duration_seconds` — never dataset paths, model names, or config contents — behind a 1-second hard timeout and the same HTTPS-only, private-IP-rejecting SSRF policy as hub endpoints, swallowing every exception so telemetry can never crash training. Wiring is deferred until a public privacy policy is published.
755
749
 
756
750
 
757
751
  ## Plugin System
@@ -30,6 +30,7 @@ soup merge-sharded-fsdp-weights ./shards -o merged.safetensors Consolidate FSDP
30
30
  soup delinearize-llama4 ./src --target ./out [--num-experts N] [--plan-only] Live Llama-4 fused-expert reshape [E*din,dout] -> [E,din,dout] + sidecar copy (v0.71.21)
31
31
  soup spectrum scan --model <id|path> --top-percent 50 [--modules mlp,attn] [-o patch.yaml] Spectrum SNR scan (no model load) -> training.unfrozen_parameters YAML patch (v0.71.23)
32
32
  soup train --config sft.yaml # training.lisa_enabled: true [lisa_num_layers lisa_interval_steps] LISA layerwise importance sampling — full-FT quality at LoRA-like memory (sft/transformers/text/quantization=none) (v0.71.34)
33
+ soup train --config sft.yaml # training.stream_layers: true [stream_source stream_buffers] BETA layer streaming — the frozen base streams from CPU RAM one decoder layer at a time, so peak VRAM is bounded by ONE layer (sft/transformers/text/quantization=none, batch 1) (v0.72.0)
33
34
  soup export --model ./output --format gguf Export to GGUF (Ollama)
34
35
  soup export --model ./output --deploy ollama Export GGUF + auto-deploy to Ollama
35
36
  soup export --model ./output --format onnx Export to ONNX
@@ -186,6 +187,10 @@ soup reward synth refs.jsonl -o reward.py Synthesize a deterministic reward
186
187
  soup reward synth ... --kind numeric|json_schema|regex|tool_call Force a verifier family (default: auto-detect)
187
188
  soup reward synth ... --plan-only Report the induced spec + calibration plan; write nothing
188
189
  soup reward synth ... --output-report r.json --min-discrimination 0.5 Save the calibration JSON / set the refusal threshold (exit 0 emit / 2 refuse / 1 error)
190
+ soup reward stress reward.py --references golds.jsonl Adversarially probe a verifier for gameability — empty/length/repetition/sentinel junk (v0.71.41)
191
+ soup reward stress verifiable --verifiable-domain math --references golds.jsonl Probe a builtin verifier instead of a .py file
192
+ soup reward stress ... --attacks empty,length,repetition,sentinel --sentinel GOLD --threshold 0.5 --max-gameable 0.0 Tune the attack set / accept threshold / tolerance
193
+ soup reward stress ... --output-report r.json Save the per-attack report JSON (exit 0 robust / 2 gameable / 1 error)
189
194
  soup tui Full-screen Textual dashboard (requires [tui] extra)
190
195
  soup train --config soup.yaml --profile Record torch.profiler trace to <output>/profiles/
191
196
  soup --log-level quiet|normal|verbose|debug Global logging tier (Rich-formatted)
@@ -14,6 +14,7 @@
14
14
  - [Cross-Document Attention Masking](#cross-document-attention-masking)
15
15
  - [Quant Menu — 9 Quantization Formats](#quant-menu--9-quantization-formats)
16
16
  - [Activation Offloading (Small-VRAM Large-Batch)](#activation-offloading-small-vram-large-batch)
17
+ - [Layer Streaming (BETA, v0.72.0)](#layer-streaming-beta-v0720)
17
18
  - [Correctness First (v0.36.0)](#correctness-first-v0360)
18
19
  - [Multi-GPU / DeepSpeed / FSDP](#multi-gpu--deepspeed--fsdp)
19
20
  - [Performance + Long-Context](#performance--long-context)
@@ -225,6 +226,108 @@ training:
225
226
  Not compatible with unsloth (own memory manager) or mlx. Wired across every transformer-backend trainer (SFT, DPO, GRPO, KTO, ORPO, SimPO, IPO, PPO, Reward-Model, Embedding, Pretrain).
226
227
 
227
228
 
229
+ ## Layer Streaming (BETA, v0.72.0)
230
+
231
+ Stream frozen base-model decoder layers ONE at a time from CPU RAM into small VRAM buffers instead of keeping the whole base resident. Peak VRAM is bounded by the size of a single layer, not the entire model — so models that don't fit resident on your GPU can now train at all.
232
+
233
+ ```yaml
234
+ training:
235
+ stream_layers: true # Enable layer streaming
236
+ stream_source: auto # 'auto' (same-host RAM), 'ram', 'disk' (v0.72.2)
237
+ stream_buffers: 2 # Double-buffering; range [2, 8]
238
+ ```
239
+
240
+ ```bash
241
+ # Layer streaming is a CONFIG key, not a CLI flag — just train normally:
242
+ soup train --config soup.yaml
243
+ ```
244
+
245
+ **How it works.** LoRA adapters + their gradients + optimizer state stay resident in VRAM (they are small). The frozen base lives in CPU RAM, page-locked when the machine allows it, and is streamed: each decoder layer is copied into one of two pre-allocated VRAM buffers on a dedicated CUDA stream while the previous layer is still computing, so the load overlaps the compute. Each layer is read **twice** per step — once in the forward pass and once when the backward pass recomputes it — because `dL/dx = Wᵀ · dL/dy` needs the weights to reach the layers below. That is physics, not an implementation detail, and it is why streaming costs time.
246
+
247
+ The tradeoff: **1.43× slower than resident training**, measured at 0.5B — the only apples-to-apples comparison available on the reference box, because 1.5B and above cannot run resident there at all.
248
+
249
+ **Measured numbers (RTX 3050 Laptop 4 GB, Windows 11, bf16 LoRA, batch 1, 50 steps after 10 warmup):**
250
+
251
+ | Model | Seq Length | Throughput | GPU Util | Peak VRAM |
252
+ |---|---|---|---|---|
253
+ | Qwen2.5-0.5B | 512 | 978.6 tok/s | 91.4% | 1.47 GB |
254
+ | Qwen2.5-1.5B | 512 | 525.0 tok/s | 96.8% | 1.82 GB |
255
+ | Qwen2.5-1.5B | 1024 | 487.6 tok/s | 96.7% | 2.96 GB |
256
+ | Qwen2.5-3B | 512 | 143.1 tok/s | 79.3% | 2.15 GB |
257
+
258
+ **Headline:** Qwen2.5-3B trains in **2.15 GB** on a 4 GB card, where a resident run OOMs.
259
+
260
+ **Honest scope (v0.72.0 = proof-of-mechanism):**
261
+ - **Models measured:** Qwen2.5-0.5B, 1.5B and 3B, plus a live `soup train` on SmolLM2-135M. **Nothing above 3B was measured, and no 8B / 14B / 70B claim is supported.**
262
+ - **RAM tier only.** `stream_source: ram` (`auto` resolves to it). The disk overflow tier ships in **v0.72.2**.
263
+ - **Llama / Qwen only**, `task: sft`, `backend: transformers`, `modality: text`.
264
+ - **`batch_size: 1`**, no gradient accumulation, no `--resume` — all ship in **v0.72.2**.
265
+ - **bf16 base; `quantization: none` is required.** 4-bit (NF4) weights carry a quantisation state and cannot be byte-copied into a plain buffer, so NF4 streaming is **v0.72.1**. A `4bit` config is refused today with a message saying exactly that.
266
+ - **The 3B throughput is a LOWER BOUND.** The reference box could not page-lock the 5.55 GB base (its measured page-locked ceiling is 7.65 GB, and a CUDA context plus the model skeleton did not leave room), so that run fell back to a pageable store. Pageable memory makes the host-to-device copy synchronous, which costs overlap — visible as the GPU-utilisation drop from 96.8% (1.5B, pinned) to 79.3% (3B, pageable). Soup does this fallback automatically **and prints the cost** rather than absorbing it silently.
267
+ - Numbers are Windows/WDDM and therefore systematically pessimistic versus Linux. `expandable_segments:True` is silently ignored on Windows; Soup detects that and does not claim it is active.
268
+
269
+ **Rejected at config load (each names the release that lifts it):**
270
+ - `stream_source: disk` → the disk tier is v0.72.2
271
+ - `quantization` other than `none` → NF4 streaming is v0.72.1
272
+ - `backend: unsloth` / `backend: mlx` → streaming replaces the model-load path those backends own
273
+ - `task` other than `sft` → preference losses are v0.72.3
274
+ - `gradient_accumulation_steps > 1` → every micro-batch re-reads the whole base, so accumulation multiplies streaming IO linearly (v0.72.2)
275
+ - `batch_size` other than `1` → v0.72.2
276
+ - `lora.use_dora` / `lora.use_vera` / `lora.init_strategy` other than `random` → these initialise from the real base weight, which is on the meta device under streaming
277
+ - `unfrozen_parameters`, `lisa_enabled`, `packing`, `multipack`, `use_fsdp2_compile`, `train_router_only`, `expand_layers` → each independently rewrites or re-freezes the same layers
278
+ - `stream_source` / `stream_buffers` set while `stream_layers: false` → a footgun, refused
279
+ - an architecture outside `llama` / `qwen2` / `qwen3` → named explicitly, with the allowlist
280
+
281
+ **Config example:**
282
+
283
+ ```yaml
284
+ base: Qwen/Qwen2.5-3B
285
+ task: sft
286
+ backend: transformers
287
+
288
+ data:
289
+ train: ./data.jsonl
290
+ format: alpaca
291
+ max_length: 512
292
+ val_split: 0.1
293
+
294
+ training:
295
+ epochs: 3
296
+ lr: 2e-5
297
+ batch_size: 1 # required; larger batches in v0.72.2
298
+ gradient_accumulation_steps: 1 # required; accumulation in v0.72.2
299
+ quantization: none # required; NF4 streaming is v0.72.1
300
+ gradient_checkpointing: true # handled per-layer by the streamer
301
+ stream_layers: true # Enable layer streaming
302
+ stream_source: auto # RAM-based (disk in v0.72.2)
303
+ stream_buffers: 2 # double-buffering
304
+ lora:
305
+ r: 64
306
+ alpha: 16
307
+
308
+ output: ./output
309
+ ```
310
+
311
+ **Performance notes:**
312
+ - 1.43× slower than resident training, measured at 0.5B (the only size on the reference box where a resident baseline genuinely fits in 4 GB and is therefore a fair comparison).
313
+ - The 1.5B runs sit at ~97% GPU utilisation, i.e. compute-bound: with a page-locked store the layer loads hide almost completely behind compute. The 3B run's 79.3% is **not** a model-size effect — it is the cost of the pageable-store fallback on that particular box.
314
+ - Correctness is not a tradeoff: streamed and resident forward passes were verified **bit-exact**, and a 100-step streamed loss curve matched resident exactly. Streaming substitutes the same weight bytes into the same kernels.
315
+
316
+ **Troubleshooting:**
317
+ - **"layer streaming needs the base to fit in RAM"** — the base is larger than free RAM. Free RAM or pick a smaller base; the disk overflow tier is v0.72.2.
318
+ - **"could not page-lock the base … falling back to a PAGEABLE RAM store"** — expected on a busy machine. Training continues, more slowly. Close other applications to keep the pinned store.
319
+ - **"layer streaming does not support model_type=…"** — v0.72.0 covers Llama and Qwen only.
320
+ - **Slower than you expected** — layer streaming trades time for memory. If the model already fits resident on your card, do not enable it.
321
+
322
+ **Roadmap (each refusal names its release):**
323
+ - 4-bit (NF4) streaming — **v0.72.1**, the first genuinely useful capability jump
324
+ - Disk overflow tier, batch size > 1, gradient accumulation, checkpoint/resume, more architectures (Mistral / Gemma / Phi) — **v0.72.2**
325
+ - Preference losses (DPO / ORPO / SimPO / KTO) — **v0.72.3**. GRPO and PPO are explicitly **not** planned: rollouts need generation, which re-reads the model per token
326
+ - A published 14B-on-8 GB reference benchmark — hardware-blocked; it needs an 8 GB card and 32 GB of RAM, which the development box does not have
327
+
328
+ **Shard cache.** The first streaming run rewrites the checkpoint into one safetensors shard per decoder layer under `~/.soup/layer-stream/` (override with `SOUP_LAYER_STREAM_CACHE_DIR`). That costs disk space roughly equal to the base. The cache is keyed to a fingerprint of the source checkpoint, so a base retrained in place re-shards instead of silently training against stale weights.
329
+
330
+
228
331
  ## Correctness First (v0.36.0)
229
332
 
230
333
  Four silent-failure modes Soup had → loud failures.
@@ -4,6 +4,11 @@
4
4
 
5
5
  > SFT, DPO/GRPO/PPO/KTO/ORPO/SimPO/IPO/BCO, tool-calling, PRM, pre-training, distillation, classification, vision/audio/TTS, unlearning, RAFT/RA-DIT, and the loop-hardening detectors.
6
6
 
7
+ > **Training a model bigger than your GPU?** `training.stream_layers: true` streams the
8
+ > frozen base from CPU RAM one decoder layer at a time, so peak VRAM is bounded by one
9
+ > layer instead of the whole model —
10
+ > see [Layer Streaming](performance-and-quantization.md#layer-streaming-beta-v0720).
11
+
7
12
  **Contents:**
8
13
 
9
14
  - [Continual-learning rehearsal (`--replay`)](#continual-learning-rehearsal---replay)
@@ -897,6 +902,31 @@ strongly the verifier must separate references from perturbed negatives before i
897
902
  v1 is deterministic families only — a `\boxed{}`/`####` marker helps the numeric verifier, and
898
903
  completions are prompted to mark their answer (standard RLVR practice).
899
904
 
905
+ ### Stress-test a verifier for gameability (`soup reward stress`)
906
+
907
+ A verifier that passes calibration still might pay out for junk. `soup reward stress` feeds the
908
+ verifier deterministic degenerate completions — empty, length-padded, repeated, and
909
+ sentinel-spam — scored against your real gold answers, and flags any it **accepts**. It's the
910
+ adversarial counterpart to `synth`: calibration proves the verifier tells references from
911
+ *friendly* bad answers; `stress` asks whether a reward-hacking model could game it.
912
+
913
+ ```bash
914
+ # probe a synthesized verifier (or any reward .py) — exit 0 robust, 2 gameable, 1 error
915
+ soup reward stress reward.py --references golds.jsonl --output-report stress.json
916
+
917
+ # probe a builtin verifier instead of a .py file
918
+ soup reward stress verifiable --verifiable-domain math --references golds.jsonl
919
+
920
+ # tune the attack set / accept threshold / gameability tolerance
921
+ soup reward stress reward.py --references golds.jsonl \
922
+ --attacks empty,length,repetition,sentinel --sentinel GOLD \
923
+ --threshold 0.5 --max-gameable 0.0
924
+ ```
925
+
926
+ The report shows a per-attack accept-rate and an overall verdict. A gold-requiring verifier probed
927
+ with **no** `--references` is a hard error (it can't be measured), never a false "robust". Probing a
928
+ `.py` executes its module code, like any custom reward — only stress files you trust.
929
+
900
930
  ### Verifiable Rewards (RLVR)
901
931
 
902
932
  Use `reward_fn: verifiable` with a `verifiable_domain` for deterministic, math-checkable rewards — no judge model, no heuristics. Great for GRPO on math, code, or structured-output tasks.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "soup-cli"
7
- version = "0.71.40"
7
+ version = "0.72.0"
8
8
  description = "Fine-tune and post-train LLMs in one command. No SSH, no config hell."
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -1,3 +1,3 @@
1
1
  """Soup CLI — Fine-tune and post-train LLMs in one command."""
2
2
 
3
- __version__ = "0.71.40"
3
+ __version__ = "0.72.0"