freesolo-flash-dev 1.0.71__tar.gz → 1.0.72__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 (392) hide show
  1. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/PKG-INFO +1 -1
  2. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/opd_train.py +35 -1
  3. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/runner/__init__.py +3 -3
  4. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/spec.py +4 -12
  5. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/pyproject.toml +2 -2
  6. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_grpo_resident_sizing.py +1 -2
  7. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_multi_gpu_gate.py +24 -31
  8. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_opd_train.py +54 -11
  9. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/uv.lock +1 -1
  10. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.dockerignore +0 -0
  11. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.env.example +0 -0
  12. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  13. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  14. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  15. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  16. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/dependabot.yml +0 -0
  17. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/auto-rebake.yml +0 -0
  18. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/bake-kernel-cache.yml +0 -0
  19. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/ci.yml +0 -0
  20. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/main-source-guard.yml +0 -0
  21. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/notify-tests-repo.yml +0 -0
  22. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/publish-dev.yml +0 -0
  23. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/publish-image.yml +0 -0
  24. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/publish.yml +0 -0
  25. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/version-parity.yml +0 -0
  26. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/worker-image.yml +0 -0
  27. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.gitignore +0 -0
  28. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/CODE_OF_CONDUCT.md +0 -0
  29. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/CONTRIBUTING.md +0 -0
  30. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/Dockerfile +0 -0
  31. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/Dockerfile.worker +0 -0
  32. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/LICENSE +0 -0
  33. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/NOTICE +0 -0
  34. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/README.md +0 -0
  35. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/SECURITY.md +0 -0
  36. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/build/kernel_cache/.gitignore +0 -0
  37. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/build/kernel_cache/.keep +0 -0
  38. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/docker/Dockerfile.kernelcache +0 -0
  39. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/docker/Dockerfile.kernelcache.relayer +0 -0
  40. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/docker/bake_kernel_cache.py +0 -0
  41. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/docker/bake_pod_entry.py +0 -0
  42. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/docker/kernel_fingerprint.py +0 -0
  43. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/docker/make_rp_handler.py +0 -0
  44. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/__init__.py +0 -0
  45. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/_channel.py +0 -0
  46. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/_fileio.py +0 -0
  47. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/_logging.py +0 -0
  48. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/_update_check.py +0 -0
  49. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/adapter_artifacts.py +0 -0
  50. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/catalog.py +0 -0
  51. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/TRAINING.md +0 -0
  52. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/__init__.py +0 -0
  53. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/__main__.py +0 -0
  54. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/_tty.py +0 -0
  55. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/commands.py +0 -0
  56. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/env_eval.py +0 -0
  57. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/env_setup.py +0 -0
  58. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/env_test.py +0 -0
  59. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/envpush.py +0 -0
  60. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/render.py +0 -0
  61. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/traces.py +0 -0
  62. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/training_doc.py +0 -0
  63. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/client/__init__.py +0 -0
  64. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/client/config.py +0 -0
  65. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/client/http.py +0 -0
  66. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/client/runtime_secrets.py +0 -0
  67. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/client/specs.py +0 -0
  68. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cost/__init__.py +0 -0
  69. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cost/analytical.py +0 -0
  70. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cost/facts.py +0 -0
  71. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cost/spec.py +0 -0
  72. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cost/types.py +0 -0
  73. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/diagnostics.py +0 -0
  74. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/__init__.py +0 -0
  75. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/accounting.py +0 -0
  76. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/multiturn_reward_scoring.py +0 -0
  77. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/recipe.py +0 -0
  78. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/reward_profile.py +0 -0
  79. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/steps.py +0 -0
  80. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/structured_outputs.py +0 -0
  81. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/vram.py +0 -0
  82. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/__init__.py +0 -0
  83. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/__main__.py +0 -0
  84. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/_pkg.py +0 -0
  85. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/adapter.py +0 -0
  86. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/backend_common.py +0 -0
  87. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/decoding.py +0 -0
  88. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/finalize.py +0 -0
  89. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/grpo.py +0 -0
  90. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/grpo_multiturn.py +0 -0
  91. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/grpo_plugin.py +0 -0
  92. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/heartbeat.py +0 -0
  93. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/hf.py +0 -0
  94. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/kernel_warmup.py +0 -0
  95. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/lora.py +0 -0
  96. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/multiturn_glue.py +0 -0
  97. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/opd.py +0 -0
  98. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/opd_gkd.py +0 -0
  99. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/opd_multiturn.py +0 -0
  100. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/opd_plugin.py +0 -0
  101. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/opd_structured.py +0 -0
  102. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/packing.py +0 -0
  103. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/perf/__init__.py +0 -0
  104. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/perf/attn.py +0 -0
  105. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/perf/diagnostics.py +0 -0
  106. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/perf/lifecycle.py +0 -0
  107. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/perf/liger.py +0 -0
  108. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/perf/loraplus.py +0 -0
  109. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/perf/memory.py +0 -0
  110. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/rl.py +0 -0
  111. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/rl_train.py +0 -0
  112. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/rng.py +0 -0
  113. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/rollout_samples.py +0 -0
  114. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/sft.py +0 -0
  115. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/sft_train.py +0 -0
  116. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/teacher.py +0 -0
  117. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/tokenizer_align.py +0 -0
  118. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/wandb_log.py +0 -0
  119. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker_entrypoint.py +0 -0
  120. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/envs/__init__.py +0 -0
  121. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/envs/adapter.py +0 -0
  122. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/envs/archive.py +0 -0
  123. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/envs/archive_policy.py +0 -0
  124. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/envs/base.py +0 -0
  125. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/envs/evaluations.py +0 -0
  126. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/envs/loader.py +0 -0
  127. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/envs/pull.py +0 -0
  128. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/envs/registry.py +0 -0
  129. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/lora_rank.py +0 -0
  130. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/multimodal.py +0 -0
  131. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/opd_retry_contract.py +0 -0
  132. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/opd_validation.py +0 -0
  133. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/__init__.py +0 -0
  134. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/_auth.py +0 -0
  135. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/_deadline.py +0 -0
  136. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/_hf_artifacts.py +0 -0
  137. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/_hf_retry.py +0 -0
  138. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/_http.py +0 -0
  139. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/_instance.py +0 -0
  140. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/_instance_bootstrap.py +0 -0
  141. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/_instance_poll.py +0 -0
  142. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/_instance_provider.py +0 -0
  143. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/_poll.py +0 -0
  144. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/_worker.py +0 -0
  145. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/allocator.py +0 -0
  146. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/base.py +0 -0
  147. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/lambdalabs/__init__.py +0 -0
  148. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/lambdalabs/api.py +0 -0
  149. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/lambdalabs/auth.py +0 -0
  150. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/lambdalabs/gpus.py +0 -0
  151. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/lambdalabs/jobs/__init__.py +0 -0
  152. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/lambdalabs/jobs/builders.py +0 -0
  153. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/lambdalabs/preflight.py +0 -0
  154. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/lambdalabs/pricing.py +0 -0
  155. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/preflight.py +0 -0
  156. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/realized.py +0 -0
  157. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/__init__.py +0 -0
  158. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/api.py +0 -0
  159. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/auth.py +0 -0
  160. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/cost.py +0 -0
  161. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/gpus.py +0 -0
  162. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/jobs.py +0 -0
  163. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/keys.py +0 -0
  164. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/preflight.py +0 -0
  165. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/pricing.py +0 -0
  166. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/slots.py +0 -0
  167. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/train/__init__.py +0 -0
  168. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/train/endpoints.py +0 -0
  169. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/vast/__init__.py +0 -0
  170. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/vast/api.py +0 -0
  171. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/vast/auth.py +0 -0
  172. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/vast/jobs/__init__.py +0 -0
  173. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/vast/jobs/builders.py +0 -0
  174. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/vast/preflight.py +0 -0
  175. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/vast/pricing.py +0 -0
  176. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/weight_cache_preload.py +0 -0
  177. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/py.typed +0 -0
  178. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/runner/checkpoints.py +0 -0
  179. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/runner/deploy.py +0 -0
  180. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/runner/lifecycle.py +0 -0
  181. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/runner/verified_revisions.py +0 -0
  182. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/schema/__init__.py +0 -0
  183. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/schema/fields.py +0 -0
  184. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/serve/__init__.py +0 -0
  185. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/serve/deploy.py +0 -0
  186. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/serve/export.py +0 -0
  187. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/serve/preflight.py +0 -0
  188. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/serve/pricing.py +0 -0
  189. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/serve/urls.py +0 -0
  190. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/__init__.py +0 -0
  191. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/__main__.py +0 -0
  192. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/_deps.py +0 -0
  193. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/_internal_client.py +0 -0
  194. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/_locks.py +0 -0
  195. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/_runtime.py +0 -0
  196. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/app.py +0 -0
  197. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/auth.py +0 -0
  198. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/billing.py +0 -0
  199. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/billing_retry.py +0 -0
  200. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/checkpoints.py +0 -0
  201. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/db.py +0 -0
  202. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/environment_registry.py +0 -0
  203. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/envs.py +0 -0
  204. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/projects.py +0 -0
  205. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/reconcile.py +0 -0
  206. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/repo_cleanup.py +0 -0
  207. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/routes/__init__.py +0 -0
  208. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/routes/envs.py +0 -0
  209. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/routes/meta.py +0 -0
  210. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/routes/runs.py +0 -0
  211. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/routes/serving.py +0 -0
  212. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/run_registry.py +0 -0
  213. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/thinking.py +0 -0
  214. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/infisical-entrypoint.sh +0 -0
  215. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/scripts/build_dev_dist.py +0 -0
  216. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/scripts/scrub_history.sh +0 -0
  217. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/__init__.py +0 -0
  218. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/_helpers/__init__.py +0 -0
  219. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/_helpers/runner.py +0 -0
  220. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/_helpers/specs.py +0 -0
  221. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/_helpers/vast.py +0 -0
  222. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/conftest.py +0 -0
  223. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/fixtures/math_eval.jsonl +0 -0
  224. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/fixtures/math_train.jsonl +0 -0
  225. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/live/__init__.py +0 -0
  226. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/live/conftest.py +0 -0
  227. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/live/test_lambda_live.py +0 -0
  228. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/live/test_runpod_live.py +0 -0
  229. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/live/test_vast_live.py +0 -0
  230. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_accounting_coverage.py +0 -0
  231. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_agent_flash_cli_contract.py +0 -0
  232. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_algorithms.py +0 -0
  233. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_allocator.py +0 -0
  234. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_async_uploads.py +0 -0
  235. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_backend_common.py +0 -0
  236. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_backend_jobspec_contract.py +0 -0
  237. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_base_model_provenance.py +0 -0
  238. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_billing_retry.py +0 -0
  239. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cancel_remote.py +0 -0
  240. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_catalog_consistency.py +0 -0
  241. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_charge_pricing.py +0 -0
  242. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_checkpoints.py +0 -0
  243. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_commands.py +0 -0
  244. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_commands_coverage.py +0 -0
  245. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_credential_shadowing.py +0 -0
  246. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_errors.py +0 -0
  247. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_estimate.py +0 -0
  248. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_gpus_flag.py +0 -0
  249. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_help.py +0 -0
  250. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_main_coverage.py +0 -0
  251. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_managed.py +0 -0
  252. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_render_coverage.py +0 -0
  253. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_render_theme.py +0 -0
  254. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_traces.py +0 -0
  255. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_wandb_warning.py +0 -0
  256. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_client.py +0 -0
  257. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_client_server_integration.py +0 -0
  258. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_client_stream_reads.py +0 -0
  259. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_config_overrides.py +0 -0
  260. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_controlled_experiment_repairs.py +0 -0
  261. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cost_analytical.py +0 -0
  262. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cost_equation.py +0 -0
  263. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cost_estimate.py +0 -0
  264. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cost_hardware.py +0 -0
  265. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cost_models.py +0 -0
  266. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cost_rewards.py +0 -0
  267. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_deploy_latency.py +0 -0
  268. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_dev_channel.py +0 -0
  269. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_disk_gb.py +0 -0
  270. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_endpoint_name.py +0 -0
  271. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_cache_evict.py +0 -0
  272. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_delete.py +0 -0
  273. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_download.py +0 -0
  274. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_download_api.py +0 -0
  275. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_evaluations.py +0 -0
  276. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_no_install.py +0 -0
  277. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_publish.py +0 -0
  278. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_pull.py +0 -0
  279. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_pull_coverage.py +0 -0
  280. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_pull_loader_coverage.py +0 -0
  281. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_pull_managed_control_plane.py +0 -0
  282. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_push.py +0 -0
  283. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_rate_limit_resolve.py +0 -0
  284. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_ref_pinning.py +0 -0
  285. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_test.py +0 -0
  286. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_envs_coverage.py +0 -0
  287. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_export.py +0 -0
  288. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_flash_mvp.py +0 -0
  289. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_flash_worker.py +0 -0
  290. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_flashinfer_cache_dirs.py +0 -0
  291. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_github_urlopen_retry.py +0 -0
  292. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_gpu_type_single_field.py +0 -0
  293. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_gpus.py +0 -0
  294. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_grpo_mask_aware.py +0 -0
  295. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_grpo_params.py +0 -0
  296. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_health_liveness.py +0 -0
  297. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_hf_retry.py +0 -0
  298. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_idle_endpoint_reaper.py +0 -0
  299. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_instance_bootstrap_coverage.py +0 -0
  300. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_internal_client.py +0 -0
  301. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_jobs.py +0 -0
  302. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_kernel_cache.py +0 -0
  303. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_kernel_fingerprint.py +0 -0
  304. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_kv_util.py +0 -0
  305. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_lambda_api_coverage.py +0 -0
  306. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_lambda_runner.py +0 -0
  307. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_logging.py +0 -0
  308. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_login_perms.py +0 -0
  309. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_lora_rank_coverage.py +0 -0
  310. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_lora_rank_preflight.py +0 -0
  311. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_managed_config_fields.py +0 -0
  312. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_managed_hf_repo.py +0 -0
  313. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_metrics_schema_agent_contract.py +0 -0
  314. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_mig_guard.py +0 -0
  315. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_multimodal_input_grads.py +0 -0
  316. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_multimodal_training.py +0 -0
  317. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_named_reward_metrics.py +0 -0
  318. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_oom_escalate_gpu.py +0 -0
  319. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_opd.py +0 -0
  320. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_opd_resume_safety.py +0 -0
  321. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_open_model_policy.py +0 -0
  322. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_orchestrator_flash.py +0 -0
  323. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_packing.py +0 -0
  324. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_packing_coverage.py +0 -0
  325. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_poll_helpers.py +0 -0
  326. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_preflight.py +0 -0
  327. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_projects.py +0 -0
  328. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_provider_preflight_coverage.py +0 -0
  329. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_provider_routing.py +0 -0
  330. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_provider_teardown_robustness.py +0 -0
  331. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_providers_symmetry.py +0 -0
  332. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_realized_cost.py +0 -0
  333. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_repo_cleanup.py +0 -0
  334. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_resolve_params_b.py +0 -0
  335. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_resume_on_retry.py +0 -0
  336. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_reward_profile.py +0 -0
  337. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_rl_train.py +0 -0
  338. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_rollout_samples.py +0 -0
  339. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_runmgmt.py +0 -0
  340. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_runpod_api_delete.py +0 -0
  341. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_runpod_key_fingerprint.py +0 -0
  342. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_runpod_key_waterfall.py +0 -0
  343. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_runpod_slots.py +0 -0
  344. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_serve.py +0 -0
  345. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_serve_reasoning_content.py +0 -0
  346. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_server_api.py +0 -0
  347. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_server_app_coverage.py +0 -0
  348. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_server_auth_singleflight.py +0 -0
  349. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_server_billing.py +0 -0
  350. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_server_checkpoints_coverage.py +0 -0
  351. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_server_db.py +0 -0
  352. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_server_envs_coverage.py +0 -0
  353. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_server_locks_coverage.py +0 -0
  354. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_serving_context_preflight.py +0 -0
  355. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_serving_contract.py +0 -0
  356. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_serving_pricing_coverage.py +0 -0
  357. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_serving_schema_coverage.py +0 -0
  358. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_sft_chunked_nll.py +0 -0
  359. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_sft_example_selection.py +0 -0
  360. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_sft_gc_off.py +0 -0
  361. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_sft_max_context.py +0 -0
  362. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_sft_train.py +0 -0
  363. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_spec_and_validation.py +0 -0
  364. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_step_metrics.py +0 -0
  365. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_structured_outputs.py +0 -0
  366. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_thinking_config.py +0 -0
  367. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_train_context_preflight.py +0 -0
  368. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_training_controls.py +0 -0
  369. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_update_check.py +0 -0
  370. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_vast_api.py +0 -0
  371. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_vast_api_coverage.py +0 -0
  372. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_vast_offers.py +0 -0
  373. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_vast_provider_coverage.py +0 -0
  374. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_vast_runner.py +0 -0
  375. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_verified_revisions.py +0 -0
  376. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_verifiers.py +0 -0
  377. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_version.py +0 -0
  378. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_vl_warmstart_adapter_keys.py +0 -0
  379. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_vram_architecture.py +0 -0
  380. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_wandb_link.py +0 -0
  381. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_wandb_log_coverage.py +0 -0
  382. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_wandb_naming.py +0 -0
  383. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_warmstart_adapter_download.py +0 -0
  384. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_warmstart_cross_repo.py +0 -0
  385. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_warmstart_error_attribution.py +0 -0
  386. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_weight_cache.py +0 -0
  387. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_worker_dryrun.py +0 -0
  388. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_worker_hardexit.py +0 -0
  389. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_worker_image.py +0 -0
  390. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_worker_init_heartbeat.py +0 -0
  391. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_worker_stack.py +0 -0
  392. {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_worker_thinking.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: freesolo-flash-dev
3
- Version: 1.0.71
3
+ Version: 1.0.72
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
@@ -38,6 +38,7 @@ from flash.engine.worker.backend_common import (
38
38
  parse_wandb_link,
39
39
  ray_num_cpus,
40
40
  render_wandb_link_shim,
41
+ resolve_blackwell_attention_backends,
41
42
  resolve_rollout_enforce_eager,
42
43
  resolve_verl_device_capability,
43
44
  resolve_verl_loggers,
@@ -1561,6 +1562,25 @@ def build_opd_overrides(config: dict) -> list[str]:
1561
1562
  # rollout.enforce_eager is a real verl field, so this is a plain override, not a '+' append.
1562
1563
  # the caller resolves it from the device capability; absent/false keeps verl's default.
1563
1564
  *(["actor_rollout_ref.rollout.enforce_eager=True"] if config.get("enforce_eager") else []),
1565
+ # blackwell attention pins, resolved by the caller and absent off blackwell. both are real
1566
+ # AsyncEngineArgs fields in the pinned vllm 0.19.1 and verl spreads engine_kwargs.vllm
1567
+ # straight into them, so '+' appends under the existing struct exactly as on the grpo path.
1568
+ *(
1569
+ [
1570
+ "+actor_rollout_ref.rollout.engine_kwargs.vllm.attention_backend="
1571
+ f"{config['attention_backend']}"
1572
+ ]
1573
+ if config.get("attention_backend")
1574
+ else []
1575
+ ),
1576
+ *(
1577
+ [
1578
+ "+actor_rollout_ref.rollout.engine_kwargs.vllm.mm_encoder_attn_backend="
1579
+ f"{config['mm_encoder_attn_backend']}"
1580
+ ]
1581
+ if config.get("mm_encoder_attn_backend")
1582
+ else []
1583
+ ),
1564
1584
  # keep the rollout engine RESIDENT for models whose vLLM wake/reload HANGS (catalog
1565
1585
  # sleep_unsupported), exactly as the grpo path does. opd is NOT exempt: main_ppo_sync calls
1566
1586
  # checkpoint_manager.sleep_replicas() during init_workers and again around validation, which
@@ -2389,7 +2409,19 @@ def run_opd_train(spec=None) -> None:
2389
2409
  # oom. see resolve_rollout_enforce_eager for why this one knob is enough and cannot fight
2390
2410
  # verl's: vllm resolves enforce_eager LAST (config/vllm.py:1024), after the async server has set
2391
2411
  # cudagraph_mode, and forces both compilation mode and cudagraph_mode to NONE.
2392
- enforce_eager = resolve_rollout_enforce_eager(resolve_verl_device_capability(python_bin))
2412
+ # one capability probe feeds both rollout decisions, as it does on the grpo path.
2413
+ verl_cc = resolve_verl_device_capability(python_bin)
2414
+ enforce_eager = resolve_rollout_enforce_eager(verl_cc)
2415
+ # the same grpo/opd divergence as enforce_eager above, one knob over: blackwell needs both
2416
+ # rollout attention backends pinned because vllm 0.19.1's defaults are wrong there, and opd
2417
+ # never pinned them. the ViT default routes into a CUTE flash-attn that is unimportable against
2418
+ # every published nvidia-cutlass-dsl, which aborts the engine with
2419
+ # `RuntimeError: Worker failed with error 'module 'cutlass.cute.core' has no attribute
2420
+ # 'ThrMma''` -- and a VL model builds its vision tower even for a text-only rollout, so this
2421
+ # reaches text-only opd too. no-op off blackwell. see resolve_blackwell_attention_backends.
2422
+ attention_backend, mm_encoder_attn_backend = resolve_blackwell_attention_backends(
2423
+ python_bin, verl_cc
2424
+ )
2393
2425
 
2394
2426
  plugin_path = os.path.join(shim_dir, "flash_opd_plugin.py")
2395
2427
  shutil.copy2(os.path.join(os.path.dirname(__file__), "opd_plugin.py"), plugin_path)
@@ -2489,6 +2521,8 @@ def run_opd_train(spec=None) -> None:
2489
2521
  "structured_outputs": structured_outputs,
2490
2522
  "fp8_kv": fp8_kv,
2491
2523
  "enforce_eager": enforce_eager,
2524
+ "attention_backend": attention_backend,
2525
+ "mm_encoder_attn_backend": mm_encoder_attn_backend,
2492
2526
  "sleep_unsupported": rollout_sleep_unsupported(model_id),
2493
2527
  "loggers": loggers,
2494
2528
  }
@@ -29,7 +29,7 @@ from flash.opd_retry_contract import (
29
29
  require_opd_retry_contract_version,
30
30
  )
31
31
  from flash.providers._poll import _MAX_ATTEMPT_ID, _attempt_int
32
- from flash.spec import MANAGED_GPU_KEYS, JobSpec, effective_backend
32
+ from flash.spec import MANAGED_GPU_KEYS, TRAINER_BACKEND, JobSpec
33
33
 
34
34
  _STATE_DIR = os.path.join(os.path.expanduser("~"), ".flash")
35
35
  RUNS_DIR = os.path.join(_STATE_DIR, "runs")
@@ -1207,7 +1207,7 @@ def _persist_effective_worker_spec(worker_spec: JobSpec) -> bool:
1207
1207
  "worker_spec": worker_spec.to_internal_dict(),
1208
1208
  "adapter_identity": adapter_identity,
1209
1209
  "preparation_digest": _preparation_digest(public_spec, worker_spec, adapter_identity),
1210
- "backend": effective_backend(public_spec),
1210
+ "backend": TRAINER_BACKEND,
1211
1211
  }
