freesolo-flash-dev 0.2.36__tar.gz → 0.2.38__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 (282) hide show
  1. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/Dockerfile.worker +5 -6
  2. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/PKG-INFO +3 -3
  3. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/README.md +2 -2
  4. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/docker/Dockerfile.kernelcache +1 -1
  5. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/docker/bake_kernel_cache.py +4 -4
  6. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/docker/kernel_fingerprint.py +43 -5
  7. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/docs/cli-style/generate.py +4 -2
  8. freesolo_flash_dev-0.2.38/docs/cli-style/index.html +343 -0
  9. freesolo_flash_dev-0.2.38/flash/adapter_artifacts.py +7 -0
  10. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/catalog.py +27 -14
  11. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/cli/__init__.py +2 -3
  12. freesolo_flash_dev-0.2.38/flash/cli/_tty.py +32 -0
  13. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/cli/commands.py +52 -38
  14. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/cli/envpush.py +51 -52
  15. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/cli/render.py +3 -5
  16. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/cli/training_doc.py +14 -4
  17. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/client/__init__.py +9 -1
  18. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/client/http.py +92 -4
  19. freesolo_flash_dev-0.2.38/flash/cost/spec.py +109 -0
  20. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/chalk_kernels.py +30 -7
  21. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/vram.py +13 -3
  22. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/__init__.py +6 -0
  23. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/adapter.py +2 -1
  24. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/heartbeat.py +12 -1
  25. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/hf.py +5 -6
  26. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/kernel_warmup.py +18 -98
  27. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/lora.py +67 -14
  28. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/rl.py +15 -85
  29. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/sft.py +93 -26
  30. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/envs/adapter.py +3 -31
  31. freesolo_flash_dev-0.2.38/flash/envs/archive_policy.py +52 -0
  32. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/envs/loader.py +39 -36
  33. freesolo_flash_dev-0.2.38/flash/envs/pull.py +257 -0
  34. freesolo_flash_dev-0.2.38/flash/providers/_hf_retry.py +76 -0
  35. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/_instance_bootstrap.py +35 -3
  36. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/_poll.py +13 -4
  37. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/lambdalabs/__init__.py +10 -11
  38. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/lambdalabs/jobs/__init__.py +4 -3
  39. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/runpod/jobs.py +23 -22
  40. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/runpod/train/__init__.py +4 -54
  41. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/runpod/train/deps.py +10 -3
  42. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/runpod/train/endpoints.py +33 -3
  43. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/runner/__init__.py +25 -0
  44. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/runner/checkpoints.py +6 -9
  45. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/runner/deploy.py +4 -4
  46. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/runner/lifecycle.py +4 -4
  47. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/schema/__init__.py +5 -0
  48. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/serve/deploy.py +1 -22
  49. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/server/_internal_client.py +79 -3
  50. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/server/environment_registry.py +19 -47
  51. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/server/envs.py +149 -62
  52. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/server/routes/envs.py +21 -1
  53. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/server/routes/meta.py +7 -1
  54. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/server/routes/serving.py +0 -2
  55. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/server/run_registry.py +8 -18
  56. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/pyproject.toml +9 -14
  57. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/_helpers/specs.py +1 -1
  58. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_agent_flash_cli_contract.py +1 -0
  59. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_algorithms.py +1 -1
  60. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_allocator.py +35 -0
  61. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_backend_jobspec_contract.py +2 -1
  62. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_catalog_consistency.py +32 -21
  63. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_chalk_kernels.py +34 -13
  64. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_checkpoints.py +119 -24
  65. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_cli_commands.py +62 -3
  66. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_cli_estimate.py +13 -145
  67. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_cli_render_theme.py +4 -8
  68. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_client.py +77 -2
  69. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_disk_gb.py +2 -0
  70. freesolo_flash_dev-0.2.38/tests/test_env_download.py +101 -0
  71. freesolo_flash_dev-0.2.38/tests/test_env_download_api.py +99 -0
  72. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_env_pull.py +103 -410
  73. freesolo_flash_dev-0.2.38/tests/test_env_pull_managed_control_plane.py +165 -0
  74. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_env_push.py +7 -7
  75. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_envs_coverage.py +3 -2
  76. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_flash_worker.py +104 -11
  77. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_gpus.py +2 -2
  78. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_grpo_params.py +16 -40
  79. freesolo_flash_dev-0.2.38/tests/test_health_liveness.py +44 -0
  80. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_jobs.py +34 -0
  81. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_kernel_cache.py +38 -0
  82. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_kernel_fingerprint.py +9 -2
  83. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_lambda_runner.py +68 -0
  84. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_lora_rank_preflight.py +18 -10
  85. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_managed_hf_repo.py +2 -2
  86. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_provider_routing.py +2 -2
  87. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_runmgmt.py +88 -2
  88. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_serve.py +13 -38
  89. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_server_api.py +42 -10
  90. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_serving_contract.py +14 -14
  91. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_spec_and_validation.py +31 -7
  92. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_thinking_config.py +2 -1
  93. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_verifiers.py +93 -46
  94. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_vl_warmstart_adapter_keys.py +48 -3
  95. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_vl_warmstart_recombine.py +49 -15
  96. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_wandb_naming.py +2 -1
  97. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_weight_cache.py +3 -3
  98. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_worker_init_heartbeat.py +54 -5
  99. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/uv.lock +1 -1
  100. freesolo_flash_dev-0.2.36/docs/cli-style/index.html +0 -657
  101. freesolo_flash_dev-0.2.36/flash/cost/spec.py +0 -248
  102. freesolo_flash_dev-0.2.36/flash/envs/pull.py +0 -215
  103. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/.dockerignore +0 -0
  104. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/.env.example +0 -0
  105. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/.github/workflows/auto-rebake.yml +0 -0
  106. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/.github/workflows/bake-kernel-cache.yml +0 -0
  107. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/.github/workflows/ci.yml +0 -0
  108. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/.github/workflows/main-source-guard.yml +0 -0
  109. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/.github/workflows/notify-tests-repo.yml +0 -0
  110. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/.github/workflows/publish-dev.yml +0 -0
  111. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/.github/workflows/publish-image.yml +0 -0
  112. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/.github/workflows/publish.yml +0 -0
  113. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/.github/workflows/version-parity.yml +0 -0
  114. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/.github/workflows/worker-image.yml +0 -0
  115. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/.gitignore +0 -0
  116. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/Dockerfile +0 -0
  117. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/LICENSE +0 -0
  118. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/build/kernel_cache/.gitignore +0 -0
  119. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/build/kernel_cache/.keep +0 -0
  120. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/docker/Dockerfile.kernelcache.relayer +0 -0
  121. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/docker/bake_pod_entry.py +0 -0
  122. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/docker/make_rp_handler.py +0 -0
  123. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/docs/cli-style/README.md +0 -0
  124. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/docs/cli-style/preview.png +0 -0
  125. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/docs/cli-style/themed-errors.png +0 -0
  126. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/docs/kernel-cache.md +0 -0
  127. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/__init__.py +0 -0
  128. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/_channel.py +0 -0
  129. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/_fileio.py +0 -0
  130. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/_logging.py +0 -0
  131. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/_update_check.py +0 -0
  132. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/cli/__main__.py +0 -0
  133. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/client/config.py +0 -0
  134. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/client/runtime_secrets.py +0 -0
  135. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/client/specs.py +0 -0
  136. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/cost/__init__.py +0 -0
  137. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/cost/analytical.py +0 -0
  138. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/cost/facts.py +0 -0
  139. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/cost/types.py +0 -0
  140. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/__init__.py +0 -0
  141. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/accounting.py +0 -0
  142. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/multiturn_rollout.py +0 -0
  143. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/recipe.py +0 -0
  144. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/__main__.py +0 -0
  145. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/_pkg.py +0 -0
  146. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/decoding.py +0 -0
  147. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/finalize.py +0 -0
  148. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/gpu_setup.py +0 -0
  149. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/grpo.py +0 -0
  150. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/packing.py +0 -0
  151. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/perf/__init__.py +0 -0
  152. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/perf/attn.py +0 -0
  153. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/perf/diagnostics.py +0 -0
  154. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/perf/lifecycle.py +0 -0
  155. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/perf/liger.py +0 -0
  156. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/perf/loraplus.py +0 -0
  157. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/perf/memory.py +0 -0
  158. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/engine/worker/wandb_log.py +0 -0
  159. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/envs/__init__.py +0 -0
  160. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/envs/base.py +0 -0
  161. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/envs/registry.py +0 -0
  162. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/lora_rank.py +0 -0
  163. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/__init__.py +0 -0
  164. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/_auth.py +0 -0
  165. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/_http.py +0 -0
  166. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/_instance.py +0 -0
  167. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/allocator.py +0 -0
  168. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/base.py +0 -0
  169. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/lambdalabs/api.py +0 -0
  170. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/lambdalabs/auth.py +0 -0
  171. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/lambdalabs/gpus.py +0 -0
  172. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/lambdalabs/jobs/builders.py +0 -0
  173. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/lambdalabs/preflight.py +0 -0
  174. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/lambdalabs/pricing.py +0 -0
  175. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/lambdalabs/train.py +0 -0
  176. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/preflight.py +0 -0
  177. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/realized.py +0 -0
  178. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/runpod/__init__.py +0 -0
  179. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/runpod/api.py +0 -0
  180. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/runpod/auth.py +0 -0
  181. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/runpod/cost.py +0 -0
  182. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/runpod/gpus.py +0 -0
  183. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/runpod/keys.py +0 -0
  184. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/runpod/preflight.py +0 -0
  185. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/runpod/preload.py +0 -0
  186. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/runpod/pricing.py +0 -0
  187. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/providers/runpod/slots.py +0 -0
  188. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/py.typed +0 -0
  189. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/schema/fields.py +0 -0
  190. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/serve/__init__.py +0 -0
  191. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/serve/export.py +0 -0
  192. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/serve/pricing.py +0 -0
  193. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/server/__init__.py +0 -0
  194. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/server/__main__.py +0 -0
  195. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/server/_deps.py +0 -0
  196. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/server/_locks.py +0 -0
  197. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/server/_runtime.py +0 -0
  198. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/server/app.py +0 -0
  199. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/server/auth.py +0 -0
  200. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/server/billing.py +0 -0
  201. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/server/billing_retry.py +0 -0
  202. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/server/checkpoints.py +0 -0
  203. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/server/db.py +0 -0
  204. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/server/reconcile.py +0 -0
  205. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/server/routes/__init__.py +0 -0
  206. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/server/routes/runs.py +0 -0
  207. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/flash/spec.py +0 -0
  208. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/infisical-entrypoint.sh +0 -0
  209. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/scripts/build_dev_dist.py +0 -0
  210. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/__init__.py +0 -0
  211. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/_helpers/__init__.py +0 -0
  212. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/_helpers/runner.py +0 -0
  213. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/conftest.py +0 -0
  214. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/fixtures/math_eval.jsonl +0 -0
  215. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/fixtures/math_train.jsonl +0 -0
  216. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/live/__init__.py +0 -0
  217. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/live/conftest.py +0 -0
  218. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/live/test_lambda_live.py +0 -0
  219. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/live/test_runpod_live.py +0 -0
  220. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_b200_rollout_opt.py +0 -0
  221. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_billing_retry.py +0 -0
  222. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_cancel_remote.py +0 -0
  223. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_charge_pricing.py +0 -0
  224. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_cli_errors.py +0 -0
  225. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_cli_help.py +0 -0
  226. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_cli_managed.py +0 -0
  227. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_client_server_integration.py +0 -0
  228. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_config_overrides.py +0 -0
  229. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_cost_analytical.py +0 -0
  230. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_cost_equation.py +0 -0
  231. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_cost_estimate.py +0 -0
  232. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_cost_hardware.py +0 -0
  233. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_cost_models.py +0 -0
  234. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_cost_rewards.py +0 -0
  235. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_dev_channel.py +0 -0
  236. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_endpoint_name.py +0 -0
  237. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_env_cache_evict.py +0 -0
  238. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_env_delete.py +0 -0
  239. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_env_no_install.py +0 -0
  240. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_env_publish.py +0 -0
  241. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_env_rate_limit_resolve.py +0 -0
  242. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_export.py +0 -0
  243. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_flash_mvp.py +0 -0
  244. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_flashinfer_cache_dirs.py +0 -0
  245. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_github_urlopen_retry.py +0 -0
  246. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_grpo_mask_aware.py +0 -0
  247. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_grpo_sleep_gate.py +0 -0
  248. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_idle_endpoint_reaper.py +0 -0
  249. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_internal_client.py +0 -0
  250. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_kv_util.py +0 -0
  251. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_logging.py +0 -0
  252. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_login_perms.py +0 -0
  253. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_metrics_schema_agent_contract.py +0 -0
  254. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_mig_guard.py +0 -0
  255. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_multiturn_rollout.py +0 -0
  256. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_oom_escalate_gpu.py +0 -0
  257. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_open_model_policy.py +0 -0
  258. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_orchestrator_flash.py +0 -0
  259. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_packing.py +0 -0
  260. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_poll_helpers.py +0 -0
  261. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_preflight.py +0 -0
  262. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_provider_teardown_robustness.py +0 -0
  263. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_providers_symmetry.py +0 -0
  264. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_realized_cost.py +0 -0
  265. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_resolve_params_b.py +0 -0
  266. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_resume_on_retry.py +0 -0
  267. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_runpod_api_delete.py +0 -0
  268. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_runpod_key_fingerprint.py +0 -0
  269. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_runpod_key_waterfall.py +0 -0
  270. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_runpod_slots.py +0 -0
  271. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_server_billing.py +0 -0
  272. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_server_db.py +0 -0
  273. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_sft_gc_off.py +0 -0
  274. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_update_check.py +0 -0
  275. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_version.py +0 -0
  276. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_vl_weight_sync.py +0 -0
  277. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_warmstart_cross_repo.py +0 -0
  278. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_worker_dryrun.py +0 -0
  279. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_worker_hardexit.py +0 -0
  280. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_worker_image.py +0 -0
  281. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_worker_stack.py +0 -0
  282. {freesolo_flash_dev-0.2.36 → freesolo_flash_dev-0.2.38}/tests/test_worker_thinking.py +0 -0
