freesolo-flash-dev 1.2.97__tar.gz → 1.2.100__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 (613) hide show
  1. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/PKG-INFO +1 -1
  2. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/commands/train_cost.py +18 -9
  3. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/plan/kv_sizing.py +31 -5
  4. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/plan/vram.py +41 -14
  5. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/opd_train_runner.py +1 -0
  6. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/opd/overrides.py +10 -0
  7. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/rl/verl_config.py +15 -5
  8. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/verl/capabilities.py +39 -0
  9. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/schema/__init__.py +38 -7
  10. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/pyproject.toml +2 -2
  11. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_backend_common.py +38 -0
  12. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_cli_estimate.py +119 -3
  13. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_kv_util.py +108 -4
  14. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_lora_rank_preflight.py +28 -3
  15. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_opd_train.py +25 -1
  16. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_rl_train.py +112 -1
  17. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_spec_and_validation.py +96 -0
  18. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_vram_architecture.py +39 -0
  19. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/uv.lock +1 -1
  20. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/.dockerignore +0 -0
  21. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/.env.example +0 -0
  22. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/.github/CODEOWNERS +0 -0
  23. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  24. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  25. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  26. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  27. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/.github/dependabot.yml +0 -0
  28. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/.github/workflows/auto-rebake.yml +0 -0
  29. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/.github/workflows/bake-kernel-cache.yml +0 -0
  30. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/.github/workflows/ci.yml +0 -0
  31. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/.github/workflows/dev-kernel-cache.yml +0 -0
  32. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/.github/workflows/main-source-guard.yml +0 -0
  33. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/.github/workflows/notify-tests-repo.yml +0 -0
  34. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/.github/workflows/production-kernel-cache-ready.yml +0 -0
  35. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/.github/workflows/publish-dev.yml +0 -0
  36. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/.github/workflows/publish-image.yml +0 -0
  37. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/.github/workflows/publish.yml +0 -0
  38. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/.github/workflows/version-parity.yml +0 -0
  39. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/.github/workflows/worker-image.yml +0 -0
  40. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/.gitignore +0 -0
  41. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/CHANGELOG.md +0 -0
  42. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/CODE_OF_CONDUCT.md +0 -0
  43. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/CONTRIBUTING.md +0 -0
  44. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/Dockerfile +0 -0
  45. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/Dockerfile.worker +0 -0
  46. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/LICENSE +0 -0
  47. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/NOTICE +0 -0
  48. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/README.md +0 -0
  49. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/SECURITY.md +0 -0
  50. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/SELF_HOSTING.md +0 -0
  51. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/build/kernel_cache/.gitignore +0 -0
  52. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/build/kernel_cache/.keep +0 -0
  53. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/deploy/infisical/README.md +0 -0
  54. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/deploy/infisical/entrypoint.sh +0 -0
  55. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/docker/Dockerfile.kernelcache +0 -0
  56. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/docker/Dockerfile.kernelcache.relayer +0 -0
  57. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/docker/bake_kernel_cache.py +0 -0
  58. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/docker/bake_pod_entry.py +0 -0
  59. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/docker/extract_cudart_fix.py +0 -0
  60. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/docker/kernel_fingerprint.py +0 -0
  61. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/docker/make_rp_handler.py +0 -0
  62. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/__init__.py +0 -0
  63. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/_internal/__init__.py +0 -0
  64. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/_internal/channel.py +0 -0
  65. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/_internal/diagnostics.py +0 -0
  66. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/_internal/fileio.py +0 -0
  67. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/_internal/logging.py +0 -0
  68. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/_internal/paths.py +0 -0
  69. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/adapters/__init__.py +0 -0
  70. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/adapters/artifacts.py +0 -0
  71. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/adapters/fused_experts.py +0 -0
  72. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/adapters/lora_rank.py +0 -0
  73. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/adapters/targets.py +0 -0
  74. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/__init__.py +0 -0
  75. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/__main__.py +0 -0
  76. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/commands/__init__.py +0 -0
  77. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/commands/deploy.py +0 -0
  78. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/commands/env/__init__.py +0 -0
  79. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/commands/env/episode.py +0 -0
  80. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/commands/env/eval.py +0 -0
  81. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/commands/env/eval_args.py +0 -0
  82. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/commands/env/imports.py +0 -0
  83. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/commands/env/list.py +0 -0
  84. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/commands/env/push.py +0 -0
  85. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/commands/env/retained.py +0 -0
  86. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/commands/env/setup.py +0 -0
  87. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/commands/env/setup_wandb.py +0 -0
  88. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/commands/env/test.py +0 -0
  89. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/commands/env/test_evaluations.py +0 -0
  90. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/commands/env/test_params.py +0 -0
  91. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/commands/env/test_warnings.py +0 -0
  92. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/commands/prompt_budget.py +0 -0
  93. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/commands/traces.py +0 -0
  94. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/commands/worker_output.py +0 -0
  95. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/errors.py +0 -0
  96. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/scaffold/TRAINING.md +0 -0
  97. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/scaffold/__init__.py +0 -0
  98. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/ui/__init__.py +0 -0
  99. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/ui/cost.py +0 -0
  100. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/ui/env_panels.py +0 -0
  101. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/ui/heartbeat.py +0 -0
  102. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/ui/render.py +0 -0
  103. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/ui/tables.py +0 -0
  104. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cli/ui/tty.py +0 -0
  105. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/client/__init__.py +0 -0
  106. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/client/config.py +0 -0
  107. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/client/freesolo_api.py +0 -0
  108. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/client/http.py +0 -0
  109. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/client/runtime_secrets.py +0 -0
  110. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/client/shapes.py +0 -0
  111. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/client/specs.py +0 -0
  112. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/client/streaming.py +0 -0
  113. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/content/__init__.py +0 -0
  114. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/content/image_descriptors.py +0 -0
  115. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/content/multimodal.py +0 -0
  116. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/content/structured_outputs.py +0 -0
  117. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/content/thinking.py +0 -0
  118. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/core/__init__.py +0 -0
  119. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/core/catalog.py +0 -0
  120. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/core/grpo.py +0 -0
  121. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/core/spec.py +0 -0
  122. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/core/spec_persistence.py +0 -0
  123. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cost/__init__.py +0 -0
  124. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cost/analytical.py +0 -0
  125. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cost/facts.py +0 -0
  126. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cost/spec.py +0 -0
  127. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/cost/types.py +0 -0
  128. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/__init__.py +0 -0
  129. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/huggingface.py +0 -0
  130. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/plan/__init__.py +0 -0
  131. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/plan/model_config_probe.py +0 -0
  132. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/plan/prompt_budget.py +0 -0
  133. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/plan/recipe.py +0 -0
  134. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/plan/steps.py +0 -0
  135. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/profiling/__init__.py +0 -0
  136. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/profiling/dataset_profile.py +0 -0
  137. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/profiling/image_tokens.py +0 -0
  138. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/profiling/reasoning_render.py +0 -0
  139. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/profiling/sft_image_rows.py +0 -0
  140. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/profiling/sft_workload.py +0 -0
  141. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/profiling/tokenizer.py +0 -0
  142. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/profiling/workload_profile.py +0 -0
  143. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/result/__init__.py +0 -0
  144. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/result/accounting.py +0 -0
  145. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/result/rollout_samples.py +0 -0
  146. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/__init__.py +0 -0
  147. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/__main__.py +0 -0
  148. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/backend_common.py +0 -0
  149. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/entry/__init__.py +0 -0
  150. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/entry/opd.py +0 -0
  151. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/entry/rl.py +0 -0
  152. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/entry/sft.py +0 -0
  153. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/io/__init__.py +0 -0
  154. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/io/heartbeat.py +0 -0
  155. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/io/hf.py +0 -0
  156. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/io/prefetch.py +0 -0
  157. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/io/wandb_log.py +0 -0
  158. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/model/__init__.py +0 -0
  159. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/model/adapter.py +0 -0
  160. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/model/chatml_mask.py +0 -0
  161. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/model/decoding.py +0 -0
  162. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/model/lora.py +0 -0
  163. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/model/packing.py +0 -0
  164. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/opd_train.py +0 -0
  165. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/perf/__init__.py +0 -0
  166. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/perf/diagnostics.py +0 -0
  167. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/perf/lifecycle.py +0 -0
  168. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/perf/liger.py +0 -0
  169. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/perf/memory.py +0 -0
  170. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/rl_train.py +0 -0
  171. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/rl_train_runner.py +0 -0
  172. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/runtime/__init__.py +0 -0
  173. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
  174. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
  175. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/runtime/rng.py +0 -0
  176. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/score_batcher.py +0 -0
  177. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/sft_train.py +0 -0
  178. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/sft_train_runner.py +0 -0
  179. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/teacher/__init__.py +0 -0
  180. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/teacher/client.py +0 -0
  181. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/teacher/encoding.py +0 -0
  182. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
  183. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/__init__.py +0 -0
  184. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/core/__init__.py +0 -0
  185. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/core/checkpoint_lifecycle.py +0 -0
  186. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/core/child/__init__.py +0 -0
  187. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/core/child/glue.py +0 -0
  188. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/core/child/runtime.py +0 -0
  189. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/core/step_timing.py +0 -0
  190. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/finalize.py +0 -0
  191. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/opd/__init__.py +0 -0
  192. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/opd/batching.py +0 -0
  193. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/opd/bridge.py +0 -0
  194. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/opd/bridge_failures.py +0 -0
  195. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/opd/child/__init__.py +0 -0
  196. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/opd/child/bridge.py +0 -0
  197. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/opd/child/entry.py +0 -0
  198. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
  199. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/opd/child/plugin.py +0 -0
  200. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
  201. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/opd/child/runtime.py +0 -0
  202. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/opd/child/structured.py +0 -0
  203. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/opd/failures.py +0 -0
  204. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/opd/gkd.py +0 -0
  205. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/opd/multiturn_media.py +0 -0
  206. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
  207. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/opd/prompts.py +0 -0
  208. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/opd/reporting.py +0 -0
  209. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/opd/scoring.py +0 -0
  210. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/opd/state.py +0 -0
  211. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/opd/validation.py +0 -0
  212. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/rl/__init__.py +0 -0
  213. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/rl/checkpoints.py +0 -0
  214. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/rl/child/__init__.py +0 -0
  215. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/rl/child/entry.py +0 -0
  216. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
  217. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/rl/child/patches.py +0 -0
  218. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/rl/child/plugin.py +0 -0
  219. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/rl/config.py +0 -0
  220. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/rl/identity.py +0 -0
  221. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/rl/inputs.py +0 -0
  222. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/rl/multi_turn.py +0 -0
  223. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/rl/reward_module.py +0 -0
  224. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/rl/scoring.py +0 -0
  225. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/rl/single_turn.py +0 -0
  226. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/sft/__init__.py +0 -0
  227. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/sft/checkpoints.py +0 -0
  228. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/sft/child/entry.py +0 -0
  229. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/sft/child/plugin.py +0 -0
  230. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/train/sft/config.py +0 -0
  231. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/verl/__init__.py +0 -0
  232. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/verl/checkpoints.py +0 -0
  233. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/verl/child_io.py +0 -0
  234. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/verl/diagnostics.py +0 -0
  235. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/verl/parallelism.py +0 -0
  236. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/verl/parent_work.py +0 -0
  237. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker/verl/process_census.py +0 -0
  238. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/engine/worker_entrypoint.py +0 -0
  239. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/envs/__init__.py +0 -0
  240. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/envs/adapter.py +0 -0
  241. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/envs/base.py +0 -0
  242. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/envs/cache_security.py +0 -0
  243. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/envs/dataset_selection.py +0 -0
  244. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/envs/evaluations.py +0 -0
  245. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/envs/identity.py +0 -0
  246. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/envs/loader.py +0 -0
  247. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/envs/namespace_listing.py +0 -0
  248. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/envs/package/__init__.py +0 -0
  249. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/envs/package/direct_tokens.py +0 -0
  250. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/envs/package/limits.py +0 -0
  251. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/envs/package/unpack.py +0 -0
  252. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/envs/pull.py +0 -0
  253. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/envs/staged.py +0 -0
  254. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/__init__.py +0 -0
  255. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/_lifecycle/__init__.py +0 -0
  256. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/_lifecycle/auth.py +0 -0
  257. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/_lifecycle/bootstrap.py +0 -0
  258. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/_lifecycle/bootstrap_console.py +0 -0
  259. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
  260. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
  261. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/_lifecycle/deadline.py +0 -0
  262. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/_lifecycle/host/__init__.py +0 -0
  263. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
  264. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/_lifecycle/host/failmark.py +0 -0
  265. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/_lifecycle/host/hostlog.py +0 -0
  266. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/_lifecycle/http.py +0 -0
  267. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/_lifecycle/instance.py +0 -0
  268. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/_lifecycle/poll.py +0 -0
  269. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/_lifecycle/poll_instance.py +0 -0
  270. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/_lifecycle/provider.py +0 -0
  271. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/_lifecycle/terminal_artifacts.py +0 -0
  272. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/_lifecycle/worker.py +0 -0
  273. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/allocator.py +0 -0
  274. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/artifacts/__init__.py +0 -0
  275. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/artifacts/hf.py +0 -0
  276. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/artifacts/preload_runpod.py +0 -0
  277. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/artifacts/weight_cache.py +0 -0
  278. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/base.py +0 -0
  279. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/fit_errors.py +0 -0
  280. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/lambda_/__init__.py +0 -0
  281. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/lambda_/api.py +0 -0
  282. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/lambda_/auth.py +0 -0
  283. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/lambda_/gpus.py +0 -0
  284. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/lambda_/jobs/__init__.py +0 -0
  285. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/lambda_/jobs/builders.py +0 -0
  286. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/lambda_/jobs/reap.py +0 -0
  287. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/lambda_/preflight.py +0 -0
  288. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/lambda_/pricing.py +0 -0
  289. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/preflight.py +0 -0
  290. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/realized.py +0 -0
  291. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/runpod/__init__.py +0 -0
  292. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/runpod/api.py +0 -0
  293. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/runpod/auth.py +0 -0
  294. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/runpod/cost.py +0 -0
  295. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/runpod/gpus.py +0 -0
  296. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/runpod/job_execution.py +0 -0
  297. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/runpod/jobs.py +0 -0
  298. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/runpod/preflight.py +0 -0
  299. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/runpod/pricing.py +0 -0
  300. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/runpod/resources.py +0 -0
  301. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/runpod/serverless/__init__.py +0 -0
  302. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/runpod/serverless/endpoints.py +0 -0
  303. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/sharding.py +0 -0
  304. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/vast/__init__.py +0 -0
  305. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/vast/api.py +0 -0
  306. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/vast/auth.py +0 -0
  307. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/vast/jobs/__init__.py +0 -0
  308. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/vast/jobs/builders.py +0 -0
  309. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/vast/preflight.py +0 -0
  310. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/providers/vast/pricing.py +0 -0
  311. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/py.typed +0 -0
  312. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runner/__init__.py +0 -0
  313. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runner/artifacts.py +0 -0
  314. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runner/attempts.py +0 -0
  315. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runner/costs.py +0 -0
  316. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runner/deadlines.py +0 -0
  317. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runner/preparation.py +0 -0
  318. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runner/reconciliation.py +0 -0
  319. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runner/results/__init__.py +0 -0
  320. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runner/results/checkpoints.py +0 -0
  321. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runner/results/verified_revisions.py +0 -0
  322. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runner/status.py +0 -0
  323. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runner/submit.py +0 -0
  324. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runner/supervise/__init__.py +0 -0
  325. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runner/supervise/attach.py +0 -0
  326. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runner/supervise/deploy.py +0 -0
  327. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runner/supervise/lifecycle.py +0 -0
  328. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runner/supervise/recovery.py +0 -0
  329. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runner/supervise/retry_decision.py +0 -0
  330. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runner/supervise/seed_submission.py +0 -0
  331. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runner/supervise/transitions.py +0 -0
  332. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runner/weight_cache.py +0 -0
  333. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runtime_capsule/__init__.py +0 -0
  334. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runtime_capsule/build.py +0 -0
  335. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runtime_capsule/manifest.py +0 -0
  336. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/runtime_capsule/profiles.py +0 -0
  337. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/schema/fields.py +0 -0
  338. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/serve/__init__.py +0 -0
  339. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/serve/adapter_check.py +0 -0
  340. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/serve/deploy.py +0 -0
  341. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/serve/errors.py +0 -0
  342. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/serve/export.py +0 -0
  343. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/serve/preflight.py +0 -0
  344. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/serve/responses.py +0 -0
  345. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/serve/streaming.py +0 -0
  346. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/serve/thinking.py +0 -0
  347. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/serve/urls.py +0 -0
  348. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/__init__.py +0 -0
  349. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/__main__.py +0 -0
  350. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/app.py +0 -0
  351. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/billing/__init__.py +0 -0
  352. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/billing/charges.py +0 -0
  353. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/billing/retry.py +0 -0
  354. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/domain/__init__.py +0 -0
  355. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/domain/checkpoints.py +0 -0
  356. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/domain/environment_registry.py +0 -0
  357. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/domain/envs.py +0 -0
  358. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/domain/projects.py +0 -0
  359. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/domain/reconcile.py +0 -0
  360. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/domain/repo_cleanup.py +0 -0
  361. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/domain/run_registry.py +0 -0
  362. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/domain/teacher_broker.py +0 -0
  363. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/domain/teacher_errors.py +0 -0
  364. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/domain/teacher_requests.py +0 -0
  365. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/platform/__init__.py +0 -0
  366. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/platform/auth.py +0 -0
  367. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/platform/db.py +0 -0
  368. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/platform/deps.py +0 -0
  369. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/platform/internal_client.py +0 -0
  370. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/platform/locks.py +0 -0
  371. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/platform/runtime.py +0 -0
  372. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/routes/__init__.py +0 -0
  373. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/routes/envs.py +0 -0
  374. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/routes/meta.py +0 -0
  375. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/routes/runs.py +0 -0
  376. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/routes/serving.py +0 -0
  377. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/routes/serving_completion.py +0 -0
  378. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/routes/serving_revisions.py +0 -0
  379. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/routes/serving_smoke.py +0 -0
  380. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/server/routes/teacher.py +0 -0
  381. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/source_snapshot.py +0 -0
  382. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/teacher/__init__.py +0 -0
  383. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/teacher/limits.py +0 -0
  384. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/teacher/provider_status.py +0 -0
  385. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/flash/teacher/retry_contract.py +0 -0
  386. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/scripts/build_dev_dist.py +0 -0
  387. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/scripts/check_file_size.py +0 -0
  388. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/scripts/check_function_size.py +0 -0
  389. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/scripts/check_rollout_identity_actor.py +0 -0
  390. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/scripts/check_verl_pin_exists.py +0 -0
  391. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/scripts/scrub_history.sh +0 -0
  392. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/__init__.py +0 -0
  393. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/_helpers/__init__.py +0 -0
  394. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/_helpers/profile.py +0 -0
  395. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/_helpers/runner.py +0 -0
  396. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/_helpers/source_snapshot.py +0 -0
  397. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/_helpers/specs.py +0 -0
  398. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/_helpers/teacher.py +0 -0
  399. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/_helpers/vast.py +0 -0
  400. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/capture_image_sft_processor_oracle.py +0 -0
  401. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/conftest.py +0 -0
  402. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/fixtures/image_sft_processor_oracle.json +0 -0
  403. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/fixtures/qwen35_08b_target_metadata.json +0 -0
  404. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/live/__init__.py +0 -0
  405. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/live/conftest.py +0 -0
  406. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/live/test_lambda_live.py +0 -0
  407. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/live/test_runpod_live.py +0 -0
  408. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/live/test_sft_thinking_render_live.py +0 -0
  409. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/live/test_vast_live.py +0 -0
  410. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_accounting_coverage.py +0 -0
  411. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_adapter_shard_completeness.py +0 -0
  412. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_agent_flash_cli_contract.py +0 -0
  413. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_algorithms.py +0 -0
  414. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_allocator.py +0 -0
  415. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_backend_jobspec_contract.py +0 -0
  416. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_bake_kernel_cache.py +0 -0
  417. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_base_model_provenance.py +0 -0
  418. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_billing_retry.py +0 -0
  419. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_build_context_contract.py +0 -0
  420. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_cancel_remote.py +0 -0
  421. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_catalog_consistency.py +0 -0
  422. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_catalog_only_models.py +0 -0
  423. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_charge_pricing.py +0 -0
  424. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_checkpoint_lifecycle.py +0 -0
  425. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_checkpoints.py +0 -0
  426. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_cli_commands.py +0 -0
  427. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_cli_commands_coverage.py +0 -0
  428. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_cli_credential_shadowing.py +0 -0
  429. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_cli_errors.py +0 -0
  430. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_cli_gpus_flag.py +0 -0
  431. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_cli_help.py +0 -0
  432. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_cli_main_coverage.py +0 -0
  433. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_cli_managed.py +0 -0
  434. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_cli_render_coverage.py +0 -0
  435. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_cli_render_theme.py +0 -0
  436. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_cli_traces.py +0 -0
  437. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_cli_wandb_warning.py +0 -0
  438. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_client.py +0 -0
  439. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_client_import_purity.py +0 -0
  440. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_client_server_integration.py +0 -0
  441. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_client_stream_reads.py +0 -0
  442. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_config_env_vars.py +0 -0
  443. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_config_overrides.py +0 -0
  444. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_console_upload.py +0 -0
  445. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_controlled_experiment_repairs.py +0 -0
  446. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_cost_analytical.py +0 -0
  447. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_cost_equation.py +0 -0
  448. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_cost_estimate.py +0 -0
  449. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_cost_hardware.py +0 -0
  450. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_cost_models.py +0 -0
  451. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_dataset_profile.py +0 -0
  452. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_deploy_alias_move_warning.py +0 -0
  453. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_deploy_latency.py +0 -0
  454. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_dev_channel.py +0 -0
  455. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_disk_gb.py +0 -0
  456. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_endpoint_name.py +0 -0
  457. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_env_cache_evict.py +0 -0
  458. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_env_delete.py +0 -0
  459. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_env_download.py +0 -0
  460. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_env_download_api.py +0 -0
  461. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_env_evaluations.py +0 -0
  462. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_env_list_api.py +0 -0
  463. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_env_list_cli.py +0 -0
  464. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_env_list_hub.py +0 -0
  465. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_env_no_install.py +0 -0
  466. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_env_publish.py +0 -0
  467. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_env_pull.py +0 -0
  468. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_env_pull_coverage.py +0 -0
  469. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_env_pull_loader_coverage.py +0 -0
  470. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_env_pull_managed_control_plane.py +0 -0
  471. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_env_push.py +0 -0
  472. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_env_rate_limit_resolve.py +0 -0
  473. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_env_ref_pinning.py +0 -0
  474. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_env_test.py +0 -0
  475. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_envs_coverage.py +0 -0
  476. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_export.py +0 -0
  477. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_flash_mvp.py +0 -0
  478. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_flash_worker.py +0 -0
  479. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_flashinfer_cache_dirs.py +0 -0
  480. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_freesolo_api_transport.py +0 -0
  481. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_fused_expert_warmstart.py +0 -0
  482. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_github_urlopen_retry.py +0 -0
  483. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_gpu_type_single_field.py +0 -0
  484. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_gpus.py +0 -0
  485. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_grpo_params.py +0 -0
  486. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_grpo_process_census.py +0 -0
  487. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_grpo_resident_sizing.py +0 -0
  488. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_grpo_reward_batching.py +0 -0
  489. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_grpo_rollout_contract.py +0 -0
  490. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_grpo_rollout_identity.py +0 -0
  491. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_health_liveness.py +0 -0
  492. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_hf_retry.py +0 -0
  493. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_idle_endpoint_reaper.py +0 -0
  494. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_image_environment_capability.py +0 -0
  495. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_image_incremental_processor.py +0 -0
  496. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_image_sft_markers.py +0 -0
  497. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_image_sft_processor_parity.py +0 -0
  498. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_image_tokens.py +0 -0
  499. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_infisical_secrets.py +0 -0
  500. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_instance_bootstrap_coverage.py +0 -0
  501. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_internal_client.py +0 -0
  502. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_jobs.py +0 -0
  503. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_kernel_cache.py +0 -0
  504. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_kernel_fingerprint.py +0 -0
  505. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_lambda_api_coverage.py +0 -0
  506. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_lambda_runner.py +0 -0
  507. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_logging.py +0 -0
  508. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_login_perms.py +0 -0
  509. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_lora_rank_coverage.py +0 -0
  510. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_lora_rank_nested_rung.py +0 -0
  511. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_lora_targeting.py +0 -0
  512. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_lora_targeting_pinned_verl.py +0 -0
  513. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_managed_config_fields.py +0 -0
  514. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_managed_hf_repo.py +0 -0
  515. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_metrics_schema_agent_contract.py +0 -0
  516. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_mig_guard.py +0 -0
  517. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_multi_gpu_gate.py +0 -0
  518. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_multimodal_training.py +0 -0
  519. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_named_reward_metrics.py +0 -0
  520. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_oom_escalate_gpu.py +0 -0
  521. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_opd.py +0 -0
  522. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_opd_limits.py +0 -0
  523. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_opd_multiturn_eos_boundary.py +0 -0
  524. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_opd_multiturn_failure_exit.py +0 -0
  525. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_opd_replay_guard.py +0 -0
  526. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_opd_resume_safety.py +0 -0
  527. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_orchestrator_flash.py +0 -0
  528. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_packing.py +0 -0
  529. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_packing_coverage.py +0 -0
  530. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_parasail_teacher.py +0 -0
  531. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_persisted_spec_envelope.py +0 -0
  532. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_poll_helpers.py +0 -0
  533. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_preflight.py +0 -0
  534. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_projects.py +0 -0
  535. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_prompt_budget.py +0 -0
  536. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_provider_preflight_coverage.py +0 -0
  537. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_provider_routing.py +0 -0
  538. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_provider_teardown_robustness.py +0 -0
  539. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_providers_symmetry.py +0 -0
  540. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_realized_cost.py +0 -0
  541. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_repo_cleanup.py +0 -0
  542. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_resolve_params_b.py +0 -0
  543. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_resume_on_retry.py +0 -0
  544. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_rollout_samples.py +0 -0
  545. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_runmgmt.py +0 -0
  546. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_runpod_api_delete.py +0 -0
  547. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_runpod_key_fingerprint.py +0 -0
  548. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_runpod_key_waterfall.py +0 -0
  549. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_runtime_capsule.py +0 -0
  550. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_serve.py +0 -0
  551. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_serve_reasoning_content.py +0 -0
  552. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_server_api.py +0 -0
  553. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_server_app_coverage.py +0 -0
  554. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_server_auth_singleflight.py +0 -0
  555. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_server_billing.py +0 -0
  556. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_server_checkpoints_coverage.py +0 -0
  557. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_server_db.py +0 -0
  558. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_server_envs_coverage.py +0 -0
  559. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_server_locks_coverage.py +0 -0
  560. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_server_standalone.py +0 -0
  561. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_serving_context_preflight.py +0 -0
  562. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_serving_contract.py +0 -0
  563. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_serving_schema_coverage.py +0 -0
  564. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_sft_chunked_nll.py +0 -0
  565. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_sft_example_selection.py +0 -0
  566. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_sft_gc_off.py +0 -0
  567. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_sft_max_context.py +0 -0
  568. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_sft_startup_block.py +0 -0
  569. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_sft_train.py +0 -0
  570. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_sft_workload.py +0 -0
  571. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_source_attestation_flow.py +0 -0
  572. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_source_snapshot.py +0 -0
  573. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_spec_contract_bytes.py +0 -0
  574. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_staged_environment.py +0 -0
  575. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_step_floor.py +0 -0
  576. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_step_metrics.py +0 -0
  577. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_step_timing.py +0 -0
  578. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_structured_outputs.py +0 -0
  579. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_teacher_broker.py +0 -0
  580. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_teacher_encoding_contract.py +0 -0
  581. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_terminal_artifacts.py +0 -0
  582. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_thinking_config.py +0 -0
  583. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_train_context_preflight.py +0 -0
  584. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_training_controls.py +0 -0
  585. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_type_comment_prose.py +0 -0
  586. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_vast_api.py +0 -0
  587. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_vast_api_coverage.py +0 -0
  588. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_vast_offers.py +0 -0
  589. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_vast_provider_coverage.py +0 -0
  590. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_vast_runner.py +0 -0
  591. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_verified_revisions.py +0 -0
  592. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_verifiers.py +0 -0
  593. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_verl_checkpoint_export.py +0 -0
  594. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_verl_child_plugins.py +0 -0
  595. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_verl_silence_watchdog.py +0 -0
  596. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_version.py +0 -0
  597. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_vl_warmstart_adapter_keys.py +0 -0
  598. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_wandb_link.py +0 -0
  599. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_wandb_naming.py +0 -0
  600. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_warmstart_adapter_download.py +0 -0
  601. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_warmstart_cross_repo.py +0 -0
  602. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_warmstart_error_attribution.py +0 -0
  603. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_warmstart_image_adapters.py +0 -0
  604. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_weight_cache.py +0 -0
  605. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_worker_dryrun.py +0 -0
  606. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_worker_hardexit.py +0 -0
  607. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_worker_image.py +0 -0
  608. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_worker_init_heartbeat.py +0 -0
  609. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_worker_stack.py +0 -0
  610. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_worker_thinking.py +0 -0
  611. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_workflow_contracts.py +0 -0
  612. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_workload_profile.py +0 -0
  613. {freesolo_flash_dev-1.2.97 → freesolo_flash_dev-1.2.100}/tests/test_zero2_sharding_gate.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: freesolo-flash-dev