1212
1212
  return _update(
1213
1213
  worker_spec.run_id,
@@ -1297,7 +1297,7 @@ def submit_job(
1297
1297
  "preparation_digest": _preparation_digest(
1298
1298
  public_spec, worker_spec, prepared.adapter_identity
1299
1299
  ),
1300
- "backend": effective_backend(public_spec),
1300
+ "backend": TRAINER_BACKEND,
1301
1301
  },
1302
1302
  # Snapshot the instance providers available at submit so a later handle-less recovery can fail
1303
1303
  # closed for any phantom-capable one whose creds were since dropped (see _confirm_run_clear).
@@ -215,18 +215,10 @@ def validate_worker_env_reserved(worker_env: Any) -> None:
215
215
  )
216
216
 
217
217
 
218
- def effective_backend(spec: JobSpec) -> str:
219
- """the training backend this spec will actually run, as the worker resolves it.
220
-
221
- verl is the only backend: run_sft, run_opd and run_rl all delegate straight to it, so every
222
- spec resolves "verl" whatever [worker_env] says.
223
-
224
- kept as a function rather than folded into its call sites because the answer is load-bearing --
225
- it picks the allocator conf (a spec that resolved "trl" would take expandable_segments and crash
226
- its vLLM rollout outright, cumem.py CuMemAllocator assert) and gates multi-gpu, so the
227
- resolution belongs in one place even now that it has one answer.
228
- """
229
- return "verl"
218
+ # the trainer every run reports. run_sft, run_opd and run_rl all delegate straight to verl, so this
219
+ # is a constant rather than a resolution: nothing in [worker_env] or the spec can select anything
220
+ # else. recorded on effective_preparation so a stored run says which trainer produced it.
221
+ TRAINER_BACKEND = "verl"
230
222
 
