freesolo-flash-dev 1.2.69__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.
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/.github/workflows/auto-rebake.yml +31 -14
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/.github/workflows/bake-kernel-cache.yml +15 -23
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/.github/workflows/ci.yml +2 -2
- freesolo_flash_dev-1.2.87/.github/workflows/dev-kernel-cache.yml +212 -0
- freesolo_flash_dev-1.2.87/.github/workflows/production-kernel-cache-ready.yml +98 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/.github/workflows/publish-dev.yml +1 -1
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/.github/workflows/publish.yml +1 -1
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/.github/workflows/worker-image.yml +40 -3
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/CHANGELOG.md +7 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/Dockerfile.worker +12 -5
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/PKG-INFO +1 -1
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/docker/bake_kernel_cache.py +78 -29
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/adapters/fused_experts.py +30 -28
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/scaffold/TRAINING.md +11 -5
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/plan/vram.py +28 -2
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/__init__.py +0 -5
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/backend_common.py +1 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/opd_train.py +3 -2
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/perf/__init__.py +4 -3
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/rl_train.py +5 -2
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/sft_train.py +10 -4
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/verl/capabilities.py +35 -4
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runner/__init__.py +0 -1
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runner/preparation.py +18 -10
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runner/submit.py +0 -1
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/schema/__init__.py +0 -5
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/pyproject.toml +2 -2
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_bake_kernel_cache.py +60 -26
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_fused_expert_warmstart.py +148 -21
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_lora_rank_preflight.py +0 -1
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_multi_gpu_gate.py +103 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_opd.py +173 -8
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_opd_train.py +19 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_sft_train.py +16 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_spec_and_validation.py +32 -16
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_warmstart_cross_repo.py +236 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_worker_hardexit.py +21 -11
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_worker_stack.py +80 -21
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_workflow_contracts.py +134 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/uv.lock +68 -70
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/.dockerignore +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/.env.example +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/.github/CODEOWNERS +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/.github/dependabot.yml +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/.github/workflows/main-source-guard.yml +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/.github/workflows/notify-tests-repo.yml +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/.github/workflows/publish-image.yml +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/.github/workflows/version-parity.yml +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/.gitignore +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/CODE_OF_CONDUCT.md +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/CONTRIBUTING.md +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/Dockerfile +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/LICENSE +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/NOTICE +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/README.md +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/SECURITY.md +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/SELF_HOSTING.md +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/build/kernel_cache/.gitignore +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/build/kernel_cache/.keep +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/deploy/infisical/README.md +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/deploy/infisical/entrypoint.sh +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/docker/Dockerfile.kernelcache +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/docker/Dockerfile.kernelcache.relayer +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/docker/bake_pod_entry.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/docker/extract_cudart_fix.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/docker/kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/docker/make_rp_handler.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/_internal/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/_internal/channel.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/_internal/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/_internal/fileio.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/_internal/logging.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/_internal/paths.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/adapters/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/adapters/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/adapters/lora_rank.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/__main__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/commands/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/commands/deploy.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/episode.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/eval.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/eval_args.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/imports.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/list.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/push.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/retained.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/setup.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/setup_wandb.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/test.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/test_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/test_params.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/test_warnings.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/commands/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/commands/traces.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/commands/train_cost.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/scaffold/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/ui/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/ui/cost.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/ui/env_panels.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/ui/heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/ui/render.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/ui/tables.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cli/ui/tty.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/client/config.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/client/freesolo_api.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/client/http.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/client/runtime_secrets.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/client/shapes.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/client/specs.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/client/streaming.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/content/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/content/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/content/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/content/thinking.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/core/catalog.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/core/spec.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/core/spec_persistence.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cost/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cost/analytical.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cost/facts.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cost/spec.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/cost/types.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/huggingface.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/plan/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/plan/kv_sizing.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/plan/model_config_probe.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/plan/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/plan/recipe.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/plan/steps.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/image_tokens.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/reasoning_render.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/sft_image_rows.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/tokenizer.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/result/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/result/accounting.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/result/rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/__main__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/entry/opd.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/entry/rl.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/entry/sft.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/io/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/io/heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/io/hf.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/io/prefetch.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/io/wandb_log.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/model/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/model/adapter.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/model/chatml_mask.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/model/decoding.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/model/lora.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/model/packing.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/opd_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/perf/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/perf/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/perf/liger.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/perf/memory.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/rl_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/runtime/rng.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/score_batcher.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/sft_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/teacher/client.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/teacher/encoding.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/core/checkpoint_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/core/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/core/child/glue.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/core/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/core/step_timing.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/finalize.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/batching.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/bridge.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/bridge_failures.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/bridge.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/structured.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/failures.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/gkd.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/overrides.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/prompts.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/reporting.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/scoring.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/state.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/validation.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/child/patches.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/config.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/inputs.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/multi_turn.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/reward_module.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/scoring.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/single_turn.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/verl_config.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/sft/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/sft/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/sft/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/sft/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/sft/config.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/verl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/verl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/verl/child_io.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/verl/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/verl/parallelism.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker/verl/parent_work.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/engine/worker_entrypoint.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/envs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/envs/adapter.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/envs/base.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/envs/cache_security.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/envs/dataset_selection.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/envs/evaluations.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/envs/identity.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/envs/loader.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/envs/namespace_listing.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/envs/package/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/envs/package/direct_tokens.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/envs/package/limits.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/envs/package/unpack.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/envs/pull.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/auth.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/bootstrap.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/bootstrap_console.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/deadline.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/host/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/host/failmark.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/host/hostlog.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/http.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/instance.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/poll.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/poll_instance.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/provider.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/worker.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/allocator.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/artifacts/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/artifacts/hf.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/artifacts/preload_runpod.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/artifacts/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/base.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/fit_errors.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/api.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/auth.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/gpus.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/jobs/reap.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/preflight.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/pricing.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/preflight.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/realized.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/api.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/auth.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/cost.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/gpus.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/job_execution.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/jobs.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/preflight.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/pricing.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/resources.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/serverless/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/serverless/endpoints.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/sharding.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/vast/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/vast/api.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/vast/auth.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/vast/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/vast/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/vast/preflight.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/providers/vast/pricing.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/py.typed +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runner/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runner/attempts.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runner/costs.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runner/deadlines.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runner/reconciliation.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runner/results/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runner/results/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runner/results/verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runner/status.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/attach.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/deploy.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/recovery.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/retry_decision.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/seed_submission.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/transitions.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runner/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runtime_capsule/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runtime_capsule/build.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runtime_capsule/manifest.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/runtime_capsule/profiles.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/schema/fields.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/serve/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/serve/adapter_check.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/serve/deploy.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/serve/errors.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/serve/export.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/serve/preflight.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/serve/responses.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/serve/streaming.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/serve/thinking.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/serve/urls.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/__main__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/app.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/billing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/billing/charges.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/billing/retry.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/domain/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/domain/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/domain/environment_registry.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/domain/envs.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/domain/projects.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/domain/reconcile.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/domain/repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/domain/run_registry.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/domain/teacher_broker.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/domain/teacher_errors.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/domain/teacher_requests.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/platform/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/platform/auth.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/platform/db.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/platform/deps.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/platform/internal_client.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/platform/locks.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/platform/runtime.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/routes/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/routes/envs.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/routes/meta.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/routes/runs.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/routes/serving.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/routes/serving_completion.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/routes/serving_revisions.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/routes/serving_smoke.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/server/routes/teacher.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/source_snapshot.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/teacher/limits.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/flash/teacher/retry_contract.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/scripts/build_dev_dist.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/scripts/check_file_size.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/scripts/check_function_size.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/scripts/check_verl_pin_exists.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/scripts/scrub_history.sh +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/_helpers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/_helpers/profile.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/_helpers/runner.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/_helpers/source_snapshot.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/_helpers/specs.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/_helpers/teacher.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/_helpers/vast.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/capture_image_sft_processor_oracle.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/conftest.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/fixtures/image_sft_processor_oracle.json +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/fixtures/math_eval.jsonl +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/fixtures/math_train.jsonl +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/live/__init__.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/live/conftest.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/live/test_lambda_live.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/live/test_runpod_live.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/live/test_sft_thinking_render_live.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/live/test_vast_live.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_accounting_coverage.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_adapter_shard_completeness.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_agent_flash_cli_contract.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_algorithms.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_allocator.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_backend_common.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_backend_jobspec_contract.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_base_model_provenance.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_billing_retry.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_build_context_contract.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_cancel_remote.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_catalog_consistency.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_catalog_only_models.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_charge_pricing.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_checkpoint_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_cli_commands.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_cli_commands_coverage.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_cli_credential_shadowing.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_cli_errors.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_cli_estimate.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_cli_gpus_flag.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_cli_help.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_cli_main_coverage.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_cli_managed.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_cli_render_coverage.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_cli_render_theme.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_cli_traces.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_cli_wandb_warning.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_client.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_client_import_purity.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_client_server_integration.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_client_stream_reads.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_config_env_vars.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_config_overrides.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_console_upload.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_controlled_experiment_repairs.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_cost_analytical.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_cost_equation.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_cost_estimate.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_cost_hardware.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_cost_models.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_deploy_alias_move_warning.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_deploy_latency.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_dev_channel.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_disk_gb.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_endpoint_name.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_env_cache_evict.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_env_delete.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_env_download.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_env_download_api.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_env_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_env_list_api.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_env_list_cli.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_env_list_hub.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_env_no_install.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_env_publish.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_env_pull.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_env_pull_coverage.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_env_pull_loader_coverage.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_env_pull_managed_control_plane.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_env_push.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_env_rate_limit_resolve.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_env_ref_pinning.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_env_test.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_export.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_flash_mvp.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_flash_worker.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_flashinfer_cache_dirs.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_freesolo_api_transport.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_github_urlopen_retry.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_gpu_type_single_field.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_gpus.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_grpo_params.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_grpo_resident_sizing.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_grpo_reward_batching.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_health_liveness.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_hf_retry.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_idle_endpoint_reaper.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_image_sft_markers.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_image_sft_processor_parity.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_image_tokens.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_infisical_secrets.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_instance_bootstrap_coverage.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_internal_client.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_jobs.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_kv_util.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_lambda_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_lambda_runner.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_logging.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_login_perms.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_lora_rank_coverage.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_managed_config_fields.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_managed_hf_repo.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_metrics_schema_agent_contract.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_mig_guard.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_multimodal_training.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_named_reward_metrics.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_oom_escalate_gpu.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_opd_limits.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_opd_multiturn_eos_boundary.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_opd_multiturn_failure_exit.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_opd_replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_opd_resume_safety.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_orchestrator_flash.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_packing.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_packing_coverage.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_parasail_teacher.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_persisted_spec_envelope.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_poll_helpers.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_preflight.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_projects.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_provider_preflight_coverage.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_provider_routing.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_provider_teardown_robustness.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_providers_symmetry.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_realized_cost.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_resolve_params_b.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_resume_on_retry.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_rl_train.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_runmgmt.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_runpod_api_delete.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_runpod_key_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_runpod_key_waterfall.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_runtime_capsule.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_serve.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_serve_reasoning_content.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_server_api.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_server_app_coverage.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_server_auth_singleflight.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_server_billing.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_server_checkpoints_coverage.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_server_db.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_server_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_server_locks_coverage.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_server_standalone.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_serving_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_serving_contract.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_serving_schema_coverage.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_sft_chunked_nll.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_sft_example_selection.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_sft_gc_off.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_sft_max_context.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_sft_startup_block.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_source_attestation_flow.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_source_snapshot.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_spec_contract_bytes.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_step_floor.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_step_metrics.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_step_timing.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_teacher_broker.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_teacher_encoding_contract.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_thinking_config.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_train_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_training_controls.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_type_comment_prose.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_vast_api.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_vast_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_vast_offers.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_vast_provider_coverage.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_vast_runner.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_verifiers.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_verl_checkpoint_export.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_verl_child_plugins.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_verl_silence_watchdog.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_version.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_vl_warmstart_adapter_keys.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_vram_architecture.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_wandb_link.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_wandb_naming.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_warmstart_adapter_download.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_warmstart_error_attribution.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_worker_dryrun.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_worker_image.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_worker_init_heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_worker_thinking.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/tests/test_zero2_sharding_gate.py +0 -0
|
@@ -5,9 +5,8 @@ name: auto-rebake per-arch kernel cache
|
|
|
5
5
|
# the per-arch tags pointing at the OLD base until rebaked. "Out of date" has two flavors, keyed off
|
|
6
6
|
# the fp_cache / fp_base labels worker-image.yml stamps on :cu128 (docker/kernel_fingerprint.py):
|
|
7
7
|
#
|
|
8
|
-
# * fp_cache changed ->
|
|
9
|
-
#
|
|
10
|
-
# fp_cache only moves on a deliberate toolchain bump, so spend stays tied to real need.
|
|
8
|
+
# * fp_cache changed -> promote a matching dev-ready cache by free re-layer. a real gpu re-warm is
|
|
9
|
+
# only the fail-safe when the required candidate is absent.
|
|
11
10
|
# * fp_cache same but fp_base changed -> the cache is still valid, the base just moved (FA wheel /
|
|
12
11
|
# causal-conv1d / rp_handler / a non-kernel dep) -> a FREE re-layer grafts the existing cache onto
|
|
13
12
|
# the fresh base (docker/Dockerfile.kernelcache.relayer), no GPU.
|
|
@@ -54,7 +53,7 @@ jobs:
|
|
|
54
53
|
timeout-minutes: 15
|
|
55
54
|
outputs:
|
|
56
55
|
proceed: ${{ steps.base.outputs.proceed }}
|
|
57
|
-
|
|
56
|
+
relayer_matrix: ${{ steps.classify.outputs.relayer_matrix }}
|
|
58
57
|
gpu_sms: ${{ steps.classify.outputs.gpu_sms }}
|
|
59
58
|
fp_cache: ${{ steps.base.outputs.fp_cache }}
|
|
60
59
|
fp_base: ${{ steps.base.outputs.fp_base }}
|
|
@@ -138,9 +137,23 @@ jobs:
|
|
|
138
137
|
pc="(missing)"; pb="(missing)"
|
|
139
138
|
fi
|
|
140
139
|
if [ "$pc" != "$FP_CACHE" ]; then
|
|
141
|
-
|
|
140
|
+
candidate="ghcr.io/freesolo-co/flash-worker:cu128-dev-ready-$sm"
|
|
141
|
+
candidate_pc=""; candidate_ref=""
|
|
142
|
+
if candidate_digest=$(crane digest "$candidate" 2>/dev/null); then
|
|
143
|
+
candidate_ref="${candidate%:*}@$candidate_digest"
|
|
144
|
+
fi
|
|
145
|
+
if [ -n "$candidate_ref" ] && candidate_cfg=$(crane config "$candidate_ref" 2>/dev/null); then
|
|
146
|
+
candidate_pc=$(echo "$candidate_cfg" | jq -r '.config.Labels["co.freesolo.flash.kernelcache.fp_cache"] // ""')
|
|
147
|
+
fi
|
|
148
|
+
if [ "$candidate_pc" = "$FP_CACHE" ]; then
|
|
149
|
+
relayer+=("$(jq -cn --arg sm "$sm" --arg source "$candidate_ref" '{sm:$sm, source:$source}')")
|
|
150
|
+
action="promote dev cache (free)"
|
|
151
|
+
else
|
|
152
|
+
gpu+=("$sm"); action="gpu re-warm (candidate missing)"
|
|
153
|
+
fi
|
|
142
154
|
elif [ "$pb" != "$FP_BASE" ]; then
|
|
143
|
-
relayer+=("$sm"
|
|
155
|
+
relayer+=("$(jq -cn --arg sm "$sm" --arg source "$img" '{sm:$sm, source:$source}')")
|
|
156
|
+
action="re-layer (free)"
|
|
144
157
|
else
|
|
145
158
|
action="up to date"
|
|
146
159
|
fi
|
|
@@ -148,12 +161,12 @@ jobs:
|
|
|
148
161
|
summary="$summary| $sm | \`$pc\` | \`$pb\` | $action |\n"
|
|
149
162
|
done
|
|
150
163
|
if [ ${#relayer[@]} -gt 0 ]; then
|
|
151
|
-
relayer_json=$(printf '%s\n' "${relayer[@]}" | jq -
|
|
164
|
+
relayer_json=$(printf '%s\n' "${relayer[@]}" | jq -cs .)
|
|
152
165
|
else
|
|
153
166
|
relayer_json='[]'
|
|
154
167
|
fi
|
|
155
168
|
gpu_csv=$(IFS=,; echo "${gpu[*]}")
|
|
156
|
-
echo "
|
|
169
|
+
echo "relayer_matrix=$relayer_json" >> "$GITHUB_OUTPUT"
|
|
157
170
|
echo "gpu_sms=$gpu_csv" >> "$GITHUB_OUTPUT"
|
|
158
171
|
{
|
|
159
172
|
echo "### auto-rebake plan (base rev \`$REV\`, fp_cache \`$FP_CACHE\` fp_base \`$FP_BASE\`)"
|
|
@@ -189,7 +202,7 @@ jobs:
|
|
|
189
202
|
# FREE path: graft the existing valid cache onto the fresh base, no GPU. Runs automatically.
|
|
190
203
|
relayer:
|
|
191
204
|
needs: gate
|
|
192
|
-
if: needs.gate.outputs.proceed == 'true' && needs.gate.outputs.
|
|
205
|
+
if: needs.gate.outputs.proceed == 'true' && needs.gate.outputs.relayer_matrix != '[]' && needs.gate.outputs.relayer_matrix != ''
|
|
193
206
|
runs-on: ubuntu-24.04-8core
|
|
194
207
|
# The graft pulls two ~20GB images and pushes one. 21min is the slowest auto-rebake run on
|
|
195
208
|
# record; 60 covers a slow registry without holding the org's larger runner indefinitely.
|
|
@@ -197,7 +210,7 @@ jobs:
|
|
|
197
210
|
strategy:
|
|
198
211
|
fail-fast: false
|
|
199
212
|
matrix:
|
|
200
|
-
|
|
213
|
+
include: ${{ fromJson(needs.gate.outputs.relayer_matrix || '[]') }}
|
|
201
214
|
env:
|
|
202
215
|
BASE_REF: ${{ needs.gate.outputs.base_ref }}
|
|
203
216
|
FP_CACHE: ${{ needs.gate.outputs.fp_cache }}
|
|
@@ -232,10 +245,14 @@ jobs:
|
|
|
232
245
|
- name: Resolve old per-arch cache digest
|
|
233
246
|
id: old
|
|
234
247
|
run: |
|
|
235
|
-
img="
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
248
|
+
img="${{ matrix.source }}"
|
|
249
|
+
if [[ "$img" == *@sha256:* ]]; then
|
|
250
|
+
echo "ref=$img" >> "$GITHUB_OUTPUT"
|
|
251
|
+
else
|
|
252
|
+
digest=$(docker buildx imagetools inspect "$img" --format '{{.Manifest.Digest}}')
|
|
253
|
+
# canonical digest ref (repo@sha256, no tag) for the FROM in the relayer build.
|
|
254
|
+
echo "ref=${img%:*}@$digest" >> "$GITHUB_OUTPUT"
|
|
255
|
+
fi
|
|
239
256
|
|
|
240
257
|
- name: Re-layer cache onto the fresh base (no GPU)
|
|
241
258
|
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
|
{freesolo_flash_dev-1.2.69 → freesolo_flash_dev-1.2.87}/.github/workflows/bake-kernel-cache.yml
RENAMED
|
@@ -24,6 +24,10 @@ on:
|
|
|
24
24
|
description: "comma-separated sm list to bake; default is all validated arches"
|
|
25
25
|
default: "sm80,sm86,sm89,sm90,sm120,sm100"
|
|
26
26
|
required: false
|
|
27
|
+
target_tag_prefix:
|
|
28
|
+
description: "target image tag before the -sm suffix"
|
|
29
|
+
default: "cu128"
|
|
30
|
+
required: false
|
|
27
31
|
# auto-rebake.yml calls this for the EXPENSIVE path (the cache is invalid and must be re-warmed on a
|
|
28
32
|
# real GPU). It passes the arch subset, the fingerprints to stamp, and a digest-pinned base so the
|
|
29
33
|
# warm runs inside the exact :cu128 the per-arch tag will sit on.
|
|
@@ -48,6 +52,10 @@ on:
|
|
|
48
52
|
type: string
|
|
49
53
|
required: false
|
|
50
54
|
default: ""
|
|
55
|
+
target_tag_prefix:
|
|
56
|
+
type: string
|
|
57
|
+
required: false
|
|
58
|
+
default: "cu128"
|
|
51
59
|
|
|
52
60
|
permissions:
|
|
53
61
|
contents: read
|
|
@@ -85,51 +93,36 @@ jobs:
|
|
|
85
93
|
- {
|
|
86
94
|
sm: sm80,
|
|
87
95
|
arch: "8.0",
|
|
88
|
-
gpu_type_id: "NVIDIA A100 80GB PCIe",
|
|
89
96
|
allowed_cuda: "",
|
|
90
97
|
}
|
|
91
98
|
- {
|
|
92
99
|
sm: sm86,
|
|
93
100
|
arch: "8.6",
|
|
94
|
-
gpu_type_id: "NVIDIA RTX A6000",
|
|
95
101
|
allowed_cuda: "",
|
|
96
102
|
}
|
|
97
|
-
#
|
|
98
|
-
#
|
|
99
|
-
#
|
|
100
|
-
# sm89 cache is valid on every sm89 card (4090/L40/L4). NB: verify the exact RunPod gpuTypeId.
|
|
103
|
+
# the controller walks ordered same-sm secure-cloud gpu types from its per-sm map.
|
|
104
|
+
# preferred datacenter cards stay first, but one empty sku cannot strand this architecture
|
|
105
|
+
# on a stale image and send ordinary starts through jit.
|
|
101
106
|
- {
|
|
102
107
|
sm: sm89,
|
|
103
108
|
arch: "8.9",
|
|
104
|
-
gpu_type_id: "NVIDIA L40S",
|
|
105
109
|
allowed_cuda: "",
|
|
106
110
|
}
|
|
107
|
-
# sm90 (Hopper): warm on the H200 (141GB, sm90) -- better secure-cloud capacity than the
|
|
108
|
-
# heavily-contended H100 80GB HBM3 (which cold-pull-stalled the bake). Same sm90, so the cache
|
|
109
|
-
# is valid on every H100/H200. H200 is in flash's validated GPU catalog (providers/base.py).
|
|
110
111
|
- {
|
|
111
112
|
sm: sm90,
|
|
112
113
|
arch: "9.0",
|
|
113
|
-
gpu_type_id: "NVIDIA H200",
|
|
114
114
|
allowed_cuda: "",
|
|
115
115
|
}
|
|
116
|
-
#
|
|
117
|
-
# sm120 on the RTX Pro 6000 (Server Edition): it's the same sm120 (cache is sm-keyed, so it's
|
|
118
|
-
# valid for RTX 5090 too) but has far better secure-cloud on-demand capacity -- the RTX 5090
|
|
119
|
-
# pool repeatedly returned "machine does not have the resources" at create_pod.
|
|
116
|
+
# blackwell needs cuda-13 hosts to jit its ptx (matches min_cuda_for in the provider).
|
|
120
117
|
- {
|
|
121
118
|
sm: sm120,
|
|
122
119
|
arch: "12.0",
|
|
123
|
-
gpu_type_id: "NVIDIA RTX PRO 6000 Blackwell Server Edition",
|
|
124
120
|
allowed_cuda: "13.0",
|
|
125
121
|
}
|
|
126
|
-
# datacenter blackwell
|
|
127
|
-
# good secure-cloud capacity, and is validated. promote its image only after a successful
|
|
128
|
-
# real-b200 bake, then include it in default and automatic rebakes.
|
|
122
|
+
# datacenter blackwell is distinct from sm120. b200 is the only validated sm100 type.
|
|
129
123
|
- {
|
|
130
124
|
sm: sm100,
|
|
131
125
|
arch: "10.0",
|
|
132
|
-
gpu_type_id: "NVIDIA B200",
|
|
133
126
|
allowed_cuda: "13.0",
|
|
134
127
|
}
|
|
135
128
|
steps:
|
|
@@ -202,7 +195,7 @@ jobs:
|
|
|
202
195
|
|
|
203
196
|
- name: Install uv
|
|
204
197
|
if: steps.gate.outputs.run == 'true'
|
|
205
|
-
uses: astral-sh/setup-uv@
|
|
198
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
206
199
|
with:
|
|
207
200
|
# no cache: the post-run cache-prune calls `uv`, but the "Free disk space" step deletes
|
|
208
201
|
# /opt/hostedtoolcache (where setup-uv put uv), so the post step fails ("uv not found") and
|
|
@@ -227,7 +220,6 @@ jobs:
|
|
|
227
220
|
run: |
|
|
228
221
|
uv run python docker/bake_kernel_cache.py \
|
|
229
222
|
--arch "${{ matrix.arch }}" --sm "${{ matrix.sm }}" \
|
|
230
|
-
--gpu-type-id "${{ matrix.gpu_type_id }}" \
|
|
231
223
|
--allowed-cuda "${{ matrix.allowed_cuda }}" \
|
|
232
224
|
--image "$BASE_IMAGE" \
|
|
233
225
|
--out build/kernel_cache
|
|
@@ -256,7 +248,7 @@ jobs:
|
|
|
256
248
|
context: .
|
|
257
249
|
file: docker/Dockerfile.kernelcache
|
|
258
250
|
push: true
|
|
259
|
-
tags: ghcr.io/freesolo-co/flash-worker
|
|
251
|
+
tags: ghcr.io/freesolo-co/flash-worker:${{ inputs.target_tag_prefix || 'cu128' }}-${{ matrix.sm }}
|
|
260
252
|
provenance: false
|
|
261
253
|
build-args: |
|
|
262
254
|
BASE=${{ steps.base.outputs.ref }}
|
|
@@ -33,7 +33,7 @@ jobs:
|
|
|
33
33
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
34
34
|
|
|
35
35
|
- name: Install uv
|
|
36
|
-
uses: astral-sh/setup-uv@
|
|
36
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
37
37
|
with:
|
|
38
38
|
python-version: ${{ matrix.python-version }}
|
|
39
39
|
|
|
@@ -156,7 +156,7 @@ jobs:
|
|
|
156
156
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
157
157
|
|
|
158
158
|
- name: Install uv
|
|
159
|
-
uses: astral-sh/setup-uv@
|
|
159
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
160
160
|
with:
|
|
161
161
|
python-version: "3.11"
|
|
162
162
|
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
name: dev kernel-cache candidate
|
|
2
|
+
|
|
3
|
+
# dev pushes only run the metadata detector. the scheduled or manual run builds the newest
|
|
4
|
+
# missing candidate, so several daytime changes coalesce into one off-peak gpu bake.
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
push:
|
|
8
|
+
branches: [dev]
|
|
9
|
+
paths:
|
|
10
|
+
- Dockerfile.worker
|
|
11
|
+
- .github/workflows/worker-image.yml
|
|
12
|
+
- .github/workflows/bake-kernel-cache.yml
|
|
13
|
+
- .github/workflows/dev-kernel-cache.yml
|
|
14
|
+
- docker/kernel_fingerprint.py
|
|
15
|
+
- docker/make_rp_handler.py
|
|
16
|
+
- docker/extract_cudart_fix.py
|
|
17
|
+
- flash/**
|
|
18
|
+
- pyproject.toml
|
|
19
|
+
schedule:
|
|
20
|
+
# 09:00 utc is 01:00 pst / 02:00 pdt.
|
|
21
|
+
- cron: "0 9 * * *"
|
|
22
|
+
workflow_dispatch:
|
|
23
|
+
|
|
24
|
+
permissions:
|
|
25
|
+
actions: write
|
|
26
|
+
contents: read
|
|
27
|
+
packages: write
|
|
28
|
+
|
|
29
|
+
concurrency:
|
|
30
|
+
group: dev-kernel-cache
|
|
31
|
+
cancel-in-progress: false
|
|
32
|
+
|
|
33
|
+
jobs:
|
|
34
|
+
dispatch-dev:
|
|
35
|
+
if: github.repository == 'freesolo-co/flash' && github.event_name == 'schedule'
|
|
36
|
+
runs-on: ubuntu-latest
|
|
37
|
+
timeout-minutes: 5
|
|
38
|
+
env:
|
|
39
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
40
|
+
steps:
|
|
41
|
+
- name: Dispatch the dev workflow definition
|
|
42
|
+
run: gh workflow run dev-kernel-cache.yml --repo "$GITHUB_REPOSITORY" --ref dev
|
|
43
|
+
|
|
44
|
+
detect:
|
|
45
|
+
if: github.repository == 'freesolo-co/flash' && github.event_name != 'schedule'
|
|
46
|
+
runs-on: ubuntu-latest
|
|
47
|
+
timeout-minutes: 15
|
|
48
|
+
outputs:
|
|
49
|
+
needs_bake: ${{ steps.classify.outputs.needs_bake }}
|
|
50
|
+
revision: ${{ steps.source.outputs.revision }}
|
|
51
|
+
fp_cache: ${{ steps.fp.outputs.fp_cache }}
|
|
52
|
+
fp_base: ${{ steps.fp.outputs.fp_base }}
|
|
53
|
+
sms: ${{ steps.source.outputs.sms }}
|
|
54
|
+
env:
|
|
55
|
+
FA2_SPEC: https://github.com/mjun0812/flash-attention-prebuild-wheels/releases/download/v0.9.0/flash_attn-2.8.3%2Bcu128torch2.10-cp312-cp312-linux_x86_64.whl
|
|
56
|
+
FA2_SHA256: a58c95a080363606e691c342d47dd173b510f4c013a8c5fcb8744def12e36a0f
|
|
57
|
+
steps:
|
|
58
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
59
|
+
with:
|
|
60
|
+
ref: ${{ github.sha }}
|
|
61
|
+
|
|
62
|
+
- name: Resolve source metadata
|
|
63
|
+
id: source
|
|
64
|
+
run: |
|
|
65
|
+
echo "revision=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT"
|
|
66
|
+
arches=$(python3 docker/kernel_fingerprint.py --print-baked-arches)
|
|
67
|
+
echo "sms=$(echo "$arches" | tr ' ' ',')" >> "$GITHUB_OUTPUT"
|
|
68
|
+
|
|
69
|
+
- name: Compute kernel fingerprints
|
|
70
|
+
id: fp
|
|
71
|
+
run: python3 docker/kernel_fingerprint.py --format github --fa2-spec "$FA2_SPEC" --fa2-sha256 "$FA2_SHA256" >> "$GITHUB_OUTPUT"
|
|
72
|
+
|
|
73
|
+
- name: Install crane
|
|
74
|
+
run: |
|
|
75
|
+
set -euo pipefail
|
|
76
|
+
ver=v0.20.2
|
|
77
|
+
sha=c14340087103ba9dadf61d45acd20675490fd0ccbd56ac7901fc1b502137f44b
|
|
78
|
+
curl -fsSL -o /tmp/crane.tar.gz \
|
|
79
|
+
"https://github.com/google/go-containerregistry/releases/download/${ver}/go-containerregistry_Linux_x86_64.tar.gz"
|
|
80
|
+
echo "${sha} /tmp/crane.tar.gz" | sha256sum -c -
|
|
81
|
+
sudo tar -xz -C /usr/local/bin -f /tmp/crane.tar.gz crane
|
|
82
|
+
rm -f /tmp/crane.tar.gz
|
|
83
|
+
crane version
|
|
84
|
+
|
|
85
|
+
- name: Log in to GHCR
|
|
86
|
+
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
|
|
87
|
+
with:
|
|
88
|
+
registry: ghcr.io
|
|
89
|
+
username: ${{ github.actor }}
|
|
90
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
91
|
+
|
|
92
|
+
- name: Check published caches
|
|
93
|
+
id: classify
|
|
94
|
+
env:
|
|
95
|
+
FP_CACHE: ${{ steps.fp.outputs.fp_cache }}
|
|
96
|
+
REVISION: ${{ steps.source.outputs.revision }}
|
|
97
|
+
run: |
|
|
98
|
+
set -euo pipefail
|
|
99
|
+
arches=$(python3 docker/kernel_fingerprint.py --print-baked-arches)
|
|
100
|
+
uncovered=false
|
|
101
|
+
summary="| arch | production | dev candidate |\n|---|---|---|\n"
|
|
102
|
+
for sm in $arches; do
|
|
103
|
+
prod="ghcr.io/freesolo-co/flash-worker:cu128-$sm"
|
|
104
|
+
candidate="ghcr.io/freesolo-co/flash-worker:cu128-dev-ready-$sm"
|
|
105
|
+
|
|
106
|
+
prod_pc=""
|
|
107
|
+
if cfg=$(crane config "$prod" 2>/dev/null); then
|
|
108
|
+
prod_pc=$(echo "$cfg" | jq -r '.config.Labels["co.freesolo.flash.kernelcache.fp_cache"] // ""')
|
|
109
|
+
fi
|
|
110
|
+
candidate_pc=""; candidate_rev=""
|
|
111
|
+
if cfg=$(crane config "$candidate" 2>/dev/null); then
|
|
112
|
+
candidate_pc=$(echo "$cfg" | jq -r '.config.Labels["co.freesolo.flash.kernelcache.fp_cache"] // ""')
|
|
113
|
+
candidate_rev=$(echo "$cfg" | jq -r '.config.Labels["org.opencontainers.image.revision"] // ""')
|
|
114
|
+
fi
|
|
115
|
+
if [ "$prod_pc" != "$FP_CACHE" ] && [ "$candidate_pc" != "$FP_CACHE" ]; then
|
|
116
|
+
uncovered=true
|
|
117
|
+
fi
|
|
118
|
+
|
|
119
|
+
summary="$summary| $sm | \`${prod_pc:-missing}\` | \`${candidate_pc:-missing}\` at \`${candidate_rev:-unknown}\` |\n"
|
|
120
|
+
done
|
|
121
|
+
|
|
122
|
+
if [ "$uncovered" = true ]; then
|
|
123
|
+
echo "needs_bake=true" >> "$GITHUB_OUTPUT"
|
|
124
|
+
else
|
|
125
|
+
echo "needs_bake=false" >> "$GITHUB_OUTPUT"
|
|
126
|
+
fi
|
|
127
|
+
{
|
|
128
|
+
echo "### dev kernel-cache candidate"
|
|
129
|
+
echo ""
|
|
130
|
+
echo "source revision: \`$REVISION\`"
|
|
131
|
+
echo ""
|
|
132
|
+
echo -e "$summary"
|
|
133
|
+
if [ "${{ github.event_name }}" = push ] && [ "$uncovered" = true ]; then
|
|
134
|
+
echo "A bake is pending for the next off-peak run. Use workflow dispatch for an urgent release."
|
|
135
|
+
fi
|
|
136
|
+
} >> "$GITHUB_STEP_SUMMARY"
|
|
137
|
+
|
|
138
|
+
build-base:
|
|
139
|
+
needs: detect
|
|
140
|
+
if: github.event_name == 'workflow_dispatch' && needs.detect.outputs.needs_bake == 'true'
|
|
141
|
+
uses: ./.github/workflows/worker-image.yml
|
|
142
|
+
with:
|
|
143
|
+
tag: cu128-dev-${{ needs.detect.outputs.revision }}
|
|
144
|
+
source_ref: ${{ needs.detect.outputs.revision }}
|
|
145
|
+
secrets: inherit
|
|
146
|
+
|
|
147
|
+
bake:
|
|
148
|
+
needs: [detect, build-base]
|
|
149
|
+
if: github.event_name == 'workflow_dispatch' && needs.detect.outputs.needs_bake == 'true'
|
|
150
|
+
uses: ./.github/workflows/bake-kernel-cache.yml
|
|
151
|
+
with:
|
|
152
|
+
sms: ${{ needs.detect.outputs.sms }}
|
|
153
|
+
fp_cache: ${{ needs.build-base.outputs.fp_cache }}
|
|
154
|
+
fp_base: ${{ needs.build-base.outputs.fp_base }}
|
|
155
|
+
base_ref: ${{ needs.build-base.outputs.base_ref }}
|
|
156
|
+
base_revision: ${{ needs.build-base.outputs.base_revision }}
|
|
157
|
+
target_tag_prefix: cu128-dev-${{ needs.detect.outputs.revision }}
|
|
158
|
+
secrets: inherit
|
|
159
|
+
|
|
160
|
+
publish-ready:
|
|
161
|
+
needs: [detect, bake]
|
|
162
|
+
if: github.event_name == 'workflow_dispatch' && needs.detect.outputs.needs_bake == 'true'
|
|
163
|
+
runs-on: ubuntu-latest
|
|
164
|
+
timeout-minutes: 15
|
|
165
|
+
steps:
|
|
166
|
+
- name: Install crane
|
|
167
|
+
run: |
|
|
168
|
+
set -euo pipefail
|
|
169
|
+
ver=v0.20.2
|
|
170
|
+
sha=c14340087103ba9dadf61d45acd20675490fd0ccbd56ac7901fc1b502137f44b
|
|
171
|
+
curl -fsSL -o /tmp/crane.tar.gz \
|
|
172
|
+
"https://github.com/google/go-containerregistry/releases/download/${ver}/go-containerregistry_Linux_x86_64.tar.gz"
|
|
173
|
+
echo "${sha} /tmp/crane.tar.gz" | sha256sum -c -
|
|
174
|
+
sudo tar -xz -C /usr/local/bin -f /tmp/crane.tar.gz crane
|
|
175
|
+
rm -f /tmp/crane.tar.gz
|
|
176
|
+
crane version
|
|
177
|
+
|
|
178
|
+
- name: Log in to GHCR
|
|
179
|
+
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
|
|
180
|
+
with:
|
|
181
|
+
registry: ghcr.io
|
|
182
|
+
username: ${{ github.actor }}
|
|
183
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
184
|
+
|
|
185
|
+
- name: Publish ready aliases
|
|
186
|
+
env:
|
|
187
|
+
FP_CACHE: ${{ needs.detect.outputs.fp_cache }}
|
|
188
|
+
REVISION: ${{ needs.detect.outputs.revision }}
|
|
189
|
+
SMS: ${{ needs.detect.outputs.sms }}
|
|
190
|
+
run: |
|
|
191
|
+
set -euo pipefail
|
|
192
|
+
repo=ghcr.io/freesolo-co/flash-worker
|
|
193
|
+
for sm in ${SMS//,/ }; do
|
|
194
|
+
source="$repo:cu128-dev-$REVISION-$sm"
|
|
195
|
+
cfg=$(crane config "$source")
|
|
196
|
+
pc=$(echo "$cfg" | jq -r '.config.Labels["co.freesolo.flash.kernelcache.fp_cache"] // ""')
|
|
197
|
+
rev=$(echo "$cfg" | jq -r '.config.Labels["org.opencontainers.image.revision"] // ""')
|
|
198
|
+
if [ "$pc" != "$FP_CACHE" ] || [ "$rev" != "$REVISION" ]; then
|
|
199
|
+
echo "candidate validation failed for $sm: fp_cache=$pc revision=$rev" >&2
|
|
200
|
+
exit 1
|
|
201
|
+
fi
|
|
202
|
+
done
|
|
203
|
+
for sm in ${SMS//,/ }; do
|
|
204
|
+
crane copy \
|
|
205
|
+
"$repo:cu128-dev-$REVISION-$sm" \
|
|
206
|
+
"$repo:cu128-dev-ready-$sm"
|
|
207
|
+
done
|
|
208
|
+
|
|
209
|
+
- name: Re-run production readiness for dev
|
|
210
|
+
env:
|
|
211
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
212
|
+
run: gh workflow run production-kernel-cache-ready.yml --repo "$GITHUB_REPOSITORY" --ref dev
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
name: production kernel-cache readiness
|
|
2
|
+
|
|
3
|
+
# this check is registry-only and never starts a gpu. branch protection can require its named job
|
|
4
|
+
# to prove every production sm already has the cache or has a compatible dev candidate to promote.
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
pull_request:
|
|
8
|
+
branches: [main]
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
packages: read
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
ready:
|
|
17
|
+
name: production kernel cache ready
|
|
18
|
+
if: github.repository == 'freesolo-co/flash'
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
timeout-minutes: 15
|
|
21
|
+
env:
|
|
22
|
+
FA2_SPEC: https://github.com/mjun0812/flash-attention-prebuild-wheels/releases/download/v0.9.0/flash_attn-2.8.3%2Bcu128torch2.10-cp312-cp312-linux_x86_64.whl
|
|
23
|
+
FA2_SHA256: a58c95a080363606e691c342d47dd173b510f4c013a8c5fcb8744def12e36a0f
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
26
|
+
with:
|
|
27
|
+
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
28
|
+
|
|
29
|
+
- name: Compute proposed kernel fingerprint
|
|
30
|
+
id: fp
|
|
31
|
+
run: python3 docker/kernel_fingerprint.py --format github --fa2-spec "$FA2_SPEC" --fa2-sha256 "$FA2_SHA256" >> "$GITHUB_OUTPUT"
|
|
32
|
+
|
|
33
|
+
- name: Install crane
|
|
34
|
+
run: |
|
|
35
|
+
set -euo pipefail
|
|
36
|
+
ver=v0.20.2
|
|
37
|
+
sha=c14340087103ba9dadf61d45acd20675490fd0ccbd56ac7901fc1b502137f44b
|
|
38
|
+
curl -fsSL -o /tmp/crane.tar.gz \
|
|
39
|
+
"https://github.com/google/go-containerregistry/releases/download/${ver}/go-containerregistry_Linux_x86_64.tar.gz"
|
|
40
|
+
echo "${sha} /tmp/crane.tar.gz" | sha256sum -c -
|
|
41
|
+
sudo tar -xz -C /usr/local/bin -f /tmp/crane.tar.gz crane
|
|
42
|
+
rm -f /tmp/crane.tar.gz
|
|
43
|
+
crane version
|
|
44
|
+
|
|
45
|
+
- name: Log in to GHCR
|
|
46
|
+
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
|
|
47
|
+
with:
|
|
48
|
+
registry: ghcr.io
|
|
49
|
+
username: ${{ github.actor }}
|
|
50
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
51
|
+
|
|
52
|
+
- name: Verify every sm cache is ready
|
|
53
|
+
env:
|
|
54
|
+
FP_CACHE: ${{ steps.fp.outputs.fp_cache }}
|
|
55
|
+
HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
56
|
+
run: |
|
|
57
|
+
set -euo pipefail
|
|
58
|
+
arches=$(python3 docker/kernel_fingerprint.py --print-baked-arches)
|
|
59
|
+
missing=()
|
|
60
|
+
summary="| arch | production | dev candidate | result |\n|---|---|---|---|\n"
|
|
61
|
+
for sm in $arches; do
|
|
62
|
+
prod="ghcr.io/freesolo-co/flash-worker:cu128-$sm"
|
|
63
|
+
candidate="ghcr.io/freesolo-co/flash-worker:cu128-dev-ready-$sm"
|
|
64
|
+
|
|
65
|
+
prod_pc=""
|
|
66
|
+
if cfg=$(crane config "$prod" 2>/dev/null); then
|
|
67
|
+
prod_pc=$(echo "$cfg" | jq -r '.config.Labels["co.freesolo.flash.kernelcache.fp_cache"] // ""')
|
|
68
|
+
fi
|
|
69
|
+
|
|
70
|
+
candidate_pc=""; candidate_rev=""
|
|
71
|
+
if cfg=$(crane config "$candidate" 2>/dev/null); then
|
|
72
|
+
candidate_pc=$(echo "$cfg" | jq -r '.config.Labels["co.freesolo.flash.kernelcache.fp_cache"] // ""')
|
|
73
|
+
candidate_rev=$(echo "$cfg" | jq -r '.config.Labels["org.opencontainers.image.revision"] // ""')
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
if [ "$prod_pc" = "$FP_CACHE" ]; then
|
|
77
|
+
result="production ready"
|
|
78
|
+
elif [ "$candidate_pc" = "$FP_CACHE" ]; then
|
|
79
|
+
result="dev candidate ready"
|
|
80
|
+
else
|
|
81
|
+
result="missing"
|
|
82
|
+
missing+=("$sm")
|
|
83
|
+
fi
|
|
84
|
+
summary="$summary| $sm | \`${prod_pc:-missing}\` | \`${candidate_pc:-missing}\` at \`${candidate_rev:-unknown}\` | $result |\n"
|
|
85
|
+
done
|
|
86
|
+
|
|
87
|
+
{
|
|
88
|
+
echo "### production kernel-cache readiness"
|
|
89
|
+
echo ""
|
|
90
|
+
echo "required fp_cache: \`$FP_CACHE\`"
|
|
91
|
+
echo ""
|
|
92
|
+
echo -e "$summary"
|
|
93
|
+
} >> "$GITHUB_STEP_SUMMARY"
|
|
94
|
+
|
|
95
|
+
if [ ${#missing[@]} -gt 0 ]; then
|
|
96
|
+
echo "::error::missing kernel-cache candidates for: ${missing[*]}. Run the dev kernel-cache candidate workflow for $HEAD_SHA."
|
|
97
|
+
exit 1
|
|
98
|
+
fi
|
|
@@ -136,7 +136,7 @@ jobs:
|
|
|
136
136
|
|
|
137
137
|
- name: Install uv
|
|
138
138
|
if: steps.decide.outputs.publish == 'true'
|
|
139
|
-
uses: astral-sh/setup-uv@
|
|
139
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
140
140
|
with:
|
|
141
141
|
python-version: "3.11"
|
|
142
142
|
|
|
@@ -202,7 +202,7 @@ jobs:
|
|
|
202
202
|
|
|
203
203
|
- name: Install uv
|
|
204
204
|
if: github.event_name == 'workflow_dispatch' || steps.changes.outputs.package_changed == 'true'
|
|
205
|
-
uses: astral-sh/setup-uv@
|
|
205
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
206
206
|
with:
|
|
207
207
|
python-version: "3.11"
|
|
208
208
|
|
|
@@ -12,6 +12,27 @@ name: flash worker image
|
|
|
12
12
|
# means only the flash COPY+install layer reruns on pure Python changes (~minutes, not hours).
|
|
13
13
|
|
|
14
14
|
on:
|
|
15
|
+
workflow_call:
|
|
16
|
+
inputs:
|
|
17
|
+
tag:
|
|
18
|
+
type: string
|
|
19
|
+
required: true
|
|
20
|
+
source_ref:
|
|
21
|
+
type: string
|
|
22
|
+
required: true
|
|
23
|
+
outputs:
|
|
24
|
+
base_ref:
|
|
25
|
+
description: digest-pinned worker base
|
|
26
|
+
value: ${{ jobs.build.outputs.base_ref }}
|
|
27
|
+
fp_cache:
|
|
28
|
+
description: kernel-cache compatibility fingerprint
|
|
29
|
+
value: ${{ jobs.build.outputs.fp_cache }}
|
|
30
|
+
fp_base:
|
|
31
|
+
description: full worker-base fingerprint
|
|
32
|
+
value: ${{ jobs.build.outputs.fp_base }}
|
|
33
|
+
base_revision:
|
|
34
|
+
description: resolved source revision
|
|
35
|
+
value: ${{ jobs.build.outputs.base_revision }}
|
|
15
36
|
workflow_dispatch:
|
|
16
37
|
inputs:
|
|
17
38
|
tag:
|
|
@@ -46,7 +67,7 @@ permissions:
|
|
|
46
67
|
# a non-prod `tag=cu128-test` dispatch can't cancel an in-flight prod `cu128` push on the same ref
|
|
47
68
|
# (which would leave :cu128 unpublished for that commit and auto-rebake blind to it).
|
|
48
69
|
concurrency:
|
|
49
|
-
group: worker-image-${{ github.ref }}-${{ github.event.inputs.tag || 'cu128' }}
|
|
70
|
+
group: worker-image-${{ github.ref }}-${{ inputs.tag || github.event.inputs.tag || 'cu128' }}
|
|
50
71
|
cancel-in-progress: true
|
|
51
72
|
|
|
52
73
|
jobs:
|
|
@@ -63,6 +84,11 @@ jobs:
|
|
|
63
84
|
# vllm and the flash-attn wheels from scratch, while still releasing the runner well before
|
|
64
85
|
# the 6-hour default would.
|
|
65
86
|
timeout-minutes: 90
|
|
87
|
+
outputs:
|
|
88
|
+
base_ref: ghcr.io/freesolo-co/flash-worker@${{ steps.image.outputs.digest }}
|
|
89
|
+
fp_cache: ${{ steps.fp.outputs.fp_cache }}
|
|
90
|
+
fp_base: ${{ steps.fp.outputs.fp_base }}
|
|
91
|
+
base_revision: ${{ steps.source.outputs.revision }}
|
|
66
92
|
# Single source for the FlashAttention wheel: used BOTH as a build-arg and as a fingerprint input
|
|
67
93
|
# (so a wheel bump moves fp_base). Keep FA2_SPEC in sync with Dockerfile.worker's ARG default.
|
|
68
94
|
env:
|
|
@@ -75,6 +101,16 @@ jobs:
|
|
|
75
101
|
FA2_SHA256: a58c95a080363606e691c342d47dd173b510f4c013a8c5fcb8744def12e36a0f
|
|
76
102
|
steps:
|
|
77
103
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
104
|
+
with:
|
|
105
|
+
ref: ${{ inputs.source_ref || github.sha }}
|
|
106
|
+
|
|
107
|
+
- name: Resolve source metadata
|
|
108
|
+
id: source
|
|
109
|
+
env:
|
|
110
|
+
IMAGE_TAG: ${{ inputs.tag || github.event.inputs.tag || 'cu128' }}
|
|
111
|
+
run: |
|
|
112
|
+
echo "revision=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT"
|
|
113
|
+
echo "tag=$IMAGE_TAG" >> "$GITHUB_OUTPUT"
|
|
78
114
|
|
|
79
115
|
# Compute the kernel-cache fingerprints (stdlib-only, no uv sync) and stamp them as labels on
|
|
80
116
|
# :cu128 below, so auto-rebake.yml can read what this base was built from. Fails the build if a
|
|
@@ -103,6 +139,7 @@ jobs:
|
|
|
103
139
|
password: ${{ secrets.GITHUB_TOKEN }}
|
|
104
140
|
|
|
105
141
|
- name: Build + push worker image
|
|
142
|
+
id: image
|
|
106
143
|
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
|
|
107
144
|
with:
|
|
108
145
|
context: .
|
|
@@ -111,14 +148,14 @@ jobs:
|
|
|
111
148
|
# pin the freesolo-co namespace: runpod, vast, and lambda training paths pull the image
|
|
112
149
|
# declared in flash/providers/_lifecycle/worker.py, so a fork run must not push to its own owner
|
|
113
150
|
# namespace and leave the real image stale.
|
|
114
|
-
tags: ghcr.io/freesolo-co/flash-worker:${{
|
|
151
|
+
tags: ghcr.io/freesolo-co/flash-worker:${{ steps.source.outputs.tag }}
|
|
115
152
|
provenance: false
|
|
116
153
|
# Stamp the kernel-cache fingerprints + the source commit so auto-rebake.yml can read what
|
|
117
154
|
# this base was built from (docker/kernel_fingerprint.py is the source of truth).
|
|
118
155
|
labels: |
|
|
119
156
|
co.freesolo.flash.kernelcache.fp_cache=${{ steps.fp.outputs.fp_cache }}
|
|
120
157
|
co.freesolo.flash.kernelcache.fp_base=${{ steps.fp.outputs.fp_base }}
|
|
121
|
-
org.opencontainers.image.revision=${{
|
|
158
|
+
org.opencontainers.image.revision=${{ steps.source.outputs.revision }}
|
|
122
159
|
# Install a PREBUILT flash-attn wheel instead of compiling from source (a multi-arch
|
|
123
160
|
# source compile is huge and OOM-kills the runner). The wheel matches the base exactly
|
|
124
161
|
# (cu128 / torch2.10 / cp312). The FA2 spec comes from the job-level env (single source).
|
|
@@ -21,6 +21,13 @@ This file starts at 1.1.35. Earlier releases are not reconstructed here; use
|
|
|
21
21
|
|
|
22
22
|
### Changed
|
|
23
23
|
|
|
24
|
+
- `[train] init_from_adapter` now works for every source/target algorithm pair. SFT was rejected as
|
|
25
|
+
a warm-start target, so an adapter could be continued only by GRPO or OPD; that restriction
|
|
26
|
+
described the retired trl SFT backend, and the verl backend that replaced it loads a warm-start
|
|
27
|
+
adapter exactly like the other two. All nine combinations of `sft`, `grpo`, and `opd` are
|
|
28
|
+
supported, including same-algorithm continuation. A warm-started SFT run also inherits its
|
|
29
|
+
source's base-model pin instead of resolving its own, so it stays deployable and no longer breaks
|
|
30
|
+
when the base model's hub tip moves.
|
|
24
31
|
- Managed attempts now pin, verify, and report one immutable Flash source archive across retries and recovery.
|
|
25
32
|
- Multi-turn GRPO now clones each sibling rollout from the task state that produced its prepared
|
|
26
33
|
prompt. Environments that record randomized episode choices on the task during `start_episode`
|