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

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