@@ -42,7 +42,7 @@ ENV TRITON_CACHE_DIR=/opt/flash/kernelcache/triton \
42
42
  RUN mkdir -p /opt/flash/kernelcache/triton /opt/flash/kernelcache/inductor \
43
43
  /opt/flash/kernelcache/flashinfer_cubin /opt/flash/kernelcache/flashinfer
44
44
 
45
- # build-essential for Triton/Inductor (Liger) + any source builds; git for pip VCS installs.
45
+ # build-essential for Triton/Inductor/chalk + any source builds; git for pip VCS installs.
46
46
  RUN apt-get update && apt-get install -y --no-install-recommends build-essential git curl \
47
47
  && rm -rf /var/lib/apt/lists/*
48
48
 
@@ -58,7 +58,6 @@ RUN pip install --no-cache-dir \
58
58
  "huggingface_hub>=0.25" \
59
59
  "accelerate>=1.4" \
60
60
  "wandb>=0.17" \
61
- "liger-kernel>=0.5" \
62
61
  "flash-linear-attention @ git+https://github.com/fla-org/flash-linear-attention.git@f0e213dbd8b5fb90c3c7eca869ac1706d5377139" \
63
62
  "tilelang==0.1.11" \
64
63
  "apache-tvm-ffi==0.1.11" \
@@ -148,7 +147,7 @@ RUN TORCH_CUDA_ARCH_LIST="8.0 8.6 8.9 9.0 10.0 12.0" CAUSAL_CONV1D_FORCE_BUILD=T
148
147
  # affect another tenant). The redirect can't be a static image ENV: the volume mounts at a fixed path
149
148
  # only at runtime and only when attached, so a baked ENV would break cache-less (no-volume) cold runs.
150
149
  #
151
- # Compiled-kernel cache: OPT-IN bake, JIT fallback. The fused Triton (Liger/fla/chalk),
150
+ # Compiled-kernel cache: OPT-IN bake, JIT fallback. The fused Triton (fla/chalk),
152
151
  # TorchInductor, and Hopper tilelang kernels the trainer builds on first use are content-addressed
153
152
  # by GPU ARCH + toolchain version, so they can only be compiled on a real GPU of each catalog arch
154
153
  # (8.0/8.6/8.9/9.0/12.0) — which the CI image builder normally lacks (the FA2 *source* path above
@@ -187,7 +186,7 @@ RUN if [ "${BUILD_KERNEL_CACHE}" = "true" ] && [ -f /opt/flash/kernelcache/mega_
187
186
  # Sanity: the worker imports must succeed (catches a broken stack at build time, not run time).
188
187
  # Import EVERY package the worker runtime uses (derived from a full AST scan of the engine/envs/
189
188
  # bootstrap code + the WORKER_DEPS list above): the core stack, the optimizer/accelerator libs
190
- # (liger, flash-linear-attention=fla, flash_attn, bitsandbytes, triton), and the HF/env libs. A
189
+ # (flash-linear-attention=fla, flash_attn, bitsandbytes, triton), and the HF/env libs. A
191
190
  # missing or ABI-broken package fails the build HERE instead of silently shipping (the FA wheel in
192
191
  # particular can install yet fail to import against this torch). cuDNN comes from the base image.
193
192
  # flash_attn is BEST-EFFORT (the install above tolerates a build failure -> SDPA fallback), so it
@@ -195,7 +194,7 @@ RUN if [ "${BUILD_KERNEL_CACHE}" = "true" ] && [ -f /opt/flash/kernelcache/mega_
195
194
  # could never be produced. The rest of the stack is mandatory.
196
195
  RUN python -c "import importlib.metadata as M; \
197
196
  import torch, transformers, trl, peft, vllm, datasets, huggingface_hub, accelerate, wandb, \
198
- liger_kernel, fla, bitsandbytes, hf_transfer, triton, freesolo, runpod; \
197
+ fla, bitsandbytes, hf_transfer, triton, freesolo, runpod; \
199
198
  import importlib; \
200
199
  fa_ok = False; \
201
200
  exec('try:\n import flash_attn\n fa_ok = True\nexcept Exception:\n fa_ok = False'); \
@@ -207,7 +206,7 @@ cudnn = torch.backends.cudnn.version(); assert cudnn, 'cuDNN not compiled into t
207
206
  ver = lambda n: M.version(n); \
208
207
  print('worker stack OK | torch', torch.__version__, '| cudnn', cudnn, '| triton', triton.__version__, '| flash_attn', 'present' if fa_ok else 'ABSENT (SDPA fallback)', '| flash_attn_3', 'present (Hopper FA3)' if fa3_ok else 'ABSENT (SDPA on Hopper)', '| flashinfer', 'present (B200 MoE/attn)' if fi_ok else 'ABSENT (Triton fused-MoE fallback)'); \
209
208
  [print(' ', d, ver(d)) for d in ['transformers','trl','peft','vllm','flashinfer-python','datasets','huggingface-hub', \
210
- 'accelerate','wandb','liger-kernel','flash-linear-attention','bitsandbytes', \
209
+ 'accelerate','wandb','flash-linear-attention','bitsandbytes', \
211
210
  'hf-transfer','freesolo','runpod']]"
212
211
 
213
212
  # RunPod Serverless worker entrypoint (Pattern D — Flash custom image). Generate /rp_handler.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: freesolo-flash-dev
3
- Version: 0.2.36
3
+ Version: 0.2.38
4
4
  Summary: Flash — managed LoRA post-training (SFT/GRPO) 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
@@ -62,7 +62,7 @@ The allocator picks the cheapest validated managed GPU class that fits the run.
62
62
  - `flash checkpoints`, `flash deploy`, `flash chat` — serving for trained adapters,
63
63
  including deployable intermediate RL checkpoints.
64
64
  - **Freesolo SDK environments.** Every run names a Freesolo environment id.
65
- Scaffold `environment.py` plus `datasets/train.jsonl`, upload `.` or another
65
+ Scaffold `environment.py` plus `dataset/train.jsonl`, upload `.` or another
66
66
  folder with `flash env push --name <name> <folder>`, then reference the
67
67
  returned id. The worker loads it through `freesolo.environments`. There are no
68
68
  built-in task environments. Single-turn and bounded multi-turn environments are
@@ -84,7 +84,7 @@ The allocator picks the cheapest validated managed GPU class that fits the run.
84
84
  (task-specific grading lives with its example, not in the engine)
85
85
  - `flash/envs/` — environment machinery: registry and the adapter that loads
86
86
  Freesolo SDK environments onto the worker's interface
87
- - `flash env setup` — scaffold a starter local Freesolo env, `datasets/train.jsonl`,
87
+ - `flash env setup` — scaffold a starter local Freesolo env, `dataset/train.jsonl`,
88
88
  ready-to-run configs, and a `TRAINING.md` playbook with common failure modes and
89
89
  mitigations
90
90
  - `flash/serve/`, `flash/server/` — adapter serving and the FastAPI control
@@ -11,7 +11,7 @@ The allocator picks the cheapest validated managed GPU class that fits the run.
11
11
  - `flash checkpoints`, `flash deploy`, `flash chat` — serving for trained adapters,
12
12
  including deployable intermediate RL checkpoints.
13
13
  - **Freesolo SDK environments.** Every run names a Freesolo environment id.
14
- Scaffold `environment.py` plus `datasets/train.jsonl`, upload `.` or another
14
+ Scaffold `environment.py` plus `dataset/train.jsonl`, upload `.` or another
15
15
  folder with `flash env push --name <name> <folder>`, then reference the
16
16
  returned id. The worker loads it through `freesolo.environments`. There are no
17
17
  built-in task environments. Single-turn and bounded multi-turn environments are
@@ -33,7 +33,7 @@ The allocator picks the cheapest validated managed GPU class that fits the run.
33
33
  (task-specific grading lives with its example, not in the engine)
34
34
  - `flash/envs/` — environment machinery: registry and the adapter that loads
35
35
  Freesolo SDK environments onto the worker's interface
36
- - `flash env setup` — scaffold a starter local Freesolo env, `datasets/train.jsonl`,
36
+ - `flash env setup` — scaffold a starter local Freesolo env, `dataset/train.jsonl`,
37
37
  ready-to-run configs, and a `TRAINING.md` playbook with common failure modes and
38
38
  mitigations
39
39
  - `flash/serve/`, `flash/server/` — adapter serving and the FastAPI control
@@ -1,7 +1,7 @@
1
1
  # Thin per-arch kernel-cache layer.
2
2
  #
3
3
  # Bakes a warmup-produced mega-cache ON TOP of the EXACT base image the warmup ran inside, so the
4
- # cache's toolchain (torch/triton/fla/liger) is guaranteed to match the image it ships in. Rebuilding
4
+ # cache's toolchain (torch/triton/fla/chalk) is guaranteed to match the image it ships in. Rebuilding
5
5
  # the full Dockerfile.worker from the checkout instead could drift from the published base and bake a
6
6
  # cache that silently won't load (cold-JIT fallback) -- this avoids that by construction.
7
7
  #
@@ -100,16 +100,16 @@ def main() -> int:
100
100
  entry_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "bake_pod_entry.py")
101
101
  allowed_cuda = [v.strip() for v in args.allowed_cuda.split(",") if v.strip()] or None
102
102
 
103
- # the chalk install spec the production worker uses (so the bake warms chalk's kernels too);
104
- # FLASH_CHALK_SPEC overrides, else the source-of-truth DEFAULT_CHALK_SPEC, else a safe literal.
103
+ # The chalk install spec the production worker uses, so the bake warms the same kernels. Keep the
104
+ # default import fail-loud: a stale hidden fallback would silently bake against the wrong chalk SHA.
105
105
  chalk_spec = os.environ.get("FLASH_CHALK_SPEC", "").strip()
106
106
  if not chalk_spec:
107
107
  try:
108
108
  from flash.providers.runpod.train.deps import DEFAULT_CHALK_SPEC
109
109
 
110
110
  chalk_spec = DEFAULT_CHALK_SPEC
111
- except Exception:
112
- chalk_spec = "freesolo-chalk>=0.1.0,<0.2.0"
111
+ except Exception as exc:
112
+ raise RuntimeError("could not import DEFAULT_CHALK_SPEC for kernel-cache bake") from exc
113
113
 
114
114
  _upload_flash_code(api, repo, token)
115
115
 
@@ -11,7 +11,7 @@ Two fingerprints, because "out of date" has two flavors with very different cost
11
11
  * fp_cache = hash of the inputs whose kernels live in the baked mega-cache
12
12
  (torch.compiler.save_cache_artifacts: Triton/Inductor/torch.compile). Changing one of these
13
13
  INVALIDATES the cache, so the per-arch image needs a real GPU re-warm. These are: the base
14
- FROM image (torch+triton), the fla git pin, liger, tilelang, apache-tvm-ffi, the default chalk
14
+ FROM image (torch+triton), the fla git pin, tilelang, apache-tvm-ffi, the default chalk
15
15
  spec, and the warmup script itself (it decides which kernels get compiled).
16
16
 
17
17
  * fp_base = hash of everything else baked into :cu128 that is NOT in the cache (FA2/FA3 wheels,
@@ -27,7 +27,7 @@ time, which is why every parse below FAILS LOUD rather than hashing a None.
27
27
  Known limitations (deliberately scoped -- each only ever costs a recoverable cold-JIT, never
28
28
  correctness, and the alternatives over-fire the paid GPU bake):
29
29
  * fp_cache hashes the Dockerfile dep PINS, not pip-resolved versions. A cache-affecting range
30
- (liger-kernel>=, the chalk spec) could resolve a newer build on a later worker-image rebuild with
30
+ (the chalk spec) could resolve a newer build on a later worker-image rebuild with
31
31
  no text change, leaving fp_cache unmoved. Pin those exactly for airtight coverage. (fp_base DOES
32
32
  hash the whole Dockerfile.worker, so arbitrary base edits -- apt/ENV/CMD/cache-dir -- still
33
33
  trigger a free re-layer; only a cache-affecting change that isn't a parsed pin slips through.)
@@ -43,6 +43,7 @@ stdlib only, no flash/torch import, so it runs under a bare python3 in CI (no uv
43
43
  from __future__ import annotations
44
44
 
45
45
  import argparse
46
+ import ast
46
47
  import hashlib
47
48
  import json
48
49
  import re
@@ -56,7 +57,7 @@ LABEL_REVISION = "org.opencontainers.image.revision"
56
57
 
57
58
  # pip specs in Dockerfile.worker's main stack whose kernels land in the mega-cache. everything else
58
59
  # in that block is a base-layer dep (fp_base). fla is matched separately (it carries the git sha).
59
- _CACHE_PKGS = {"liger-kernel", "tilelang", "apache-tvm-ffi"}
60
+ _CACHE_PKGS = {"tilelang", "apache-tvm-ffi"}
60
61
 
61
62
 
62
63
  def _search(pattern: str, text: str, what: str, *, flags: int = 0) -> str:
@@ -71,6 +72,44 @@ def _sha256_file(path: Path) -> str:
71
72
  return hashlib.sha256(path.read_bytes()).hexdigest()
72
73
 
73
74
 
75
+ def _python_string_constant(text: str, name: str, what: str) -> str:
76
+ """Resolve a simple module-level string constant, including f-strings using prior constants."""
77
+ values: dict[str, str] = {}
78
+
79
+ def _eval(node: ast.AST) -> str | None:
80
+ if isinstance(node, ast.Constant) and isinstance(node.value, str):
81
+ return node.value
82
+ if isinstance(node, ast.JoinedStr):
83
+ parts: list[str] = []
84
+ for value in node.values:
85
+ if isinstance(value, ast.Constant) and isinstance(value.value, str):
86
+ parts.append(value.value)
87
+ elif (
88
+ isinstance(value, ast.FormattedValue)
89
+ and isinstance(value.value, ast.Name)
90
+ and value.value.id in values
91
+ ):
92
+ parts.append(values[value.value.id])
93
+ else:
94
+ return None
95
+ return "".join(parts)
96
+ return None
97
+
98
+ tree = ast.parse(text)
99
+ for node in tree.body:
100
+ if not isinstance(node, ast.Assign):
101
+ continue
102
+ value = _eval(node.value)
103
+ if value is None:
104
+ continue
105
+ for target in node.targets:
106
+ if isinstance(target, ast.Name):
107
+ values[target.id] = value
108
+ if name not in values:
109
+ raise ValueError(f"kernel_fingerprint: could not parse {what}")
110
+ return values[name]
111
+
112
+
74
113
  def _pip_stack_specs(dockerfile: str) -> list[str]:
75
114
  """The quoted specs from Dockerfile.worker's first `pip install` block (the pinned worker stack)."""
76
115
  specs: list[str] = []
@@ -129,12 +168,11 @@ def collect_inputs(
129
168
  raise ValueError(
130
169
  "kernel_fingerprint: fla spec missing or not pinned to a 40-char commit sha"
131
170
  )
132
- chalk = _search(r'DEFAULT_CHALK_SPEC\s*=\s*"([^"]+)"', deps, "deps.py DEFAULT_CHALK_SPEC")
171
+ chalk = _python_string_constant(deps, "DEFAULT_CHALK_SPEC", "deps.py DEFAULT_CHALK_SPEC")
133
172
 
134
173
  cache_inputs = {
135
174
  "from_image": from_image,
136
175
  "fla": fla,
137
- "liger": _need("liger-kernel"),
138
176
  "tilelang": _need("tilelang"),
139
177
  "tvm_ffi": _need("apache-tvm-ffi"),
140
178
  "chalk": chalk,
@@ -127,7 +127,6 @@ class FakeClient:
127
127
  "mode": "dev",
128
128
  "openai_model": run_id,
129
129
  "endpoint_name": "https://api.freesolo.co/v1",
130
- "gpu": "RTX 4090",
131
130
  }
132
131
 
133
132
  def undeploy(self, run_id):
@@ -137,7 +136,10 @@ class FakeClient:
137
136
  return [
138
137
  {
139
138
  "run_id": "flash-1718900000-a1b2c3d4",
140
- "deployment": {"gpu": "RTX 4090", "endpoint_name": "https://api.freesolo.co/v1"},
139
+ "deployment": {
140
+ "state": "ready",
141
+ "endpoint_name": "https://api.freesolo.co/v1",
142
+ },
141
143
  }
142
144
  ]
143
145