231
223
 
232
224
  def require_matching_seed(spec: JobSpec, seed: Any) -> int:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "freesolo-flash-dev"
3
- version = "1.0.71"
3
+ version = "1.0.72"
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).
@@ -123,7 +123,7 @@ artifacts = ["flash/py.typed"]
123
123
  # auto-published by .github/workflows/publish-dev.yml: a push to `dev` whose version isn't yet on
124
124
  # PyPI publishes it; pushes that don't change it find it already published and no-op. So cutting a
125
125
  # dev-channel release = bump this (and [project].version) and merge to `dev`.
126
- version = "1.0.71"
126
+ version = "1.0.72"
127
127
 
128
128
  [tool.pytest.ini_options]
129
129
  pythonpath = ["."]
@@ -288,7 +288,7 @@ def test_a_stale_backend_key_cannot_change_the_allocator(stale_backend):
288
288
  trainer that cannot run, and "trl" on grpo/opd would hand verl's rollout the expandable conf that
289
289
  trips the CuMemAllocator assert before step 1."""
290
290
  from flash.providers._worker import build_worker_env
291
- from flash.spec import JobSpec, effective_backend
291
+ from flash.spec import JobSpec
292
292
 
293
293
  for algorithm, phase, expect_expandable in (
294
294
  ("grpo", "rl", False),
@@ -304,7 +304,6 @@ def test_a_stale_backend_key_cannot_change_the_allocator(stale_backend):
304
304
  }
305
305
  )
306
306
  env = build_worker_env(spec, 0)
307
- assert effective_backend(spec) == "verl"
308
307
  for key in ("PYTORCH_ALLOC_CONF", "PYTORCH_CUDA_ALLOC_CONF"):
309
308
  assert ("expandable_segments" in env[key]) is expect_expandable, (
310
309
  f"{algorithm} allocator moved under a stale {stale_backend!r} key"
@@ -42,33 +42,37 @@ def test_gate_helper_allows_single_gpu():
42
42
 
43
43
 
44
44
  @pytest.mark.parametrize("algorithm", ["sft", "grpo", "opd"])
45
- def test_gate_allows_multi_gpu_for_verl_backend(algorithm):
45
+ def test_gate_allows_multi_gpu_on_a_provider_that_rents_n_cards(algorithm):
46
+ # no phase has a selector left: run_sft, run_rl and run_opd all delegate to verl, whose worker
47
+ # launches nproc-per-node == gpu.count ranks. so multi-gpu needs no opt-in beyond the provider.
46
48
  from flash import runner
47
49
 
48
- # every verl worker launches nproc-per-node == gpu.count ranks, so all three shard.
49
- assert runner._require_supported_gpu_count(_spec(4, algorithm, backend="verl")) is None
50
-
51
-
52
- @pytest.mark.parametrize("algorithm", ["sft", "grpo", "opd"])
53
- def test_gate_allows_multi_gpu_with_no_key_at_all(algorithm):
54
- from flash import runner
55
-
56
- # no phase has a selector: run_sft, run_rl and run_opd all delegate to verl, so multi-gpu needs
57
- # no opt-in anywhere.
58
50
  assert runner._require_supported_gpu_count(_spec(4, algorithm)) is None
59
51
 
60
52
 
61
- @pytest.mark.parametrize("algorithm", ["sft", "grpo", "opd"])
62
- def test_a_stale_backend_key_cannot_downgrade_any_phase(algorithm):
53
+ @pytest.mark.parametrize("stale", ["verl", "trl", "bogus"])
54
+ @pytest.mark.parametrize("provider", ["runpod", "vast"])
55
+ def test_a_stale_backend_key_changes_no_gate_outcome(stale, provider):
56
+ """A [worker_env] selector carried over from the trl era must not move this gate either way.
57
+
58
+ Asserted as "same outcome as the identical spec WITHOUT the key" rather than as a fixed verdict:
59
+ a bare `is None` on a runpod spec passes no matter what the gate does with the key, since the
60
+ provider alone already decides it. Pairing against the no-key baseline on BOTH an accepting and
61
+ a rejecting provider is what makes the claim able to fail -- it breaks the moment the gate starts
62
+ reading worker_env, in either direction.
63
+ """
63
64
  from flash import runner
64
- from flash.spec import effective_backend
65
65
 
66
- # a config carried over from when these phases had selectors must not resolve a backend that no
67
- # longer exists: the worker would still run verl, and the gate would refuse it multi-gpu while
68
- # the launcher handed it trl's expandable_segments alloc conf (which kills verl's CuMemAllocator).
69
- spec = _spec(4, algorithm, backend="trl")
70
- assert effective_backend(spec) == "verl"
71
- assert runner._require_supported_gpu_count(spec) is None
66
+ def outcome(backend: str) -> str:
67
+ try:
68
+ runner._require_supported_gpu_count(
69
+ _spec(4, "grpo", backend=backend, provider=provider)
70
+ )
71
+ except ValueError as exc:
72
+ return f"rejected: {exc}"
73
+ return "allowed"
74
+
75
+ assert outcome(stale) == outcome("")
72
76
 
73
77
 
74
78
  def test_gate_rejects_multi_gpu_on_providers_that_ignore_count():
@@ -81,17 +85,6 @@ def test_gate_rejects_multi_gpu_on_providers_that_ignore_count():
81
85
  runner._require_supported_gpu_count(_spec(4, backend="verl", provider=provider))
82
86
 
83
87
 
84
- def test_effective_backend_is_verl_for_every_phase():
85
- from flash.spec import effective_backend
86
-
87
- # verl is the only backend. this stays pinned because the answer is load-bearing: it picks the
88
- # allocator conf and gates multi-gpu, and a spec that resolved anything else would take
89
- # expandable_segments and crash its vllm rollout on the CuMemAllocator assert.
90
- for algorithm in ("sft", "grpo", "opd"):
91
- assert effective_backend(_spec(1, algorithm)) == "verl"
92
- assert effective_backend(_spec(1, algorithm, backend="trl")) == "verl"
93
-
94
-
95
88
  def test_submit_job_rejects_multi_gpu_at_boundary(monkeypatch):
96
89
  from flash import runner
97
90
 
@@ -4641,10 +4641,57 @@ def test_the_resolved_eager_flag_reaches_the_opd_verl_config():
4641
4641
  # the string assertions above pass against a resolver whose answer is never carried into the
4642
4642
  # config, which is exactly the shape of the bug this fixes. pin the wiring.
4643
4643
  built = inspect.getsource(opd_train.run_opd_train)
4644
- assert "resolve_rollout_enforce_eager(resolve_verl_device_capability(python_bin))" in built
4644
+ # one probe now feeds both eager and the attention pins, so the call is bound to a name rather
4645
+ # than nested inline. assert the resolver still consumes THAT probe, not a second one.
4646
+ assert "verl_cc = resolve_verl_device_capability(python_bin)" in built
4647
+ assert "resolve_rollout_enforce_eager(verl_cc)" in built
4645
4648
  assert '"enforce_eager": enforce_eager,' in built
4646
4649
 
4647
4650
 
4651
+ def test_opd_pins_the_blackwell_attention_backends_like_grpo_does():
4652
+ """VERL-156: opd's rollout died on B200 because it never pinned the ViT attention backend.
4653
+
4654
+ vllm 0.19.1 defaults the ViT to a CUTE flash-attn that is unimportable against every published
4655
+ nvidia-cutlass-dsl, so the engine aborts with `cutlass.cute.core has no attribute 'ThrMma'`.
4656
+ grpo has pinned both backends since the trl driver; opd never did, which is the same one-sided
4657
+ fix that produced the enforce_eager bug directly above. two attempts on two fresh B200s
4658
+ reproduced it byte-identically before this was found.
4659
+ """
4660
+ # off blackwell the resolver answers (None, None) and nothing may be emitted -- an unconditional
4661
+ # pin would change the rollout on every other card.
4662
+ off = build_opd_overrides(_config())
4663
+ assert not any("attention_backend" in value for value in off)
4664
+
4665
+ on = build_opd_overrides(
4666
+ _config(attention_backend="FLASHINFER", mm_encoder_attn_backend="TORCH_SDPA")
4667
+ )
4668
+ # '+' appends under the existing engine_kwargs.vllm struct: these are AsyncEngineArgs fields
4669
+ # spread by verl, not declared RolloutConfig fields, so a bare assignment would not reach them.
4670
+ assert "+actor_rollout_ref.rollout.engine_kwargs.vllm.attention_backend=FLASHINFER" in on, on
4671
+ assert (
4672
+ "+actor_rollout_ref.rollout.engine_kwargs.vllm.mm_encoder_attn_backend=TORCH_SDPA" in on
4673
+ ), on
4674
+
4675
+
4676
+ def test_both_ray_rollouts_pin_blackwell_attention_from_the_same_resolver():
4677
+ # the enforce_eager cross-trainer check below exists because a one-sided fix is how that bug
4678
+ # shipped. the attention pins are the same divergence one knob over, so assert them the same
4679
+ # way rather than trusting opd alone.
4680
+ for module, source in (
4681
+ ("rl_train", inspect.getsource(rl_train.run_rl_train)),
4682
+ ("opd_train", inspect.getsource(opd_train.run_opd_train)),
4683
+ ):
4684
+ # the resolver must be CALLED and its second return value must be carried onward. the two
4685
+ # trainers spell the handoff differently (rl_train passes it as a kwarg into
4686
+ # _rl_runconfig, opd_train builds its config dict inline), so assert the binding both
4687
+ # share rather than either one's syntax.
4688
+ assert "resolve_blackwell_attention_backends(" in source, module
4689
+ assert "attention_backend, mm_encoder_attn_backend = " in source, module
4690
+ assert "mm_encoder_attn_backend=mm_encoder_attn_backend" in source or (
4691
+ '"mm_encoder_attn_backend": mm_encoder_attn_backend,' in source
4692
+ ), module
4693
+
4694
+
4648
4695
  def test_both_ray_rollouts_resolve_eager_from_the_same_hardware_probe():
4649
4696
  # asserted across BOTH trainers rather than in one file: grpo has resolved this since the trl
4650
4697
  # driver and opd did not, so opd captured 102 cuda graphs on an rtx 4090 and died on HOST ram
@@ -5384,19 +5431,17 @@ def test_opd_delegates_to_verl_with_no_selector_left(monkeypatch):
5384
5431
 
5385
5432
 
5386
5433
  def test_opd_spec_never_resolves_the_allocator_conf_that_kills_vllm(monkeypatch):
5387
- """An OPD spec must resolve backend "verl" and a NON-expandable allocator conf.
5434
+ """An OPD spec must build a NON-expandable allocator conf.
5388
5435
 
5389
- This is the regression the TRL deletion exposed. `effective_backend` defaulted to "trl" for any
5390
- phase whose worker_env carried no selector, and _worker.py maps a non-verl OPD run to
5391
- PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True. verl leaves rollout.enable_sleep_mode
5392
- defaulted True, so the engine always builds a CuMemAllocator, which asserts outright on
5393
- expandable_segments (cumem.py, pytorch#147851) -- the run would die before step 1.
5436
+ verl leaves rollout.enable_sleep_mode defaulted True, so the engine always builds a
5437
+ CuMemAllocator, which asserts outright on expandable_segments (cumem.py, pytorch#147851) -- the
5438
+ run would die before step 1.
5394
5439
 
5395
5440
  A [worker_env] selector must not be able to reintroduce it either: run_opd delegates to verl
5396
- unconditionally, so honoring the key would pick an allocator for a backend that cannot run.
5441
+ unconditionally, so honoring a stale key would pick an allocator for a backend that cannot run.
5397
5442
  """
