freesolo-flash-dev 1.2.14__tar.gz → 1.2.22__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 (534) hide show
  1. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/PKG-INFO +1 -1
  2. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/ui/heartbeat.py +34 -9
  3. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/content/multimodal.py +4 -2
  4. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cost/analytical.py +48 -1
  5. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/io/heartbeat.py +13 -7
  6. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/opd_train_runner.py +3 -77
  7. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/rl_train_runner.py +30 -1
  8. freesolo_flash_dev-1.2.22/flash/engine/worker/train/opd/reporting.py +94 -0
  9. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/shims.py +378 -23
  10. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/identity.py +15 -0
  11. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/loader.py +11 -0
  12. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/__init__.py +9 -0
  13. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/artifacts.py +65 -30
  14. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/submit.py +13 -5
  15. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/routes/runs.py +3 -22
  16. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/pyproject.toml +2 -2
  17. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/_helpers/profile.py +5 -6
  18. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_render_theme.py +172 -2
  19. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_client_server_integration.py +6 -0
  20. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_controlled_experiment_repairs.py +10 -0
  21. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_rate_limit_resolve.py +37 -1
  22. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_multimodal_training.py +2 -38
  23. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_provider_routing.py +113 -0
  24. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_rl_train.py +498 -7
  25. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_server_billing.py +98 -2
  26. freesolo_flash_dev-1.2.22/tests/test_sft_startup_block.py +133 -0
  27. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_worker_init_heartbeat.py +73 -13
  28. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/uv.lock +1 -1
  29. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.dockerignore +0 -0
  30. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.env.example +0 -0
  31. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/CODEOWNERS +0 -0
  32. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  33. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  34. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  35. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  36. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/dependabot.yml +0 -0
  37. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/workflows/auto-rebake.yml +0 -0
  38. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/workflows/bake-kernel-cache.yml +0 -0
  39. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/workflows/ci.yml +0 -0
  40. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/workflows/main-source-guard.yml +0 -0
  41. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/workflows/notify-tests-repo.yml +0 -0
  42. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/workflows/publish-dev.yml +0 -0
  43. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/workflows/publish-image.yml +0 -0
  44. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/workflows/publish.yml +0 -0
  45. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/workflows/version-parity.yml +0 -0
  46. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/workflows/worker-image.yml +0 -0
  47. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.gitignore +0 -0
  48. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/CHANGELOG.md +0 -0
  49. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/CODE_OF_CONDUCT.md +0 -0
  50. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/CONTRIBUTING.md +0 -0
  51. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/Dockerfile +0 -0
  52. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/Dockerfile.worker +0 -0
  53. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/LICENSE +0 -0
  54. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/NOTICE +0 -0
  55. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/README.md +0 -0
  56. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/SECURITY.md +0 -0
  57. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/SELF_HOSTING.md +0 -0
  58. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/build/kernel_cache/.gitignore +0 -0
  59. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/build/kernel_cache/.keep +0 -0
  60. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/deploy/infisical/README.md +0 -0
  61. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/deploy/infisical/entrypoint.sh +0 -0
  62. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/docker/Dockerfile.kernelcache +0 -0
  63. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/docker/Dockerfile.kernelcache.relayer +0 -0
  64. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/docker/bake_kernel_cache.py +0 -0
  65. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/docker/bake_pod_entry.py +0 -0
  66. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/docker/extract_cudart_fix.py +0 -0
  67. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/docker/kernel_fingerprint.py +0 -0
  68. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/docker/make_rp_handler.py +0 -0
  69. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/__init__.py +0 -0
  70. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/_internal/__init__.py +0 -0
  71. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/_internal/channel.py +0 -0
  72. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/_internal/diagnostics.py +0 -0
  73. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/_internal/fileio.py +0 -0
  74. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/_internal/logging.py +0 -0
  75. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/_internal/paths.py +0 -0
  76. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/adapters/__init__.py +0 -0
  77. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/adapters/artifacts.py +0 -0
  78. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/adapters/lora_rank.py +0 -0
  79. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/__init__.py +0 -0
  80. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/__main__.py +0 -0
  81. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/__init__.py +0 -0
  82. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/deploy.py +0 -0
  83. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/__init__.py +0 -0
  84. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/episode.py +0 -0
  85. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/eval.py +0 -0
  86. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/eval_args.py +0 -0
  87. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/imports.py +0 -0
  88. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/list.py +0 -0
  89. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/push.py +0 -0
  90. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/retained.py +0 -0
  91. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/setup.py +0 -0
  92. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/test.py +0 -0
  93. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/test_evaluations.py +0 -0
  94. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/test_params.py +0 -0
  95. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/test_warnings.py +0 -0
  96. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/traces.py +0 -0
  97. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/train_cost.py +0 -0
  98. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/scaffold/TRAINING.md +0 -0
  99. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/scaffold/__init__.py +0 -0
  100. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/ui/__init__.py +0 -0
  101. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/ui/cost.py +0 -0
  102. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/ui/env_panels.py +0 -0
  103. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/ui/render.py +0 -0
  104. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/ui/tables.py +0 -0
  105. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/ui/tty.py +0 -0
  106. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/client/__init__.py +0 -0
  107. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/client/config.py +0 -0
  108. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/client/freesolo_api.py +0 -0
  109. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/client/http.py +0 -0
  110. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/client/runtime_secrets.py +0 -0
  111. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/client/shapes.py +0 -0
  112. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/client/specs.py +0 -0
  113. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/client/streaming.py +0 -0
  114. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/content/__init__.py +0 -0
  115. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/content/structured_outputs.py +0 -0
  116. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/content/thinking.py +0 -0
  117. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/core/__init__.py +0 -0
  118. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/core/catalog.py +0 -0
  119. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/core/spec.py +0 -0
  120. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cost/__init__.py +0 -0
  121. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cost/facts.py +0 -0
  122. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cost/spec.py +0 -0
  123. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cost/types.py +0 -0
  124. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/__init__.py +0 -0
  125. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/plan/__init__.py +0 -0
  126. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/plan/kv_sizing.py +0 -0
  127. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/plan/model_config_probe.py +0 -0
  128. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/plan/recipe.py +0 -0
  129. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/plan/steps.py +0 -0
  130. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/plan/vram.py +0 -0
  131. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/profiling/__init__.py +0 -0
  132. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/profiling/dataset_profile.py +0 -0
  133. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/profiling/reasoning_render.py +0 -0
  134. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/profiling/sft_workload.py +0 -0
  135. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/profiling/tokenizer.py +0 -0
  136. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/profiling/workload_profile.py +0 -0
  137. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/result/__init__.py +0 -0
  138. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/result/accounting.py +0 -0
  139. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/result/rollout_samples.py +0 -0
  140. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/__init__.py +0 -0
  141. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/__main__.py +0 -0
  142. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/backend_common.py +0 -0
  143. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/entry/__init__.py +0 -0
  144. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/entry/opd.py +0 -0
  145. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/entry/rl.py +0 -0
  146. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/entry/sft.py +0 -0
  147. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/io/__init__.py +0 -0
  148. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/io/hf.py +0 -0
  149. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/io/prefetch.py +0 -0
  150. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/io/wandb_log.py +0 -0
  151. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/model/__init__.py +0 -0
  152. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/model/adapter.py +0 -0
  153. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/model/decoding.py +0 -0
  154. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/model/lora.py +0 -0
  155. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/model/packing.py +0 -0
  156. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/opd_train.py +0 -0
  157. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/perf/__init__.py +0 -0
  158. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/perf/diagnostics.py +0 -0
  159. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/perf/lifecycle.py +0 -0
  160. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/perf/liger.py +0 -0
  161. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/perf/memory.py +0 -0
  162. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/rl_train.py +0 -0
  163. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/runtime/__init__.py +0 -0
  164. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
  165. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
  166. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/runtime/rng.py +0 -0
  167. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/score_batcher.py +0 -0
  168. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/sft_train.py +0 -0
  169. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/sft_train_runner.py +0 -0
  170. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/teacher/__init__.py +0 -0
  171. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/teacher/client.py +0 -0
  172. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/teacher/encoding.py +0 -0
  173. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
  174. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/__init__.py +0 -0
  175. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/core/__init__.py +0 -0
  176. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/core/child/__init__.py +0 -0
  177. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/core/child/glue.py +0 -0
  178. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/finalize.py +0 -0
  179. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/__init__.py +0 -0
  180. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/batching.py +0 -0
  181. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/bridge.py +0 -0
  182. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/child/__init__.py +0 -0
  183. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/child/bridge.py +0 -0
  184. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
  185. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/child/plugin.py +0 -0
  186. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/child/structured.py +0 -0
  187. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/failures.py +0 -0
  188. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/gkd.py +0 -0
  189. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
  190. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/overrides.py +0 -0
  191. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/prompts.py +0 -0
  192. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/scoring.py +0 -0
  193. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/validation.py +0 -0
  194. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/__init__.py +0 -0
  195. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/checkpoints.py +0 -0
  196. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/child/__init__.py +0 -0
  197. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
  198. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/child/plugin.py +0 -0
  199. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/config.py +0 -0
  200. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/inputs.py +0 -0
  201. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/multi_turn.py +0 -0
  202. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/scoring.py +0 -0
  203. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/single_turn.py +0 -0
  204. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/verl_config.py +0 -0
  205. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/sft/__init__.py +0 -0
  206. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/sft/checkpoints.py +0 -0
  207. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/sft/config.py +0 -0
  208. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/verl/__init__.py +0 -0
  209. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/verl/capabilities.py +0 -0
  210. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/verl/checkpoints.py +0 -0
  211. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/verl/child_io.py +0 -0
  212. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/verl/diagnostics.py +0 -0
  213. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/verl/parallelism.py +0 -0
  214. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker_entrypoint.py +0 -0
  215. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/__init__.py +0 -0
  216. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/adapter.py +0 -0
  217. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/base.py +0 -0
  218. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/cache_security.py +0 -0
  219. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/dataset_selection.py +0 -0
  220. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/evaluations.py +0 -0
  221. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/namespace_listing.py +0 -0
  222. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/package/__init__.py +0 -0
  223. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/package/limits.py +0 -0
  224. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/package/unpack.py +0 -0
  225. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/pull.py +0 -0
  226. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/__init__.py +0 -0
  227. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/__init__.py +0 -0
  228. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/auth.py +0 -0
  229. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/bootstrap.py +0 -0
  230. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
  231. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
  232. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/deadline.py +0 -0
  233. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/http.py +0 -0
  234. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/instance.py +0 -0
  235. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/poll.py +0 -0
  236. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/poll_instance.py +0 -0
  237. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/provider.py +0 -0
  238. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/worker.py +0 -0
  239. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/allocator.py +0 -0
  240. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/artifacts/__init__.py +0 -0
  241. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/artifacts/hf.py +0 -0
  242. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/artifacts/preload_runpod.py +0 -0
  243. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/artifacts/weight_cache.py +0 -0
  244. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/base.py +0 -0
  245. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/fit_errors.py +0 -0
  246. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/lambda_/__init__.py +0 -0
  247. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/lambda_/api.py +0 -0
  248. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/lambda_/auth.py +0 -0
  249. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/lambda_/gpus.py +0 -0
  250. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/lambda_/jobs/__init__.py +0 -0
  251. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/lambda_/jobs/builders.py +0 -0
  252. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/lambda_/jobs/reap.py +0 -0
  253. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/lambda_/preflight.py +0 -0
  254. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/lambda_/pricing.py +0 -0
  255. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/preflight.py +0 -0
  256. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/realized.py +0 -0
  257. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/__init__.py +0 -0
  258. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/api.py +0 -0
  259. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/auth.py +0 -0
  260. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/cost.py +0 -0
  261. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/gpus.py +0 -0
  262. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/job_execution.py +0 -0
  263. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/jobs.py +0 -0
  264. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/preflight.py +0 -0
  265. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/pricing.py +0 -0
  266. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/resources.py +0 -0
  267. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/serverless/__init__.py +0 -0
  268. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/serverless/endpoints.py +0 -0
  269. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/sharding.py +0 -0
  270. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/vast/__init__.py +0 -0
  271. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/vast/api.py +0 -0
  272. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/vast/auth.py +0 -0
  273. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/vast/jobs/__init__.py +0 -0
  274. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/vast/jobs/builders.py +0 -0
  275. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/vast/preflight.py +0 -0
  276. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/vast/pricing.py +0 -0
  277. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/py.typed +0 -0
  278. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/attempts.py +0 -0
  279. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/costs.py +0 -0
  280. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/deadlines.py +0 -0
  281. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/preparation.py +0 -0
  282. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/reconciliation.py +0 -0
  283. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/results/__init__.py +0 -0
  284. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/results/checkpoints.py +0 -0
  285. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/results/verified_revisions.py +0 -0
  286. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/status.py +0 -0
  287. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/supervise/__init__.py +0 -0
  288. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/supervise/attach.py +0 -0
  289. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/supervise/deploy.py +0 -0
  290. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/supervise/lifecycle.py +0 -0
  291. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/supervise/recovery.py +0 -0
  292. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/supervise/retry_decision.py +0 -0
  293. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/supervise/seed_submission.py +0 -0
  294. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/supervise/transitions.py +0 -0
  295. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/weight_cache.py +0 -0
  296. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/schema/__init__.py +0 -0
  297. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/schema/fields.py +0 -0
  298. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/serve/__init__.py +0 -0
  299. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/serve/adapter_check.py +0 -0
  300. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/serve/deploy.py +0 -0
  301. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/serve/errors.py +0 -0
  302. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/serve/export.py +0 -0
  303. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/serve/preflight.py +0 -0
  304. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/serve/responses.py +0 -0
  305. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/serve/streaming.py +0 -0
  306. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/serve/thinking.py +0 -0
  307. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/serve/urls.py +0 -0
  308. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/__init__.py +0 -0
  309. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/__main__.py +0 -0
  310. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/app.py +0 -0
  311. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/billing/__init__.py +0 -0
  312. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/billing/charges.py +0 -0
  313. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/billing/retry.py +0 -0
  314. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/domain/__init__.py +0 -0
  315. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/domain/checkpoints.py +0 -0
  316. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/domain/environment_registry.py +0 -0
  317. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/domain/envs.py +0 -0
  318. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/domain/projects.py +0 -0
  319. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/domain/reconcile.py +0 -0
  320. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/domain/repo_cleanup.py +0 -0
  321. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/domain/run_registry.py +0 -0
  322. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/domain/teacher_broker.py +0 -0
  323. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/domain/teacher_errors.py +0 -0
  324. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/domain/teacher_requests.py +0 -0
  325. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/platform/__init__.py +0 -0
  326. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/platform/auth.py +0 -0
  327. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/platform/db.py +0 -0
  328. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/platform/deps.py +0 -0
  329. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/platform/internal_client.py +0 -0
  330. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/platform/locks.py +0 -0
  331. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/platform/runtime.py +0 -0
  332. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/routes/__init__.py +0 -0
  333. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/routes/envs.py +0 -0
  334. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/routes/meta.py +0 -0
  335. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/routes/serving.py +0 -0
  336. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/routes/serving_completion.py +0 -0
  337. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/routes/serving_revisions.py +0 -0
  338. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/routes/serving_smoke.py +0 -0
  339. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/routes/teacher.py +0 -0
  340. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/teacher/__init__.py +0 -0
  341. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/teacher/limits.py +0 -0
  342. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/teacher/retry_contract.py +0 -0
  343. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/scripts/build_dev_dist.py +0 -0
  344. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/scripts/check_file_size.py +0 -0
  345. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/scripts/check_function_size.py +0 -0
  346. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/scripts/check_verl_pin_exists.py +0 -0
  347. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/scripts/scrub_history.sh +0 -0
  348. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/__init__.py +0 -0
  349. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/_helpers/__init__.py +0 -0
  350. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/_helpers/runner.py +0 -0
  351. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/_helpers/specs.py +0 -0
  352. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/_helpers/teacher.py +0 -0
  353. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/_helpers/vast.py +0 -0
  354. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/conftest.py +0 -0
  355. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/fixtures/math_eval.jsonl +0 -0
  356. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/fixtures/math_train.jsonl +0 -0
  357. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/live/__init__.py +0 -0
  358. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/live/conftest.py +0 -0
  359. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/live/test_lambda_live.py +0 -0
  360. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/live/test_runpod_live.py +0 -0
  361. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/live/test_sft_thinking_render_live.py +0 -0
  362. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/live/test_vast_live.py +0 -0
  363. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_accounting_coverage.py +0 -0
  364. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_adapter_shard_completeness.py +0 -0
  365. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_agent_flash_cli_contract.py +0 -0
  366. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_algorithms.py +0 -0
  367. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_allocator.py +0 -0
  368. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_backend_common.py +0 -0
  369. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_backend_jobspec_contract.py +0 -0
  370. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_bake_kernel_cache.py +0 -0
  371. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_base_model_provenance.py +0 -0
  372. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_billing_retry.py +0 -0
  373. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_build_context_contract.py +0 -0
  374. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cancel_remote.py +0 -0
  375. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_catalog_consistency.py +0 -0
  376. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_catalog_only_models.py +0 -0
  377. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_charge_pricing.py +0 -0
  378. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_checkpoints.py +0 -0
  379. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_commands.py +0 -0
  380. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_commands_coverage.py +0 -0
  381. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_credential_shadowing.py +0 -0
  382. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_errors.py +0 -0
  383. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_estimate.py +0 -0
  384. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_gpus_flag.py +0 -0
  385. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_help.py +0 -0
  386. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_main_coverage.py +0 -0
  387. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_managed.py +0 -0
  388. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_render_coverage.py +0 -0
  389. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_traces.py +0 -0
  390. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_wandb_warning.py +0 -0
  391. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_client.py +0 -0
  392. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_client_import_purity.py +0 -0
  393. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_client_stream_reads.py +0 -0
  394. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_config_env_vars.py +0 -0
  395. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_config_overrides.py +0 -0
  396. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cost_analytical.py +0 -0
  397. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cost_equation.py +0 -0
  398. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cost_estimate.py +0 -0
  399. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cost_hardware.py +0 -0
  400. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cost_models.py +0 -0
  401. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_dataset_profile.py +0 -0
  402. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_deploy_latency.py +0 -0
  403. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_dev_channel.py +0 -0
  404. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_disk_gb.py +0 -0
  405. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_endpoint_name.py +0 -0
  406. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_cache_evict.py +0 -0
  407. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_delete.py +0 -0
  408. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_download.py +0 -0
  409. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_download_api.py +0 -0
  410. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_evaluations.py +0 -0
  411. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_list_api.py +0 -0
  412. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_list_cli.py +0 -0
  413. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_list_hub.py +0 -0
  414. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_no_install.py +0 -0
  415. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_publish.py +0 -0
  416. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_pull.py +0 -0
  417. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_pull_coverage.py +0 -0
  418. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_pull_loader_coverage.py +0 -0
  419. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_pull_managed_control_plane.py +0 -0
  420. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_push.py +0 -0
  421. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_ref_pinning.py +0 -0
  422. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_test.py +0 -0
  423. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_envs_coverage.py +0 -0
  424. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_export.py +0 -0
  425. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_flash_mvp.py +0 -0
  426. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_flash_worker.py +0 -0
  427. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_flashinfer_cache_dirs.py +0 -0
  428. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_freesolo_api_transport.py +0 -0
  429. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_github_urlopen_retry.py +0 -0
  430. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_gpu_type_single_field.py +0 -0
  431. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_gpus.py +0 -0
  432. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_grpo_params.py +0 -0
  433. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_grpo_resident_sizing.py +0 -0
  434. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_grpo_reward_batching.py +0 -0
  435. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_health_liveness.py +0 -0
  436. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_hf_retry.py +0 -0
  437. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_idle_endpoint_reaper.py +0 -0
  438. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_infisical_secrets.py +0 -0
  439. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_instance_bootstrap_coverage.py +0 -0
  440. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_internal_client.py +0 -0
  441. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_jobs.py +0 -0
  442. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_kernel_cache.py +0 -0
  443. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_kernel_fingerprint.py +0 -0
  444. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_kv_util.py +0 -0
  445. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_lambda_api_coverage.py +0 -0
  446. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_lambda_runner.py +0 -0
  447. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_logging.py +0 -0
  448. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_login_perms.py +0 -0
  449. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_lora_rank_coverage.py +0 -0
  450. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_lora_rank_preflight.py +0 -0
  451. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_managed_config_fields.py +0 -0
  452. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_managed_hf_repo.py +0 -0
  453. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_metrics_schema_agent_contract.py +0 -0
  454. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_mig_guard.py +0 -0
  455. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_multi_gpu_gate.py +0 -0
  456. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_named_reward_metrics.py +0 -0
  457. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_oom_escalate_gpu.py +0 -0
  458. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_opd.py +0 -0
  459. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_opd_limits.py +0 -0
  460. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_opd_multiturn_eos_boundary.py +0 -0
  461. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_opd_resume_safety.py +0 -0
  462. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_opd_train.py +0 -0
  463. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_orchestrator_flash.py +0 -0
  464. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_packing.py +0 -0
  465. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_packing_coverage.py +0 -0
  466. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_parasail_teacher.py +0 -0
  467. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_poll_helpers.py +0 -0
  468. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_preflight.py +0 -0
  469. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_projects.py +0 -0
  470. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_provider_preflight_coverage.py +0 -0
  471. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_provider_teardown_robustness.py +0 -0
  472. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_providers_symmetry.py +0 -0
  473. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_realized_cost.py +0 -0
  474. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_repo_cleanup.py +0 -0
  475. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_resolve_params_b.py +0 -0
  476. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_resume_on_retry.py +0 -0
  477. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_rollout_samples.py +0 -0
  478. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_runmgmt.py +0 -0
  479. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_runpod_api_delete.py +0 -0
  480. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_runpod_key_fingerprint.py +0 -0
  481. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_runpod_key_waterfall.py +0 -0
  482. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_serve.py +0 -0
  483. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_serve_reasoning_content.py +0 -0
  484. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_server_api.py +0 -0
  485. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_server_app_coverage.py +0 -0
  486. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_server_auth_singleflight.py +0 -0
  487. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_server_checkpoints_coverage.py +0 -0
  488. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_server_db.py +0 -0
  489. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_server_envs_coverage.py +0 -0
  490. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_server_locks_coverage.py +0 -0
  491. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_server_standalone.py +0 -0
  492. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_serving_context_preflight.py +0 -0
  493. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_serving_contract.py +0 -0
  494. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_serving_schema_coverage.py +0 -0
  495. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_sft_chunked_nll.py +0 -0
  496. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_sft_example_selection.py +0 -0
  497. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_sft_gc_off.py +0 -0
  498. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_sft_max_context.py +0 -0
  499. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_sft_train.py +0 -0
  500. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_sft_workload.py +0 -0
  501. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_spec_and_validation.py +0 -0
  502. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_step_floor.py +0 -0
  503. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_step_metrics.py +0 -0
  504. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_structured_outputs.py +0 -0
  505. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_teacher_broker.py +0 -0
  506. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_teacher_encoding_contract.py +0 -0
  507. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_thinking_config.py +0 -0
  508. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_train_context_preflight.py +0 -0
  509. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_training_controls.py +0 -0
  510. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_type_comment_prose.py +0 -0
  511. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_vast_api.py +0 -0
  512. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_vast_api_coverage.py +0 -0
  513. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_vast_offers.py +0 -0
  514. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_vast_provider_coverage.py +0 -0
  515. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_vast_runner.py +0 -0
  516. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_verified_revisions.py +0 -0
  517. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_verifiers.py +0 -0
  518. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_version.py +0 -0
  519. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_vl_warmstart_adapter_keys.py +0 -0
  520. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_vram_architecture.py +0 -0
  521. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_wandb_link.py +0 -0
  522. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_wandb_naming.py +0 -0
  523. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_warmstart_adapter_download.py +0 -0
  524. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_warmstart_cross_repo.py +0 -0
  525. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_warmstart_error_attribution.py +0 -0
  526. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_weight_cache.py +0 -0
  527. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_worker_dryrun.py +0 -0
  528. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_worker_hardexit.py +0 -0
  529. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_worker_image.py +0 -0
  530. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_worker_stack.py +0 -0
  531. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_worker_thinking.py +0 -0
  532. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_workflow_contracts.py +0 -0
  533. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_workload_profile.py +0 -0
  534. {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/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.14
3
+ Version: 1.2.22
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
@@ -13,6 +13,7 @@ CLI tests reach them.
13
13
 
14
14
  from __future__ import annotations
15
15
 
16
+ import math
16
17
  import time
17
18
 
18
19
  from flash.cli.ui.render import _dim
@@ -114,10 +115,13 @@ _QUIET_HEARTBEAT_HINT = (
114
115
  # than on 900s -- the incident that motivated this reported 559s and 687s, squarely inside that
115
116
  # window, where a 900s gate would stay silent and leave only the dead-end quiet hint.
116
117
  _STALE_STEP_AFTER_S = _HB_QUIET_HINT_AFTER_S
117
- # only the stages the worker actually holds on the 900s upload throttle. opd_step is excluded: its
118
- # post-update ping is force=True, so it re-commits at the 60s forced floor and an opd_step older
119
- # than 900s means a long step, failed uploads, or a real stall -- not reporting lag.
120
- _TRAINING_STEP_STAGES = frozenset({"rl_step", "sft_step"})
118
+ # progress_age_s is the age of latest known progress at payload build time. combine it with upload age
119
+ # for a conservative current bound, and speak once that bound reaches the throttle without claiming
120
+ # either health or a stall: newer progress may be uncommitted, or the worker may be silent.
121
+ _UPLOAD_THROTTLE_S = 900.0
122
+ # only the stages the worker actually holds on the 900s upload throttle. opd_step emits ordinary
123
+ # post-step and liveness heartbeats, so its uploaded step can lag just like rl_step and sft_step.
124
+ _TRAINING_STEP_STAGES = frozenset({"opd_step", "rl_step", "sft_step"})
121
125
 
122
126
  # the setup stages that hold a liveness thread on the 240s tight cadence (_HB_SETUP_LIVENESS_INTERVAL_S).
123
127
  # these are the ones where age is genuinely informative: the worker pings every 240s while alive, so
@@ -255,8 +259,6 @@ def _stale_step_hint(
255
259
  # throttled progress hides that the replacement has published nothing.
256
260
  if not current_attempt:
257
261
  return None
258
- if heartbeat_age_seconds <= _STALE_STEP_AFTER_S:
259
- return None
260
262
  if str(heartbeat.get("stage") or "") not in _TRAINING_STEP_STAGES:
261
263
  return None
262
264
  # step 0 is the cold, still-running first step: no optimizer update has landed, so there is no
@@ -266,9 +268,32 @@ def _stale_step_hint(
266
268
 
267
269
  if not is_training_heartbeat(heartbeat.get("stage"), heartbeat.get("step")):
268
270
  return None
269
- # do not suggest `runs log -f`: it shows control-plane logs, and worker output arrives only after
270
- # termination (flash/cli/commands/__init__.py cmd_log) on a 3600s upload interval. use heartbeat age against
271
- # the 900s throttle, with w&b as the optional live signal.
271
+ progress_age_s = heartbeat.get("progress_age_s")
272
+ progress_age: float | None = None
273
+ if not isinstance(progress_age_s, bool):
274
+ try:
275
+ candidate = float(progress_age_s)
276
+ except (OverflowError, TypeError, ValueError):
277
+ pass
278
+ else:
279
+ if candidate >= 0 and math.isfinite(candidate):
280
+ progress_age = candidate
281
+ if progress_age is not None:
282
+ progress_age_bound_s = heartbeat_age_seconds + progress_age
283
+ if progress_age_bound_s >= _UPLOAD_THROTTLE_S:
284
+ return (
285
+ "the step above is the last one UPLOADED; "
286
+ f"the last known progress can be as old as {progress_age_bound_s:.1f}s. upload "
287
+ "throttling no longer explains the gap, but newer progress may be uncommitted and "
288
+ "a long step may still be running; this signal does not show recent progress"
289
+ )
290
+ # below the 900s hold, throttling still explains the visible lag. fall through to the exact
291
+ # pre-existing reading so new workers never lose guidance in the incident's 300-900s band.
292
+ if heartbeat_age_seconds <= _STALE_STEP_AFTER_S:
293
+ return None
294
+ # old workers do not publish progress_age_s. keep their existing throttle-only reading exactly so
295
+ # content-addressed in-flight runs do not change interpretation when the CLI upgrades. invalid
296
+ # progress ages use the same fallback because they provide no trustworthy worker-side reading.
272
297
  return (
273
298
  "the step above is the last one UPLOADED, not necessarily the one training is on; "
274
299
  "a throttled worker can hold it for many minutes while the trainer advances normally. "
@@ -697,8 +697,8 @@ def _read_json_records(path: Path) -> list[dict]:
697
697
  return value
698
698
 
699
699
 
700
- def preflight_validate_image_opd(spec) -> None:
701
- """Validate statically discoverable image OPD datasets before GPU allocation."""
700
+ def preflight_validate_image_opd(spec, *, scan_packaged_environment: bool = True) -> None:
701
+ """validate statically discoverable image opd datasets before gpu allocation."""
702
702
  if getattr(spec, "algorithm", "") != "opd":
703
703
  return
704
704
  environment = getattr(spec, "environment", None)
@@ -708,6 +708,8 @@ def preflight_validate_image_opd(spec) -> None:
708
708
  if not isinstance(records, list) or not all(isinstance(row, dict) for row in records):
709
709
  return
710
710
  else:
711
+ if not scan_packaged_environment:
712
+ return
711
713
  from flash.envs.loader import (
712
714
  _packaged_dataset_file,
713
715
  _resolve_environment_reference,
@@ -87,6 +87,49 @@ def step_floor_seconds(gpu: str, completions: int) -> float:
87
87
  # by matched multi-card measurements.
88
88
  STEP_FLOOR_SHARDED_FRACTION = 0.799
89
89
 
90
+ # --- sft training-side startup block + per-step floor -------------------------------------------
91
+ # the flops term alone quoted sft at 28.6x UNDER the realized train wall (geometric, 17 measured
92
+ # runpod arms, 0/17 inside the 0.70-1.43x band). it is the same structural gap the rollout floor
93
+ # above closed for grpo, and it is NOT the cold start in `setup_seconds`: `setup_seconds` and
94
+ # `train_wall` are DISJOINT intervals in the worker (sft_train.py stamps setup before launching the
95
+ # training subprocess, and train_wall wraps `run_verl_training` plus the upload drain), so verl
96
+ # startup, model load, lora wrap and fsdp init sit INSIDE the billed train wall and were priced at
97
+ # zero.
98
+ #
99
+ # the block scales with model size -- measured median implied block 82s at 0.8B against 248s at 4B --
100
+ # so a size-blind constant cannot cover both: at the same in-band count it leaves a 3.75x worst arm
101
+ # and log-sd 0.50, against 2.13x and 0.32 for the size-scaled form below.
102
+ #
103
+ # fitted over 17 arms (2 cards, 2 model sizes, step counts 2/32/64/128/256, including the replicate
104
+ # groups) and selected by holding out an ENTIRE step-count class at a time, the same methodology
105
+ # that chose the rollout floor: a random holdout cannot test whether a form extrapolates to a shape
106
+ # it never saw. least squares lands at (58.3, 44.3, 0.948); the shipped triple is the rounded
107
+ # neighbour that survives holdout best. scored: 28.596x -> 1.013x geometric, 0/17 -> 14/17 in band,
108
+ # worst arm 1135x -> 2.13x, and it holds under a model holdout in both directions (0.8B 1.005x,
109
+ # 4B 1.033x), so the size term is not an artifact of the size that dominates the sample.
110
+ #
111
+ # KNOWN RESIDUAL, and the reason this is not tuned further: the same config on a different runpod
112
+ # HOST CLASS (nvidia driver build) spans 1.56x-1.88x, while replicates within one build agree to
113
+ # 1.01x-1.03x. the quote cannot observe which build it will be handed, so roughly half the remaining
114
+ # per-arm error is hardware the estimator has no input for. re-fitting below that resolution would
115
+ # be fitting the confounder. evidence: /home/azureuser/benchmark/cost-calib-20260801/ISSUES.md.
116
+ SFT_STARTUP_BASE_SECONDS = 60.0
117
+ SFT_STARTUP_SECONDS_PER_PARAM_B = 40.0
118
+ SFT_STEP_FLOOR_SECONDS = 0.8
119
+
120
+
121
+ def sft_overhead_seconds(config: RunConfig, steps: int) -> float:
122
+ """Training-wall seconds an sft run pays outside its flops term.
123
+
124
+ A one-time startup block that grows with checkpoint size, plus a per-step floor. Neither is
125
+ divided by card count: the block is model load and framework init that every rank pays, and the
126
+ per-step floor is dominated by the same non-shardable publish/sync work as the rollout floor.
127
+ """
128
+ n = config.normalized()
129
+ params_b = total_params_b(n.model_id, n.model_revision)
130
+ block = SFT_STARTUP_BASE_SECONDS + SFT_STARTUP_SECONDS_PER_PARAM_B * params_b
131
+ return block + SFT_STEP_FLOOR_SECONDS * max(0, steps)
132
+
90
133
 
91
134
  def _step_floor_seconds_for(config: RunConfig, gpu: str) -> float:
92
135
  """Step-floor seconds ``config`` pays on ``gpu``; 0 for sft, which runs no rollout."""
@@ -814,12 +857,16 @@ def estimate_cost(
814
857
  # training GPU time, so it belongs in the (billed) train term, not setup. Required saves are also
815
858
  # synchronous fixed overhead; neither is divided by the number of cards.
816
859
  compile_s = compile_seconds(config, gpu)
817
- raw_train = compile_s + config.steps * sps + required_save_s
860
+ # sft pays a startup block and per-step floor inside its BILLED train wall that the flops term
861
+ # does not model (see sft_overhead_seconds); grpo/opd carry the equivalent in their step floor.
862
+ sft_overhead_s = sft_overhead_seconds(config, config.steps) if config.method == "sft" else 0.0
863
+ raw_train = compile_s + config.steps * sps + required_save_s + sft_overhead_s
818
864
  if not config.is_grpo and config.train_tokens is not None:
819
865
  raw_train = (
820
866
  compile_s
821
867
  + sft_seconds_for_tokens(config, gpu, config.train_tokens) / speedup
822
868
  + required_save_s
869
+ + sft_overhead_s
823
870
  )
824
871
  sps = raw_train / config.steps
825
872
 
@@ -142,20 +142,20 @@ def heartbeat(
142
142
  stage: str, *, liveness: bool = False, force: bool = False, initial: bool = False, **kw
143
143
  ):
144
144
  global _HB_CLAIM_SEQ
145
- ts = time.time()
146
- # liveness pings don't count as progress; provider stall detection skips them.
147
- if not liveness:
148
- _w._HB_LAST_PROGRESS_TS = ts
145
+ genuine_progress = not liveness
149
146
  with _HB_LOCK:
150
- if not liveness:
147
+ ts = time.time()
148
+ if genuine_progress:
149
+ _w._HB_LAST_PROGRESS_TS = ts
151
150
  _w._HB_PROGRESS_SEQ += 1
152
151
  elif _w._HB_PROGRESS_SEQ > _w._HB_PROGRESS_UPLOADED_SEQ:
153
152
  # progress-carry: a real heartbeat since the last committed snapshot never reached HF
154
153
  # (throttled away or its upload failed). upgrade this ping to a real heartbeat so the
155
154
  # control plane's stall clock sees that progress instead of killing a healthy run.
156
- # deliberately after the _HB_LAST_PROGRESS_TS bump above: carried progress is not NEW
157
- # progress, so the worker's own stall-dump timer keeps its original reference point.
155
+ # carried progress is not new progress, so do not advance _HB_LAST_PROGRESS_TS: the
156
+ # worker's own stall-dump timer and the published age keep the original reference point.
158
157
  liveness = False
158
+ latest_progress_ts = float(_w._HB_LAST_PROGRESS_TS or 0.0)
159
159
  my_progress_seq = _w._HB_PROGRESS_SEQ
160
160
  payload = {
161
161
  "stage": stage,
@@ -167,6 +167,12 @@ def heartbeat(
167
167
  **({"liveness": True} if liveness else {}),
168
168
  **kw,
169
169
  }
170
+ if genuine_progress:
171
+ payload["progress_age_s"] = 0.0
172
+ elif latest_progress_ts:
173
+ payload["progress_age_s"] = round(max(0.0, ts - latest_progress_ts), 1)
174
+ else:
175
+ payload.pop("progress_age_s", None)
170
176
  _dc = os.environ.get("RUNPOD_DC_ID") or ""
171
177
  if _dc:
172
178
  payload.setdefault("dc", _dc)
@@ -16,6 +16,9 @@ from typing import Any
16
16
 
17
17
  from flash.engine.plan.steps import rl_data_parallel_cards
18
18
  from flash.engine.worker import opd_train as _opd_train
19
+ from flash.engine.worker.train.opd.reporting import (
20
+ _build_train_note_sections as _build_train_note_sections,
21
+ )
19
22
  from flash.engine.worker.verl.child_io import (
20
23
  LORA_ROLLOUT_GUARD_SHIM,
21
24
  render_lora_rollout_guard_fragment,
@@ -921,80 +924,3 @@ def _export_and_upload_adapter(
921
924
  )
922
925
  _opd_train._w.hf_upload_folder(adapter_dir, "adapter", required=True)
923
926
  return adapter_dir
924
-
925
-
926
- def _build_train_note_sections(
927
- request: _OpdRequest,
928
- prompt_state: _PromptState,
929
- workload: _WorkloadState,
930
- runtime: _RuntimeState,
931
- result: _ChildResult,
932
- download_seconds: float,
933
- ) -> tuple[
934
- dict[str, Any],
935
- dict[str, Any],
936
- dict[str, Any],
937
- tuple[dict[str, Any], dict[str, Any]],
938
- ]:
939
- final_accounting = result.final_accounting
940
- knobs = request.knobs
941
- initial = {
942
- "epochs": knobs.epochs,
943
- "retained_prompts": len(prompt_state.prompts),
944
- "dropped_long_prompts": prompt_state.dropped_long,
945
- "method": "gkd",
946
- "init_from_adapter": request.spec.train.init_from_adapter or None,
947
- "teacher_model": knobs.teacher_model,
948
- "download_seconds": download_seconds,
949
- "thinking": _opd_train._w.THINKING,
950
- "loss_curve": final_accounting["loss_curve"],
951
- "mean_coverage": (
952
- float(final_accounting["coverage_sum"]) / int(final_accounting["aligned_sequences"])
953
- if final_accounting["aligned_sequences"]
954
- else 0.0
955
- ),
956
- }
957
- accounting = {
958
- "truncated_rollouts": int(final_accounting["truncated_rollouts"]),
959
- "forced_tokens": int(final_accounting["forced_tokens"]),
960
- "dropped_forced_groups": int(final_accounting["dropped_forced_groups"]),
961
- "teacher_input_tokens": int(final_accounting["teacher_input_tokens"]),
962
- "teacher_output_tokens": int(final_accounting["teacher_output_tokens"]),
963
- "aligned_sequences": int(final_accounting["aligned_sequences"]),
964
- "empty_alignments": int(final_accounting["empty_alignments"]),
965
- "teacher_ok": int(final_accounting["teacher_ok"]),
966
- }
967
- training = {
968
- "temperature": knobs.temperature,
969
- "group_size": knobs.group_size,
970
- "prompts_per_step": workload.prompts_per_step,
971
- "max_completion_len": knobs.max_completion,
972
- "multi_turn": request.multi_turn,
973
- "max_turns": request.max_turns if request.multi_turn else None,
974
- "episodes": int(final_accounting["episodes_seen"]) if request.multi_turn else None,
975
- "mean_turns_per_episode": (
976
- int(final_accounting["mt_turn_records"]) / int(final_accounting["episodes_seen"])
977
- if request.multi_turn and final_accounting["episodes_seen"]
978
- else None
979
- ),
980
- }
981
- backend = (
982
- {
983
- "rollout_backend": "verl_vllm",
984
- "verl_version": "0.8.0",
985
- "verl_backend": "fsdp",
986
- # report the EXECUTED width, not the allocation: the card count here would claim a
987
- # sequence-parallel run that did not happen. token-balanced batching makes every
988
- # allocated rank a dp rank, so unlike sft the executed dp width IS the card count.
989
- "ulysses_sequence_parallel_size": ULYSSES_SEQUENCE_PARALLEL_SIZE,
990
- "data_parallel_size": runtime.gpu_count,
991
- },
992
- {
993
- "peak_gpu_gb": result.peak_gpu_gb,
994
- "warm_started": bool(workload.warmstart_adapter),
995
- "resumed": bool(runtime.resume_step),
996
- "wandb_project": runtime.project_name if "wandb" in runtime.loggers else None,
997
- "wandb_run_name": runtime.experiment_name if "wandb" in runtime.loggers else None,
998
- },
999
- )
1000
- return initial, accounting, training, backend
@@ -46,11 +46,13 @@ from flash.engine.worker.train.rl.multi_turn import (
46
46
  start_reward_server,
47
47
  )
48
48
  from flash.engine.worker.train.rl.shims import (
49
+ render_deferred_patch_runtime,
49
50
  render_entropy_quantile_shim,
50
51
  render_exact_save_steps_shim,
51
52
  render_image_pad_ban_shim,
52
53
  render_kl_ref_adapter_shim,
53
54
  render_per_turn_credit_shim,
55
+ render_rank_device_assert_shim,
54
56
  render_reentrant_checkpointing_shim,
55
57
  render_reward_module,
56
58
  render_stop_sequences_shim,
@@ -178,6 +180,12 @@ def _prepare_rl_files(inp, prompts):
178
180
  shim_markers = shim_marker_file(shim_dir)
179
181
  if os.path.exists(shim_markers):
180
182
  os.remove(shim_markers)
183
+ # where each rank records the gpu uuid it opened, so a collision is caught before nccl init.
184
+ # removed for the same reason as the marker file: a stale one from a prior attempt would show
185
+ # ranks claiming devices this attempt never touched, and read as a collision that is not there.
186
+ rank_device_claims = os.path.join(shim_dir, "rank_device_claims.txt")
187
+ if os.path.exists(rank_device_claims):
188
+ os.remove(rank_device_claims)
181
189
  return {
182
190
  "rollout_examples": rollout_examples,
183
191
  "message_prompts": message_prompts,
@@ -190,6 +198,7 @@ def _prepare_rl_files(inp, prompts):
190
198
  "shim_dir": shim_dir,
191
199
  "shim_py": os.path.join(shim_dir, "sitecustomize.py"),
192
200
  "shim_markers": shim_markers,
201
+ "rank_device_claims": rank_device_claims,
193
202
  }
194
203
 
195
204
 
@@ -204,6 +213,9 @@ def _write_rl_shim(inp, files) -> list[str]:
204
213
  # loaded. each feature renderer returns "" when its feature is off; the tf32 fragment is
205
214
  # unconditional, so this source is never empty.
206
215
  required_fragments = [
216
+ # first, so a collapsed rank->device map is reported before any other patch runs and long
217
+ # before the model load that currently hides it. inert at one card.
218
+ ("rank-device-assert", render_rank_device_assert_shim(int(inp["dp_cards"]))),
207
219
  (
208
220
  "reentrant-checkpointing",
209
221
  render_reentrant_checkpointing_shim(
@@ -238,7 +250,20 @@ def _write_rl_shim(inp, files) -> list[str]:
238
250
  # into this process there is nothing left to fix.
239
251
  render_tilelang_cudart_shim(),
240
252
  render_shim_marker_prologue(files["shim_markers"]),
241
- *(wrap_shim_fragment(name, source) for name, source in required_fragments),
253
+ # above every wrapped fragment: each one registers with this registry rather than
254
+ # importing verl at startup, which is what keeps ray free to pin each rank to its own
255
+ # card (see train/rl/shims.render_deferred_patch_runtime). unwrapped -- it only defines
256
+ # the registry and touches no cuda, so there is no patch here that could fail open.
257
+ render_deferred_patch_runtime(),
258
+ # every fragment above defers its patch to the import of the module it targets, so this
259
+ # wrapper now spans only the registration. a marker written here would prove a callback
260
+ # was queued, not that the patch ran, and the parent's verify_applied_shim_markers would
261
+ # pass for a child training unpatched. each deferred body records its own name once the
262
+ # patch is actually installed.
263
+ *(
264
+ wrap_shim_fragment(name, source, record_immediately=False)
265
+ for name, source in required_fragments
266
+ ),
242
267
  # unconditional: every flash rollout is a lora rollout, and a base-model fallback is
243
268
  # indistinguishable from a working run in the metrics.
244
269
  render_lora_rollout_guard_fragment(),
@@ -405,6 +430,10 @@ def _build_rl_child_env(inp, files, loggers, reward_url):
405
430
  shim_dir=files["shim_dir"], wandb_enabled="wandb" in loggers
406
431
  )
407
432
  env_for_verl["FLASH_VERL_REWARD_URL"] = reward_url
433
+ # where each rank records the gpu it opened. ray fans this env to every actor, which is what
434
+ # makes the file a rendezvous point: the check needs to compare ranks that have no process
435
+ # group yet (see render_rank_device_assert_shim).
436
+ env_for_verl["FLASH_RANK_DEVICE_CLAIMS"] = files["rank_device_claims"]
408
437
  # the model is prefetched above; keep the subprocess off hf's rate-limited api.
409
438
  env_for_verl["HF_HUB_OFFLINE"] = "1"
410
439
  env_for_verl["TRANSFORMERS_OFFLINE"] = "1"
@@ -0,0 +1,94 @@
1
+ """training metadata reporting helpers for opd."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING, Any
6
+
7
+ from flash.engine.worker.runtime.pkg_proxy import W as _w
8
+ from flash.engine.worker.verl.parallelism import ULYSSES_SEQUENCE_PARALLEL_SIZE
9
+
10
+ if TYPE_CHECKING:
11
+ from flash.engine.worker.opd_train_runner import (
12
+ _ChildResult,
13
+ _OpdRequest,
14
+ _PromptState,
15
+ _RuntimeState,
16
+ _WorkloadState,
17
+ )
18
+
19
+
20
+ def _build_train_note_sections(
21
+ request: _OpdRequest,
22
+ prompt_state: _PromptState,
23
+ workload: _WorkloadState,
24
+ runtime: _RuntimeState,
25
+ result: _ChildResult,
26
+ download_seconds: float,
27
+ ) -> tuple[
28
+ dict[str, Any],
29
+ dict[str, Any],
30
+ dict[str, Any],
31
+ tuple[dict[str, Any], dict[str, Any]],
32
+ ]:
33
+ final_accounting = result.final_accounting
34
+ knobs = request.knobs
35
+ initial = {
36
+ "epochs": knobs.epochs,
37
+ "retained_prompts": len(prompt_state.prompts),
38
+ "dropped_long_prompts": prompt_state.dropped_long,
39
+ "method": "gkd",
40
+ "init_from_adapter": request.spec.train.init_from_adapter or None,
41
+ "teacher_model": knobs.teacher_model,
42
+ "download_seconds": download_seconds,
43
+ "thinking": _w.THINKING,
44
+ "loss_curve": final_accounting["loss_curve"],
45
+ "mean_coverage": (
46
+ float(final_accounting["coverage_sum"]) / int(final_accounting["aligned_sequences"])
47
+ if final_accounting["aligned_sequences"]
48
+ else 0.0
49
+ ),
50
+ }
51
+ accounting = {
52
+ "truncated_rollouts": int(final_accounting["truncated_rollouts"]),
53
+ "forced_tokens": int(final_accounting["forced_tokens"]),
54
+ "dropped_forced_groups": int(final_accounting["dropped_forced_groups"]),
55
+ "teacher_input_tokens": int(final_accounting["teacher_input_tokens"]),
56
+ "teacher_output_tokens": int(final_accounting["teacher_output_tokens"]),
57
+ "aligned_sequences": int(final_accounting["aligned_sequences"]),
58
+ "empty_alignments": int(final_accounting["empty_alignments"]),
59
+ "teacher_ok": int(final_accounting["teacher_ok"]),
60
+ }
61
+ training = {
62
+ "temperature": knobs.temperature,
63
+ "group_size": knobs.group_size,
64
+ "prompts_per_step": workload.prompts_per_step,
65
+ "max_completion_len": knobs.max_completion,
66
+ "multi_turn": request.multi_turn,
67
+ "max_turns": request.max_turns if request.multi_turn else None,
68
+ "episodes": int(final_accounting["episodes_seen"]) if request.multi_turn else None,
69
+ "mean_turns_per_episode": (
70
+ int(final_accounting["mt_turn_records"]) / int(final_accounting["episodes_seen"])
71
+ if request.multi_turn and final_accounting["episodes_seen"]
72
+ else None
73
+ ),
74
+ }
75
+ backend = (
76
+ {
77
+ "rollout_backend": "verl_vllm",
78
+ "verl_version": "0.8.0",
79
+ "verl_backend": "fsdp",
80
+ # report the executed width, not the allocation: the card count here would claim a
81
+ # sequence-parallel run that did not happen. token-balanced batching makes every
82
+ # allocated rank a dp rank, so unlike sft the executed dp width is the card count.
83
+ "ulysses_sequence_parallel_size": ULYSSES_SEQUENCE_PARALLEL_SIZE,
84
+ "data_parallel_size": runtime.gpu_count,
85
+ },
86
+ {
87
+ "peak_gpu_gb": result.peak_gpu_gb,
88
+ "warm_started": bool(workload.warmstart_adapter),
89
+ "resumed": bool(runtime.resume_step),
90
+ "wandb_project": runtime.project_name if "wandb" in runtime.loggers else None,
91
+ "wandb_run_name": runtime.experiment_name if "wandb" in runtime.loggers else None,
92
+ },
93
+ )
94
+ return initial, accounting, training, backend