3
- Version: 1.2.97
3
+ Version: 1.2.100
4
4
  Summary: Flash — managed LoRA post-training (SFT/GRPO/OPD) for Freesolo environments, driven by the `flash` CLI
5
5
  Project-URL: Homepage, https://github.com/freesolo-co/flash
6
6
  Project-URL: Repository, https://github.com/freesolo-co/flash
@@ -61,21 +61,30 @@ def _cmd_train_cost(args) -> int:
61
61
 
62
62
  def _cmd_train_cost_offline(spec) -> int:
63
63
  """Catalog-only quote for the algorithms that do not need workload evidence yet (grpo, opd)."""
64
+ from dataclasses import replace
65
+
64
66
  from flash.cost import estimate_cost
67
+ from flash.schema import MIN_LORA_RANK
65
68
 
69
+ config = runconfig_from_spec(spec)
66
70
  if spec.train.init_from_adapter:
67
- # --cost is offline/catalog-only and cannot read the source adapter, so the rank stays at the
68
- # local default. Warm starts train and are priced at the SOURCE adapter's authoritative rank
69
- # (resolved server-side at submit/dry-run), which can be higher — so this estimate may
70
- # under-quote. stderr keeps stdout clean for machine-readable callers.
71
+ # --cost is offline/catalog-only and cannot read the source adapter's rank, and the parser
72
+ # rejects an authored `lora_rank` alongside `init_from_adapter`, so there is never an
73
+ # authored rank to quote at. stderr keeps stdout clean for machine-readable callers.
74
+ #
75
+ # quote at rank 1 rather than at the serialization placeholder. the placeholder is not a
76
+ # measurement of anything, and `estimate_cost` reads the rank for both the exact-card fit and
77
+ # cost-ranked hardware selection. rank 1 is a vram lower bound, but not a dollar lower bound:
78
+ # a higher source rank can move the run onto a cheaper multi-card shape.
79
+ config = replace(config, lora_rank=MIN_LORA_RANK)
71
80
  print(
72
- "warning: warm-start (train.init_from_adapter) cost uses the default LoRA rank; the "
73
- "source adapter's rank is authoritative and resolved at submit, so a higher-rank source "
74
- f"may cost more than this estimate. Run `{_commands().CLI_NAME} train --dry-run` "
75
- "for a source-rank quote.",
81
+ "warning: warm-start (train.init_from_adapter) cost is a provisional rank-1 estimate. "
82
+ "The authoritative source adapter rank is resolved server-side and can change the "
83
+ "selected hardware and cost in either direction. Run "
84
+ f"`{_commands().CLI_NAME} train --dry-run` for a quote using the resolved source rank.",
76
85
  file=sys.stderr,
77
86
  )
