freesolo-flash-dev 1.2.70__tar.gz → 1.2.87__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 (593) hide show
  1. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/Dockerfile.worker +12 -5
  2. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/PKG-INFO +1 -1
  3. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/adapters/fused_experts.py +30 -28
  4. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/plan/vram.py +28 -2
  5. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/backend_common.py +1 -0
  6. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/opd_train.py +3 -2
  7. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/perf/__init__.py +4 -3
  8. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/rl_train.py +5 -2
  9. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/verl/capabilities.py +35 -4
  10. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/pyproject.toml +2 -2
  11. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_fused_expert_warmstart.py +148 -21
  12. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_multi_gpu_gate.py +103 -0
  13. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_opd.py +173 -8
  14. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_worker_stack.py +80 -21
  15. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/uv.lock +1 -1
  16. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.dockerignore +0 -0
  17. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.env.example +0 -0
  18. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/CODEOWNERS +0 -0
  19. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  20. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  21. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  22. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  23. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/dependabot.yml +0 -0
  24. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/auto-rebake.yml +0 -0
  25. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/bake-kernel-cache.yml +0 -0
  26. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/ci.yml +0 -0
  27. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/dev-kernel-cache.yml +0 -0
  28. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/main-source-guard.yml +0 -0
  29. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/notify-tests-repo.yml +0 -0
  30. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/production-kernel-cache-ready.yml +0 -0
  31. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/publish-dev.yml +0 -0
  32. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/publish-image.yml +0 -0
  33. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/publish.yml +0 -0
  34. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/version-parity.yml +0 -0
  35. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/worker-image.yml +0 -0
  36. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.gitignore +0 -0
  37. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/CHANGELOG.md +0 -0
  38. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/CODE_OF_CONDUCT.md +0 -0
  39. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/CONTRIBUTING.md +0 -0
  40. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/Dockerfile +0 -0
  41. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/LICENSE +0 -0
  42. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/NOTICE +0 -0
  43. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/README.md +0 -0
  44. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/SECURITY.md +0 -0
  45. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/SELF_HOSTING.md +0 -0
  46. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/build/kernel_cache/.gitignore +0 -0
  47. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/build/kernel_cache/.keep +0 -0
  48. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/deploy/infisical/README.md +0 -0
  49. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/deploy/infisical/entrypoint.sh +0 -0
  50. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/docker/Dockerfile.kernelcache +0 -0
  51. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/docker/Dockerfile.kernelcache.relayer +0 -0
  52. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/docker/bake_kernel_cache.py +0 -0
  53. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/docker/bake_pod_entry.py +0 -0
  54. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/docker/extract_cudart_fix.py +0 -0
  55. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/docker/kernel_fingerprint.py +0 -0
  56. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/docker/make_rp_handler.py +0 -0
  57. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/__init__.py +0 -0
  58. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/_internal/__init__.py +0 -0
  59. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/_internal/channel.py +0 -0
  60. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/_internal/diagnostics.py +0 -0
  61. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/_internal/fileio.py +0 -0
  62. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/_internal/logging.py +0 -0
  63. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/_internal/paths.py +0 -0
  64. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/adapters/__init__.py +0 -0
  65. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/adapters/artifacts.py +0 -0
  66. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/adapters/lora_rank.py +0 -0
  67. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/__init__.py +0 -0
  68. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/__main__.py +0 -0
  69. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/__init__.py +0 -0
  70. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/deploy.py +0 -0
  71. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/__init__.py +0 -0
  72. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/episode.py +0 -0
  73. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/eval.py +0 -0
  74. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/eval_args.py +0 -0
  75. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/imports.py +0 -0
  76. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/list.py +0 -0
  77. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/push.py +0 -0
  78. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/retained.py +0 -0
  79. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/setup.py +0 -0
  80. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/setup_wandb.py +0 -0
  81. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/test.py +0 -0
  82. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/test_evaluations.py +0 -0
  83. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/test_params.py +0 -0
  84. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/test_warnings.py +0 -0
  85. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/prompt_budget.py +0 -0
  86. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/traces.py +0 -0
  87. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/train_cost.py +0 -0
  88. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/scaffold/TRAINING.md +0 -0
  89. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/scaffold/__init__.py +0 -0
  90. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/ui/__init__.py +0 -0
  91. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/ui/cost.py +0 -0
  92. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/ui/env_panels.py +0 -0
  93. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/ui/heartbeat.py +0 -0
  94. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/ui/render.py +0 -0
  95. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/ui/tables.py +0 -0
  96. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/ui/tty.py +0 -0
  97. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/client/__init__.py +0 -0
  98. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/client/config.py +0 -0
  99. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/client/freesolo_api.py +0 -0
  100. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/client/http.py +0 -0
  101. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/client/runtime_secrets.py +0 -0
  102. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/client/shapes.py +0 -0
  103. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/client/specs.py +0 -0
  104. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/client/streaming.py +0 -0
  105. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/content/__init__.py +0 -0
  106. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/content/multimodal.py +0 -0
  107. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/content/structured_outputs.py +0 -0
  108. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/content/thinking.py +0 -0
  109. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/core/__init__.py +0 -0
  110. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/core/catalog.py +0 -0
  111. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/core/spec.py +0 -0
  112. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/core/spec_persistence.py +0 -0
  113. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cost/__init__.py +0 -0
  114. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cost/analytical.py +0 -0
  115. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cost/facts.py +0 -0
  116. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cost/spec.py +0 -0
  117. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cost/types.py +0 -0
  118. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/__init__.py +0 -0
  119. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/huggingface.py +0 -0
  120. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/plan/__init__.py +0 -0
  121. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/plan/kv_sizing.py +0 -0
  122. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/plan/model_config_probe.py +0 -0
  123. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/plan/prompt_budget.py +0 -0
  124. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/plan/recipe.py +0 -0
  125. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/plan/steps.py +0 -0
  126. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/__init__.py +0 -0
  127. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/dataset_profile.py +0 -0
  128. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/image_tokens.py +0 -0
  129. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/reasoning_render.py +0 -0
  130. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/sft_image_rows.py +0 -0
  131. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/sft_workload.py +0 -0
  132. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/tokenizer.py +0 -0
  133. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/workload_profile.py +0 -0
  134. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/result/__init__.py +0 -0
  135. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/result/accounting.py +0 -0
  136. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/result/rollout_samples.py +0 -0
  137. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/__init__.py +0 -0
  138. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/__main__.py +0 -0
  139. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/entry/__init__.py +0 -0
  140. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/entry/opd.py +0 -0
  141. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/entry/rl.py +0 -0
  142. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/entry/sft.py +0 -0
  143. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/io/__init__.py +0 -0
  144. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/io/heartbeat.py +0 -0
  145. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/io/hf.py +0 -0
  146. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/io/prefetch.py +0 -0
  147. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/io/wandb_log.py +0 -0
  148. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/model/__init__.py +0 -0
  149. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/model/adapter.py +0 -0
  150. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/model/chatml_mask.py +0 -0
  151. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/model/decoding.py +0 -0
  152. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/model/lora.py +0 -0
  153. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/model/packing.py +0 -0
  154. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/opd_train_runner.py +0 -0
  155. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/perf/diagnostics.py +0 -0
  156. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/perf/lifecycle.py +0 -0
  157. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/perf/liger.py +0 -0
  158. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/perf/memory.py +0 -0
  159. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/rl_train_runner.py +0 -0
  160. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/runtime/__init__.py +0 -0
  161. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
  162. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
  163. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/runtime/rng.py +0 -0
  164. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/score_batcher.py +0 -0
  165. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/sft_train.py +0 -0
  166. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/sft_train_runner.py +0 -0
  167. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/teacher/__init__.py +0 -0
  168. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/teacher/client.py +0 -0
  169. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/teacher/encoding.py +0 -0
  170. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
  171. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/__init__.py +0 -0
  172. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/core/__init__.py +0 -0
  173. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/core/checkpoint_lifecycle.py +0 -0
  174. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/core/child/__init__.py +0 -0
  175. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/core/child/glue.py +0 -0
  176. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/core/child/runtime.py +0 -0
  177. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/core/step_timing.py +0 -0
  178. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/finalize.py +0 -0
  179. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/__init__.py +0 -0
  180. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/batching.py +0 -0
  181. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/bridge.py +0 -0
  182. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/bridge_failures.py +0 -0
  183. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/__init__.py +0 -0
  184. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/bridge.py +0 -0
  185. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/entry.py +0 -0
  186. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
  187. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/plugin.py +0 -0
  188. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
  189. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/runtime.py +0 -0
  190. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/structured.py +0 -0
  191. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/failures.py +0 -0
  192. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/gkd.py +0 -0
  193. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
  194. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/overrides.py +0 -0
  195. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/prompts.py +0 -0
  196. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/reporting.py +0 -0
  197. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/scoring.py +0 -0
  198. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/state.py +0 -0
  199. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/validation.py +0 -0
  200. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/__init__.py +0 -0
  201. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/checkpoints.py +0 -0
  202. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/child/__init__.py +0 -0
  203. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/child/entry.py +0 -0
  204. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
  205. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/child/patches.py +0 -0
  206. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/child/plugin.py +0 -0
  207. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/config.py +0 -0
  208. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/inputs.py +0 -0
  209. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/multi_turn.py +0 -0
  210. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/reward_module.py +0 -0
  211. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/scoring.py +0 -0
  212. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/single_turn.py +0 -0
  213. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/verl_config.py +0 -0
  214. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/sft/__init__.py +0 -0
  215. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/sft/checkpoints.py +0 -0
  216. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/sft/child/entry.py +0 -0
  217. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/sft/child/plugin.py +0 -0
  218. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/sft/config.py +0 -0
  219. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/verl/__init__.py +0 -0
  220. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/verl/checkpoints.py +0 -0
  221. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/verl/child_io.py +0 -0
  222. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/verl/diagnostics.py +0 -0
  223. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/verl/parallelism.py +0 -0
  224. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/verl/parent_work.py +0 -0
  225. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker_entrypoint.py +0 -0
  226. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/__init__.py +0 -0
  227. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/adapter.py +0 -0
  228. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/base.py +0 -0
  229. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/cache_security.py +0 -0
  230. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/dataset_selection.py +0 -0
  231. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/evaluations.py +0 -0
  232. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/identity.py +0 -0
  233. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/loader.py +0 -0
  234. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/namespace_listing.py +0 -0
  235. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/package/__init__.py +0 -0
  236. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/package/direct_tokens.py +0 -0
  237. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/package/limits.py +0 -0
  238. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/package/unpack.py +0 -0
  239. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/pull.py +0 -0
  240. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/__init__.py +0 -0
  241. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/__init__.py +0 -0
  242. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/auth.py +0 -0
  243. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/bootstrap.py +0 -0
  244. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/bootstrap_console.py +0 -0
  245. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
  246. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
  247. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/deadline.py +0 -0
  248. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/host/__init__.py +0 -0
  249. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
  250. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/host/failmark.py +0 -0
  251. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/host/hostlog.py +0 -0
  252. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/http.py +0 -0
  253. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/instance.py +0 -0
  254. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/poll.py +0 -0
  255. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/poll_instance.py +0 -0
  256. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/provider.py +0 -0
  257. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/terminal_artifacts.py +0 -0
  258. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/worker.py +0 -0
  259. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/allocator.py +0 -0
  260. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/artifacts/__init__.py +0 -0
  261. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/artifacts/hf.py +0 -0
  262. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/artifacts/preload_runpod.py +0 -0
  263. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/artifacts/weight_cache.py +0 -0
  264. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/base.py +0 -0
  265. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/fit_errors.py +0 -0
  266. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/__init__.py +0 -0
  267. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/api.py +0 -0
  268. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/auth.py +0 -0
  269. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/gpus.py +0 -0
  270. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/jobs/__init__.py +0 -0
  271. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/jobs/builders.py +0 -0
  272. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/jobs/reap.py +0 -0
  273. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/preflight.py +0 -0
  274. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/pricing.py +0 -0
  275. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/preflight.py +0 -0
  276. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/realized.py +0 -0
  277. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/__init__.py +0 -0
  278. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/api.py +0 -0
  279. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/auth.py +0 -0
  280. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/cost.py +0 -0
  281. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/gpus.py +0 -0
  282. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/job_execution.py +0 -0
  283. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/jobs.py +0 -0
  284. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/preflight.py +0 -0
  285. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/pricing.py +0 -0
  286. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/resources.py +0 -0
  287. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/serverless/__init__.py +0 -0
  288. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/serverless/endpoints.py +0 -0
  289. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/sharding.py +0 -0
  290. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/vast/__init__.py +0 -0
  291. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/vast/api.py +0 -0
  292. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/vast/auth.py +0 -0
  293. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/vast/jobs/__init__.py +0 -0
  294. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/vast/jobs/builders.py +0 -0
  295. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/vast/preflight.py +0 -0
  296. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/vast/pricing.py +0 -0
  297. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/py.typed +0 -0
  298. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/__init__.py +0 -0
  299. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/artifacts.py +0 -0
  300. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/attempts.py +0 -0
  301. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/costs.py +0 -0
  302. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/deadlines.py +0 -0
  303. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/preparation.py +0 -0
  304. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/reconciliation.py +0 -0
  305. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/results/__init__.py +0 -0
  306. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/results/checkpoints.py +0 -0
  307. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/results/verified_revisions.py +0 -0
  308. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/status.py +0 -0
  309. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/submit.py +0 -0
  310. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/__init__.py +0 -0
  311. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/attach.py +0 -0
  312. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/deploy.py +0 -0
  313. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/lifecycle.py +0 -0
  314. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/recovery.py +0 -0
  315. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/retry_decision.py +0 -0
  316. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/seed_submission.py +0 -0
  317. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/transitions.py +0 -0
  318. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/weight_cache.py +0 -0
  319. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runtime_capsule/__init__.py +0 -0
  320. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runtime_capsule/build.py +0 -0
  321. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runtime_capsule/manifest.py +0 -0
  322. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runtime_capsule/profiles.py +0 -0
  323. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/schema/__init__.py +0 -0
  324. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/schema/fields.py +0 -0
  325. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/serve/__init__.py +0 -0
  326. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/serve/adapter_check.py +0 -0
  327. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/serve/deploy.py +0 -0
  328. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/serve/errors.py +0 -0
  329. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/serve/export.py +0 -0
  330. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/serve/preflight.py +0 -0
  331. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/serve/responses.py +0 -0
  332. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/serve/streaming.py +0 -0
  333. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/serve/thinking.py +0 -0
  334. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/serve/urls.py +0 -0
  335. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/__init__.py +0 -0
  336. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/__main__.py +0 -0
  337. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/app.py +0 -0
  338. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/billing/__init__.py +0 -0
  339. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/billing/charges.py +0 -0
  340. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/billing/retry.py +0 -0
  341. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/domain/__init__.py +0 -0
  342. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/domain/checkpoints.py +0 -0
  343. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/domain/environment_registry.py +0 -0
  344. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/domain/envs.py +0 -0
  345. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/domain/projects.py +0 -0
  346. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/domain/reconcile.py +0 -0
  347. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/domain/repo_cleanup.py +0 -0
  348. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/domain/run_registry.py +0 -0
  349. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/domain/teacher_broker.py +0 -0
  350. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/domain/teacher_errors.py +0 -0
  351. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/domain/teacher_requests.py +0 -0
  352. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/platform/__init__.py +0 -0
  353. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/platform/auth.py +0 -0
  354. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/platform/db.py +0 -0
  355. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/platform/deps.py +0 -0
  356. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/platform/internal_client.py +0 -0
  357. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/platform/locks.py +0 -0
  358. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/platform/runtime.py +0 -0
  359. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/routes/__init__.py +0 -0
  360. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/routes/envs.py +0 -0
  361. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/routes/meta.py +0 -0
  362. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/routes/runs.py +0 -0
  363. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/routes/serving.py +0 -0
  364. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/routes/serving_completion.py +0 -0
  365. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/routes/serving_revisions.py +0 -0
  366. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/routes/serving_smoke.py +0 -0
  367. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/routes/teacher.py +0 -0
  368. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/source_snapshot.py +0 -0
  369. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/teacher/__init__.py +0 -0
  370. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/teacher/limits.py +0 -0
  371. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/teacher/retry_contract.py +0 -0
  372. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/scripts/build_dev_dist.py +0 -0
  373. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/scripts/check_file_size.py +0 -0
  374. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/scripts/check_function_size.py +0 -0
  375. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/scripts/check_verl_pin_exists.py +0 -0
  376. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/scripts/scrub_history.sh +0 -0
  377. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/__init__.py +0 -0
  378. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/_helpers/__init__.py +0 -0
  379. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/_helpers/profile.py +0 -0
  380. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/_helpers/runner.py +0 -0
  381. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/_helpers/source_snapshot.py +0 -0
  382. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/_helpers/specs.py +0 -0
  383. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/_helpers/teacher.py +0 -0
  384. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/_helpers/vast.py +0 -0
  385. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/capture_image_sft_processor_oracle.py +0 -0
  386. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/conftest.py +0 -0
  387. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/fixtures/image_sft_processor_oracle.json +0 -0
  388. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/fixtures/math_eval.jsonl +0 -0
  389. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/fixtures/math_train.jsonl +0 -0
  390. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/live/__init__.py +0 -0
  391. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/live/conftest.py +0 -0
  392. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/live/test_lambda_live.py +0 -0
  393. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/live/test_runpod_live.py +0 -0
  394. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/live/test_sft_thinking_render_live.py +0 -0
  395. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/live/test_vast_live.py +0 -0
  396. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_accounting_coverage.py +0 -0
  397. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_adapter_shard_completeness.py +0 -0
  398. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_agent_flash_cli_contract.py +0 -0
  399. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_algorithms.py +0 -0
  400. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_allocator.py +0 -0
  401. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_backend_common.py +0 -0
  402. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_backend_jobspec_contract.py +0 -0
  403. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_bake_kernel_cache.py +0 -0
  404. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_base_model_provenance.py +0 -0
  405. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_billing_retry.py +0 -0
  406. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_build_context_contract.py +0 -0
  407. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cancel_remote.py +0 -0
  408. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_catalog_consistency.py +0 -0
  409. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_catalog_only_models.py +0 -0
  410. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_charge_pricing.py +0 -0
  411. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_checkpoint_lifecycle.py +0 -0
  412. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_checkpoints.py +0 -0
  413. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_commands.py +0 -0
  414. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_commands_coverage.py +0 -0
  415. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_credential_shadowing.py +0 -0
  416. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_errors.py +0 -0
  417. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_estimate.py +0 -0
  418. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_gpus_flag.py +0 -0
  419. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_help.py +0 -0
  420. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_main_coverage.py +0 -0
  421. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_managed.py +0 -0
  422. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_render_coverage.py +0 -0
  423. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_render_theme.py +0 -0
  424. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_traces.py +0 -0
  425. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_wandb_warning.py +0 -0
  426. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_client.py +0 -0
  427. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_client_import_purity.py +0 -0
  428. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_client_server_integration.py +0 -0
  429. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_client_stream_reads.py +0 -0
  430. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_config_env_vars.py +0 -0
  431. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_config_overrides.py +0 -0
  432. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_console_upload.py +0 -0
  433. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_controlled_experiment_repairs.py +0 -0
  434. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cost_analytical.py +0 -0
  435. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cost_equation.py +0 -0
  436. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cost_estimate.py +0 -0
  437. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cost_hardware.py +0 -0
  438. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cost_models.py +0 -0
  439. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_dataset_profile.py +0 -0
  440. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_deploy_alias_move_warning.py +0 -0
  441. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_deploy_latency.py +0 -0
  442. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_dev_channel.py +0 -0
  443. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_disk_gb.py +0 -0
  444. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_endpoint_name.py +0 -0
  445. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_cache_evict.py +0 -0
  446. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_delete.py +0 -0
  447. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_download.py +0 -0
  448. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_download_api.py +0 -0
  449. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_evaluations.py +0 -0
  450. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_list_api.py +0 -0
  451. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_list_cli.py +0 -0
  452. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_list_hub.py +0 -0
  453. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_no_install.py +0 -0
  454. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_publish.py +0 -0
  455. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_pull.py +0 -0
  456. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_pull_coverage.py +0 -0
  457. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_pull_loader_coverage.py +0 -0
  458. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_pull_managed_control_plane.py +0 -0
  459. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_push.py +0 -0
  460. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_rate_limit_resolve.py +0 -0
  461. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_ref_pinning.py +0 -0
  462. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_test.py +0 -0
  463. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_envs_coverage.py +0 -0
  464. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_export.py +0 -0
  465. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_flash_mvp.py +0 -0
  466. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_flash_worker.py +0 -0
  467. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_flashinfer_cache_dirs.py +0 -0
  468. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_freesolo_api_transport.py +0 -0
  469. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_github_urlopen_retry.py +0 -0
  470. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_gpu_type_single_field.py +0 -0
  471. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_gpus.py +0 -0
  472. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_grpo_params.py +0 -0
  473. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_grpo_resident_sizing.py +0 -0
  474. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_grpo_reward_batching.py +0 -0
  475. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_health_liveness.py +0 -0
  476. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_hf_retry.py +0 -0
  477. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_idle_endpoint_reaper.py +0 -0
  478. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_image_sft_markers.py +0 -0
  479. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_image_sft_processor_parity.py +0 -0
  480. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_image_tokens.py +0 -0
  481. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_infisical_secrets.py +0 -0
  482. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_instance_bootstrap_coverage.py +0 -0
  483. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_internal_client.py +0 -0
  484. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_jobs.py +0 -0
  485. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_kernel_cache.py +0 -0
  486. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_kernel_fingerprint.py +0 -0
  487. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_kv_util.py +0 -0
  488. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_lambda_api_coverage.py +0 -0
  489. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_lambda_runner.py +0 -0
  490. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_logging.py +0 -0
  491. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_login_perms.py +0 -0
  492. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_lora_rank_coverage.py +0 -0
  493. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_lora_rank_preflight.py +0 -0
  494. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_managed_config_fields.py +0 -0
  495. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_managed_hf_repo.py +0 -0
  496. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_metrics_schema_agent_contract.py +0 -0
  497. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_mig_guard.py +0 -0
  498. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_multimodal_training.py +0 -0
  499. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_named_reward_metrics.py +0 -0
  500. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_oom_escalate_gpu.py +0 -0
  501. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_opd_limits.py +0 -0
  502. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_opd_multiturn_eos_boundary.py +0 -0
  503. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_opd_multiturn_failure_exit.py +0 -0
  504. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_opd_replay_guard.py +0 -0
  505. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_opd_resume_safety.py +0 -0
  506. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_opd_train.py +0 -0
  507. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_orchestrator_flash.py +0 -0
  508. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_packing.py +0 -0
  509. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_packing_coverage.py +0 -0
  510. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_parasail_teacher.py +0 -0
  511. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_persisted_spec_envelope.py +0 -0
  512. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_poll_helpers.py +0 -0
  513. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_preflight.py +0 -0
  514. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_projects.py +0 -0
  515. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_prompt_budget.py +0 -0
  516. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_provider_preflight_coverage.py +0 -0
  517. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_provider_routing.py +0 -0
  518. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_provider_teardown_robustness.py +0 -0
  519. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_providers_symmetry.py +0 -0
  520. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_realized_cost.py +0 -0
  521. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_repo_cleanup.py +0 -0
  522. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_resolve_params_b.py +0 -0
  523. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_resume_on_retry.py +0 -0
  524. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_rl_train.py +0 -0
  525. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_rollout_samples.py +0 -0
  526. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_runmgmt.py +0 -0
  527. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_runpod_api_delete.py +0 -0
  528. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_runpod_key_fingerprint.py +0 -0
  529. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_runpod_key_waterfall.py +0 -0
  530. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_runtime_capsule.py +0 -0
  531. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_serve.py +0 -0
  532. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_serve_reasoning_content.py +0 -0
  533. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_server_api.py +0 -0
  534. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_server_app_coverage.py +0 -0
  535. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_server_auth_singleflight.py +0 -0
  536. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_server_billing.py +0 -0
  537. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_server_checkpoints_coverage.py +0 -0
  538. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_server_db.py +0 -0
  539. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_server_envs_coverage.py +0 -0
  540. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_server_locks_coverage.py +0 -0
  541. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_server_standalone.py +0 -0
  542. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_serving_context_preflight.py +0 -0
  543. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_serving_contract.py +0 -0
  544. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_serving_schema_coverage.py +0 -0
  545. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_sft_chunked_nll.py +0 -0
  546. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_sft_example_selection.py +0 -0
  547. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_sft_gc_off.py +0 -0
  548. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_sft_max_context.py +0 -0
  549. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_sft_startup_block.py +0 -0
  550. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_sft_train.py +0 -0
  551. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_sft_workload.py +0 -0
  552. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_source_attestation_flow.py +0 -0
  553. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_source_snapshot.py +0 -0
  554. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_spec_and_validation.py +0 -0
  555. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_spec_contract_bytes.py +0 -0
  556. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_step_floor.py +0 -0
  557. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_step_metrics.py +0 -0
  558. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_step_timing.py +0 -0
  559. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_structured_outputs.py +0 -0
  560. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_teacher_broker.py +0 -0
  561. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_teacher_encoding_contract.py +0 -0
  562. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_terminal_artifacts.py +0 -0
  563. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_thinking_config.py +0 -0
  564. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_train_context_preflight.py +0 -0
  565. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_training_controls.py +0 -0
  566. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_type_comment_prose.py +0 -0
  567. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_vast_api.py +0 -0
  568. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_vast_api_coverage.py +0 -0
  569. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_vast_offers.py +0 -0
  570. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_vast_provider_coverage.py +0 -0
  571. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_vast_runner.py +0 -0
  572. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_verified_revisions.py +0 -0
  573. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_verifiers.py +0 -0
  574. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_verl_checkpoint_export.py +0 -0
  575. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_verl_child_plugins.py +0 -0
  576. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_verl_silence_watchdog.py +0 -0
  577. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_version.py +0 -0
  578. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_vl_warmstart_adapter_keys.py +0 -0
  579. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_vram_architecture.py +0 -0
  580. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_wandb_link.py +0 -0
  581. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_wandb_naming.py +0 -0
  582. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_warmstart_adapter_download.py +0 -0
  583. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_warmstart_cross_repo.py +0 -0
  584. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_warmstart_error_attribution.py +0 -0
  585. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_weight_cache.py +0 -0
  586. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_worker_dryrun.py +0 -0
  587. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_worker_hardexit.py +0 -0
  588. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_worker_image.py +0 -0
  589. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_worker_init_heartbeat.py +0 -0
  590. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_worker_thinking.py +0 -0
  591. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_workflow_contracts.py +0 -0
  592. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_workload_profile.py +0 -0
  593. {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_zero2_sharding_gate.py +0 -0
@@ -59,15 +59,15 @@ RUN pip install --no-cache-dir \
59
59
  "wandb>=0.17" \
60
60
  "flash-linear-attention @ git+https://github.com/fla-org/flash-linear-attention.git@9c8e42e762fce087c27b673af4922795d9edb85e" \
61
61
  "flash-qla==0.1.2" \
62
- "tilelang==0.1.11" \
63
- "apache-tvm-ffi==0.1.11" \
62
+ "tilelang==0.1.9" \
63
+ "apache-tvm-ffi==0.1.9" \
64
64
  "hf_transfer" \
65
65
  "freesolo>=0.4.1" \
66
66
  "runpod"
67
67
  # Gated-DeltaNet (Qwen3.5/3.6) runs on flash-linear-attention's Triton kernels. On consumer cards
68
68
  # (Ampere/Ada/Blackwell) the Triton path is correct. On Hopper (sm90) fla's GDN chunk_bwd is
69
69
  # miscomputed with Triton>=3.4 (fla #640) — the fix is fla's TILELANG backend (correct there), so
70
- # we bake the pinned tilelang==0.1.11 + apache-tvm-ffi==0.1.11 (0.1.12 double-registers TVM-FFI ->
70
+ # we bake the pinned tilelang==0.1.9 + apache-tvm-ffi==0.1.9 (0.1.12 double-registers TVM-FFI ->
71
71
  # `import tilelang` aborts) and KEEP fla on every arch; flash.engine.worker.perf._ensure_fla_fastpath_on_hopper
72
72
  # ensures the tilelang backend is live on sm90 before any model import. The INVERSE holds on
73
73
  # B200/sm100: THERE the tilelang chunk_bwd_dqkwg miscomputes gradients while the Triton path is
@@ -79,6 +79,13 @@ RUN pip install --no-cache-dir \
79
79
  # seq16384 12.6x / 1.9x, loss matches to 1.8e-4. fla is from git: the PyPI wheel is a broken stub
80
80
  # (no fla.modules). The git URL is PINNED to a commit (not the moving default branch) for
81
81
  # reproducible image builds; keep this sha in lockstep with the worker dependencies in flash/providers/_lifecycle/worker.py.
82
+ # tilelang is 0.1.9, not the newest release: flash-qla (added for the sm90 GDN backend) hard-requires
83
+ # tilelang==0.1.9 AND apache-tvm-ffi==0.1.9, so 0.1.11 made this layer unsatisfiable and every image
84
+ # build failed from 2026-08-12 until the downgrade. 0.1.11 was only ever "latest stable at the time"
85
+ # (the pin exists for determinism, not to dodge a 0.1.9 defect), and the version predates flash-qla.
86
+ # Keep all four sites in lockstep -- both installs here, capabilities.py, and perf's TILELANG_PIN --
87
+ # because perf fails CLOSED: a resolved version != TILELANG_PIN deletes fla and drops sm90 to the
88
+ # pure-PyTorch fallback, which is correct but far slower.
82
89
 
83
90
  # FlashAttention: PREFER a prebuilt wheel. There is no OFFICIAL Dao-AILab wheel for torch 2.10 yet,
84
91
  # but community CI publishes matching wheels (cu128/torch2.10/cp312); CI passes one as FLASH_ATTN_SPEC
@@ -334,8 +341,8 @@ RUN printf '%s\n' "numpy==2.2.6" "xgrammar==0.1.25" "vllm==0.19.1" "transformers
334
341
  cachetools uvicorn fastapi torchvision tqdm pyarrow \
335
342
  "flash-linear-attention @ git+https://github.com/fla-org/flash-linear-attention.git@9c8e42e762fce087c27b673af4922795d9edb85e" \
336
343
  "flash-qla==0.1.2" \
337
- "tilelang==0.1.11" \
338
- "apache-tvm-ffi==0.1.11" \
344
+ "tilelang==0.1.9" \
345
+ "apache-tvm-ffi==0.1.9" \
339
346
  && rm -f /tmp/verl-overrides.txt \
340
347
  && uv cache clean
341
348
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: freesolo-flash-dev
3
- Version: 1.2.70
3
+ Version: 1.2.87
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
@@ -14,6 +14,8 @@ from flash.adapters.lora_rank import (
14
14
  )
15
15
  from flash.core.catalog import get_model
16
16
 
17
+ _LORA_FACTOR_PATTERN = re.compile(r"\.lora_[AB]\.")
18
+ _LORA_PARAMETER = "weight"
17
19
  _QWEN36_MODEL_ID = "Qwen/Qwen3.6-35B-A3B"
18
20
  _QWEN36_EXPERT_TARGET_PARAMETERS = (
19
21
  "mlp.experts.gate_up_proj",
@@ -31,7 +33,7 @@ _FUSED_EXPERT_SYNTHETIC_MODULES = frozenset({"experts", "base_layer"})
31
33
  _FUSED_EXPERT_WRAPPER_MODULES = ("mlp.experts", "mlp.experts.base_layer")
32
34
  _INVALID_FUSED_LOCATION = object()
33
35
 
34
- _LoraTensor = tuple[str, str, str, str, tuple[int, ...]]
36
+ _LoraTensor = tuple[str, str, str, tuple[int, ...]]
35
37
  _LoraPair = tuple[tuple[int, ...], tuple[int, ...]]
36
38
 
37
39
 
@@ -166,12 +168,13 @@ def has_complete_fused_expert_tensors(
166
168
  expected = _expected_fused_expert_rungs(config, model_id)
167
169
  if expected is None:
168
170
  return False
171
+ lora_keys = {key: shape for key, shape in tensors.items() if _LORA_FACTOR_PATTERN.search(key)}
169
172
  parsed = [
170
173
  tensor
171
- for key, shape in tensors.items()
174
+ for key, shape in lora_keys.items()
172
175
  if (tensor := _parse_lora_tensor(key, shape)) is not None
173
176
  ]
174
- if len({adapter_name for _, _, adapter_name, _, _ in parsed}) != 1:
177
+ if len(parsed) != len(lora_keys):
175
178
  return False
176
179
  return _has_complete_fused_rungs(parsed, expected, model_id) and _has_ordinary_evidence(
177
180
  parsed, config, expected
@@ -179,7 +182,17 @@ def has_complete_fused_expert_tensors(
179
182
 
180
183
 
181
184
  def _parse_lora_tensor(key: str, shape: tuple[int, ...]) -> _LoraTensor | None:
182
- """Parse one canonical PEFT LoRA tensor key."""
185
+ """Parse one canonical PEFT LoRA tensor key.
186
+
187
+ Accept exactly the grammar PEFT writes: a bare ``lora_A.weight`` leaf with no adapter
188
+ namespace. ``get_peft_model_state_dict`` documents stripping the namespace on save, verl's
189
+ merger reproduces that strip, and ``_insert_adapter_name_into_state_dict`` re-inserts it on
190
+ load, so the stripped form is the only spelling that round-trips. Verified against peft 0.19.1:
191
+ ``...lora_A.weight`` loads as ``...lora_A.default.weight`` and matches the live module, while a
192
+ file that already carries the namespace loads as ``...lora_A.default.default.weight`` and
193
+ matches nothing. Since one grammar is accepted, the adapter namespace is no longer part of the
194
+ parsed identity.
195
+ """
183
196
  matches = [
184
197
  (factor, infix) for factor, infix in (("A", ".lora_A."), ("B", ".lora_B.")) if infix in key
185
198
  ]
@@ -187,13 +200,9 @@ def _parse_lora_tensor(key: str, shape: tuple[int, ...]) -> _LoraTensor | None:
187
200
  return None
188
201
  factor, infix = matches[0]
189
202
  module_path, _, leaf = key.partition(infix)
190
- leaf_parts = leaf.split(".")
191
- if not module_path or len(leaf_parts) != 2:
203
+ if not module_path or module_path.endswith(".") or leaf != _LORA_PARAMETER:
192
204
  return None
193
- adapter_name, parameter = leaf_parts
194
- if not adapter_name or parameter != "weight":
195
- return None
196
- return module_path, factor, adapter_name, key, shape
205
+ return module_path, factor, key, shape
197
206
 
198
207
 
199
208
  def _expected_fused_expert_rungs(
@@ -237,31 +246,25 @@ def _expected_fused_expert_rungs(
237
246
  def _has_complete_fused_rungs(
238
247
  tensors: list[_LoraTensor], expected: Mapping[str, Mapping[str, _LoraPair]], model_id: str
239
248
  ) -> bool:
240
- """Validate every concrete fused owner, rung, namespace, and factor shape."""
249
+ """Validate every concrete fused owner, rung, and factor shape."""
241
250
  model = get_model(model_id)
242
251
  for owner, expected_rungs in expected.items():
243
- factors: dict[str, dict[str, dict[str, dict[str, tuple[int, ...]]]]] = {}
244
- for module_path, factor, adapter_name, _key, shape in tensors:
252
+ factors: dict[str, dict[str, dict[str, tuple[int, ...]]]] = {}
253
+ for module_path, factor, _key, shape in tensors:
245
254
  location = _fused_tensor_location(module_path, owner, frozenset(expected_rungs))
246
255
  if location is _INVALID_FUSED_LOCATION:
247
256
  return False
248
257
  if location is None:
249
258
  continue
250
259
  instance, rung = location
251
- factors.setdefault(instance, {}).setdefault(rung, {}).setdefault(adapter_name, {})[
252
- factor
253
- ] = shape
260
+ factors.setdefault(instance, {}).setdefault(rung, {})[factor] = shape
254
261
  if not factors:
255
262
  return False
256
263
  for seen_rungs in factors.values():
257
264
  if set(seen_rungs) != set(expected_rungs):
258
265
  return False
259
266
  for rung, expected_pair in expected_rungs.items():
260
- namespaces = seen_rungs[rung]
261
- if len(namespaces) != 1:
262
- return False
263
- seen_factors = next(iter(namespaces.values()))
264
- if _lora_pair_shapes(seen_factors) != expected_pair:
267
+ if _lora_pair_shapes(seen_rungs[rung]) != expected_pair:
265
268
  return False
266
269
  expert_layers = {
267
270
  prefix
@@ -303,28 +306,27 @@ def _has_ordinary_evidence(
303
306
  config: Mapping[str, Any],
304
307
  fused_rungs: Mapping[str, Mapping[str, _LoraPair]],
305
308
  ) -> bool:
306
- """Validate concrete ordinary target evidence with per-module ranks and namespaces."""
309
+ """Validate concrete ordinary target evidence with per-module ranks."""
307
310
  modules = config.get("target_modules")
308
311
  all_linear = modules == "all-linear"
309
312
  targets = () if all_linear else tuple(modules) if isinstance(modules, list) else ()
310
- groups: dict[str, dict[str, dict[str, tuple[str, tuple[int, ...]]]]] = {}
313
+ groups: dict[str, dict[str, tuple[str, tuple[int, ...]]]] = {}
311
314
  evidence: set[str] = set()
312
- for module_path, factor, adapter_name, key, shape in tensors:
315
+ for module_path, factor, key, shape in tensors:
313
316
  if _is_fused_rung(module_path, fused_rungs):
314
317
  continue
315
318
  matched = tuple(target for target in targets if _anchored_suffix_match(module_path, target))
316
319
  if not all_linear and not matched:
317
320
  continue
318
321
  evidence.update(matched)
319
- groups.setdefault(module_path, {}).setdefault(adapter_name, {})[factor] = (key, shape)
322
+ groups.setdefault(module_path, {})[factor] = (key, shape)
320
323
  if not groups or (not all_linear and evidence != set(targets)):
321
324
  return False
322
325
 
323
326
  declared = declared_lora_ranks(config)
324
- for module_path, namespaces in groups.items():
325
- if len(namespaces) != 1 or _rank_for_module(module_path, declared) is None:
327
+ for module_path, factors in groups.items():
328
+ if _rank_for_module(module_path, declared) is None:
326
329
  return False
327
- factors = next(iter(namespaces.values()))
328
330
  if set(factors) != {"A", "B"}:
329
331
  return False
330
332
  for key, shape in factors.values():
@@ -249,10 +249,31 @@ def grpo_kv_floor_gb(
249
249
  return upper
250
250
 
251
251
 
252
+ def _rollout_stays_resident(model_info, model_id: str = "") -> bool:
253
+ """True when the rollout engine is pinned resident and never sleeps.
254
+
255
+ Named for the property sizing actually depends on rather than the catalog flag that currently
256
+ implies it: ``sleep_unsupported`` records that a model HANGS on wake, and
257
+ ``rollout_resident_overrides`` turns that into ``free_cache_engine=false``. Sizing cares only
258
+ about the second fact, so it reads through this predicate -- the worker gate
259
+ (``rollout_fp8_kv``) answers the same question, and the two must not drift.
260
+ """
261
+ if getattr(model_info, "sleep_unsupported", False):
262
+ return True
263
+ if not model_id:
264
+ return False
265
+ from flash.core.catalog import MODELS
266
+
267
+ info = MODELS.get(model_id)
268
+ return bool(info is not None and getattr(info, "sleep_unsupported", False))
269
+
270
+
252
271
  def _declares_linear_attention(model_info, model_id: str = "") -> bool:
253
272
  """True for a GDN hybrid, using the catalog rather than a network config fetch.
254
273
 
255
- GDN workers reject fp8 KV, so sizing must not apply that discount. Fall back to catalog lookup
274
+ A GDN worker rejects fp8 KV only when its rollout engine sleeps, because the crash is vllm's
275
+ ``init_fp8_kv_scales`` on wake; a model the catalog pins resident keeps fp8. Callers that size a
276
+ KV pool must therefore pair this with ``_rollout_stays_resident``. Fall back to catalog lookup
256
277
  by model id for pinned revisions because attention family is revision-independent.
257
278
  """
258
279
  if int(getattr(model_info, "num_linear_attention_layers", 0) or 0) > 0:
@@ -661,7 +682,12 @@ def _opd_fp8_adjust(
661
682
  """Re-size an OPD requirement with fp8 KV on modern cards when sufficient."""
662
683
  from flash.providers.base import max_non_fp8_kv_vram_gb
663
684
 
664
- if _declares_linear_attention(model_info, model_id):
685
+ # a gdn hybrid keeps the bf16 reservation only while its engine sleeps. once the catalog pins
686
+ # it resident the worker sends fp8 (rollout_fp8_kv), so sizing must price the same cache or it
687
+ # reserves a full-width pool nobody allocates.
688
+ if _declares_linear_attention(model_info, model_id) and not _rollout_stays_resident(
689
+ model_info, model_id
690
+ ):
665
691
  return need
666
692
  ceiling = max_non_fp8_kv_vram_gb()
667
693
  if need <= ceiling:
@@ -935,6 +935,7 @@ from flash.engine.worker.verl.capabilities import ( # noqa: E402,F401
935
935
  resolve_rollout_enforce_eager,
936
936
  resolve_verl_loggers,
937
937
  resolve_verl_python,
938
+ rollout_fp8_kv,
938
939
  rollout_mm_processor_cache_overrides,
939
940
  rollout_resident_overrides,
940
941
  rollout_sleep_unsupported,
@@ -35,6 +35,7 @@ from flash.engine.worker.backend_common import ( # noqa: F401
35
35
  resolve_rollout_enforce_eager,
36
36
  resolve_verl_loggers,
37
37
  resolve_verl_python,
38
+ rollout_fp8_kv,
38
39
  rollout_sleep_unsupported,
39
40
  run_verl_training,
40
41
  shim_marker_file,
@@ -321,7 +322,7 @@ def run_opd_train(spec=None) -> None:
321
322
  gdn_module = gdn_probe_module(model_id, model_revision) if gdn_hybrid else ""
322
323
  # ONE child answers every independent capability question. each used to cost its own interpreter, and the torch/verl import -- not the question -- was the price.
323
324
  caps = probe_verl_capabilities(python_bin, gdn_module)
324
- # enable fp8 kv on cc >= 8.9 only for non-gdn models; gdn sleep/wake crashes on hybrid caches. keep this aligned with vram.py, and keep the device probe separate from gdn classification.
325
+ # enable fp8 kv on cc >= 8.9. a gdn hybrid qualifies only when the catalog pins its rollout engine resident: it is sleep/WAKE that crashes on the hybrid cache, not gdn itself. see rollout_fp8_kv. keep this aligned with vram.py, and keep the device probe separate from gdn classification.
325
326
  try:
326
327
  import torch as _torch_cc
327
328
 
@@ -330,7 +331,7 @@ def run_opd_train(spec=None) -> None:
330
331
  )
331
332
  except Exception: # no cuda / probe failure -> conservative bf16 kv
332
333
  _cc_ok = False
333
- fp8_kv = _cc_ok and not gdn_hybrid
334
+ fp8_kv = rollout_fp8_kv(_cc_ok, gdn_hybrid, model_id)
334
335
  # gdn packing requires child support for seq_idx and cu_seqlens; fallbacks discard both and silently bleed state across examples. record whether the child can reset gdn state because successful runs upload no console and failure here is silent contamination; none means non-gdn. see require_gdn_boundary_resets.
335
336
  gdn_reset_arch = require_gdn_boundary_resets(caps, gdn_module)
336
337
  # run sm86 eagerly because vllm 0.19.1 graph capture degenerates there. sm89 capture is empirically acceptable; enforce_eager overrides async cudagraph settings last at config/vllm.py:1024.
@@ -315,9 +315,10 @@ def _ensure_fla_fastpath_on_hopper() -> None:
315
315
  return False
316
316
  return rc == 0
317
317
 
318
- # 0.1.12 double-registers the TVM-FFI runtime -> `import tilelang` aborts; keep in lockstep with Dockerfile.worker.
319
- TVM_FFI_PIN = "0.1.11"
320
- TILELANG_PIN = "0.1.11"
318
+ # flash-qla requires exactly these two, and 0.1.12 double-registers the TVM-FFI runtime ->
319
+ # `import tilelang` aborts; keep in lockstep with Dockerfile.worker and capabilities.py.
320
+ TVM_FFI_PIN = "0.1.9"
321
+ TILELANG_PIN = "0.1.9"
321
322
 
322
323
  try:
323
324
  tilelang_ok = True
@@ -41,6 +41,7 @@ from flash.engine.worker.backend_common import ( # noqa: F401
41
41
  resolve_rollout_enforce_eager,
42
42
  resolve_verl_loggers,
43
43
  resolve_verl_python,
44
+ rollout_fp8_kv,
44
45
  stamp_adapter_dir_provenance,
45
46
  verl_declares_rollout_field,
46
47
  verl_device_capability,
@@ -266,8 +267,10 @@ def _configure_rl_child(
266
267
  gdn_reset_arch=gdn_reset_arch,
267
268
  loggers=loggers,
268
269
  )
269
- # reuse the gdn answer resolved above rather than re-probing; see gdn_hybrid.
270
- fp8_kv = cc_ok and not gdn_hybrid
270
+ # reuse the gdn answer resolved above rather than re-probing; see gdn_hybrid. a gdn hybrid keeps
271
+ # fp8 only when the catalog pins its engine resident -- see rollout_fp8_kv for why sleep is the
272
+ # thing that actually crashes, not gdn.
273
+ fp8_kv = rollout_fp8_kv(cc_ok, gdn_hybrid, inp["model_id"])
271
274
  # one capability probe, both rollout decisions below. asked of the verl interpreter, whose
272
275
  # torch/vllm stack is the one that has to run the rollout.
273
276
  verl_cc = verl_device_capability(caps)
@@ -479,15 +479,15 @@ def resolve_verl_python(workdir: str, *, install_wandb: bool = False) -> str:
479
479
  # binds chunk_gated_delta_rule to the pure-torch fallback that
480
480
  # takes **kwargs and discards cu_seqlens, and packed gdn runs
481
481
  # train across example boundaries while looking patched.
482
- # apache-tvm-ffi is pinned to 0.1.11 because 0.1.12
483
- # double-registers TVM-FFI and aborts `import tilelang`.
482
+ # apache-tvm-ffi is pinned to 0.1.9 because flash-qla requires exactly that, and
483
+ # 0.1.12 double-registers TVM-FFI and aborts `import tilelang`.
484
484
  FLA_REQUIREMENT,
485
485
  # the flashqla GDN backend fla 0.5.2 dispatches to. same lockstep requirement:
486
486
  # the shim binds it in THIS interpreter, so a wheel present only in the worker's
487
487
  # env would leave the child on the old kernel while the marker still printed.
488
488
  FLASH_QLA_REQUIREMENT,
489
- "tilelang==0.1.11",
490
- "apache-tvm-ffi==0.1.11",
489
+ "tilelang==0.1.9",
490
+ "apache-tvm-ffi==0.1.9",
491
491
  ],
492
492
  check=True,
493
493
  )
@@ -742,6 +742,37 @@ def rollout_sleep_unsupported(model_id: str) -> bool:
742
742
  return bool(info is not None and getattr(info, "sleep_unsupported", False))
743
743
 
744
744
 
745
+ def rollout_fp8_kv(cc_ok: bool, gdn_hybrid: bool, model_id: str) -> bool:
746
+ """whether the rollout engine may cache KV in fp8. shared by grpo and opd.
747
+
748
+ ``cc_ok`` (cc>=8.9) is the hardware floor. the gdn exclusion on top of it is narrower than it
749
+ looks: the crash it avoids is vllm's ``init_fp8_kv_scales``, which zeroes each cache tensor and
750
+ hits ``'list' object has no attribute 'zero_'`` on a hybrid cache. that function is reachable
751
+ from exactly ONE place -- ``gpu_worker.wake_up`` (``v1/worker/gpu_worker.py:198-203``) -- and
752
+ verl only ever wakes an engine it put to sleep: both training-path callers are gated on
753
+ ``rollout.free_cache_engine`` (``engine_workers.py:706,741`` -> ``vllm_rollout.py:161``). a model
754
+ the catalog flags ``sleep_unsupported`` runs with that flag pinned false by
755
+ ``rollout_resident_overrides``, so it never sleeps, never wakes, and never reaches the crash.
756
+
757
+ the resident engine still gets fp8 for its ordinary attention layers: the recurrent state is a
758
+ separate ``MambaSpec`` carrying its own dtypes, so fp8 never applies to it. vram sizing already
759
+ prices this exact combination -- ``mamba_block_size=1072`` is the fp8-derived attention-token
760
+ page (the 1,097,728-byte gdn state over a 1024-byte fp8 attention token, rounded to vllm's
761
+ 16-token alignment) and ``kv_sizing`` applies it only when ``fp8_kv`` is set.
762
+
763
+ this also closes a planner/worker disagreement rather than merely freeing memory: the grpo
764
+ resident wall in ``vram.py`` sizes a ``sleep_unsupported`` model with ``fp8_kv=True`` already,
765
+ so a worker that sent bf16 needed ~6-7 GB MORE than the planner had reserved for it (measured
766
+ at 4096x8 and 8192x4). the two halves now assume the same cache dtype.
767
+ """
768
+ if not cc_ok:
769
+ return False
770
+ if not gdn_hybrid:
771
+ return True
772
+ # gdn + sleeping engine is the combination that crashes on wake; gdn + resident is not.
773
+ return rollout_sleep_unsupported(model_id)
774
+
775
+
745
776
  def rollout_resident_overrides(sleep_unsupported: bool) -> list[str]:
746
777
  """verl overrides that pin the rollout engine resident, or ``[]`` to keep verl's default.
747
778
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "freesolo-flash-dev"
3
- version = "1.2.70"
3
+ version = "1.2.87"
4
4
  description ="Flash — managed LoRA post-training (SFT/GRPO/OPD) for Freesolo environments, driven by the `flash` CLI"
5
5
  readme = "README.md"
6
6
  # RunPod Flash supports Python 3.11-3.12 (not 3.13 yet).
@@ -137,7 +137,7 @@ artifacts = ["flash/py.typed"]
137
137
  # auto-published by .github/workflows/publish-dev.yml: a push to `dev` whose version isn't yet on
138
138
  # PyPI publishes it; pushes that don't change it find it already published and no-op. So cutting a
139
139
  # dev-channel release = bump this (and [project].version) and merge to `dev`.
140
- version = "1.2.70"
140
+ version = "1.2.87"
141
141
 
142
142
  [tool.pytest.ini_options]
143
143
  pythonpath = ["."]
@@ -28,7 +28,10 @@ def _import_worker(monkeypatch):
28
28
  return worker
29
29
 
30
30
 
31
- def _wrapper_tensors(prefix, pair, factor_leaves=("default.weight", "default.weight")):
31
+ _SERIALIZED_LEAVES = ("weight", "weight")
32
+
33
+
34
+ def _wrapper_tensors(prefix, pair, factor_leaves=_SERIALIZED_LEAVES):
32
35
  shape_a, shape_b = pair
33
36
  leaf_a, leaf_b = factor_leaves
34
37
  return {
@@ -40,7 +43,7 @@ def _wrapper_tensors(prefix, pair, factor_leaves=("default.weight", "default.wei
40
43
  def _ordinary_tensors(
41
44
  target="q_proj",
42
45
  pair=((32, 2048), (2048, 32)),
43
- factor_leaves=("default.weight", "default.weight"),
46
+ factor_leaves=_SERIALIZED_LEAVES,
44
47
  ):
45
48
  prefix = f"base_model.model.layers.0.self_attn.{target}"
46
49
  return _wrapper_tensors(prefix, pair, factor_leaves)
@@ -51,7 +54,7 @@ def _complete_expert_tensors(
51
54
  owner_segment="mlp.experts",
52
55
  pairs=_EXPECTED_PAIRS,
53
56
  swap_rungs=False,
54
- factor_leaves=("default.weight", "default.weight"),
57
+ factor_leaves=_SERIALIZED_LEAVES,
55
58
  include_ordinary=True,
56
59
  ):
57
60
  tensors = {}
@@ -356,20 +359,19 @@ def test_tensor_analyzer_rejects_swapped_qwen36_rungs():
356
359
  )
357
360
 
358
361
 
359
- def test_tensor_analyzer_requires_matching_adapter_namespaces_across_all_exact_owners():
362
+ def test_tensor_analyzer_rejects_every_adapter_namespace_on_disk():
363
+ """No namespaced spelling is a real serialized artifact, uniform or not.
364
+
365
+ PEFT strips the namespace on save and re-inserts it on load, so a file that still carries one
366
+ loads with the namespace doubled and matches no module.
367
+ """
360
368
  from flash.adapters.fused_experts import has_complete_fused_expert_tensors
361
369
 
362
370
  config = _valid_config()
363
- assert has_complete_fused_expert_tensors(
364
- _complete_expert_tensors(factor_leaves=("foo.weight", "foo.weight")),
365
- config,
366
- _MODEL_ID,
367
- )
368
- assert not has_complete_fused_expert_tensors(
369
- _complete_expert_tensors(factor_leaves=("foo.weight", "bar.weight")),
370
- config,
371
- _MODEL_ID,
372
- )
371
+ for leaves in (("foo.weight", "foo.weight"), ("foo.weight", "bar.weight")):
372
+ assert not has_complete_fused_expert_tensors(
373
+ _complete_expert_tensors(factor_leaves=leaves), config, _MODEL_ID
374
+ )
373
375
 
374
376
 
375
377
  def test_tensor_analyzer_rejects_namespace_changes_across_wrapper_rungs():
@@ -426,11 +428,7 @@ def test_tensor_analyzer_requires_every_catalog_layer_and_both_lora_factors():
426
428
  _MODEL_ID,
427
429
  )
428
430
  assert not has_complete_fused_expert_tensors(
429
- {
430
- key: shape
431
- for key, shape in complete.items()
432
- if not key.endswith("lora_B.default.weight")
433
- },
431
+ {key: shape for key, shape in complete.items() if not key.endswith("lora_B.weight")},
434
432
  config,
435
433
  _MODEL_ID,
436
434
  )
@@ -463,8 +461,7 @@ def _expert_namespace_mismatch(rung):
463
461
  tensors = _complete_expert_tensors()
464
462
  suffix = "" if rung == "outer" else ".base_layer"
465
463
  prefix = f"base_model.model.layers.0.mlp.experts{suffix}"
466
- default_key = f"{prefix}.lora_B.default.weight"
467
- tensors[f"{prefix}.lora_B.other.weight"] = tensors.pop(default_key)
464
+ tensors[f"{prefix}.lora_B.other.weight"] = tensors.pop(f"{prefix}.lora_B.weight")
468
465
  return tensors
469
466
 
470
467
 
@@ -649,3 +646,133 @@ def test_tensor_analyzer_rejects_non_peft_fused_shapes(tensors, config):
649
646
  from flash.adapters.fused_experts import has_complete_fused_expert_tensors
650
647
 
651
648
  assert not has_complete_fused_expert_tensors(tensors, config, _MODEL_ID)
649
+
650
+
651
+ def test_tensor_analyzer_accepts_the_grammar_peft_and_verl_actually_write():
652
+ from flash.adapters.fused_experts import has_complete_fused_expert_tensors
653
+
654
+ stripped = _complete_expert_tensors()
655
+
656
+ assert not any(".default." in key for key in stripped)
657
+ assert has_complete_fused_expert_tensors(stripped, _valid_config(), _MODEL_ID)
658
+
659
+
660
+ def test_export_stamps_an_adapter_serialized_without_the_adapter_namespace(monkeypatch, tmp_path):
661
+ import flash.engine.worker.verl.checkpoints as checkpoints
662
+
663
+ tensors = _complete_expert_tensors()
664
+ tensors.update(_ordinary_tensors(target="v_proj"))
665
+ monkeypatch.setattr(checkpoints, "_read_adapter_tensor_metadata", lambda _path: tensors)
666
+ config = {
667
+ "peft_type": "LORA",
668
+ "r": 32,
669
+ "target_modules": ["v_proj", "experts", "base_layer"],
670
+ "target_parameters": None,
671
+ }
672
+ _write_expert_adapter(tmp_path, config=config)
673
+
674
+ checkpoints.stamp_adapter_dir_provenance(str(tmp_path), _MODEL_ID, "e" * 40)
675
+
676
+ saved = json.loads((tmp_path / "adapter_config.json").read_text(encoding="utf-8"))
677
+ assert saved["target_parameters"] == _TARGETS
678
+ assert saved["base_model_name_or_path"] == _MODEL_ID
679
+
680
+
681
+ def test_warmstart_accepts_an_adapter_serialized_without_the_adapter_namespace(
682
+ monkeypatch, tmp_path
683
+ ):
684
+ import flash.engine.worker.model.adapter as adapter
685
+
686
+ worker = _import_worker(monkeypatch)
687
+ tensors = _complete_expert_tensors()
688
+ monkeypatch.setattr(adapter, "_read_adapter_tensor_metadata", lambda _path: tensors)
689
+
690
+ worker.validate_warmstart_adapter(_valid_config(), _MODEL_ID, str(tmp_path))
691
+
692
+
693
+ @pytest.mark.parametrize("rung", ["outer", "nested"])
694
+ def test_tensor_analyzer_still_rejects_cross_namespace_pairs_when_serialized(rung):
695
+ from flash.adapters.fused_experts import has_complete_fused_expert_tensors
696
+
697
+ tensors = _complete_expert_tensors()
698
+ suffix = "" if rung == "outer" else ".base_layer"
699
+ prefix = f"base_model.model.layers.0.mlp.experts{suffix}"
700
+ tensors[f"{prefix}.lora_B.other.weight"] = tensors.pop(f"{prefix}.lora_B.weight")
701
+
702
+ assert not has_complete_fused_expert_tensors(tensors, _valid_config(), _MODEL_ID)
703
+
704
+
705
+ @pytest.mark.parametrize(
706
+ ("leaf", "expected"),
707
+ [
708
+ pytest.param("weight", "module", id="serialized-bare-leaf"),
709
+ pytest.param("default.weight", None, id="explicit-default-does-not-roundtrip"),
710
+ pytest.param("other.weight", None, id="explicit-namespace-does-not-roundtrip"),
711
+ pytest.param("not_peft", None, id="wrong-parameter-name"),
712
+ pytest.param("default.not_peft", None, id="namespaced-wrong-parameter-name"),
713
+ pytest.param("default.weight.extra", None, id="extra-segment"),
714
+ pytest.param(".weight", None, id="empty-adapter-name"),
715
+ pytest.param("", None, id="empty-leaf"),
716
+ ],
717
+ )
718
+ def test_parse_lora_tensor_pins_the_exact_accepted_leaf_grammar(leaf, expected):
719
+ """Pin the grammar directly.
720
+
721
+ Routing these through the whole-artifact analyzer used to be inert: a malformed key merely
722
+ failed to parse, and the surviving tensors still satisfied every downstream check, so the
723
+ assertion passed for the wrong reason. Sabotaging the parser to accept an empty adapter name
724
+ left the artifact-level version green.
725
+ """
726
+ from flash.adapters.fused_experts import _parse_lora_tensor
727
+
728
+ parsed = _parse_lora_tensor(f"module.lora_A.{leaf}", (8, 16))
729
+
730
+ if expected is None:
731
+ assert parsed is None
732
+ else:
733
+ module_path, factor, key, shape = parsed
734
+ assert (module_path, factor) == (expected, "A")
735
+ assert (key, shape) == (f"module.lora_A.{leaf}", (8, 16))
736
+
737
+
738
+ def test_parse_lora_tensor_requires_exactly_one_factor_infix():
739
+ from flash.adapters.fused_experts import _parse_lora_tensor
740
+
741
+ assert _parse_lora_tensor("m.lora_A.lora_B.weight", (8, 16)) is None
742
+ assert _parse_lora_tensor("lora_A.weight", (8, 16)) is None
743
+
744
+
745
+ def test_tensor_analyzer_rejects_an_artifact_carrying_the_adapter_namespace():
746
+ """Only the stripped grammar round-trips through PEFT, so a namespaced file must not validate.
747
+
748
+ Verified against the locked peft 0.19.1 ``_insert_adapter_name_into_state_dict``: a stripped
749
+ ``...lora_A.weight`` loads as ``...lora_A.default.weight`` and matches the live module, while
750
+ ``...lora_A.default.weight`` loads as ``...lora_A.default.default.weight`` and matches nothing.
751
+ """
752
+ from flash.adapters.fused_experts import has_complete_fused_expert_tensors
753
+
754
+ for leaves in (("default.weight", "default.weight"), ("other.weight", "other.weight")):
755
+ tensors = _complete_expert_tensors(factor_leaves=leaves)
756
+
757
+ assert not has_complete_fused_expert_tensors(tensors, _valid_config(), _MODEL_ID)
758
+
759
+
760
+ def test_tensor_analyzer_rejects_an_unparseable_lora_key():
761
+ """An unrecognized lora key must fail the artifact rather than be skipped.
762
+
763
+ Dropping it would let a malformed tensor ride along beside a complete canonical set, and a
764
+ trailing-dot module alias would then collapse onto the outer rung and make the verdict depend
765
+ on mapping iteration order.
766
+ """
767
+ from flash.adapters.fused_experts import has_complete_fused_expert_tensors
768
+
769
+ owner = "base_model.model.layers.0.mlp.experts"
770
+ for alias in (f"{owner}..lora_A.weight", f"{owner}.lora_A.not_peft"):
771
+ for alias_first in (True, False):
772
+ tensors = _complete_expert_tensors()
773
+ if alias_first:
774
+ tensors = {alias: (1, 1), **tensors}
775
+ else:
776
+ tensors[alias] = (1, 1)
777
+
778
+ assert not has_complete_fused_expert_tensors(tensors, _valid_config(), _MODEL_ID)