5398
5443
  from flash.providers._worker import build_worker_env
5399
- from flash.spec import JobSpec, effective_backend
5444
+ from flash.spec import JobSpec
5400
5445
 
5401
5446
  def _spec(worker_env=None):
5402
5447
  payload = {
@@ -5415,7 +5460,6 @@ def test_opd_spec_never_resolves_the_allocator_conf_that_kills_vllm(monkeypatch)
5415
5460
  for worker_env in (None, {"FLASH_OPD_BACKEND": "trl"}, {"FLASH_OPD_BACKEND": "bogus"}):
5416
5461
  spec = _spec(worker_env)
5417
5462
  assert spec.phase == "opd"
5418
- assert effective_backend(spec) == "verl", worker_env
5419
5463
  alloc = build_worker_env(spec, spec.seed)["PYTORCH_CUDA_ALLOC_CONF"]
5420
5464
  assert "expandable_segments" not in alloc, (worker_env, alloc)
5421
5465
 
@@ -5431,7 +5475,6 @@ def test_opd_spec_never_resolves_the_allocator_conf_that_kills_vllm(monkeypatch)
5431
5475
  "gpu": {"type": "B200", "count": 1, "provider": "runpod"},
5432
5476
  }
5433
5477
  )
5434
- assert effective_backend(sft) == "verl"
5435
5478
  assert build_worker_env(sft, sft.seed)["PYTORCH_CUDA_ALLOC_CONF"] == "expandable_segments:True"
5436
5479
 
5437
5480
 
@@ -1025,7 +1025,7 @@ wheels = [
1025
1025
 
1026
1026
  [[package]]
1027
1027
  name = "freesolo-flash"
1028
- version = "1.0.71"
1028
+ version = "1.0.72"
1029
1029
  source = { editable = "." }
1030
1030
 
1031
1031
  [package.optional-dependencies]