78
- estimate = estimate_cost(runconfig_from_spec(spec))
87
+ estimate = estimate_cost(config)
79
88
  if render.styled():
80
89
  print(render.cost_panel(estimate))
81
90
  else:
@@ -132,6 +132,26 @@ def _colocate_util_cap(weights_gb: float, total_vram_gb: float) -> float:
132
132
  return 0.55 if (big_weight_copy and leaves_room_for_trainer_copy) else 0.45
133
133
 
134
134
 
135
+ def _capped_engine_util(
136
+ weights_gb: float,
137
+ adapter_gb: float,
138
+ requested_kv_gb: float,
139
+ total_vram_gb: float,
140
+ util_cap: float,
141
+ ) -> float:
142
+ """Fit weights, adapter, then KV into vllm's capped share of one card."""
143
+ card_gb = max(1.0, total_vram_gb)
144
+ max_engine_gb = util_cap * card_gb
145
+ # gpu_memory_utilization is vllm's whole allocation, and its lora weights live inside it. reserve
146
+ # weights plus adapter first; only a cap collision may reduce the requested kv pool. spelling out
147
+ # fitted_kv_gb makes that loss visible instead of incidentally subtracting adapter bytes from a
148
+ # weights-plus-kv fraction. if weights plus adapter alone exceed the cap, kv reaches zero and the
149
+ # returned cap truthfully exposes that this engine shape has no viable cache budget.
150
+ fitted_kv_gb = max(0.0, min(requested_kv_gb, max_engine_gb - weights_gb - adapter_gb))
151
+ fitted_engine_gb = weights_gb + adapter_gb + fitted_kv_gb
152
+ return min(util_cap, fitted_engine_gb / card_gb)
153
+
154
+
135
155
  def colocate_kv_util(
136
156
  params_b: float | None,
137
157
  vllm_max_len: int,
@@ -143,14 +163,19 @@ def colocate_kv_util(
143
163
  model_info=None,
144
164
  preserve_legacy_floor: bool = False,
145
165
  tensor_parallel: int = 1,
166
+ lora_rank: int = 0,
146
167
  ) -> float:
147
168
  """vllm_gpu_memory_utilization for one colocated rollout tensor-parallel rank.
148
169
 
149
- Budget the rank's weight shard plus a conservative full KV cache. Catalog models use geometry
150
- with measured overhead and an 8 GB floor; uncataloged models retain the legacy KV equation.
170
+ budget the rank's weight shard, rank-local bf16 lora footprint, and conservative full kv cache.
171
+ catalog models use geometry with measured overhead and an 8 gb floor; uncataloged models retain
172
+ the legacy kv equation and no unverified adapter margin.
151
173
  """
174
+ from flash.engine.plan.vram import _lora_weight_memory_gb
175
+
152
176
  total_weights_gb = max(0.5, float(params_b or 1.0)) * 2.0
153
177
  tp_size = max(1, int(tensor_parallel))
178
+ adapter_gb = _lora_weight_memory_gb(lora_rank, model_info, tensor_parallel=tp_size) or 0.0
154
179
  # tensor parallelism shards vllm's bf16 weights, but kv heads can replicate when tp is wider than
155
180
  # the model's kv-head count. shard only the weight term and keep the full kv budget on every rank.
156
181
  weights_gb = total_weights_gb if tp_size == 1 else total_weights_gb / tp_size
@@ -162,7 +187,7 @@ def colocate_kv_util(
162
187
  # but not H200. `_NvidiaSmiPeakSampler` verifies runtime headroom.
163
188
  _util_cap = _colocate_util_cap(weights_gb, total_vram_gb)
164
189
  if not sleep_mode:
165
- # `gpu_memory_utilization` covers weights plus KV, so budget both. scale KV with
190
+ # `gpu_memory_utilization` covers weights, adapter, and kv, so budget all three. scale kv with
166
191
  # context and group, floor at `_KV_CAP`, and keep the 0.45 cap aligned with
167
192
  # `estimate_vram_gb(..., sleep_offload=False)`.
168
193
  kv_gb = max(
@@ -176,7 +201,8 @@ def colocate_kv_util(
176
201
  preserve_legacy_floor=preserve_legacy_floor,
177
202
  ),
178
203
  )
179
- return max(_MIN_ENGINE_UTIL, min(_util_cap, (weights_gb + kv_gb) / max(1.0, total_vram_gb)))
204
+ sized = _capped_engine_util(weights_gb, adapter_gb, kv_gb, total_vram_gb, _util_cap)
205
+ return max(_MIN_ENGINE_UTIL, sized)
180
206
  # Sleep mode keeps a larger pool (1.5x margin): the engine is offloaded during the backward, so a
181
207
  # bigger rollout-phase KV does not compete with the training peak.
182
208
  kv_pool_gb = max(
@@ -191,7 +217,7 @@ def colocate_kv_util(
191
217
  preserve_legacy_floor=preserve_legacy_floor,
192
218
  ),
193
219
  )
194
- sized = min(_util_cap, (weights_gb + kv_pool_gb) / max(1.0, total_vram_gb))
220
+ sized = _capped_engine_util(weights_gb, adapter_gb, kv_pool_gb, total_vram_gb, _util_cap)
195
221
  # sharding the weight term can drive a small model's rank budget low enough that vllm has no
196
222
  # room left for its own runtime once the kv pool is carved out -- a 4B model on 2 cards prices
197
223
  # under this floor. single-rank sizing carries the whole weight copy and never gets that small,
@@ -129,6 +129,33 @@ def _legacy_lora_floor_gb(lora_rank: int, effective_params_b: float) -> float:
129
129
  return (lora_rank / 16.0) * (0.3 + 0.04 * effective_params_b)
130
130
 
131
131
 
132
+ def _lora_parameter_count(
133
+ lora_rank: int, model_info=None, *, tensor_parallel: int = 1
134
+ ) -> int | None:
135
+ """lora parameters resident on one tensor-parallel rank from concrete target geometry."""
136
+ shapes = tuple(getattr(model_info, "lora_target_shapes", ()) or ())
137
+ rank = int(lora_rank)
138
+ if not shapes or rank <= 0:
139
+ return None
140
+ tp_size = max(1, int(tensor_parallel))
141
+ if tp_size == 1:
142
+ return rank * sum((int(i) + int(o)) * int(count) for i, o, count in shapes)
143
+ # vllm shards one factor, except the current min-dim-1 gate keeps that factor whole. integer shard
144
+ # sizing covers that catalog shape exactly; this is not a general replicated-layer classifier.
145
+ return sum(
146
+ rank * int(count) * (max(int(i), int(o)) + math.ceil(min(int(i), int(o)) / tp_size))
147
+ for i, o, count in shapes
148
+ )
149
+
150
+
151
+ def _lora_weight_memory_gb(
152
+ lora_rank: int, model_info=None, *, tensor_parallel: int = 1
153
+ ) -> float | None:
154
+ """rank-local resident bf16 lora weights, or none without catalog target geometry."""
155
+ params = _lora_parameter_count(lora_rank, model_info, tensor_parallel=tensor_parallel)
156
+ return None if params is None else params * _BYTES_PER_PARAM["bf16"] / 1e9
157
+
158
+
132
159
  def _lora_memory_gb(
133
160
  lora_rank: int,
134
161
  effective_params_b: float,
@@ -137,14 +164,9 @@ def _lora_memory_gb(
137
164
  ) -> float:
138
165
  """Adapter, gradient, and optimizer memory for the actual PEFT all-linear targets."""
139
166
  floor = _legacy_lora_floor_gb(lora_rank, effective_params_b)
140
- shapes = tuple(getattr(model_info, "lora_target_shapes", ()) or ())
141
- if not shapes:
167
+ trainable_params = _lora_parameter_count(lora_rank, model_info)
168
+ if trainable_params is None:
142
169
  return floor
143
- target_dims = sum(
144
- (int(in_features) + int(out_features)) * int(count)
145
- for in_features, out_features, count in shapes
146
- )
147
- trainable_params = max(1, int(lora_rank)) * target_dims
148
170
  bytes_per_param = (
149
171
  _LORA_PAGED_BYTES_PER_PARAM
150
172
  if (algorithm or "").lower() in ("grpo", "rl")
@@ -225,15 +247,15 @@ def grpo_kv_floor_gb(
225
247
  fp8_kv: bool = False,
226
248
  model_info=None,
227
249
  preserve_legacy_floor: bool = False,
250
+ lora_rank: int = 0,
251
+ tensor_parallel: int = 1,
228
252
  ) -> int:
229
- """Smallest card (GB) whose colocated vLLM executor budget still leaves a viable KV pool.
230
-
231
- The 0.45/0.55 cap must hold the weight copy plus half the concurrent group's KV; otherwise
232
- vLLM can fail with "No available memory for the cache blocks".
233
- """
253
+ """Smallest card whose cap holds rank-local weights, adapter, and half the KV pool."""
234
254
  kv_params_b = float(active_params_b) if active_params_b else float(params_b)
235
- weights_gb = max(0.5, float(params_b)) * 2.0
236
- need = weights_gb + 0.5 * _resident_kv_gb(
255
+ tp_size = max(1, int(tensor_parallel))
256
+ weights_gb = max(0.5, float(params_b)) * 2.0 / tp_size
257
+ adapter_gb = _lora_weight_memory_gb(lora_rank, model_info, tensor_parallel=tp_size) or 0.0
258
+ kv_gb = _resident_kv_gb(
237
259
  kv_params_b,
238
260
  vllm_max_len,
239
261
  group_size,
@@ -241,6 +263,7 @@ def grpo_kv_floor_gb(
241
263
  model_info=model_info,
242
264
  preserve_legacy_floor=preserve_legacy_floor,
243
265
  )
266
+ need = weights_gb + adapter_gb + 0.5 * kv_gb
244
267
  lower = math.ceil(need / 0.55)
245
268
  upper = math.ceil(need / 0.45)
246
269
  for total_vram_gb in range(lower, upper + 1):
@@ -295,6 +318,7 @@ def _rollout_kv_floor_gb(
295
318
  model_info=None,
296
319
  model_id: str = "",
297
320
  preserve_legacy_floor: bool = False,
321
+ lora_rank: int = 0,
298
322
  ) -> int:
299
323
  floor = grpo_kv_floor_gb(
300
324
  params_b,
@@ -303,6 +327,7 @@ def _rollout_kv_floor_gb(
303
327
  active_params_b=active_params_b,
304
328
  model_info=model_info,
305
329
  preserve_legacy_floor=preserve_legacy_floor,
330
+ lora_rank=lora_rank,
306
331
  )
307
332
  from flash.providers.base import max_non_fp8_kv_vram_gb
308
333
 
@@ -323,6 +348,7 @@ def _rollout_kv_floor_gb(
323
348
  fp8_kv=True,
324
349
  model_info=model_info,
325
350
  preserve_legacy_floor=preserve_legacy_floor,
351
+ lora_rank=lora_rank,
326
352
  )
327
353
  return max(fp8_floor, ceiling + 1)
328
354
 
@@ -838,6 +864,7 @@ def _catalog_model_required_vram_gb(
838
864
  model_info=sizing_info,
839
865
  model_id=model_id,
840
866
  preserve_legacy_floor=is_opd,
867
+ lora_rank=lora_rank,
841
868
  ),
842
869
  )
843
870
  return need
@@ -560,6 +560,7 @@ def _resolve_opd_gpu_mem_util(
560
560
  "model_id": model_id,
561
561
  "model_revision": str(getattr(request, "model_revision", "") or ""),
562
562
  "engine_len": int(prompt_state.max_model_len),
563
+ "lora_rank": int(workload.lora_rank),
563
564
  # opd submits prompts_per_step * group_size generations to the rollout engine together.
564
565
  # grpo's concurrency is group_size because its resolver receives one prompt group here.
565
566
  "group_size": int(workload.prompts_per_step) * int(request.knobs.group_size),
@@ -23,6 +23,7 @@ from flash.engine.worker.backend_common import (
23
23
  trainer_dtype_overrides,
24
24
  )
25
25
  from flash.engine.worker.sft_train import _build_verl_child_env, _hydra_val
26
+ from flash.engine.worker.verl.capabilities import rollout_max_num_seqs
26
27
  from flash.teacher.limits import OPD_NO_SIGNAL_ATTEMPTS
27
28
 
28
29
  _REQUIRED_OVERRIDE_KEYS = (
@@ -214,6 +215,15 @@ def _actor_rollout_overrides(config: dict, *, max_tokens: int) -> list[str]:
214
215
  "actor_rollout_ref.rollout.agent.num_workers="
215
216
  f"{agent_loop_workers(int(config['train_batch_size']) * int(config['group_size']), cap=4 if config.get('multimodal') else 8)}"
216
217
  ),
218
+ # one opd step submits exactly train_batch_size * group_size student generations. verl's
219
+ # 1024 default makes vllm reserve cuda-graph capture sizes -- and, on a gdn/mamba hybrid,
220
+ # one recurrent state block per decode slot -- for a batch this run never submits. both are
221
+ # allocated before the first token, so the over-provisioning OOMs a card that stays mostly
222
+ # free. `rollout.max_num_seqs` is a real verl field, so this is a plain override.
223
+ (
224
+ "actor_rollout_ref.rollout.max_num_seqs="
225
+ f"{rollout_max_num_seqs(int(config['train_batch_size']) * int(config['group_size']))}"
226
+ ),
217
227
  ]
218
228
 
219
229
 
@@ -26,6 +26,7 @@ from flash.engine.worker.backend_common import (
26
26
  )
27
27
  from flash.engine.worker.runtime.pkg_proxy import W as _w
28
28
  from flash.engine.worker.sft_train import _hydra_val, _verl_image_message_content
29
+ from flash.engine.worker.verl.capabilities import rollout_max_num_seqs
29
30
  from flash.engine.worker.verl.parallelism import (
30
31
  ULYSSES_SEQUENCE_PARALLEL_SIZE,
31
32
  resolve_reshard_after_forward,
@@ -321,6 +322,11 @@ def _rollout_overrides(cfg: dict) -> list[str]:
321
322
  # child-silence watchdog kills it 1200s later. capping the pool leaves group_size and
322
323
  # prompts_per_step exactly as authored -- only scheduling parallelism narrows.
323
324
  f"actor_rollout_ref.rollout.agent.num_workers={agent_loop_workers(int(cfg['prompts_per_step']) * int(cfg['group_size']), cap=4 if cfg.get('multimodal') else 8)}",
325
+ # one grpo step submits exactly prompts_per_step * group_size sequences. left unset verl
326
+ # keeps its 1024 default, and vllm sizes cuda-graph capture and (on a gdn/mamba hybrid)
327
+ # per-slot recurrent state from that number, both up front -- so a 32-sequence run paid a
328
+ # 1024-sequence reservation and OOMed during capture with most of the card still free.
329
+ f"actor_rollout_ref.rollout.max_num_seqs={rollout_max_num_seqs(int(cfg['prompts_per_step']) * int(cfg['group_size']))}",
324
330
  # multi-turn runs flash's own agent loop, registered in the child by flash_grpo_plugin. the
325
331
  # stock single_turn_agent generates once and returns; it has no notion of an environment
326
332
  # reply, so a multi-turn env on the default loop would train on first turns only.
@@ -503,13 +509,16 @@ def resolve_gpu_mem_util(
503
509
  ) -> float:
504
510
  """size vllm's colocated executor budget from this run's geometry.
505
511
 
506
- ``gpu_memory_utilization`` covers the second bf16 weight copy plus kv pool. using
512
+ ``gpu_memory_utilization`` covers the second bf16 weight copy, lora adapter, and kv pool. using
507
513
  ``colocate_kv_util`` keeps worker allocation aligned with preflight admission.
508
514
 
509
- for multi-gpu runs, vllm shards its bf16 weight copy across tensor-parallel ranks. the kv term
510
- remains unsharded here because vllm can replicate kv heads when tensor parallelism is wider than
511
- the model's kv-head count. the result is explicitly capped at the old 0.5 constant, so this path
512
- can only lower a rank's reservation and cannot create a new over-reservation.
515
+ for multi-gpu runs, vllm shards its bf16 weight copy across tensor-parallel ranks. its default
516
+ lora layout shards only one factor of each projection's a/b pair, so the rank-local adapter uses
517
+ the larger safe orientation from catalog geometry rather than dividing the full adapter evenly.
518
+ the kv term remains unsharded here because vllm can replicate kv heads when tensor parallelism is
519
+ wider than the model's kv-head count. the adapter lives inside vllm's reservation, and the result
520
+ is explicitly capped at the old 0.5 constant, so this path can only lower a rank's reservation
521
+ and cannot create a new over-reservation.
513
522
 
514
523
  the flat constant is kept where the model does not apply, because a wrong number is worse than
515
524
  a conservative one:
@@ -564,6 +573,7 @@ def resolve_gpu_mem_util(
564
573
  model_info=info,
565
574
  preserve_legacy_floor=preserve_legacy_floor,
566
575
  tensor_parallel=n_gpus,
576
+ lora_rank=int(inp["lora_rank"]),
567
577
  )
568
578
  # multi-rank sizing is strictly one-directional against the previous worker contract: it may
569
579
  # free memory but can never claim more than the flat reservation a working run already used.
@@ -773,6 +773,45 @@ def rollout_fp8_kv(cc_ok: bool, gdn_hybrid: bool, model_id: str) -> bool:
773
773
  return rollout_sleep_unsupported(model_id)
774
774
 
775
775
 
776
+ _MIN_ROLLOUT_MAX_NUM_SEQS = 16
777
+
778
+
779
+ def rollout_max_num_seqs(rollout_batch: int) -> int:
780
+ """concurrent sequence slots to provision the rollout engine for.
781
+
782
+ verl leaves ``rollout.max_num_seqs`` at its yaml default of 1024 (rollout.yaml:79) and passes
783
+ it straight to the vllm engine (vllm_async_server.py:261). vllm sizes two up-front, fixed
784
+ allocations from that number, neither of which shrinks to the batch actually submitted:
785
+
786
+ * cuda-graph capture. ``_set_cudagraph_sizes`` (vllm ``config/vllm.py``, 0.19.1 -- the version
787
+ ``Dockerfile.worker`` pins) derives a capture ladder from
788
+ ``max_cudagraph_capture_size = min(max_num_seqs * 2, 512, max_num_batched_tokens)``, taking
789
+ ``[1,2,4]``, then ``range(8, min(size+1, 256), 8)``, then ``range(256, size+1, 16)`` -- each
790
+ rung clamped by that ceiling. verl's ``max_num_batched_tokens`` default is 8192
791
+ (``rollout.yaml:73``), so it does not bind. at 1024 the ceiling is 512 and the ladder is 51
792
+ sizes; a lora run captures each size twice, since the dispatcher takes
793
+ ``product(cudagraph_capture_sizes, lora_cases)`` with ``lora_cases == [0, 1]`` when
794
+ ``cudagraph_specialize_lora`` is on (``v1/cudagraph_dispatcher.py:110-193``, default True) --
795
+ exactly the ``0/102`` seen in the failing console. the ladder saturates at 512, so 1024, 512
796
+ and 256 are indistinguishable; only dropping below 256 shortens it, and 32 yields a ceiling
797
+ of 64, 11 sizes, and 22 graphs. note the prose comment above that function omits the per-rung
798
+ clamp and predicts 34 sizes for any small value; the implementation is authoritative.
799
+ * recurrent state. a gdn/mamba hybrid reserves one state block per decode slot, a dense
800
+ allocation that -- unlike paged kv -- cannot be shared, paged out, or grown on demand.
801
+
802
+ both are paid before the first rollout token, inside the ``gpu_memory_utilization`` budget. a
803
+ grpo/opd step submits exactly ``prompts_per_step * group_size`` sequences, so a run with 32
804
+ concurrent generations was provisioning for 1024 and dying during graph capture with ~80% of
805
+ the card free -- on 234, 358, and 460 GB alike, since the cost is fixed rather than
806
+ proportional to the card.
807
+
808
+ the floor keeps small runs on a usable capture ladder rather than collapsing it to one size.
809
+ """
810
+ if rollout_batch <= 0:
811
+ raise ValueError("rollout_batch must be positive")
812
+ return max(_MIN_ROLLOUT_MAX_NUM_SEQS, int(rollout_batch))
813
+
814
+
776
815
  def rollout_resident_overrides(sleep_unsupported: bool) -> list[str]:
777
816
  """verl overrides that pin the rollout engine resident, or ``[]`` to keep verl's default.
778
817
 
@@ -50,6 +50,12 @@ from flash.schema.fields import (
50
50
  _wandb_spec,
51
51
  )
52
52
 
53
+ # the smallest rank the parser accepts, and so the smallest a source adapter can turn out to have.
54
+ # unresolved warm starts use it instead of the serialization default for permissive client-side
55
+ # sizing. it is a vram lower bound, not a dollar lower bound because cost-ranked hardware selection
56
+ # is non-monotonic across shapes. keep it aligned with the `lora_rank` parser floor.
57
+ MIN_LORA_RANK = 1
58
+
53
59
  _OWNER_REPO_RE = r"[A-Za-z0-9][A-Za-z0-9._-]*"
54
60
  _RUN_ID_RE = r"[A-Za-z0-9][A-Za-z0-9._-]{0,127}"
55
61
  # canonical short checkpoint references name a run alias or a saved checkpoint. immutable adapter
@@ -437,6 +443,7 @@ def _validate_gpu_section(
437
443
  model_revision: str,
438
444
  algorithm: str,
439
445
  train_raw: dict[str, Any],
446
+ init_from_adapter: str,
440
447
  thinking: bool,
441
448
  ) -> tuple[GpuSpec, bool]:
442
449
  """Validate the GPU section and return its canonical spec plus auto-sizing provenance."""
@@ -483,10 +490,18 @@ def _validate_gpu_section(
483
490
  # provider preferences are soft; configured unnamed providers remain eligible.
484
491
 
485
492
  requested_gpu_count = authored_gpu_ceiling(gpu_spec.type, gpu_count)
493
+ unresolved_warmstart_rank = bool(init_from_adapter) and "lora_rank" not in train_raw
494
+ # the client cannot resolve a run id to the source adapter metadata, so rank 32 is only a
495
+ # serialization placeholder here. keep geometry checks and reject shapes that cannot fit even at
496
+ # the minimum valid rank; the server replaces this value from adapter_config.json before its
497
+ # authoritative allocation-time vram check.
498
+ preflight_train = (
499
+ {**train_raw, "lora_rank": MIN_LORA_RANK} if unresolved_warmstart_rank else train_raw
500
+ )
486
501
  preflight_gpu_count = provisional_gpu_count(
487
502
  model,
488
503
  algorithm,
489
- train=train_raw,
504
+ train=preflight_train,
490
505
  thinking=thinking,
491
506
  geometry_model_revision=model_revision,
492
507
  gpu_count=requested_gpu_count,
@@ -495,10 +510,16 @@ def _validate_gpu_section(
495
510
  if gpu_types and preflight_gpu_count <= 1 and not model_revision:
496
511
  from flash.providers.allocator import required_vram_gb
497
512
 
513
+ # sized from `preflight_train`, so an unresolved warm start is measured at rank 1 rather
514
+ # than at the placeholder. that is a true vram lower bound: no source adapter can need
515
+ # less. a card rejected here therefore cannot fit at any rank the source could turn out to
516
+ # have, which keeps an impossible pin (an 80 GB A100 for a run needing 180 GB at rank 1)
517
+ # rejected at parse time. relaxing the rank is not the same as dropping the check --
518
+ # dropping it would let the authored `gpu.type` go unvalidated entirely.
498
519
  required_vram = required_vram_gb(
499
520
  model,
500
521
  algorithm,
501
- train=train_raw,
522
+ train=preflight_train,
502
523
  thinking=thinking,
503
524
  )
504
525
  # every authored class is checked, not just the head: a fallback too small to hold the
@@ -517,7 +538,7 @@ def _validate_gpu_section(
517
538
  provisional_gpu(
518
539
  model,
519
540
  algorithm=algorithm,
520
- train=train_raw,
541
+ train=preflight_train,
521
542
  thinking=thinking,
522
543
  geometry_model_revision=model_revision,
523
544
  gpu_count=preflight_gpu_count,
@@ -529,7 +550,12 @@ def _validate_gpu_section(
529
550
 
530
551
 
531
552
  def _validate_algorithm_model_consistency(
532
- model: str, algorithm: str, thinking: bool, train_raw: dict[str, Any]
553
+ model: str,
554
+ algorithm: str,
555
+ thinking: bool,
556
+ train_raw: dict[str, Any],
557
+ *,
558
+ init_from_adapter: str,
533
559
  ) -> tuple[str, int, int]:
534
560
  """Validate algorithm and model-info consistency."""
535
561
  try:
@@ -547,7 +573,6 @@ def _validate_algorithm_model_consistency(
547
573
  f"{model} always emits <think> reasoning and cannot run with thinking "
548
574
  f"disabled; set thinking = true"
549
575
  )
550
- init_from_adapter = _init_from_adapter_ref(train_raw)
551
576
  if init_from_adapter and "lora_rank" in train_raw:
552
577
  raise ConfigError(
553
578
  "train.lora_rank cannot be set with train.init_from_adapter because source adapter "
@@ -558,7 +583,7 @@ def _validate_algorithm_model_consistency(
558
583
  "train.lora_alpha cannot be set with train.init_from_adapter because source adapter "
559
584
  "alpha metadata is authoritative"
560
585
  )
561
- lora_rank = _train_int(train_raw, "lora_rank", minimum=1) or 32
586
+ lora_rank = _train_int(train_raw, "lora_rank", minimum=MIN_LORA_RANK) or 32
562
587
  # unset -> the tuned 2 x rank default. authored -> the user's value, which need not be 2 x rank.
563
588
  lora_alpha = _train_int(train_raw, "lora_alpha", minimum=1) or 2 * lora_rank
564
589
  max_lora_rank = serving_lora_rank_cap(info)
@@ -590,16 +615,22 @@ def spec_from_dict(
590
615
  )
591
616
  except (TypeError, ValueError) as exc:
592
617
  raise ConfigError(str(exc)) from exc
618
+ init_from_adapter = _init_from_adapter_ref(train_raw)
593
619
  gpu_spec, gpu_count_auto = _validate_gpu_section(
594
620
  raw,
595
621
  model=model,
596
622
  model_revision=model_revision,
597
623
  algorithm=algorithm,
598
624
  train_raw=train_raw,
625
+ init_from_adapter=init_from_adapter,
599
626
  thinking=thinking,
600
627
  )
601
628
  init_from_adapter, lora_rank, lora_alpha = _validate_algorithm_model_consistency(
602
- model, algorithm, thinking, train_raw
629
+ model,
630
+ algorithm,
631
+ thinking,
632
+ train_raw,
633
+ init_from_adapter=init_from_adapter,
603
634
  )
604
635
  wandb_spec = _validate_wandb_section(raw)
605
636
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "freesolo-flash-dev"
3
- version = "1.2.97"
3
+ version = "1.2.100"
4
4
  description ="Flash — managed LoRA post-training (SFT/GRPO/OPD) for Freesolo environments, driven by the `flash` CLI"
5
5
  readme = "README.md"
6
6
  # RunPod Flash supports Python 3.11-3.12 (not 3.13 yet).
@@ -137,7 +137,7 @@ artifacts = ["flash/py.typed"]
137
137
  # auto-published by .github/workflows/publish-dev.yml: a push to `dev` whose version isn't yet on
138
138
  # PyPI publishes it; pushes that don't change it find it already published and no-op. So cutting a
139
139
  # dev-channel release = bump this (and [project].version) and merge to `dev`.
140
- version = "1.2.97"
140
+ version = "1.2.100"
141
141
 
142
142
  [tool.pytest.ini_options]
143
143
  pythonpath = ["."]
@@ -4779,3 +4779,41 @@ def test_the_lora_rollout_guard_does_not_wrap_itself_twice(monkeypatch):
4779
4779
 
4780
4780
  assert module.vLLMHttpServer.generate is first
4781
4781
  assert asyncio.run(module.vLLMHttpServer().generate([1], {}, "req-3"))[0] == "generated"
4782
+
4783
+
4784
+ @pytest.mark.parametrize(
4785
+ ("rollout_batch", "expected"),
4786
+ [(1, 16), (4, 16), (16, 16), (32, 32), (64, 64), (512, 512)],
4787
+ )
4788
+ def test_rollout_max_num_seqs_tracks_the_rollout_batch_above_the_floor(rollout_batch, expected):
4789
+ from flash.engine.worker.verl.capabilities import rollout_max_num_seqs
4790
+
4791
+ assert rollout_max_num_seqs(rollout_batch) == expected
4792
+
4793
+
4794
+ def test_rollout_max_num_seqs_never_returns_verls_default_for_a_small_batch():
4795
+ # the regression this exists for: verl leaves rollout.max_num_seqs at 1024, and vllm sizes
4796
+ # cuda-graph capture (min(max_num_seqs * 2, 512) over a 51-rung ladder, doubled when lora
4797
+ # specialization is on) and per-slot gdn/mamba recurrent state from it, both before the first
4798
+ # rollout token. a 32-sequence grpo step paid a 1024-sequence reservation and OOMed during
4799
+ # capture with ~80% of the card free.
4800
+ from flash.engine.worker.verl.capabilities import rollout_max_num_seqs
4801
+
4802
+ for batch in (8, 32, 64, 128):
4803
+ assert rollout_max_num_seqs(batch) < 1024
4804
+
4805
+
4806
+ def test_rollout_max_num_seqs_is_never_below_the_batch_it_must_serve():
4807
+ # provisioning FEWER slots than the step submits would queue sequences instead of running them,
4808
+ # turning one rollout into several scheduler passes.
4809
+ from flash.engine.worker.verl.capabilities import rollout_max_num_seqs
4810
+
4811
+ for batch in range(1, 600):
4812
+ assert rollout_max_num_seqs(batch) >= batch
4813
+
4814
+
4815
+ def test_rollout_max_num_seqs_rejects_a_nonpositive_batch():
4816
+ from flash.engine.worker.verl.capabilities import rollout_max_num_seqs
4817
+
4818
+ with pytest.raises(ValueError, match="rollout_batch must be positive"):
4819
+ rollout_max_num_seqs(0)