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

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