soup-cli 0.72.2__tar.gz → 0.72.4__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 (925) hide show
  1. soup_cli-0.72.4/.github/FUNDING.yml +5 -0
  2. {soup_cli-0.72.2 → soup_cli-0.72.4}/CHANGELOG.md +123 -0
  3. {soup_cli-0.72.2 → soup_cli-0.72.4}/CODE_OF_CONDUCT.md +3 -1
  4. {soup_cli-0.72.2 → soup_cli-0.72.4}/CONTRIBUTING.md +5 -3
  5. {soup_cli-0.72.2 → soup_cli-0.72.4}/PKG-INFO +86 -38
  6. {soup_cli-0.72.2 → soup_cli-0.72.4}/README.md +77 -30
  7. {soup_cli-0.72.2 → soup_cli-0.72.4}/SECURITY.md +3 -0
  8. soup_cli-0.72.4/benchmarks/README.md +57 -0
  9. soup_cli-0.72.4/benchmarks/gate-v0.72.0-layer-streaming.md +233 -0
  10. soup_cli-0.72.4/benchmarks/gate-v0.72.2-nf4.md +339 -0
  11. soup_cli-0.72.4/benchmarks/gate-v0.72.3-breadth.md +472 -0
  12. soup_cli-0.72.4/benchmarks/gate-v0.72.4-preference-losses.md +296 -0
  13. {soup_cli-0.72.2 → soup_cli-0.72.4}/docs/commands.md +2 -4
  14. {soup_cli-0.72.2 → soup_cli-0.72.4}/docs/performance-and-quantization.md +122 -22
  15. {soup_cli-0.72.2 → soup_cli-0.72.4}/docs/training.md +6 -5
  16. {soup_cli-0.72.2 → soup_cli-0.72.4}/pyproject.toml +31 -4
  17. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/__init__.py +1 -1
  18. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/doctor.py +37 -2
  19. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/train.py +7 -17
  20. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/config/schema.py +60 -19
  21. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/dpo.py +28 -6
  22. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/kto.py +27 -6
  23. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/orpo.py +28 -6
  24. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/sft.py +9 -219
  25. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/simpo.py +28 -6
  26. soup_cli-0.72.4/src/soup_cli/trainer/stream_setup.py +453 -0
  27. soup_cli-0.72.4/src/soup_cli/utils/layer_stream.py +859 -0
  28. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/layer_stream_runtime.py +272 -6
  29. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07200.py +64 -29
  30. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07201.py +53 -43
  31. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07202.py +42 -6
  32. soup_cli-0.72.4/tests/test_v07203.py +1386 -0
  33. soup_cli-0.72.4/tests/test_v07204.py +1073 -0
  34. soup_cli-0.72.4/tests/test_version_sync.py +82 -0
  35. soup_cli-0.72.2/.github/FUNDING.yml +0 -7
  36. soup_cli-0.72.2/src/soup_cli/utils/layer_stream.py +0 -401
  37. {soup_cli-0.72.2 → soup_cli-0.72.4}/.dockerignore +0 -0
  38. {soup_cli-0.72.2 → soup_cli-0.72.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  39. {soup_cli-0.72.2 → soup_cli-0.72.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  40. {soup_cli-0.72.2 → soup_cli-0.72.4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  41. {soup_cli-0.72.2 → soup_cli-0.72.4}/.github/pull_request_template.md +0 -0
  42. {soup_cli-0.72.2 → soup_cli-0.72.4}/.github/workflows/ci.yml +0 -0
  43. {soup_cli-0.72.2 → soup_cli-0.72.4}/.github/workflows/docker.yml +0 -0
  44. {soup_cli-0.72.2 → soup_cli-0.72.4}/.github/workflows/publish.yml +0 -0
  45. {soup_cli-0.72.2 → soup_cli-0.72.4}/.github/workflows/recipe-validation.yml +0 -0
  46. {soup_cli-0.72.2 → soup_cli-0.72.4}/.gitignore +0 -0
  47. {soup_cli-0.72.2 → soup_cli-0.72.4}/.mailmap +0 -0
  48. {soup_cli-0.72.2 → soup_cli-0.72.4}/.pre-commit-config.yaml +0 -0
  49. {soup_cli-0.72.2 → soup_cli-0.72.4}/AGENTS.md +0 -0
  50. {soup_cli-0.72.2 → soup_cli-0.72.4}/CODEOWNERS +0 -0
  51. {soup_cli-0.72.2 → soup_cli-0.72.4}/CONTRIBUTORS.md +0 -0
  52. {soup_cli-0.72.2 → soup_cli-0.72.4}/Dockerfile +0 -0
  53. {soup_cli-0.72.2 → soup_cli-0.72.4}/LICENSE +0 -0
  54. {soup_cli-0.72.2 → soup_cli-0.72.4}/NOTICE +0 -0
  55. {soup_cli-0.72.2 → soup_cli-0.72.4}/docker-compose.yml +0 -0
  56. {soup_cli-0.72.2 → soup_cli-0.72.4}/docs/README.md +0 -0
  57. {soup_cli-0.72.2 → soup_cli-0.72.4}/docs/adapters-and-governance.md +0 -0
  58. {soup_cli-0.72.2 → soup_cli-0.72.4}/docs/backends-and-ops.md +0 -0
  59. {soup_cli-0.72.2 → soup_cli-0.72.4}/docs/compliance.md +0 -0
  60. {soup_cli-0.72.2 → soup_cli-0.72.4}/docs/data.md +0 -0
  61. {soup_cli-0.72.2 → soup_cli-0.72.4}/docs/evaluation.md +0 -0
  62. {soup_cli-0.72.2 → soup_cli-0.72.4}/docs/models.md +0 -0
  63. {soup_cli-0.72.2 → soup_cli-0.72.4}/docs/peft-and-efficiency.md +0 -0
  64. {soup_cli-0.72.2 → soup_cli-0.72.4}/docs/serving-and-export.md +0 -0
  65. {soup_cli-0.72.2 → soup_cli-0.72.4}/examples/README.md +0 -0
  66. {soup_cli-0.72.2 → soup_cli-0.72.4}/examples/configs/dpo_chat.yaml +0 -0
  67. {soup_cli-0.72.2 → soup_cli-0.72.4}/examples/configs/dpo_example.yaml +0 -0
  68. {soup_cli-0.72.2 → soup_cli-0.72.4}/examples/configs/grpo_reasoning.yaml +0 -0
  69. {soup_cli-0.72.2 → soup_cli-0.72.4}/examples/configs/rlhf_step1_sft.yaml +0 -0
  70. {soup_cli-0.72.2 → soup_cli-0.72.4}/examples/configs/rlhf_step2_reward.yaml +0 -0
  71. {soup_cli-0.72.2 → soup_cli-0.72.4}/examples/configs/rlhf_step3_ppo.yaml +0 -0
  72. {soup_cli-0.72.2 → soup_cli-0.72.4}/examples/configs/sft_basic.yaml +0 -0
  73. {soup_cli-0.72.2 → soup_cli-0.72.4}/examples/configs/vision_llama.yaml +0 -0
  74. {soup_cli-0.72.2 → soup_cli-0.72.4}/examples/data/alpaca_tiny.jsonl +0 -0
  75. {soup_cli-0.72.2 → soup_cli-0.72.4}/examples/data/chat_preferences.jsonl +0 -0
  76. {soup_cli-0.72.2 → soup_cli-0.72.4}/examples/data/dpo_sample.jsonl +0 -0
  77. {soup_cli-0.72.2 → soup_cli-0.72.4}/examples/data/reasoning_math.jsonl +0 -0
  78. {soup_cli-0.72.2 → soup_cli-0.72.4}/examples/reward_hacking/rewards.py +0 -0
  79. {soup_cli-0.72.2 → soup_cli-0.72.4}/examples/synthetic_workflow.md +0 -0
  80. {soup_cli-0.72.2 → soup_cli-0.72.4}/examples/synthetic_workflow.yaml +0 -0
  81. {soup_cli-0.72.2 → soup_cli-0.72.4}/soup.png +0 -0
  82. {soup_cli-0.72.2 → soup_cli-0.72.4}/soup_logo_svg.svg +0 -0
  83. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/__main__.py +0 -0
  84. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/autopilot/__init__.py +0 -0
  85. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/autopilot/analyzer.py +0 -0
  86. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/autopilot/decisions.py +0 -0
  87. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/autopilot/generate_config.py +0 -0
  88. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/cans/__init__.py +0 -0
  89. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/cans/pack.py +0 -0
  90. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/cans/publish.py +0 -0
  91. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/cans/run.py +0 -0
  92. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/cans/schema.py +0 -0
  93. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/cans/unpack.py +0 -0
  94. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/cans/verify.py +0 -0
  95. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/cli.py +0 -0
  96. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/cloud/__init__.py +0 -0
  97. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/cloud/modal.py +0 -0
  98. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/__init__.py +0 -0
  99. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/_eval_v0550.py +0 -0
  100. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/_eval_v0610.py +0 -0
  101. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/_eval_v0650.py +0 -0
  102. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/_eval_v07110.py +0 -0
  103. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/_webhook_cli.py +0 -0
  104. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/ab.py +0 -0
  105. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/active_sample.py +0 -0
  106. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/adapters.py +0 -0
  107. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/advise.py +0 -0
  108. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/agent.py +0 -0
  109. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/airgap.py +0 -0
  110. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/apple_adapter.py +0 -0
  111. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/attest.py +0 -0
  112. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/audit_log.py +0 -0
  113. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/autopilot.py +0 -0
  114. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/bench.py +0 -0
  115. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/bom.py +0 -0
  116. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/build.py +0 -0
  117. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/can.py +0 -0
  118. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/card.py +0 -0
  119. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/chat.py +0 -0
  120. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/ci.py +0 -0
  121. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/compile_cmd.py +0 -0
  122. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/compile_tools.py +0 -0
  123. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/completions.py +0 -0
  124. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/cost.py +0 -0
  125. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/data.py +0 -0
  126. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/data_canary.py +0 -0
  127. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/data_doctor.py +0 -0
  128. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/data_forge.py +0 -0
  129. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/data_mix.py +0 -0
  130. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/data_score.py +0 -0
  131. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/data_topics.py +0 -0
  132. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/delinearize_llama4.py +0 -0
  133. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/deploy.py +0 -0
  134. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/diagnose.py +0 -0
  135. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/diff.py +0 -0
  136. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/distill_prompt.py +0 -0
  137. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/draft.py +0 -0
  138. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/drift_alarm.py +0 -0
  139. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/edit.py +0 -0
  140. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/env.py +0 -0
  141. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/eval.py +0 -0
  142. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/expect.py +0 -0
  143. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/export.py +0 -0
  144. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/fetch.py +0 -0
  145. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/generate.py +0 -0
  146. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/history.py +0 -0
  147. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/infer.py +0 -0
  148. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/ingest.py +0 -0
  149. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/init.py +0 -0
  150. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/iterative_dpo.py +0 -0
  151. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/license_advisor.py +0 -0
  152. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/llama.py +0 -0
  153. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/local_rl.py +0 -0
  154. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/lock.py +0 -0
  155. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/loop.py +0 -0
  156. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/mcp.py +0 -0
  157. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/merge.py +0 -0
  158. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
  159. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/migrate.py +0 -0
  160. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/monitor.py +0 -0
  161. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/plan.py +0 -0
  162. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/plugins.py +0 -0
  163. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/probe.py +0 -0
  164. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/profile.py +0 -0
  165. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/prune_prompt.py +0 -0
  166. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/push.py +0 -0
  167. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/quantize.py +0 -0
  168. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/quickstart.py +0 -0
  169. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/ra_dit.py +0 -0
  170. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/recipes.py +0 -0
  171. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/registry.py +0 -0
  172. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/reward.py +0 -0
  173. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/runs.py +0 -0
  174. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/serve.py +0 -0
  175. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/ship.py +0 -0
  176. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/shrink.py +0 -0
  177. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/spectrum.py +0 -0
  178. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/steer.py +0 -0
  179. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/sweep.py +0 -0
  180. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/tokenizer.py +0 -0
  181. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/tui.py +0 -0
  182. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/tunability.py +0 -0
  183. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/ui.py +0 -0
  184. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/commands/why.py +0 -0
  185. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/config/__init__.py +0 -0
  186. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/config/loader.py +0 -0
  187. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/__init__.py +0 -0
  188. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
  189. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
  190. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
  191. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
  192. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
  193. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
  194. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
  195. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
  196. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/_fixtures/gate/format_json.jsonl +0 -0
  197. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/_fixtures/gate/safety.jsonl +0 -0
  198. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/_fixtures/gate/tool_call.jsonl +0 -0
  199. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
  200. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
  201. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
  202. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
  203. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/augment.py +0 -0
  204. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/chat_templates.py +0 -0
  205. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/collators.py +0 -0
  206. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/formats.py +0 -0
  207. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/loader.py +0 -0
  208. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/loss_mask.py +0 -0
  209. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/providers/__init__.py +0 -0
  210. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/providers/_utils.py +0 -0
  211. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/providers/anthropic.py +0 -0
  212. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/providers/ollama.py +0 -0
  213. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/providers/vllm.py +0 -0
  214. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/sft_format.py +0 -0
  215. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/templates/__init__.py +0 -0
  216. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/templates/code.py +0 -0
  217. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/templates/conversation.py +0 -0
  218. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/templates/preference.py +0 -0
  219. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/templates/qa.py +0 -0
  220. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/templates/reasoning.py +0 -0
  221. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/templates/tool_calling.py +0 -0
  222. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/templates/verifiable.py +0 -0
  223. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/traces/__init__.py +0 -0
  224. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/traces/pair_builder.py +0 -0
  225. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/traces/parsers.py +0 -0
  226. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/traces/quality.py +0 -0
  227. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/data/validator.py +0 -0
  228. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/envs/__init__.py +0 -0
  229. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/envs/_common.py +0 -0
  230. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/envs/calculator.py +0 -0
  231. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/envs/guess_number.py +0 -0
  232. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/envs/retrieval_qa.py +0 -0
  233. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/eval/__init__.py +0 -0
  234. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/eval/arena.py +0 -0
  235. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
  236. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/eval/calibrate.py +0 -0
  237. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
  238. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/eval/custom.py +0 -0
  239. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/eval/forgetting.py +0 -0
  240. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/eval/gate.py +0 -0
  241. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/eval/gate_suites.py +0 -0
  242. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/eval/human.py +0 -0
  243. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/eval/judge.py +0 -0
  244. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/eval/leaderboard.py +0 -0
  245. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/eval/quant_check.py +0 -0
  246. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/experiment/__init__.py +0 -0
  247. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/experiment/tracker.py +0 -0
  248. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/mcp_server/__init__.py +0 -0
  249. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/mcp_server/registry.py +0 -0
  250. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/mcp_server/server.py +0 -0
  251. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/migrate/__init__.py +0 -0
  252. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/migrate/axolotl.py +0 -0
  253. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/migrate/common.py +0 -0
  254. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/migrate/llamafactory.py +0 -0
  255. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/migrate/unsloth.py +0 -0
  256. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/monitoring/__init__.py +0 -0
  257. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/monitoring/callback.py +0 -0
  258. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
  259. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/monitoring/display.py +0 -0
  260. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
  261. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/monitoring/hf_push.py +0 -0
  262. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/monitoring/plugin_callback.py +0 -0
  263. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/monitoring/trace_logger.py +0 -0
  264. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/plugins/__init__.py +0 -0
  265. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/py.typed +0 -0
  266. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/recipes/__init__.py +0 -0
  267. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/recipes/catalog.py +0 -0
  268. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/registry/__init__.py +0 -0
  269. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/registry/attach.py +0 -0
  270. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/registry/diff.py +0 -0
  271. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/registry/hashing.py +0 -0
  272. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/registry/store.py +0 -0
  273. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/__init__.py +0 -0
  274. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/audio.yaml +0 -0
  275. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/bco.yaml +0 -0
  276. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/chat.yaml +0 -0
  277. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/code.yaml +0 -0
  278. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/embedding.yaml +0 -0
  279. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/eu-ai-act.yaml +0 -0
  280. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
  281. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
  282. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
  283. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/hipaa.yaml +0 -0
  284. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/ipo.yaml +0 -0
  285. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/kto.yaml +0 -0
  286. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/longcontext.yaml +0 -0
  287. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/manifest.json +0 -0
  288. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/medical.yaml +0 -0
  289. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/moe.yaml +0 -0
  290. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/orpo.yaml +0 -0
  291. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/pretrain.yaml +0 -0
  292. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/reasoning.yaml +0 -0
  293. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/rlhf.yaml +0 -0
  294. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/simpo.yaml +0 -0
  295. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/soc2.yaml +0 -0
  296. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/sr-11-7.yaml +0 -0
  297. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/tool-calling.yaml +0 -0
  298. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/templates/vision.yaml +0 -0
  299. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/__init__.py +0 -0
  300. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/asr.py +0 -0
  301. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/bco.py +0 -0
  302. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/bitnet.py +0 -0
  303. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/classifier.py +0 -0
  304. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/distill.py +0 -0
  305. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/embedding.py +0 -0
  306. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/grpo.py +0 -0
  307. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/ipo.py +0 -0
  308. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/mlx_dpo.py +0 -0
  309. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/mlx_grpo.py +0 -0
  310. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/mlx_routing.py +0 -0
  311. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/mlx_sft.py +0 -0
  312. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/mole_routing.py +0 -0
  313. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/online_dpo.py +0 -0
  314. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/ppo.py +0 -0
  315. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/preference.py +0 -0
  316. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/pretrain.py +0 -0
  317. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/prm.py +0 -0
  318. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/raft.py +0 -0
  319. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/reward_model.py +0 -0
  320. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/rewards.py +0 -0
  321. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/tts.py +0 -0
  322. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/trainer/unlearn.py +0 -0
  323. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/tui_app.py +0 -0
  324. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/ui/__init__.py +0 -0
  325. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/ui/app.py +0 -0
  326. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/ui/plugins/__init__.py +0 -0
  327. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/ui/static/app.js +0 -0
  328. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/ui/static/index.html +0 -0
  329. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/ui/static/logo.png +0 -0
  330. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/ui/static/logo.svg +0 -0
  331. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/ui/static/style.css +0 -0
  332. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/__init__.py +0 -0
  333. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/_eval_text.py +0 -0
  334. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/ab_test.py +0 -0
  335. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/activation_offload.py +0 -0
  336. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/active_sampler.py +0 -0
  337. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/adapter_arithmetic.py +0 -0
  338. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/adapter_bisect.py +0 -0
  339. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/adapter_branch.py +0 -0
  340. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/adapter_diff.py +0 -0
  341. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/adapter_fuse.py +0 -0
  342. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/adapter_merge.py +0 -0
  343. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/adapter_pr.py +0 -0
  344. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/adapter_scan.py +0 -0
  345. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/adapter_sign.py +0 -0
  346. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/advanced_precision.py +0 -0
  347. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/advise.py +0 -0
  348. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/advise_history.py +0 -0
  349. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/agent_forge.py +0 -0
  350. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/agent_rollout.py +0 -0
  351. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/agent_sandbox.py +0 -0
  352. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/airgap_bundle.py +0 -0
  353. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/annex_xi.py +0 -0
  354. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/anthropic_messages.py +0 -0
  355. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/apple_adapter.py +0 -0
  356. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/asr_metrics.py +0 -0
  357. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/attest.py +0 -0
  358. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/audit_log.py +0 -0
  359. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/auto_quant.py +0 -0
  360. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/backend_detect.py +0 -0
  361. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/batch_probe.py +0 -0
  362. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/behavior_battery.py +0 -0
  363. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/best_of_n.py +0 -0
  364. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/bitnet.py +0 -0
  365. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/blame.py +0 -0
  366. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/block_expansion.py +0 -0
  367. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/bom.py +0 -0
  368. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/brain_rot.py +0 -0
  369. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/brain_rot_lang.py +0 -0
  370. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/build_dag.py +0 -0
  371. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/canary.py +0 -0
  372. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/canary_discovery.py +0 -0
  373. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/canary_router.py +0 -0
  374. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/capability_suite.py +0 -0
  375. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/checklist_dsl.py +0 -0
  376. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
  377. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/ci_workflow.py +0 -0
  378. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/citation_faithful.py +0 -0
  379. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/classifier.py +0 -0
  380. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/cmaes_merge.py +0 -0
  381. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/compile_tools.py +0 -0
  382. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/completions.py +0 -0
  383. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/constants.py +0 -0
  384. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/convergence.py +0 -0
  385. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/crash.py +0 -0
  386. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/cross_doc_attn.py +0 -0
  387. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/curriculum.py +0 -0
  388. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
  389. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/cut_ce.py +0 -0
  390. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/data_doctor.py +0 -0
  391. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/data_forge.py +0 -0
  392. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/data_lint.py +0 -0
  393. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/data_mix.py +0 -0
  394. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/data_pipeline.py +0 -0
  395. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/data_score.py +0 -0
  396. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/deepspeed.py +0 -0
  397. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/delinearize_llama4.py +0 -0
  398. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/demo_bundles.py +0 -0
  399. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/deploy_autopilot.py +0 -0
  400. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/deploy_measure.py +0 -0
  401. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/diagnose/__init__.py +0 -0
  402. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/diagnose/_common.py +0 -0
  403. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/diagnose/badge.py +0 -0
  404. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/diagnose/citation.py +0 -0
  405. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/diagnose/contamination.py +0 -0
  406. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
  407. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/diagnose/format.py +0 -0
  408. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/diagnose/live.py +0 -0
  409. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/diagnose/memorization.py +0 -0
  410. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
  411. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/diagnose/refusal.py +0 -0
  412. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/diagnose/report.py +0 -0
  413. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/diagnose/runner.py +0 -0
  414. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/distill.py +0 -0
  415. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/dpo_variants.py +0 -0
  416. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/draft.py +0 -0
  417. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/drift_alarm.py +0 -0
  418. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/ebft_gdpo.py +0 -0
  419. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/echo_trap.py +0 -0
  420. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/edit_diff.py +0 -0
  421. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/edit_governor.py +0 -0
  422. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/edit_kernels.py +0 -0
  423. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/embed.py +0 -0
  424. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/encoding.py +0 -0
  425. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/energy.py +0 -0
  426. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/env_lock.py +0 -0
  427. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/errors.py +0 -0
  428. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/eval_design.py +0 -0
  429. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/eval_gate_hook.py +0 -0
  430. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
  431. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/evolve.py +0 -0
  432. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/expectations.py +0 -0
  433. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/fetch_examples.py +0 -0
  434. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/flash_attn.py +0 -0
  435. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/fp8.py +0 -0
  436. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/freeze.py +0 -0
  437. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/fsdp.py +0 -0
  438. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
  439. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/galore.py +0 -0
  440. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/gguf_quant.py +0 -0
  441. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/gpu.py +0 -0
  442. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/gpu_monitor.py +0 -0
  443. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/grace_codebook.py +0 -0
  444. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/graceful_save.py +0 -0
  445. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/grad_accum.py +0 -0
  446. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/gradient_ckpt.py +0 -0
  447. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/grpo_long_context.py +0 -0
  448. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/grpo_variants.py +0 -0
  449. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/hardware_fit.py +0 -0
  450. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/harm_probe.py +0 -0
  451. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/hf.py +0 -0
  452. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/hf_space.py +0 -0
  453. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/hubs.py +0 -0
  454. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/ingest_sources.py +0 -0
  455. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/integrations.py +0 -0
  456. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/interference.py +0 -0
  457. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/interference_live.py +0 -0
  458. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/irt.py +0 -0
  459. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/iterative_dpo.py +0 -0
  460. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/jinja_analyzer.py +0 -0
  461. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/kernel_picker.py +0 -0
  462. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/knowledge_edit.py +0 -0
  463. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/kv_cache.py +0 -0
  464. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/launcher.py +0 -0
  465. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/layer_shard.py +0 -0
  466. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/license_advisor.py +0 -0
  467. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/license_matrix.py +0 -0
  468. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/liger.py +0 -0
  469. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/lisa.py +0 -0
  470. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/live_eval.py +0 -0
  471. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/llama_proxy.py +0 -0
  472. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/llama_server_timings.py +0 -0
  473. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/local_rl.py +0 -0
  474. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
  475. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/loftq_init.py +0 -0
  476. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/log_level.py +0 -0
  477. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/long_context.py +0 -0
  478. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/longlora.py +0 -0
  479. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/loop_budget.py +0 -0
  480. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/loop_daemon.py +0 -0
  481. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/loop_iteration.py +0 -0
  482. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/loop_stages.py +0 -0
  483. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/loop_state.py +0 -0
  484. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/lr_finder.py +0 -0
  485. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/lr_groups.py +0 -0
  486. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/magpie.py +0 -0
  487. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/metrics.py +0 -0
  488. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/mii.py +0 -0
  489. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/minillm.py +0 -0
  490. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/mix_proxy.py +0 -0
  491. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/mixed_precision.py +0 -0
  492. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/mlx.py +0 -0
  493. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/mod.py +0 -0
  494. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/moe.py +0 -0
  495. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/moe_quant.py +0 -0
  496. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/mole_routing.py +0 -0
  497. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/multipack.py +0 -0
  498. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/multipack_sampler.py +0 -0
  499. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/multipack_trainer.py +0 -0
  500. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/namespace_pin.py +0 -0
  501. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/neat_packing.py +0 -0
  502. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/ngram_spec.py +0 -0
  503. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/nlg_metrics.py +0 -0
  504. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/ollama.py +0 -0
  505. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/onboarding.py +0 -0
  506. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/optimizer_zoo.py +0 -0
  507. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/paths.py +0 -0
  508. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/peft_builder.py +0 -0
  509. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/peft_patches.py +0 -0
  510. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/peft_wiring.py +0 -0
  511. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/persona_hub.py +0 -0
  512. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/pipeline.py +0 -0
  513. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/preference_combine.py +0 -0
  514. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/prm.py +0 -0
  515. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/prm_reward.py +0 -0
  516. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/probe_kernel.py +0 -0
  517. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/probe_pack.py +0 -0
  518. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/profiler.py +0 -0
  519. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/profiling.py +0 -0
  520. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/profiling_v0_43.py +0 -0
  521. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/prompt_compile.py +0 -0
  522. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/prompt_distill.py +0 -0
  523. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/prune_prompt.py +0 -0
  524. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/qat.py +0 -0
  525. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/qr_url.py +0 -0
  526. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/quality.py +0 -0
  527. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/quant_menu.py +0 -0
  528. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/ra_dit.py +0 -0
  529. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/ra_dit_run.py +0 -0
  530. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/raft.py +0 -0
  531. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/reasoning_effort.py +0 -0
  532. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/reasoning_parser.py +0 -0
  533. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/recipe_dag.py +0 -0
  534. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/recipe_run.py +0 -0
  535. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/registry.py +0 -0
  536. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/rehearsal.py +0 -0
  537. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/relora.py +0 -0
  538. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/replay.py +0 -0
  539. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/repro_receipt.py +0 -0
  540. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/reward_hack_control.py +0 -0
  541. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/reward_hacking.py +0 -0
  542. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/reward_stress.py +0 -0
  543. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/reward_synth.py +0 -0
  544. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/ring_attention.py +0 -0
  545. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/rl_checkpoint.py +0 -0
  546. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
  547. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/run_cost.py +0 -0
  548. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/sae_diff.py +0 -0
  549. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/save_formats.py +0 -0
  550. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/semdedup.py +0 -0
  551. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/server_tools.py +0 -0
  552. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/sglang.py +0 -0
  553. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/ship_verdict.py +0 -0
  554. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/shortcuts.py +0 -0
  555. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/shrink.py +0 -0
  556. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/signing.py +0 -0
  557. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/sleeper_probe.py +0 -0
  558. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/soup_lock.py +0 -0
  559. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/spec_pairing.py +0 -0
  560. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/spectrum_scan.py +0 -0
  561. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/spike_recovery.py +0 -0
  562. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/sse_train_stream.py +0 -0
  563. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/steering.py +0 -0
  564. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/strict_safetensors.py +0 -0
  565. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/structured_output.py +0 -0
  566. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/sweep_config.py +0 -0
  567. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/tail_latency.py +0 -0
  568. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/terraform_plan.py +0 -0
  569. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/tool_outputs.py +0 -0
  570. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/topics.py +0 -0
  571. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/topology.py +0 -0
  572. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/tracing.py +0 -0
  573. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/trackers.py +0 -0
  574. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/train_event_buffer.py +0 -0
  575. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/trainer_plugins.py +0 -0
  576. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/trust_remote.py +0 -0
  577. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/truth_probe.py +0 -0
  578. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/tts.py +0 -0
  579. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/tts_codec.py +0 -0
  580. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/tunability.py +0 -0
  581. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/ui_env.py +0 -0
  582. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/uld.py +0 -0
  583. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/unlearn_kernels.py +0 -0
  584. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/unlearning.py +0 -0
  585. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/unlearning_eval.py +0 -0
  586. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/unsloth.py +0 -0
  587. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/v028_features.py +0 -0
  588. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/vector_bank.py +0 -0
  589. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/vllm.py +0 -0
  590. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/vscode_setup.py +0 -0
  591. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/warmup.py +0 -0
  592. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/webhooks.py +0 -0
  593. {soup_cli-0.72.2 → soup_cli-0.72.4}/src/soup_cli/utils/why.py +0 -0
  594. {soup_cli-0.72.2 → soup_cli-0.72.4}/templates/chat.yaml +0 -0
  595. {soup_cli-0.72.2 → soup_cli-0.72.4}/templates/code.yaml +0 -0
  596. {soup_cli-0.72.2 → soup_cli-0.72.4}/templates/medical.yaml +0 -0
  597. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/__init__.py +0 -0
  598. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/conftest.py +0 -0
  599. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/qa/v053_qa.md +0 -0
  600. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/qa/v07114_qa.md +0 -0
  601. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/qa/v0716_qa.md +0 -0
  602. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_adapters.py +0 -0
  603. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_advanced_peft.py +0 -0
  604. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_assistant_mask.py +0 -0
  605. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_audio.py +0 -0
  606. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_auto_tuning.py +0 -0
  607. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_autopilot.py +0 -0
  608. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_awq_gptq_export.py +0 -0
  609. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_batch_probe.py +0 -0
  610. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_bco.py +0 -0
  611. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_bench.py +0 -0
  612. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_brain_rot_multilingual.py +0 -0
  613. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_bugfixes.py +0 -0
  614. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_build_dag.py +0 -0
  615. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_callback.py +0 -0
  616. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_cans.py +0 -0
  617. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_chat.py +0 -0
  618. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_chat_template.py +0 -0
  619. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_cli.py +0 -0
  620. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_cli_startup_is_light.py +0 -0
  621. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_cli_subprocess.py +0 -0
  622. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_code_review_critical.py +0 -0
  623. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_code_review_deferred.py +0 -0
  624. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_code_review_high.py +0 -0
  625. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_code_review_medium_low.py +0 -0
  626. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_code_review_recurring.py +0 -0
  627. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_config.py +0 -0
  628. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_cost.py +0 -0
  629. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_crash_reporter.py +0 -0
  630. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_curriculum.py +0 -0
  631. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_data.py +0 -0
  632. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_data_augment.py +0 -0
  633. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_data_sample.py +0 -0
  634. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_data_split.py +0 -0
  635. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_data_tools.py +0 -0
  636. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_dataset_hub.py +0 -0
  637. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_dataset_registry.py +0 -0
  638. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_deepspeed.py +0 -0
  639. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_deploy_ollama.py +0 -0
  640. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_diff.py +0 -0
  641. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_display.py +0 -0
  642. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_doctor.py +0 -0
  643. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_dpo_example.py +0 -0
  644. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_dpo_variants.py +0 -0
  645. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_embedding.py +0 -0
  646. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_errors.py +0 -0
  647. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_eval.py +0 -0
  648. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_eval_gate.py +0 -0
  649. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_eval_platform.py +0 -0
  650. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_export.py +0 -0
  651. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_formats.py +0 -0
  652. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_fp8_recipe.py +0 -0
  653. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_freeze_training.py +0 -0
  654. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_generate.py +0 -0
  655. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_gpu.py +0 -0
  656. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_grpo.py +0 -0
  657. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_hf_integration.py +0 -0
  658. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_infer.py +0 -0
  659. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_inference_advanced.py +0 -0
  660. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_init.py +0 -0
  661. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_ipo.py +0 -0
  662. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_issue300_online_dpo_train.py +0 -0
  663. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_issue302_vision_pad_token.py +0 -0
  664. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_issue305_mixed_rank_arithmetic.py +0 -0
  665. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_issue308_callback_subclass.py +0 -0
  666. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_jinja_analyzer.py +0 -0
  667. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_kto.py +0 -0
  668. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_loader.py +0 -0
  669. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_log_level.py +0 -0
  670. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_loss_watchdog.py +0 -0
  671. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_merge.py +0 -0
  672. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_migrate.py +0 -0
  673. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_mlx_backend.py +0 -0
  674. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_moe.py +0 -0
  675. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_multi_adapter.py +0 -0
  676. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_multi_gpu.py +0 -0
  677. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_multipack_config.py +0 -0
  678. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_multipack_invariants.py +0 -0
  679. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_multipack_sampler.py +0 -0
  680. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_neat_packing.py +0 -0
  681. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_neftune_rslora.py +0 -0
  682. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_onnx_tensorrt_export.py +0 -0
  683. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_orpo.py +0 -0
  684. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_packing.py +0 -0
  685. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_part_a_wave1.py +0 -0
  686. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_part_a_wave2.py +0 -0
  687. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_part_b.py +0 -0
  688. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_part_c.py +0 -0
  689. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_part_d.py +0 -0
  690. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_part_e.py +0 -0
  691. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_part_f_hardening.py +0 -0
  692. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_peft_methods.py +0 -0
  693. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_peft_patches.py +0 -0
  694. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_performance.py +0 -0
  695. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_pissa_init.py +0 -0
  696. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_ppo.py +0 -0
  697. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_preference_dispatcher.py +0 -0
  698. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_preference_multi.py +0 -0
  699. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_preference_multi_runtime.py +0 -0
  700. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_pretrain.py +0 -0
  701. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_profile.py +0 -0
  702. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_profiling.py +0 -0
  703. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_progress.py +0 -0
  704. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_push.py +0 -0
  705. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_qat.py +0 -0
  706. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_quality_filter.py +0 -0
  707. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_quant_check.py +0 -0
  708. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_quant_menu.py +0 -0
  709. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_quickstart.py +0 -0
  710. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_rank_pattern.py +0 -0
  711. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_recipes.py +0 -0
  712. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_recipes_v031.py +0 -0
  713. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_refusal_multilingual.py +0 -0
  714. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_registry.py +0 -0
  715. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_relora.py +0 -0
  716. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_replay.py +0 -0
  717. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_resume.py +0 -0
  718. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_review_fixes_v07133.py +0 -0
  719. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_rlvr.py +0 -0
  720. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_run_cost.py +0 -0
  721. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_runs.py +0 -0
  722. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_serve.py +0 -0
  723. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_server_generate.py +0 -0
  724. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_sglang_serve.py +0 -0
  725. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_simpo.py +0 -0
  726. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_smoke_train.py +0 -0
  727. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_speculative_decoding.py +0 -0
  728. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_sweep.py +0 -0
  729. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_synth_data_pro.py +0 -0
  730. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_templates_yaml.py +0 -0
  731. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_tensorboard.py +0 -0
  732. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_tool_calling.py +0 -0
  733. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_trace_to_pref.py +0 -0
  734. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_tracker.py +0 -0
  735. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_trainer_coverage_v035.py +0 -0
  736. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_trainer_init.py +0 -0
  737. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_training_intelligence.py +0 -0
  738. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_training_speed.py +0 -0
  739. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_trust_remote_code.py +0 -0
  740. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_tui.py +0 -0
  741. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_ui.py +0 -0
  742. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_ui_chat.py +0 -0
  743. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_ui_config_builder.py +0 -0
  744. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_ui_live_monitor.py +0 -0
  745. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_ui_metrics.py +0 -0
  746. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_unsloth.py +0 -0
  747. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0401_part_c.py +0 -0
  748. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0401_part_d.py +0 -0
  749. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0401_part_e.py +0 -0
  750. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0402_part_a.py +0 -0
  751. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0402_part_b.py +0 -0
  752. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0403_part_a.py +0 -0
  753. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0403_part_b.py +0 -0
  754. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0403_part_c.py +0 -0
  755. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0404_part_a.py +0 -0
  756. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0404_part_b.py +0 -0
  757. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0405_part_a.py +0 -0
  758. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0406_part_a.py +0 -0
  759. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0410_part_a.py +0 -0
  760. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0410_part_b.py +0 -0
  761. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0410_part_c.py +0 -0
  762. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0420.py +0 -0
  763. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0430_part_a.py +0 -0
  764. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0430_part_b.py +0 -0
  765. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0430_part_c.py +0 -0
  766. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0430_part_d.py +0 -0
  767. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0440_part_a.py +0 -0
  768. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0440_part_b.py +0 -0
  769. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0440_part_c.py +0 -0
  770. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0440_part_d.py +0 -0
  771. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0440_review_followups.py +0 -0
  772. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0450.py +0 -0
  773. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0460_part_a.py +0 -0
  774. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0460_part_b.py +0 -0
  775. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0470_part_a.py +0 -0
  776. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0470_part_b.py +0 -0
  777. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0480_part_a.py +0 -0
  778. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0480_part_b.py +0 -0
  779. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0490.py +0 -0
  780. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0500_part_a.py +0 -0
  781. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0500_part_b.py +0 -0
  782. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0500_part_c.py +0 -0
  783. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0500_part_d.py +0 -0
  784. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0500_part_e.py +0 -0
  785. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0510.py +0 -0
  786. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0520.py +0 -0
  787. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0530.py +0 -0
  788. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v05310.py +0 -0
  789. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v05311.py +0 -0
  790. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0531_109.py +0 -0
  791. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0531_139.py +0 -0
  792. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0531_142.py +0 -0
  793. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0531_82.py +0 -0
  794. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0532.py +0 -0
  795. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0533.py +0 -0
  796. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0534.py +0 -0
  797. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0535.py +0 -0
  798. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0536.py +0 -0
  799. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0537.py +0 -0
  800. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0538.py +0 -0
  801. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0539.py +0 -0
  802. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0540.py +0 -0
  803. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0550.py +0 -0
  804. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0550_followups.py +0 -0
  805. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0560.py +0 -0
  806. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0570_part_a.py +0 -0
  807. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0570_part_b.py +0 -0
  808. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0570_part_c.py +0 -0
  809. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0570_part_d.py +0 -0
  810. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0580.py +0 -0
  811. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0590.py +0 -0
  812. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0600_part_a.py +0 -0
  813. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0600_part_b.py +0 -0
  814. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0600_part_c.py +0 -0
  815. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0600_part_d.py +0 -0
  816. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0600_part_e.py +0 -0
  817. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0600_part_f.py +0 -0
  818. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0610_part_a.py +0 -0
  819. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0610_part_b.py +0 -0
  820. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0610_part_c.py +0 -0
  821. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0610_part_d.py +0 -0
  822. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0610_part_e.py +0 -0
  823. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0620_followups.py +0 -0
  824. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0620_part_a.py +0 -0
  825. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0620_part_b.py +0 -0
  826. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0620_part_c.py +0 -0
  827. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0620_part_d.py +0 -0
  828. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0620_part_e.py +0 -0
  829. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0630_followups.py +0 -0
  830. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0630_part_a.py +0 -0
  831. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0630_part_b.py +0 -0
  832. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0630_part_c.py +0 -0
  833. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0630_part_d.py +0 -0
  834. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0630_part_e.py +0 -0
  835. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0631_206.py +0 -0
  836. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0640_followups.py +0 -0
  837. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0640_part_a.py +0 -0
  838. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0640_part_b.py +0 -0
  839. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0640_part_c.py +0 -0
  840. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0640_part_d.py +0 -0
  841. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0640_part_e.py +0 -0
  842. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0640_part_f.py +0 -0
  843. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0650_followups.py +0 -0
  844. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0650_part_a.py +0 -0
  845. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0650_part_b.py +0 -0
  846. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0650_part_c.py +0 -0
  847. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0650_part_d.py +0 -0
  848. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0650_part_e.py +0 -0
  849. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0660_cli.py +0 -0
  850. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0660_followups.py +0 -0
  851. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0660_part_a.py +0 -0
  852. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0660_part_b.py +0 -0
  853. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0660_part_c.py +0 -0
  854. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0660_part_d.py +0 -0
  855. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0660_part_e.py +0 -0
  856. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0670_followups.py +0 -0
  857. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0670_part_a.py +0 -0
  858. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0670_part_b.py +0 -0
  859. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0670_part_c.py +0 -0
  860. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0670_part_d.py +0 -0
  861. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0670_part_e.py +0 -0
  862. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0670_part_f.py +0 -0
  863. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0680_followups.py +0 -0
  864. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0680_part_a.py +0 -0
  865. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0680_part_b.py +0 -0
  866. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0680_part_c.py +0 -0
  867. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0680_part_d.py +0 -0
  868. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0680_part_e.py +0 -0
  869. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0690_part_a.py +0 -0
  870. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0690_part_b.py +0 -0
  871. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0690_part_c.py +0 -0
  872. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0690_part_d.py +0 -0
  873. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0690_part_e.py +0 -0
  874. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0700_part_a.py +0 -0
  875. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0700_part_b.py +0 -0
  876. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0700_part_c.py +0 -0
  877. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0700_part_d.py +0 -0
  878. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0700_part_e.py +0 -0
  879. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0700_part_f.py +0 -0
  880. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07110.py +0 -0
  881. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07111.py +0 -0
  882. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07112.py +0 -0
  883. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07113.py +0 -0
  884. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07114.py +0 -0
  885. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07115.py +0 -0
  886. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07116.py +0 -0
  887. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07117.py +0 -0
  888. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07118.py +0 -0
  889. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07119.py +0 -0
  890. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0712.py +0 -0
  891. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07120.py +0 -0
  892. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07121.py +0 -0
  893. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07122.py +0 -0
  894. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07123.py +0 -0
  895. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07124.py +0 -0
  896. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07125.py +0 -0
  897. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07126.py +0 -0
  898. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07127.py +0 -0
  899. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07128.py +0 -0
  900. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07129.py +0 -0
  901. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0713.py +0 -0
  902. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07130.py +0 -0
  903. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07131.py +0 -0
  904. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07132.py +0 -0
  905. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07133.py +0 -0
  906. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07134.py +0 -0
  907. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07135.py +0 -0
  908. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07136.py +0 -0
  909. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07137.py +0 -0
  910. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07138.py +0 -0
  911. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07139.py +0 -0
  912. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0714.py +0 -0
  913. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07140.py +0 -0
  914. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v07141.py +0 -0
  915. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0715.py +0 -0
  916. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0716.py +0 -0
  917. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0717.py +0 -0
  918. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0718.py +0 -0
  919. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_v0719.py +0 -0
  920. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_validator.py +0 -0
  921. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_vision.py +0 -0
  922. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_vllm_serve.py +0 -0
  923. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_warmup.py +0 -0
  924. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_why.py +0 -0
  925. {soup_cli-0.72.2 → soup_cli-0.72.4}/tests/test_windows_encoding.py +0 -0
@@ -0,0 +1,5 @@
1
+ # Sponsor button shown in the repo sidebar and on every issue / PR.
2
+ #
3
+ # Renders only once the account is enrolled in GitHub Sponsors
4
+ # (https://github.com/sponsors). Until then the button stays hidden.
5
+ github: MakazhanAlpamys
@@ -12,6 +12,129 @@ reproducing 70+ versions of notes.
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
+ ## [0.72.4] - 2026-08-03
16
+
17
+ **Added — preference losses over layer streaming: DPO, ORPO, SimPO and KTO.**
18
+
19
+ Layer streaming kept the frozen base in CPU RAM and fed it to the GPU one decoder
20
+ layer at a time, but only for `task: sft`. This release opens it to the four
21
+ preference losses. The whole risk was one thing: **DPO needs a reference model, and a
22
+ second model instance would double memory and defeat the feature entirely.**
23
+
24
+ - **The reference is the same streamed base with its adapters disabled** — one set of
25
+ weights, one stream, no second pass. Measured on an RTX 3050 4 GB with a 730 MB
26
+ model: streamed DPO peaked at **0.914x** the SFT peak, with a byte-identical RAM
27
+ store and buffer pool. Forcing a real second instance in the same harness cost
28
+ **+730.44 MB against 730.44 MB of weights** — exactly one copy. That control is what
29
+ makes the first number mean something.
30
+ - **KTO is *not* reference-free**, contrary to how it is usually described: it selects
31
+ its reference exactly the way DPO does, so it gets the same treatment and the same
32
+ memory assertion. ORPO and SimPO genuinely are reference-free.
33
+ - **Bit-exact against a resident run of the same loss** — `0.0` difference for all
34
+ four, the standard every slot in this series inherits.
35
+ - **The pre-flight now knows that a paired loss is twice the rows.** DPO, ORPO and
36
+ SimPO concatenate chosen and rejected into one tensor, so a VRAM budget computed at
37
+ one row per example would have under-predicted by half — and on Windows the
38
+ consequence is not an error but a silent spill to host memory that makes the run an
39
+ order of magnitude slower.
40
+ - **KTO requires `batch_size >= 2`** (its KL term is degenerate at 1). Soup now says so
41
+ when your config is read, rather than minutes later after sharding the checkpoint.
42
+ KTO is streamable at all only because v0.72.3 lifted the batch-1 restriction.
43
+ - **`grpo` and `ppo` remain excluded permanently**, not "not yet": generation rollouts
44
+ re-read every layer once per generated token, which destroys the amortisation
45
+ streaming depends on. The refusal says so and deliberately names no release.
46
+
47
+ The streaming setup now lives in one shared place instead of being copied per trainer,
48
+ so the NF4 pre-flight, the RAM/disk tier choice and the VRAM fit refusal cannot drift
49
+ between SFT and the preference losses.
50
+
51
+ **Fixed — `trl` is now capped below 0.25, and that is a real bug fix, not a CI tweak.**
52
+ Six trainers (`bco`, `dpo`, `ipo`, `kto`, `orpo`, `simpo`) pass `max_prompt_length` to
53
+ their `trl` config, and `trl` removed it in stages: `bco` at 0.25, `kto`/`orpo`/`simpo`
54
+ at 0.26, `dpo`/`ipo` at 0.29 — which also deleted `ORPOConfig` and `CPOConfig`
55
+ outright. So anyone who ran `pip install 'soup-cli[train]'` and resolved to a recent
56
+ `trl` had `soup train --task orpo` fail on import.
57
+
58
+ That was already true before this release and nothing caught it: the `trl` imports
59
+ live inside `setup()`, which no test had ever called on those wrappers, so CI stayed
60
+ green while the code only worked on older `trl`. This release's end-to-end preference
61
+ tests are what surfaced it.
62
+
63
+ The boundary was read off the published wheels per config rather than inferred from a
64
+ version number — the removal being staged is exactly why a single spot-check gives the
65
+ wrong answer. Supporting the newer API is its own piece of work; declaring a dependency
66
+ the code actually works with comes first.
67
+
68
+ Honest costs: streaming makes the reference free in **memory**, not in **time** — DPO
69
+ traverses the layer stack three times per step against SFT's two, measured at **1.52x**
70
+ the layer reads. And the VRAM pre-flight is a sound *upper* bound for preference
71
+ losses rather than a tight estimate; see Known Limitations in the release notes.
72
+
73
+ ## [0.72.3] - 2026-07-28
74
+
75
+ **Added — layer streaming breadth: more architectures, bigger batches, resume, and a
76
+ disk tier.**
77
+
78
+ Layer streaming (v0.72.0–.2) was deliberately narrow: Llama/Qwen only, batch 1, no
79
+ gradient accumulation, no resume, RAM only. This release lifts all of it, and each
80
+ capability was gated against a streamed-vs-resident bit-exactness reference before any
81
+ of it was written.
82
+
83
+ - **Six more model families.** `mistral`, `gemma`, `gemma2`, `gemma3_text`, `phi` and
84
+ `phi3` join the allowlist, each verified **bit-exact** against the same checkpoint
85
+ loaded resident, under both bf16 and NF4. Phi-3 is the notable one: it fuses Q/K/V
86
+ into a single `qkv_proj`, so there is no `q_proj` to find, and it is bit-exact anyway.
87
+ Multimodal `gemma3` is deliberately *not* accepted — only `gemma3_text`.
88
+ - **`batch_size` above 1, and gradient accumulation.** Both previously refused.
89
+ - **A pre-flight VRAM budget that accounts for batch and vocabulary.** Streaming bounds
90
+ the *weights*; activations and the logits tensor are untouched by it and both scale
91
+ with `batch × seq`. On a 152k-vocab model at batch 8 the logits term alone measured
92
+ **8.71 GB — 146× the entire layer-buffer pool**. `soup train` now predicts peak VRAM
93
+ and refuses a run that will not fit, naming the two knobs that scale it.
94
+ - **A throughput forecast**, quoted as a range from a GEMM ceiling measured on your own
95
+ card in that session, alongside the SM clock — never a compiled-in per-card constant.
96
+ - **`--resume` and `--hf-resume` work with streaming.**
97
+ - **A disk overflow tier.** `stream_source: auto` (the default) uses RAM when the base
98
+ fits and falls back to an NVMe disk tier when it does not, holding nothing resident.
99
+ `stream_source: ram` refuses instead of falling back. Non-NVMe disks are still
100
+ refused outright.
101
+ - **`soup doctor --disk`** reports the detected media type.
102
+
103
+ **Fixed**
104
+
105
+ - `estimate_logits_bytes` charged 6 bytes per logit element; the measured peak is **14**
106
+ (`transformers` holds the bf16 logits, the fp32 upcast, log-softmax's fp32 output and
107
+ the fp32 gradient live at once). The old figure under-predicted that term by 2.33×.
108
+ - Adapters could not be loaded *into* a streamed model: `load_state_dict` narrows keys
109
+ by child name, so a canonical checkpoint matched **0 of N** tensors and PEFT reported
110
+ only a warning — a resumed run reproduced the from-scratch loss curve exactly. The
111
+ streaming layer now redirects canonical keys at load time, mirroring the v0.72.1
112
+ save-side fix.
113
+ - The NVMe-only tier guard was wired to a hardcoded constant and could never fire.
114
+ - Streaming weight sources are now released when training ends **or raises**; the disk
115
+ tier holds one open shard handle per decoder layer.
116
+ - Subprocess helpers resolve tools to absolute paths (on Windows, `CreateProcess`
117
+ searches the current directory before `PATH`).
118
+ - The `[mcp]` extra is now capped at `mcp<2`. The SDK's 2.0.0 release removed
119
+ `mcp.shared.memory.create_connected_server_and_client_session` and dropped
120
+ `Server.list_tools`, breaking `soup mcp serve`'s round-trip tests for anyone
121
+ installing fresh. Support for the 2.x API is tracked separately.
122
+
123
+ **Known limitations**
124
+
125
+ - The **RAM-vs-disk performance gap is unmeasured** on the development hardware and no
126
+ number is claimed for it. safetensors memory-maps the shards, so the OS page cache
127
+ keeps them resident between steps on a machine with spare RAM, and at ~5 effective
128
+ TFLOPS the NVMe read hides under compute. The disk tier's *correctness* is verified
129
+ bit-exact against the RAM tier; its speed relative to RAM is not characterised.
130
+ - End-to-end `soup train --resume` could not be demonstrated on the development box:
131
+ `transformers` refuses `torch.load` below torch 2.6 (CVE-2025-32434), which blocks
132
+ **every** resume there, streaming or not. The streaming-specific half — the adapter
133
+ round-trip and loss continuity — is verified on the production CUDA path.
134
+ - Loading *into* a streamed model works; `named_parameters()` and `state_dict()` still
135
+ disagree in memory, which is the deliberate cost of a serialisation-only design.
136
+ - Layer streaming remains **BETA**.
137
+
15
138
  ## [0.72.2] - 2026-07-28
16
139
 
17
140
  **Added — NF4 layer streaming: fine-tune Llama-3.1-8B on a 4 GB laptop GPU.**
@@ -36,7 +36,9 @@ This Code of Conduct applies within all community spaces, and also applies when
36
36
 
37
37
  ## Enforcement
38
38
 
39
- Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the project maintainer at **vpn.alpamys@gmail.com**. All complaints will be reviewed and investigated promptly and fairly.
39
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the project maintainer at **team@trysoup.dev** (the project address) or **makazanalpamys@gmail.com** (the maintainer's personal address). All complaints will be reviewed and investigated promptly and fairly.
40
+
41
+ This Code of Conduct applies in every project space, including the [Discord server](https://discord.gg/8RgVbFA6Zq).
40
42
 
41
43
  All community leaders are obligated to respect the privacy and security of the reporter of any incident.
42
44
 
@@ -120,7 +120,7 @@ src/soup_cli/
120
120
  templates/ - 21 built-in soup.yaml templates (YAML + manifest.json) with load_template loader (v0.39.0, +bco v0.40.0, +4 compliance v0.71.35)
121
121
  ui/ - Web UI (FastAPI + HTML/JS SPA)
122
122
 
123
- tests/ - Test suite (326 files, 16840 tests)
123
+ tests/ - Test suite (332 files, 17051 tests)
124
124
  examples/ - Real-world config examples and datasets
125
125
  ```
126
126
 
@@ -459,8 +459,10 @@ If you contributed and aren't credited somewhere, that's a bug — open a PR or
459
459
 
460
460
  - **Issues:** Report bugs and request features on [GitHub Issues](https://github.com/MakazhanAlpamys/Soup/issues)
461
461
  - **Discussions:** Ask questions on [GitHub Discussions](https://github.com/MakazhanAlpamys/Soup/discussions)
462
- - **Code of Conduct:** Please read [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)
463
- - **Security:** Report security issues via [SECURITY.md](SECURITY.md)
462
+ - **Discord:** Chat with maintainers and other users on [Discord](https://discord.gg/8RgVbFA6Zq) — good for
463
+ quick questions and pairing on a PR; anything worth finding later still belongs in Issues or Discussions
464
+ - **Code of Conduct:** Please read [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) — it applies on Discord too
465
+ - **Security:** Report security issues via [SECURITY.md](SECURITY.md) — privately, never in Discord
464
466
 
465
467
  ## Questions?
466
468
 
@@ -1,11 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: soup-cli
3
- Version: 0.72.2
3
+ Version: 0.72.4
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
7
7
  Project-URL: Issues, https://github.com/MakazhanAlpamys/Soup/issues
8
- Author: Soup Team
8
+ Project-URL: Discord, https://discord.gg/8RgVbFA6Zq
9
+ Author-email: Soup Team <team@trysoup.dev>
9
10
  License-Expression: Apache-2.0
10
11
  License-File: LICENSE
11
12
  License-File: NOTICE
@@ -29,11 +30,11 @@ Requires-Dist: bitsandbytes>=0.41.0; extra == 'all'
29
30
  Requires-Dist: datasets>=2.14.0; extra == 'all'
30
31
  Requires-Dist: datasketch>=1.6.0; extra == 'all'
31
32
  Requires-Dist: fastapi>=0.104.0; extra == 'all'
32
- Requires-Dist: mcp>=1.2.0; extra == 'all'
33
+ Requires-Dist: mcp<2,>=1.2.0; extra == 'all'
33
34
  Requires-Dist: peft>=0.7.0; extra == 'all'
34
35
  Requires-Dist: torch>=2.0.0; extra == 'all'
35
36
  Requires-Dist: transformers<5.0.0,>=4.36.0; extra == 'all'
36
- Requires-Dist: trl>=0.7.0; extra == 'all'
37
+ Requires-Dist: trl<0.25,>=0.7.0; extra == 'all'
37
38
  Requires-Dist: uvicorn>=0.24.0; extra == 'all'
38
39
  Provides-Extra: audio
39
40
  Requires-Dist: librosa>=0.10.0; extra == 'audio'
@@ -61,7 +62,7 @@ Requires-Dist: bitsandbytes>=0.41.0; extra == 'dev'
61
62
  Requires-Dist: cryptography>=41.0.0; extra == 'dev'
62
63
  Requires-Dist: datasets>=2.14.0; extra == 'dev'
63
64
  Requires-Dist: httpx>=0.24.0; extra == 'dev'
64
- Requires-Dist: mcp>=1.2.0; extra == 'dev'
65
+ Requires-Dist: mcp<2,>=1.2.0; extra == 'dev'
65
66
  Requires-Dist: mypy>=1.8.0; extra == 'dev'
66
67
  Requires-Dist: peft>=0.7.0; extra == 'dev'
67
68
  Requires-Dist: pre-commit>=3.5.0; extra == 'dev'
@@ -71,7 +72,7 @@ Requires-Dist: reportlab>=4.0.0; extra == 'dev'
71
72
  Requires-Dist: ruff>=0.1.0; extra == 'dev'
72
73
  Requires-Dist: torch>=2.0.0; extra == 'dev'
73
74
  Requires-Dist: transformers<5.0.0,>=4.36.0; extra == 'dev'
74
- Requires-Dist: trl>=0.7.0; extra == 'dev'
75
+ Requires-Dist: trl<0.25,>=0.7.0; extra == 'dev'
75
76
  Provides-Extra: eval
76
77
  Requires-Dist: lm-eval>=0.4.0; extra == 'eval'
77
78
  Provides-Extra: fast
@@ -83,7 +84,7 @@ Requires-Dist: auto-gptq>=0.7.0; extra == 'gptq'
83
84
  Provides-Extra: liger
84
85
  Requires-Dist: liger-kernel>=0.3.0; extra == 'liger'
85
86
  Provides-Extra: mcp
86
- Requires-Dist: mcp>=1.2.0; extra == 'mcp'
87
+ Requires-Dist: mcp<2,>=1.2.0; extra == 'mcp'
87
88
  Provides-Extra: mix
88
89
  Requires-Dist: scikit-optimize>=0.9.0; extra == 'mix'
89
90
  Provides-Extra: mlx
@@ -130,7 +131,7 @@ Requires-Dist: datasets>=2.14.0; extra == 'train'
130
131
  Requires-Dist: peft>=0.7.0; extra == 'train'
131
132
  Requires-Dist: torch>=2.0.0; extra == 'train'
132
133
  Requires-Dist: transformers<5.0.0,>=4.36.0; extra == 'train'
133
- Requires-Dist: trl>=0.7.0; extra == 'train'
134
+ Requires-Dist: trl<0.25,>=0.7.0; extra == 'train'
134
135
  Provides-Extra: tui
135
136
  Requires-Dist: textual>=0.50.0; extra == 'tui'
136
137
  Provides-Extra: ui
@@ -158,7 +159,8 @@ Description-Content-Type: text/markdown
158
159
  <a href="#configuration">Config</a> &middot;
159
160
  <a href="#documentation">Docs</a> &middot;
160
161
  <a href="docs/commands.md">Commands</a> &middot;
161
- <a href="docs/models.md">Models</a>
162
+ <a href="docs/models.md">Models</a> &middot;
163
+ <a href="https://discord.gg/8RgVbFA6Zq">Discord</a>
162
164
  </p>
163
165
 
164
166
  <p align="center">
@@ -169,6 +171,8 @@ Description-Content-Type: text/markdown
169
171
  <a href="https://github.com/MakazhanAlpamys/Soup/actions"><img src="https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/MakazhanAlpamys/65fdc943f85f3b2c46ecddb415c2b779/raw/soup_tests.json" alt="Tests"></a>
170
172
  <a href="https://github.com/MakazhanAlpamys/Soup/actions"><img src="https://github.com/MakazhanAlpamys/Soup/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
171
173
  <a href="https://trysoup.dev"><img src="https://img.shields.io/badge/website-trysoup.dev-blue" alt="Website"></a>
174
+ <a href="https://discord.gg/8RgVbFA6Zq"><img src="https://img.shields.io/badge/Discord-join-5865F2?logo=discord&logoColor=white" alt="Discord"></a>
175
+ <a href="https://doi.org/10.5281/zenodo.21771064"><img src="https://zenodo.org/badge/DOI/10.5281/zenodo.21771064.svg" alt="DOI"></a>
172
176
  </p>
173
177
 
174
178
  ---
@@ -193,31 +197,36 @@ infrastructure instead of improving models. Soup fixes that.
193
197
 
194
198
  ## What's New
195
199
 
196
- **v0.72.2 — NF4 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.
200
+ **v0.72.4 — align on a laptop: DPO, ORPO, SimPO and KTO over layer streaming.** Layer
201
+ streaming keeps the frozen base out of VRAM and feeds it to the GPU one decoder layer at
202
+ a time. It used to support supervised fine-tuning only; now it runs the preference
203
+ losses too.
204
+
205
+ - **DPO's reference model is free.** DPO needs a reference to compare against, and a
206
+ second copy of the model would double memory and defeat the whole point. Soup uses
207
+ *the same streamed base with its adapters switched off* — one set of weights, one
208
+ stream. Measured on an RTX 3050 4 GB: streamed DPO peaked at **0.914×** the
209
+ supervised-fine-tuning peak. Forcing a real second model in the same test cost
210
+ **+730 MB — exactly one copy of the weights.**
211
+ - **KTO is not reference-free**, however it is usually described: it picks its reference
212
+ the same way DPO does, so it gets the same treatment. ORPO and SimPO genuinely are.
213
+ - **Bit-exact against a normal, non-streamed run** of the same loss — `0.0` difference,
214
+ the bar every release in this series has to clear.
215
+ - **The VRAM pre-flight knows a paired loss is twice the rows**, because chosen and
216
+ rejected go through the model as one tensor.
217
+ - **Honest cost:** the reference is free in *memory*, not in *time* — DPO reads the
218
+ layer stack **1.52×** as often per step as supervised fine-tuning does.
219
+ - `grpo` / `ppo` stay excluded on purpose: generation re-reads every layer per token,
220
+ which is exactly what streaming cannot amortise.
221
+ - Still BETA.
214
222
 
215
223
  ```yaml
216
224
  # soup.yaml — then just `soup train --config soup.yaml`
217
225
  training:
218
- stream_layers: true # base streams from RAM; only the adapter trains
226
+ stream_layers: true # base streams out of VRAM; only the adapter trains
219
227
  quantization: 4bit # NF4 — ~4x smaller store, so 8B fits a 4 GB card
220
- batch_size: 1
228
+ batch_size: 4 # v0.72.3: bigger batches amortise the weight read
229
+ stream_source: auto # RAM when it fits, NVMe disk when it does not
221
230
  ```
222
231
 
223
232
  > **Trained with `stream_layers: true` on v0.72.0?** That adapter is inert — its tensors were
@@ -499,17 +508,15 @@ single 4 GB laptop, which is why every performance number in these docs is measu
499
508
  claimed.
500
509
 
501
510
  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:
511
+ helps most, and it costs nothing.
503
512
 
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
513
+ The next most useful thing is **hardware**. Multi-GPU, 8B+ validation, and Apple Silicon are
514
+ the parts a single 4 GB laptop cannot reach, so they ship behind honest "requires <hardware>"
515
+ gates instead of unverified claims. If you have access to a bigger box — or GPU credits going
516
+ unused — running one of the
511
517
  [`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.
518
+ issues and posting the numbers moves Soup further than anything else. Those issues say exactly
519
+ what is blocked on hardware today.
513
520
 
514
521
  ## Contributors
515
522
 
@@ -518,6 +525,47 @@ Built by the community ❤️ — thank you to everyone who has contributed. See
518
525
 
519
526
  [![Contributors](https://contrib.rocks/image?repo=MakazhanAlpamys/Soup)](https://github.com/MakazhanAlpamys/Soup/graphs/contributors)
520
527
 
528
+ ## Contact
529
+
530
+ Bugs and feature requests belong in the
531
+ [issue tracker](https://github.com/MakazhanAlpamys/Soup/issues), questions in
532
+ [Discussions](https://github.com/MakazhanAlpamys/Soup/discussions) — both get answered faster
533
+ and help the next person with the same problem.
534
+
535
+ For live chat, setup help, and everything that reads better as a conversation, join the
536
+ [Discord](https://discord.gg/8RgVbFA6Zq). Anything that should still be findable in six months
537
+ belongs in Issues or Discussions — a Discord answer helps one person, an issue helps everyone
538
+ who hits the same thing. The [Code of Conduct](CODE_OF_CONDUCT.md) applies there too.
539
+
540
+ For anything that does not fit in public — security reports (see [SECURITY.md](SECURITY.md)),
541
+ Code of Conduct matters, or press — email **team@trysoup.dev**. That is the project address
542
+ and the right one for anything Soup-related. **makazanalpamys@gmail.com** is the maintainer's
543
+ personal address; it reaches the same person and is a fine fallback.
544
+
545
+ ## Citing Soup
546
+
547
+ Layer streaming — training an 8B model on a 4 GB laptop GPU by streaming the frozen base from
548
+ host RAM one decoder layer at a time — is described in a preprint, together with the correctness
549
+ protocol that verifies a streamed run is bit-exact against a resident one:
550
+
551
+ > Makazhan, A. (2026). *Exact Layer Streaming: LoRA Fine-Tuning of an 8B Model on a 4 GB Laptop
552
+ > GPU.* Zenodo. https://doi.org/10.5281/zenodo.21771064
553
+
554
+ The measurement records behind every number in it are in [`benchmarks/`](benchmarks/), published
555
+ as written — including the failures, the assumptions that turned out wrong, and the numbers that
556
+ were measured and then discarded.
557
+
558
+ ```bibtex
559
+ @misc{makazhan2026exact,
560
+ title = {Exact Layer Streaming: LoRA Fine-Tuning of an 8B Model on a 4 GB Laptop GPU},
561
+ author = {Makazhan, Alpamys},
562
+ year = {2026},
563
+ publisher = {Zenodo},
564
+ doi = {10.5281/zenodo.21771064},
565
+ url = {https://doi.org/10.5281/zenodo.21771064}
566
+ }
567
+ ```
568
+
521
569
  ## License
522
570
 
523
571
  [Apache-2.0](LICENSE). Copyright © the Soup contributors.
@@ -14,7 +14,8 @@
14
14
  <a href="#configuration">Config</a> &middot;
15
15
  <a href="#documentation">Docs</a> &middot;
16
16
  <a href="docs/commands.md">Commands</a> &middot;
17
- <a href="docs/models.md">Models</a>
17
+ <a href="docs/models.md">Models</a> &middot;
18
+ <a href="https://discord.gg/8RgVbFA6Zq">Discord</a>
18
19
  </p>
19
20
 
20
21
  <p align="center">
@@ -25,6 +26,8 @@
25
26
  <a href="https://github.com/MakazhanAlpamys/Soup/actions"><img src="https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/MakazhanAlpamys/65fdc943f85f3b2c46ecddb415c2b779/raw/soup_tests.json" alt="Tests"></a>
26
27
  <a href="https://github.com/MakazhanAlpamys/Soup/actions"><img src="https://github.com/MakazhanAlpamys/Soup/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
27
28
  <a href="https://trysoup.dev"><img src="https://img.shields.io/badge/website-trysoup.dev-blue" alt="Website"></a>
29
+ <a href="https://discord.gg/8RgVbFA6Zq"><img src="https://img.shields.io/badge/Discord-join-5865F2?logo=discord&logoColor=white" alt="Discord"></a>
30
+ <a href="https://doi.org/10.5281/zenodo.21771064"><img src="https://zenodo.org/badge/DOI/10.5281/zenodo.21771064.svg" alt="DOI"></a>
28
31
  </p>
29
32
 
30
33
  ---
@@ -49,31 +52,36 @@ infrastructure instead of improving models. Soup fixes that.
49
52
 
50
53
  ## What's New
51
54
 
52
- **v0.72.2 — NF4 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.
55
+ **v0.72.4 — align on a laptop: DPO, ORPO, SimPO and KTO over layer streaming.** Layer
56
+ streaming keeps the frozen base out of VRAM and feeds it to the GPU one decoder layer at
57
+ a time. It used to support supervised fine-tuning only; now it runs the preference
58
+ losses too.
59
+
60
+ - **DPO's reference model is free.** DPO needs a reference to compare against, and a
61
+ second copy of the model would double memory and defeat the whole point. Soup uses
62
+ *the same streamed base with its adapters switched off* — one set of weights, one
63
+ stream. Measured on an RTX 3050 4 GB: streamed DPO peaked at **0.914×** the
64
+ supervised-fine-tuning peak. Forcing a real second model in the same test cost
65
+ **+730 MB — exactly one copy of the weights.**
66
+ - **KTO is not reference-free**, however it is usually described: it picks its reference
67
+ the same way DPO does, so it gets the same treatment. ORPO and SimPO genuinely are.
68
+ - **Bit-exact against a normal, non-streamed run** of the same loss — `0.0` difference,
69
+ the bar every release in this series has to clear.
70
+ - **The VRAM pre-flight knows a paired loss is twice the rows**, because chosen and
71
+ rejected go through the model as one tensor.
72
+ - **Honest cost:** the reference is free in *memory*, not in *time* — DPO reads the
73
+ layer stack **1.52×** as often per step as supervised fine-tuning does.
74
+ - `grpo` / `ppo` stay excluded on purpose: generation re-reads every layer per token,
75
+ which is exactly what streaming cannot amortise.
76
+ - Still BETA.
70
77
 
71
78
  ```yaml
72
79
  # soup.yaml — then just `soup train --config soup.yaml`
73
80
  training:
74
- stream_layers: true # base streams from RAM; only the adapter trains
81
+ stream_layers: true # base streams out of VRAM; only the adapter trains
75
82
  quantization: 4bit # NF4 — ~4x smaller store, so 8B fits a 4 GB card
76
- batch_size: 1
83
+ batch_size: 4 # v0.72.3: bigger batches amortise the weight read
84
+ stream_source: auto # RAM when it fits, NVMe disk when it does not
77
85
  ```
78
86
 
79
87
  > **Trained with `stream_layers: true` on v0.72.0?** That adapter is inert — its tensors were
@@ -355,17 +363,15 @@ single 4 GB laptop, which is why every performance number in these docs is measu
355
363
  claimed.
356
364
 
357
365
  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:
366
+ helps most, and it costs nothing.
359
367
 
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
368
+ The next most useful thing is **hardware**. Multi-GPU, 8B+ validation, and Apple Silicon are
369
+ the parts a single 4 GB laptop cannot reach, so they ship behind honest "requires <hardware>"
370
+ gates instead of unverified claims. If you have access to a bigger box — or GPU credits going
371
+ unused — running one of the
367
372
  [`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.
373
+ issues and posting the numbers moves Soup further than anything else. Those issues say exactly
374
+ what is blocked on hardware today.
369
375
 
370
376
  ## Contributors
371
377
 
@@ -374,6 +380,47 @@ Built by the community ❤️ — thank you to everyone who has contributed. See
374
380
 
375
381
  [![Contributors](https://contrib.rocks/image?repo=MakazhanAlpamys/Soup)](https://github.com/MakazhanAlpamys/Soup/graphs/contributors)
376
382
 
383
+ ## Contact
384
+
385
+ Bugs and feature requests belong in the
386
+ [issue tracker](https://github.com/MakazhanAlpamys/Soup/issues), questions in
387
+ [Discussions](https://github.com/MakazhanAlpamys/Soup/discussions) — both get answered faster
388
+ and help the next person with the same problem.
389
+
390
+ For live chat, setup help, and everything that reads better as a conversation, join the
391
+ [Discord](https://discord.gg/8RgVbFA6Zq). Anything that should still be findable in six months
392
+ belongs in Issues or Discussions — a Discord answer helps one person, an issue helps everyone
393
+ who hits the same thing. The [Code of Conduct](CODE_OF_CONDUCT.md) applies there too.
394
+
395
+ For anything that does not fit in public — security reports (see [SECURITY.md](SECURITY.md)),
396
+ Code of Conduct matters, or press — email **team@trysoup.dev**. That is the project address
397
+ and the right one for anything Soup-related. **makazanalpamys@gmail.com** is the maintainer's
398
+ personal address; it reaches the same person and is a fine fallback.
399
+
400
+ ## Citing Soup
401
+
402
+ Layer streaming — training an 8B model on a 4 GB laptop GPU by streaming the frozen base from
403
+ host RAM one decoder layer at a time — is described in a preprint, together with the correctness
404
+ protocol that verifies a streamed run is bit-exact against a resident one:
405
+
406
+ > Makazhan, A. (2026). *Exact Layer Streaming: LoRA Fine-Tuning of an 8B Model on a 4 GB Laptop
407
+ > GPU.* Zenodo. https://doi.org/10.5281/zenodo.21771064
408
+
409
+ The measurement records behind every number in it are in [`benchmarks/`](benchmarks/), published
410
+ as written — including the failures, the assumptions that turned out wrong, and the numbers that
411
+ were measured and then discarded.
412
+
413
+ ```bibtex
414
+ @misc{makazhan2026exact,
415
+ title = {Exact Layer Streaming: LoRA Fine-Tuning of an 8B Model on a 4 GB Laptop GPU},
416
+ author = {Makazhan, Alpamys},
417
+ year = {2026},
418
+ publisher = {Zenodo},
419
+ doi = {10.5281/zenodo.21771064},
420
+ url = {https://doi.org/10.5281/zenodo.21771064}
421
+ }
422
+ ```
423
+
377
424
  ## License
378
425
 
379
426
  [Apache-2.0](LICENSE). Copyright © the Soup contributors.
@@ -17,6 +17,9 @@ for anything security-sensitive.
17
17
 
18
18
  - Preferred: open a private report via
19
19
  [GitHub Security Advisories](https://github.com/MakazhanAlpamys/Soup/security/advisories/new).
20
+ - If you cannot use GitHub, email **team@trysoup.dev** (the project address), or
21
+ **makazanalpamys@gmail.com** (the maintainer's personal address) if that bounces.
22
+ Please do not report security issues in Discord — it is a public channel.
20
23
 
21
24
  We aim to acknowledge reports within 5 business days and to ship a fix or
22
25
  mitigation for confirmed, in-scope issues as promptly as is practical. When
@@ -0,0 +1,57 @@
1
+ # Measurement records
2
+
3
+ Raw gate records for Soup's layer-streaming feature, published as written.
4
+
5
+ These are not a report assembled after the fact. They are the working records
6
+ kept while each item was built and verified, so they contain the failures, the
7
+ assumptions that turned out wrong, and the numbers that were measured and then
8
+ discarded — in the order those things happened.
9
+
10
+ They are the evidence behind the preprint:
11
+
12
+ > Makazhan, A. (2026). *Exact Layer Streaming: LoRA Fine-Tuning of an 8B Model
13
+ > on a 4 GB Laptop GPU.* Zenodo.
14
+ > [10.5281/zenodo.21771064](https://doi.org/10.5281/zenodo.21771064)
15
+
16
+ | File | What it gates | Headline |
17
+ |---|---|---|
18
+ | [`gate-v0.72.0-layer-streaming.md`](gate-v0.72.0-layer-streaming.md) | The streaming path itself | Bit-exactness vs a resident reference; 3B bf16 trained on a 4 GB card |
19
+ | [`gate-v0.72.2-nf4.md`](gate-v0.72.2-nf4.md) | NF4 quantised streaming | Llama-3.1-8B at 119.6 tok/s in a 3.32 GB peak |
20
+ | [`gate-v0.72.3-breadth.md`](gate-v0.72.3-breadth.md) | Nine architectures, batching, accumulation, resume, disk tier | Peak-VRAM predictor at 0.85% worst-case error; accumulation is per-token I/O-neutral |
21
+ | [`gate-v0.72.4-preference-losses.md`](gate-v0.72.4-preference-losses.md) | DPO / ORPO / SimPO / KTO over the streaming engine | DPO's reference model costs no extra weights — 0.914x the SFT peak, against +730.44 MB for a real second instance |
22
+
23
+ ## Hardware
24
+
25
+ Every number was measured on one machine:
26
+
27
+ - **GPU** — RTX 3050 Laptop, 4 GB (4.29 GB usable)
28
+ - **Host** — 16.9 GB RAM, NVMe
29
+ - **OS** — Windows 11
30
+
31
+ Windows/WDDM matters for reading these: it spills into shared host memory rather
32
+ than raising `CUDA out of memory`, so a run completing is not evidence that its
33
+ configuration fits. That is why peak VRAM is reported alongside every throughput
34
+ figure, and why the fit decision refuses rather than warns.
35
+
36
+ ## Reading the numbers
37
+
38
+ - **Throughput is quoted with the SM clock it was taken at.** This card's boost
39
+ clock varies about 13% between sessions, so a fraction-of-ceiling stated
40
+ without its clock is not meaningful. Where a GEMM ceiling is compared against,
41
+ it was measured in the same session.
42
+ - **The correctness reference always matches the numerics under test** — a
43
+ streamed NF4 run is compared against a *resident NF4* run, never against
44
+ resident bf16, which would hide a real defect inside quantisation error.
45
+ - **Derived figures are labelled as arithmetic.** Where a line says "1M tokens =
46
+ 2.3 h", that is division, not a measured wall-clock run.
47
+
48
+ ## Reproducing
49
+
50
+ The implementation ships in Soup under Apache-2.0. Reproduction commands are in
51
+ Appendix A of the paper; the correctness protocol runs as part of the project's
52
+ test suite, so a regression in bit-exactness fails CI rather than reaching a
53
+ user.
54
+
55
+ ```bash
56
+ pip install 'soup-cli[train]'
57
+ ```