freesolo-flash-dev 1.2.68__tar.gz → 1.2.69__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.68 → freesolo_flash_dev-1.2.69}/CHANGELOG.md +1 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/Dockerfile.worker +4 -3
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/PKG-INFO +1 -1
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/docker/kernel_fingerprint.py +1 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/docker/make_rp_handler.py +17 -8
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/bootstrap.py +41 -62
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/instance.py +4 -3
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/provider.py +3 -3
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/terminal_artifacts.py +14 -7
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/worker.py +105 -40
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/base.py +1 -1
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/__init__.py +2 -2
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/jobs/__init__.py +19 -17
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/jobs/builders.py +2 -2
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/__init__.py +2 -2
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/job_execution.py +7 -1
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/jobs.py +7 -3
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/serverless/__init__.py +1 -1
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/serverless/endpoints.py +173 -172
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/vast/__init__.py +2 -2
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/vast/jobs/__init__.py +4 -4
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/vast/jobs/builders.py +2 -2
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/__init__.py +21 -1
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/artifacts.py +0 -22
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/reconciliation.py +11 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/status.py +70 -4
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/submit.py +29 -6
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/attach.py +29 -33
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/lifecycle.py +19 -26
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/seed_submission.py +17 -9
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runtime_capsule/profiles.py +2 -1
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/domain/run_registry.py +3 -2
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/platform/runtime.py +6 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/routes/runs.py +4 -1
- freesolo_flash_dev-1.2.69/flash/source_snapshot.py +387 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/pyproject.toml +2 -2
- freesolo_flash_dev-1.2.69/tests/_helpers/source_snapshot.py +13 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cancel_remote.py +9 -5
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_client_server_integration.py +3 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_publish.py +15 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_rate_limit_resolve.py +7 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_ref_pinning.py +15 -2
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_flash_worker.py +135 -89
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_instance_bootstrap_coverage.py +208 -57
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_jobs.py +157 -161
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_lambda_runner.py +77 -73
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_managed_hf_repo.py +4 -4
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_multi_gpu_gate.py +6 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_opd_resume_safety.py +23 -9
- freesolo_flash_dev-1.2.69/tests/test_orchestrator_flash.py +484 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_provider_routing.py +109 -44
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_resume_on_retry.py +10 -1
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_runmgmt.py +32 -13
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_server_api.py +42 -26
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_server_billing.py +4 -0
- freesolo_flash_dev-1.2.69/tests/test_source_attestation_flow.py +189 -0
- freesolo_flash_dev-1.2.69/tests/test_source_snapshot.py +201 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_teacher_broker.py +18 -2
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_terminal_artifacts.py +14 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_vast_runner.py +21 -10
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_weight_cache.py +56 -1
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/uv.lock +1 -1
- freesolo_flash_dev-1.2.68/tests/test_orchestrator_flash.py +0 -563
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.dockerignore +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.env.example +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/CODEOWNERS +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/dependabot.yml +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/workflows/auto-rebake.yml +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/workflows/bake-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/workflows/ci.yml +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/workflows/main-source-guard.yml +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/workflows/notify-tests-repo.yml +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/workflows/publish-dev.yml +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/workflows/publish-image.yml +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/workflows/publish.yml +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/workflows/version-parity.yml +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/workflows/worker-image.yml +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.gitignore +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/CODE_OF_CONDUCT.md +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/CONTRIBUTING.md +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/Dockerfile +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/LICENSE +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/NOTICE +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/README.md +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/SECURITY.md +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/SELF_HOSTING.md +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/build/kernel_cache/.gitignore +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/build/kernel_cache/.keep +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/deploy/infisical/README.md +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/deploy/infisical/entrypoint.sh +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/docker/Dockerfile.kernelcache +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/docker/Dockerfile.kernelcache.relayer +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/docker/bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/docker/bake_pod_entry.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/docker/extract_cudart_fix.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/_internal/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/_internal/channel.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/_internal/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/_internal/fileio.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/_internal/logging.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/_internal/paths.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/adapters/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/adapters/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/adapters/fused_experts.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/adapters/lora_rank.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/__main__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/deploy.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/episode.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/eval.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/eval_args.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/imports.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/list.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/push.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/retained.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/setup.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/setup_wandb.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/test.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/test_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/test_params.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/test_warnings.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/traces.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/train_cost.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/scaffold/TRAINING.md +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/scaffold/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/ui/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/ui/cost.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/ui/env_panels.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/ui/heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/ui/render.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/ui/tables.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/ui/tty.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/client/config.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/client/freesolo_api.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/client/http.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/client/runtime_secrets.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/client/shapes.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/client/specs.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/client/streaming.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/content/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/content/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/content/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/content/thinking.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/core/catalog.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/core/spec.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/core/spec_persistence.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cost/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cost/analytical.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cost/facts.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cost/spec.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cost/types.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/huggingface.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/plan/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/plan/kv_sizing.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/plan/model_config_probe.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/plan/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/plan/recipe.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/plan/steps.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/plan/vram.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/image_tokens.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/reasoning_render.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/sft_image_rows.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/tokenizer.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/result/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/result/accounting.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/result/rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/__main__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/backend_common.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/entry/opd.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/entry/rl.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/entry/sft.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/io/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/io/heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/io/hf.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/io/prefetch.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/io/wandb_log.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/model/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/model/adapter.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/model/chatml_mask.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/model/decoding.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/model/lora.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/model/packing.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/opd_train.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/opd_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/perf/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/perf/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/perf/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/perf/liger.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/perf/memory.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/rl_train.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/rl_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/runtime/rng.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/score_batcher.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/sft_train.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/sft_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/teacher/client.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/teacher/encoding.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/core/checkpoint_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/core/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/core/child/glue.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/core/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/core/step_timing.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/finalize.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/batching.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/bridge.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/bridge_failures.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/bridge.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/structured.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/failures.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/gkd.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/overrides.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/prompts.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/reporting.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/scoring.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/state.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/validation.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/child/patches.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/config.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/inputs.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/multi_turn.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/reward_module.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/scoring.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/single_turn.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/verl_config.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/sft/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/sft/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/sft/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/sft/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/sft/config.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/verl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/verl/capabilities.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/verl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/verl/child_io.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/verl/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/verl/parallelism.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/verl/parent_work.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker_entrypoint.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/adapter.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/base.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/cache_security.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/dataset_selection.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/evaluations.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/identity.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/loader.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/namespace_listing.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/package/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/package/direct_tokens.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/package/limits.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/package/unpack.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/pull.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/auth.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/bootstrap_console.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/deadline.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/host/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/host/failmark.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/host/hostlog.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/http.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/poll.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/poll_instance.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/allocator.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/artifacts/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/artifacts/hf.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/artifacts/preload_runpod.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/artifacts/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/fit_errors.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/api.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/auth.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/gpus.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/jobs/reap.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/preflight.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/pricing.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/preflight.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/realized.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/api.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/auth.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/cost.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/gpus.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/preflight.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/pricing.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/resources.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/sharding.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/vast/api.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/vast/auth.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/vast/preflight.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/vast/pricing.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/py.typed +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/attempts.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/costs.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/deadlines.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/preparation.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/results/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/results/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/results/verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/deploy.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/recovery.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/retry_decision.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/transitions.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runtime_capsule/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runtime_capsule/build.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runtime_capsule/manifest.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/schema/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/schema/fields.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/serve/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/serve/adapter_check.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/serve/deploy.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/serve/errors.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/serve/export.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/serve/preflight.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/serve/responses.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/serve/streaming.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/serve/thinking.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/serve/urls.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/__main__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/app.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/billing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/billing/charges.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/billing/retry.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/domain/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/domain/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/domain/environment_registry.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/domain/envs.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/domain/projects.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/domain/reconcile.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/domain/repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/domain/teacher_broker.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/domain/teacher_errors.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/domain/teacher_requests.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/platform/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/platform/auth.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/platform/db.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/platform/deps.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/platform/internal_client.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/platform/locks.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/routes/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/routes/envs.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/routes/meta.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/routes/serving.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/routes/serving_completion.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/routes/serving_revisions.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/routes/serving_smoke.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/routes/teacher.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/teacher/limits.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/teacher/retry_contract.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/scripts/build_dev_dist.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/scripts/check_file_size.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/scripts/check_function_size.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/scripts/check_verl_pin_exists.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/scripts/scrub_history.sh +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/_helpers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/_helpers/profile.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/_helpers/runner.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/_helpers/specs.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/_helpers/teacher.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/_helpers/vast.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/capture_image_sft_processor_oracle.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/conftest.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/fixtures/image_sft_processor_oracle.json +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/fixtures/math_eval.jsonl +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/fixtures/math_train.jsonl +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/live/__init__.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/live/conftest.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/live/test_lambda_live.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/live/test_runpod_live.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/live/test_sft_thinking_render_live.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/live/test_vast_live.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_accounting_coverage.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_adapter_shard_completeness.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_agent_flash_cli_contract.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_algorithms.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_allocator.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_backend_common.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_backend_jobspec_contract.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_base_model_provenance.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_billing_retry.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_build_context_contract.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_catalog_consistency.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_catalog_only_models.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_charge_pricing.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_checkpoint_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_commands.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_commands_coverage.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_credential_shadowing.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_errors.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_estimate.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_gpus_flag.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_help.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_main_coverage.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_managed.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_render_coverage.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_render_theme.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_traces.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_wandb_warning.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_client.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_client_import_purity.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_client_stream_reads.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_config_env_vars.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_config_overrides.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_console_upload.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_controlled_experiment_repairs.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cost_analytical.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cost_equation.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cost_estimate.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cost_hardware.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cost_models.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_deploy_alias_move_warning.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_deploy_latency.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_dev_channel.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_disk_gb.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_endpoint_name.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_cache_evict.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_delete.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_download.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_download_api.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_list_api.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_list_cli.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_list_hub.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_no_install.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_pull.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_pull_coverage.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_pull_loader_coverage.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_pull_managed_control_plane.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_push.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_test.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_export.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_flash_mvp.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_flashinfer_cache_dirs.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_freesolo_api_transport.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_fused_expert_warmstart.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_github_urlopen_retry.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_gpu_type_single_field.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_gpus.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_grpo_params.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_grpo_resident_sizing.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_grpo_reward_batching.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_health_liveness.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_hf_retry.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_idle_endpoint_reaper.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_image_sft_markers.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_image_sft_processor_parity.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_image_tokens.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_infisical_secrets.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_internal_client.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_kv_util.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_lambda_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_logging.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_login_perms.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_lora_rank_coverage.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_lora_rank_preflight.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_managed_config_fields.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_metrics_schema_agent_contract.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_mig_guard.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_multimodal_training.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_named_reward_metrics.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_oom_escalate_gpu.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_opd.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_opd_limits.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_opd_multiturn_eos_boundary.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_opd_multiturn_failure_exit.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_opd_replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_opd_train.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_packing.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_packing_coverage.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_parasail_teacher.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_persisted_spec_envelope.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_poll_helpers.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_preflight.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_projects.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_provider_preflight_coverage.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_provider_teardown_robustness.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_providers_symmetry.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_realized_cost.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_resolve_params_b.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_rl_train.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_runpod_api_delete.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_runpod_key_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_runpod_key_waterfall.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_runtime_capsule.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_serve.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_serve_reasoning_content.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_server_app_coverage.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_server_auth_singleflight.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_server_checkpoints_coverage.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_server_db.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_server_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_server_locks_coverage.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_server_standalone.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_serving_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_serving_contract.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_serving_schema_coverage.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_sft_chunked_nll.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_sft_example_selection.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_sft_gc_off.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_sft_max_context.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_sft_startup_block.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_sft_train.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_spec_and_validation.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_spec_contract_bytes.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_step_floor.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_step_metrics.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_step_timing.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_teacher_encoding_contract.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_thinking_config.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_train_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_training_controls.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_type_comment_prose.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_vast_api.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_vast_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_vast_offers.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_vast_provider_coverage.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_verifiers.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_verl_checkpoint_export.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_verl_child_plugins.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_verl_silence_watchdog.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_version.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_vl_warmstart_adapter_keys.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_vram_architecture.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_wandb_link.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_wandb_naming.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_warmstart_adapter_download.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_warmstart_cross_repo.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_warmstart_error_attribution.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_worker_dryrun.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_worker_hardexit.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_worker_image.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_worker_init_heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_worker_stack.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_worker_thinking.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_workflow_contracts.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_zero2_sharding_gate.py +0 -0
|
@@ -21,6 +21,7 @@ This file starts at 1.1.35. Earlier releases are not reconstructed here; use
|
|
|
21
21
|
|
|
22
22
|
### Changed
|
|
23
23
|
|
|
24
|
+
- Managed attempts now pin, verify, and report one immutable Flash source archive across retries and recovery.
|
|
24
25
|
- Multi-turn GRPO now clones each sibling rollout from the task state that produced its prepared
|
|
25
26
|
prompt. Environments that record randomized episode choices on the task during `start_episode`
|
|
26
27
|
are stepped and scored against the same episode the model saw, without sharing mutable state
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Flash prebuilt WORKER image — the full training stack baked in for RunPod workers.
|
|
2
|
-
#
|
|
2
|
+
# the worker fetches one pinned source archive at runtime; the trusted verifier is baked here.
|
|
3
3
|
#
|
|
4
4
|
# this image name is defined in flash/providers/_lifecycle/worker.py. it must be
|
|
5
5
|
# published to GHCR and the package set PUBLIC (no registry login is configured) so RunPod can
|
|
@@ -460,7 +460,8 @@ print(' gdn boundary resets: fla', M.version('flash-linear-attention'), 'and ca
|
|
|
460
460
|
# from the real _train_body source in providers/runpod/serverless/endpoints.py (single source of truth;
|
|
461
461
|
# _train_body is self-contained — every name is imported inside its body) and run it as the CMD so the
|
|
462
462
|
# image is a self-contained RunPod Serverless worker. Build context is the repo root.
|
|
463
|
-
COPY flash/providers/runpod/serverless/endpoints.py docker/make_rp_handler.py /tmp/rpgen/
|
|
464
|
-
RUN
|
|
463
|
+
COPY flash/providers/runpod/serverless/endpoints.py flash/source_snapshot.py docker/make_rp_handler.py /tmp/rpgen/
|
|
464
|
+
RUN cp /tmp/rpgen/source_snapshot.py /source_snapshot.py \
|
|
465
|
+
&& python /tmp/rpgen/make_rp_handler.py /tmp/rpgen/endpoints.py /tmp/rpgen/source_snapshot.py /rp_handler.py \
|
|
465
466
|
&& python -c "import ast; ast.parse(open('/rp_handler.py').read()); print('rp_handler OK')"
|
|
466
467
|
CMD ["python", "-u", "/rp_handler.py"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: freesolo-flash-dev
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.69
|
|
4
4
|
Summary: Flash — managed LoRA post-training (SFT/GRPO/OPD) for Freesolo environments, driven by the `flash` CLI
|
|
5
5
|
Project-URL: Homepage, https://github.com/freesolo-co/flash
|
|
6
6
|
Project-URL: Repository, https://github.com/freesolo-co/flash
|
|
@@ -236,6 +236,7 @@ def collect_inputs(
|
|
|
236
236
|
root / "flash" / "providers" / "runpod" / "serverless" / "endpoints.py"
|
|
237
237
|
),
|
|
238
238
|
"make_rp_handler_sha256": _sha256_file(root / "docker" / "make_rp_handler.py"),
|
|
239
|
+
"source_snapshot_sha256": _sha256_file(root / "flash" / "source_snapshot.py"),
|
|
239
240
|
}
|
|
240
241
|
return cache_inputs, base_inputs_partial
|
|
241
242
|
|
|
@@ -5,11 +5,10 @@ This makes the worker image a *self-contained RunPod Serverless worker* (Pattern
|
|
|
5
5
|
Flash deploys it as a custom image (client mode), the baked CMD runs this handler, which reads the
|
|
6
6
|
job payload from job["input"] and runs the training via `_train_body`.
|
|
7
7
|
|
|
8
|
-
`_train_body`
|
|
9
|
-
the
|
|
10
|
-
Single source of truth: it's generated from the real `_train_body`, so it can't drift.
|
|
8
|
+
`_train_body` imports its trusted verifier from the sibling module baked into the image, then fetches
|
|
9
|
+
the pinned Flash source archive from HF.
|
|
11
10
|
|
|
12
|
-
Usage: python make_rp_handler.py <path-to-endpoints.py> <out-path>
|
|
11
|
+
Usage: python make_rp_handler.py <path-to-endpoints.py> <path-to-source-snapshot.py> <out-path>
|
|
13
12
|
"""
|
|
14
13
|
|
|
15
14
|
import ast
|
|
@@ -17,9 +16,11 @@ import sys
|
|
|
17
16
|
|
|
18
17
|
|
|
19
18
|
def main() -> int:
|
|
20
|
-
if len(sys.argv) !=
|
|
21
|
-
raise SystemExit(
|
|
22
|
-
|
|
19
|
+
if len(sys.argv) != 4:
|
|
20
|
+
raise SystemExit(
|
|
21
|
+
f"usage: {sys.argv[0]} <path-to-endpoints.py> <path-to-source-snapshot.py> <out-path>"
|
|
22
|
+
)
|
|
23
|
+
src_path, verifier_path, out_path = sys.argv[1], sys.argv[2], sys.argv[3]
|
|
23
24
|
with open(src_path, encoding="utf-8") as f:
|
|
24
25
|
src = f.read()
|
|
25
26
|
fn_src = None
|
|
@@ -29,12 +30,20 @@ def main() -> int:
|
|
|
29
30
|
break
|
|
30
31
|
if not fn_src:
|
|
31
32
|
raise SystemExit("could not find _train_body in " + src_path)
|
|
33
|
+
with open(verifier_path, "rb") as f:
|
|
34
|
+
verifier = f.read()
|
|
35
|
+
ast.parse(verifier, filename=verifier_path)
|
|
32
36
|
out = (
|
|
33
37
|
"# AUTO-GENERATED by flash/docker/make_rp_handler.py from providers/runpod/train/endpoints.py.\n"
|
|
34
38
|
"# Do not edit; the worker image regenerates it at build time.\n"
|
|
35
39
|
"import runpod\n\n" + fn_src + "\n\ndef handler(job):\n"
|
|
36
40
|
' """RunPod Serverless entry: the job payload is the control plane\'s train input."""\n'
|
|
37
|
-
|
|
41
|
+
" try:\n"
|
|
42
|
+
' return _train_body(job["input"])\n'
|
|
43
|
+
" except Exception as exc:\n"
|
|
44
|
+
' if getattr(exc, "flash_retriable", False):\n'
|
|
45
|
+
' return {"error": str(exc), "_flash_retriable": True}\n'
|
|
46
|
+
" raise\n\n"
|
|
38
47
|
'runpod.serverless.start({"handler": handler})\n'
|
|
39
48
|
)
|
|
40
49
|
# Validate it parses before baking.
|
{freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/bootstrap.py
RENAMED
|
@@ -20,6 +20,7 @@ from datetime import UTC, datetime
|
|
|
20
20
|
from email.utils import parsedate_to_datetime
|
|
21
21
|
|
|
22
22
|
if __package__:
|
|
23
|
+
from flash import source_snapshot as _source_snapshot
|
|
23
24
|
from flash.providers._lifecycle import bootstrap_console as _bootstrap_console
|
|
24
25
|
from flash.providers._lifecycle import bootstrap_pip
|
|
25
26
|
from flash.providers._lifecycle.bootstrap_secrets import (
|
|
@@ -32,6 +33,7 @@ else:
|
|
|
32
33
|
# same directory, and the script directory leads sys.path.
|
|
33
34
|
import bootstrap_console as _bootstrap_console # type: ignore[no-redef]
|
|
34
35
|
import bootstrap_pip # type: ignore[no-redef]
|
|
36
|
+
import source_snapshot as _source_snapshot # type: ignore[no-redef]
|
|
35
37
|
from bootstrap_secrets import ( # type: ignore[no-redef]
|
|
36
38
|
_payload_secrets,
|
|
37
39
|
_read_console_tail,
|
|
@@ -139,38 +141,22 @@ def _arm(payload: dict) -> str:
|
|
|
139
141
|
return str(payload.get("flash_arm") or "instance")
|
|
140
142
|
|
|
141
143
|
|
|
142
|
-
def
|
|
143
|
-
|
|
144
|
-
if not isinstance(raw, str) or not raw.strip():
|
|
145
|
-
raise ValueError("missing code_prefix")
|
|
146
|
-
prefix = raw.strip().strip("/")
|
|
147
|
-
parts = prefix.split("/")
|
|
148
|
-
digest = parts[1] if len(parts) == 3 else ""
|
|
149
|
-
if (
|
|
150
|
-
len(parts) != 3
|
|
151
|
-
or parts[0] != "code"
|
|
152
|
-
or parts[2] != "flash"
|
|
153
|
-
or len(digest) != 32
|
|
154
|
-
or any(c not in "0123456789abcdef" for c in digest)
|
|
155
|
-
):
|
|
156
|
-
raise ValueError(f"invalid code_prefix: {prefix!r}")
|
|
157
|
-
return prefix
|
|
144
|
+
def _source_descriptor(payload: dict):
|
|
145
|
+
return _source_snapshot.parse_descriptor(payload.get("source_snapshot"))
|
|
158
146
|
|
|
159
147
|
|
|
160
148
|
def _code_dir(payload: dict) -> str:
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
149
|
+
return str(
|
|
150
|
+
_source_snapshot.attempt_materialization_path(
|
|
151
|
+
CODE_ROOT,
|
|
152
|
+
payload.get("run_id"),
|
|
153
|
+
payload.get("attempt"),
|
|
154
|
+
)
|
|
155
|
+
)
|
|
165
156
|
|
|
166
157
|
|
|
167
158
|
def _hf_status_code(exc: BaseException) -> int | None:
|
|
168
|
-
|
|
169
|
-
code = getattr(response, "status_code", None)
|
|
170
|
-
try:
|
|
171
|
-
return int(code)
|
|
172
|
-
except (TypeError, ValueError):
|
|
173
|
-
return None
|
|
159
|
+
return _source_snapshot.response_status_code(exc)
|
|
174
160
|
|
|
175
161
|
|
|
176
162
|
def _hf_retry_after(exc: BaseException) -> float | None:
|
|
@@ -208,7 +194,7 @@ def _hf_call(call, label: str, *, deadline_at: float | None = None, secrets: dic
|
|
|
208
194
|
try:
|
|
209
195
|
return call()
|
|
210
196
|
except Exception as exc:
|
|
211
|
-
if
|
|
197
|
+
if not _source_snapshot.is_transient_fetch_error(exc) or attempt >= len(
|
|
212
198
|
_HF_RETRY_DELAYS_S
|
|
213
199
|
):
|
|
214
200
|
raise
|
|
@@ -580,45 +566,36 @@ def install_extra_pip(payload: dict) -> None:
|
|
|
580
566
|
|
|
581
567
|
|
|
582
568
|
def fetch_code(payload: dict) -> None:
|
|
583
|
-
from huggingface_hub import
|
|
569
|
+
from huggingface_hub import hf_hub_download
|
|
584
570
|
|
|
585
571
|
deadline_at = require_deadline_at(payload)
|
|
586
|
-
|
|
572
|
+
descriptor = _source_descriptor(payload)
|
|
587
573
|
token = (payload.get("env") or {}).get("HF_TOKEN")
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
for entry in _hf_call(
|
|
592
|
-
lambda: list(
|
|
593
|
-
api.list_repo_tree(
|
|
594
|
-
repo_id=payload["hf_repo"],
|
|
595
|
-
repo_type="dataset",
|
|
596
|
-
path_in_repo=prefix,
|
|
597
|
-
recursive=True,
|
|
598
|
-
token=token,
|
|
599
|
-
)
|
|
600
|
-
),
|
|
601
|
-
f"list flash code under {payload['hf_repo']}:{prefix}",
|
|
602
|
-
deadline_at=deadline_at,
|
|
603
|
-
secrets=_payload_secrets(payload),
|
|
604
|
-
)
|
|
605
|
-
if getattr(entry, "path", None) and getattr(entry, "size", None) is not None
|
|
606
|
-
]
|
|
607
|
-
if not files:
|
|
608
|
-
raise RuntimeError(f"no flash code files found under {payload['hf_repo']}:{prefix}")
|
|
609
|
-
for filename in files:
|
|
610
|
-
_hf_call(
|
|
611
|
-
lambda filename=filename: hf_hub_download(
|
|
574
|
+
try:
|
|
575
|
+
archive_path = _hf_call(
|
|
576
|
+
lambda: hf_hub_download(
|
|
612
577
|
repo_id=payload["hf_repo"],
|
|
613
578
|
repo_type="dataset",
|
|
614
|
-
filename=
|
|
615
|
-
|
|
579
|
+
filename=descriptor.archive_path,
|
|
580
|
+
revision=descriptor.revision,
|
|
616
581
|
token=token,
|
|
617
582
|
),
|
|
618
|
-
|
|
583
|
+
"download pinned flash source snapshot",
|
|
619
584
|
deadline_at=deadline_at,
|
|
620
585
|
secrets=_payload_secrets(payload),
|
|
621
586
|
)
|
|
587
|
+
except Exception as exc:
|
|
588
|
+
error_type = (
|
|
589
|
+
RetriableBootstrapError
|
|
590
|
+
if _source_snapshot.is_transient_fetch_error(exc)
|
|
591
|
+
else RuntimeError
|
|
592
|
+
)
|
|
593
|
+
raise error_type("failed to fetch the pinned flash source snapshot") from None
|
|
594
|
+
_source_snapshot.materialize_verified_archive_file(
|
|
595
|
+
archive_path,
|
|
596
|
+
descriptor,
|
|
597
|
+
_code_dir(payload),
|
|
598
|
+
)
|
|
622
599
|
|
|
623
600
|
|
|
624
601
|
def run_mode(payload: dict, env: dict, mode: str, deadline_ts: float) -> int:
|
|
@@ -780,6 +757,12 @@ def write_attempt_marker(payload: dict, ok: bool, error: str = "", retriable: bo
|
|
|
780
757
|
"run_id": run_id,
|
|
781
758
|
"ts": now,
|
|
782
759
|
}
|
|
760
|
+
if ok:
|
|
761
|
+
marker["source_attestation"] = _source_snapshot.source_attestation(
|
|
762
|
+
_source_descriptor(payload),
|
|
763
|
+
run_id=run_id,
|
|
764
|
+
attempt=attempt,
|
|
765
|
+
)
|
|
783
766
|
p = "/tmp/attempt_marker.json"
|
|
784
767
|
with open(p, "w") as f:
|
|
785
768
|
json.dump(marker, f)
|
|
@@ -924,13 +907,9 @@ def main() -> int:
|
|
|
924
907
|
error = "model preload failed" if not ok else ""
|
|
925
908
|
return 0 if ok else 1
|
|
926
909
|
deadline_watchdog = arm_deadline_watchdog(deadline, payload)
|
|
910
|
+
# fetch and verify the pinned archive before pip, downloaded imports, path mutation, or child.
|
|
911
|
+
fetch_code(payload)
|
|
927
912
|
install_extra_pip(payload)
|
|
928
|
-
# Pre-worker HF fetch of the run's own code (control plane uploaded it before submit), same
|
|
929
|
-
# infra-shaped class as fetch_spec_from_hf above: a transient HF blip must retry, not fail.
|
|
930
|
-
try:
|
|
931
|
-
fetch_code(payload)
|
|
932
|
-
except Exception:
|
|
933
|
-
raise RetriableBootstrapError("failed to fetch run code from HF") from None
|
|
934
913
|
env = build_worker_env(payload)
|
|
935
914
|
phase = payload["phase"]
|
|
936
915
|
for stale in ("/tmp/train_meta.json", "/tmp/metrics.json"):
|
{freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/instance.py
RENAMED
|
@@ -191,7 +191,7 @@ def build_payload(
|
|
|
191
191
|
cache_host_mount: str | None = None,
|
|
192
192
|
mode: str | None = None,
|
|
193
193
|
models: list | None = None,
|
|
194
|
-
|
|
194
|
+
source_snapshot: dict | None = None,
|
|
195
195
|
deadline_at: float | None = None,
|
|
196
196
|
) -> dict:
|
|
197
197
|
"""The bootstrap's input — field-compatible with the RunPod ``_train_body`` payload, plus the
|
|
@@ -203,7 +203,7 @@ def build_payload(
|
|
|
203
203
|
build_worker_env,
|
|
204
204
|
strip_runpod_volume_env,
|
|
205
205
|
)
|
|
206
|
-
from flash.
|
|
206
|
+
from flash.source_snapshot import parse_descriptor
|
|
207
207
|
|
|
208
208
|
canonical_seed = require_matching_seed(spec, seed)
|
|
209
209
|
# strip the runpod-only volume redirect; point base-model prefetch at this provider's cache unless the user overrode it.
|
|
@@ -233,12 +233,13 @@ def build_payload(
|
|
|
233
233
|
# [environment] pip is appended to the worker requirement, never substituted for it.
|
|
234
234
|
"extra_pip": worker_pip_with_extras(spec.environment.id, spec.environment.pip),
|
|
235
235
|
"hf_prefix": f"{spec.phase}/{spec.run_id}",
|
|
236
|
-
"code_prefix": code_prefix or flash_code_prefix(),
|
|
237
236
|
"deadline_at": absolute_deadline,
|
|
238
237
|
"run_created_at": absolute_deadline - max_wall_seconds,
|
|
239
238
|
"run_max_wall_seconds": max_wall_seconds,
|
|
240
239
|
"attempt": attempt_id,
|
|
241
240
|
}
|
|
241
|
+
if mode != "preload":
|
|
242
|
+
payload["source_snapshot"] = parse_descriptor(source_snapshot).to_dict()
|
|
242
243
|
if cache_host_mount:
|
|
243
244
|
payload["cache_host_mount"] = cache_host_mount
|
|
244
245
|
# Carry the mount sentinel filename so the bootstrap's mount-check reads it from one constant.
|
{freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/provider.py
RENAMED
|
@@ -66,7 +66,7 @@ class InstanceProvider(abc.ABC):
|
|
|
66
66
|
on_handle: Any,
|
|
67
67
|
attempt: int,
|
|
68
68
|
runtime_secrets: dict[str, str] | None,
|
|
69
|
-
|
|
69
|
+
source_snapshot: dict | None,
|
|
70
70
|
deadline_at: float | None,
|
|
71
71
|
) -> PollResult: ...
|
|
72
72
|
|
|
@@ -122,7 +122,7 @@ class InstanceProvider(abc.ABC):
|
|
|
122
122
|
attempt: int = 0,
|
|
123
123
|
runtime_secrets: dict[str, str] | None = None,
|
|
124
124
|
on_last_gpu: bool = False,
|
|
125
|
-
|
|
125
|
+
source_snapshot: dict | None = None,
|
|
126
126
|
_deadline_at: float | None = None,
|
|
127
127
|
) -> PollResult:
|
|
128
128
|
from flash.core.spec import require_matching_seed
|
|
@@ -136,7 +136,7 @@ class InstanceProvider(abc.ABC):
|
|
|
136
136
|
on_handle=on_handle,
|
|
137
137
|
attempt=attempt,
|
|
138
138
|
runtime_secrets=runtime_secrets,
|
|
139
|
-
|
|
139
|
+
source_snapshot=source_snapshot,
|
|
140
140
|
deadline_at=_deadline_at,
|
|
141
141
|
)
|
|
142
142
|
|
|
@@ -156,19 +156,22 @@ def decode_terminal_marker(
|
|
|
156
156
|
the caller allows. A marker that cannot be verified must never settle an attempt.
|
|
157
157
|
"""
|
|
158
158
|
marker = json.loads(raw)
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
"
|
|
163
|
-
"retriable",
|
|
164
|
-
"run_id",
|
|
165
|
-
"ts",
|
|
159
|
+
base_fields = {"attempt", "error", "ok", "retriable", "run_id", "ts"}
|
|
160
|
+
if not isinstance(marker, dict) or set(marker) not in {
|
|
161
|
+
frozenset(base_fields),
|
|
162
|
+
frozenset(base_fields | {"source_attestation"}),
|
|
166
163
|
}:
|
|
167
164
|
raise ValueError("invalid terminal marker schema")
|
|
168
165
|
marker_attempt = marker["attempt"]
|
|
169
166
|
ts = marker["ts"]
|
|
170
167
|
error = marker["error"]
|
|
171
168
|
now = time.time()
|
|
169
|
+
if "source_attestation" in marker:
|
|
170
|
+
from flash.source_snapshot import parse_attestation
|
|
171
|
+
|
|
172
|
+
attestation = parse_attestation(marker["source_attestation"])
|
|
173
|
+
if attestation["run_id"] != run_id or attestation["attempt"] != attempt:
|
|
174
|
+
raise ValueError("invalid terminal marker source identity")
|
|
172
175
|
if (
|
|
173
176
|
isinstance(launch_floor, bool)
|
|
174
177
|
or not isinstance(launch_floor, (int, float))
|
|
@@ -258,4 +261,8 @@ def resolve_terminal_artifacts(
|
|
|
258
261
|
marker=marker,
|
|
259
262
|
metrics_unparseable=raw_metrics is not None,
|
|
260
263
|
)
|
|
264
|
+
if "source_attestation" in marker:
|
|
265
|
+
from flash.source_snapshot import TERMINAL_ATTESTATION_KEY
|
|
266
|
+
|
|
267
|
+
metrics = {**metrics, TERMINAL_ATTESTATION_KEY: marker["source_attestation"]}
|
|
261
268
|
return TerminalResolution(TerminalKind.SUCCESS, metrics=metrics, marker=marker)
|
{freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/worker.py
RENAMED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
"""Provider-neutral worker packaging
|
|
1
|
+
"""Provider-neutral worker packaging and immutable managed source publication."""
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import os
|
|
6
6
|
import time
|
|
7
7
|
from io import BytesIO
|
|
8
|
+
from pathlib import Path
|
|
8
9
|
|
|
9
10
|
from flash._internal.diagnostics import SECRET_ENV_KEYS_ENV
|
|
10
11
|
from flash._internal.logging import get_logger
|
|
@@ -205,9 +206,6 @@ def build_worker_env(
|
|
|
205
206
|
return env
|
|
206
207
|
|
|
207
208
|
|
|
208
|
-
_CODE_SNAPSHOT_COMPLETE = ".flash-code-snapshot-complete"
|
|
209
|
-
|
|
210
|
-
|
|
211
209
|
def _hf_call(call, label: str, *, deadline_at: float | None = None):
|
|
212
210
|
return hf_call(
|
|
213
211
|
call,
|
|
@@ -246,53 +244,120 @@ def _ensure_private_artifact_repo(
|
|
|
246
244
|
)
|
|
247
245
|
|
|
248
246
|
|
|
249
|
-
def
|
|
247
|
+
def _repo_revision(api, repo: str, *, deadline_at: float | None) -> str:
|
|
248
|
+
info = _hf_call(
|
|
249
|
+
lambda: api.repo_info(repo_id=repo, repo_type="dataset"),
|
|
250
|
+
f"read artifact repo revision {repo}",
|
|
251
|
+
deadline_at=deadline_at,
|
|
252
|
+
)
|
|
253
|
+
revision = str(getattr(info, "sha", None) or getattr(info, "oid", None) or "").strip()
|
|
254
|
+
if not revision:
|
|
255
|
+
raise RuntimeError("artifact repository revision is unavailable")
|
|
256
|
+
return revision
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
def _download_source_archive(
|
|
260
|
+
repo: str,
|
|
261
|
+
archive_path: str,
|
|
262
|
+
revision: str,
|
|
263
|
+
token: str | None,
|
|
264
|
+
*,
|
|
265
|
+
deadline_at: float | None,
|
|
266
|
+
) -> bytes | None:
|
|
267
|
+
from huggingface_hub import hf_hub_download
|
|
268
|
+
|
|
269
|
+
try:
|
|
270
|
+
local_path = _hf_call(
|
|
271
|
+
lambda: hf_hub_download(
|
|
272
|
+
repo_id=repo,
|
|
273
|
+
repo_type="dataset",
|
|
274
|
+
filename=archive_path,
|
|
275
|
+
revision=revision,
|
|
276
|
+
token=token,
|
|
277
|
+
),
|
|
278
|
+
f"download source snapshot {repo}:{archive_path}@{revision}",
|
|
279
|
+
deadline_at=deadline_at,
|
|
280
|
+
)
|
|
281
|
+
except Exception as exc:
|
|
282
|
+
if hf_status_code(exc) == 404 or exc.__class__.__name__ in {
|
|
283
|
+
"EntryNotFoundError",
|
|
284
|
+
"LocalEntryNotFoundError",
|
|
285
|
+
}:
|
|
286
|
+
return None
|
|
287
|
+
raise
|
|
288
|
+
with open(local_path, "rb") as source:
|
|
289
|
+
return source.read()
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def publish_source_snapshot(
|
|
250
293
|
repo: str | None = None,
|
|
251
294
|
*,
|
|
252
|
-
code_prefix: str | None = None,
|
|
253
295
|
deadline_at: float | None = None,
|
|
254
|
-
) ->
|
|
255
|
-
"""
|
|
296
|
+
) -> dict:
|
|
297
|
+
"""Publish one deterministic source archive and return its immutable descriptor."""
|
|
256
298
|
from huggingface_hub import HfApi
|
|
257
299
|
|
|
258
300
|
import flash
|
|
259
|
-
from flash.
|
|
301
|
+
from flash.source_snapshot import (
|
|
302
|
+
build_source_archive,
|
|
303
|
+
canonical_archive_path,
|
|
304
|
+
descriptor_for_archive,
|
|
305
|
+
read_verified_archive,
|
|
306
|
+
sha256_bytes,
|
|
307
|
+
)
|
|
260
308
|
|
|
261
309
|
if not repo:
|
|
262
310
|
raise RuntimeError(
|
|
263
311
|
"hf_repo must be set (the run's [train] hf_repo: HF dataset repo for code + artifacts)"
|
|
264
312
|
)
|
|
265
313
|
token = os.environ.get("HF_TOKEN")
|
|
266
|
-
pkg_dir = os.path.realpath(os.path.dirname(os.path.abspath(flash.__file__)))
|
|
267
314
|
api = HfApi(token=token)
|
|
268
315
|
_ensure_private_artifact_repo(api, repo, deadline_at=deadline_at)
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
)
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
316
|
+
package_dir = os.path.realpath(os.path.dirname(os.path.abspath(flash.__file__)))
|
|
317
|
+
archive = build_source_archive(package_dir=Path(package_dir))
|
|
318
|
+
digest = sha256_bytes(archive)
|
|
319
|
+
archive_path = canonical_archive_path(digest)
|
|
320
|
+
|
|
321
|
+
def verified_at(revision: str) -> dict | None:
|
|
322
|
+
candidate = _download_source_archive(
|
|
323
|
+
repo,
|
|
324
|
+
archive_path,
|
|
325
|
+
revision,
|
|
326
|
+
token,
|
|
327
|
+
deadline_at=deadline_at,
|
|
328
|
+
)
|
|
329
|
+
if candidate is None:
|
|
330
|
+
return None
|
|
331
|
+
descriptor = descriptor_for_archive(archive, revision)
|
|
332
|
+
read_verified_archive(candidate, descriptor)
|
|
333
|
+
return descriptor.to_dict()
|
|
334
|
+
|
|
335
|
+
head = _repo_revision(api, repo, deadline_at=deadline_at)
|
|
336
|
+
existing = verified_at(head)
|
|
337
|
+
if existing is not None:
|
|
338
|
+
return existing
|
|
339
|
+
try:
|
|
340
|
+
commit = _hf_call(
|
|
341
|
+
lambda: api.upload_file(
|
|
342
|
+
path_or_fileobj=BytesIO(archive),
|
|
343
|
+
path_in_repo=archive_path,
|
|
344
|
+
repo_id=repo,
|
|
345
|
+
repo_type="dataset",
|
|
346
|
+
commit_message=f"publish flash source {digest}",
|
|
347
|
+
),
|
|
348
|
+
f"publish source snapshot {repo}:{archive_path}",
|
|
349
|
+
deadline_at=deadline_at,
|
|
350
|
+
)
|
|
351
|
+
revision = str(getattr(commit, "oid", None) or "").strip()
|
|
352
|
+
if not revision:
|
|
353
|
+
raise RuntimeError("source snapshot publication returned no immutable revision")
|
|
354
|
+
published = verified_at(revision)
|
|
355
|
+
if published is None:
|
|
356
|
+
raise RuntimeError("published source snapshot is not readable at its commit revision")
|
|
357
|
+
return published
|
|
358
|
+
except Exception:
|
|
359
|
+
winner_revision = _repo_revision(api, repo, deadline_at=deadline_at)
|
|
360
|
+
winner = verified_at(winner_revision)
|
|
361
|
+
if winner is not None:
|
|
362
|
+
return winner
|
|
363
|
+
raise
|
|
@@ -903,7 +903,7 @@ class Provider(Protocol):
|
|
|
903
903
|
attempt: int = 0,
|
|
904
904
|
runtime_secrets: dict[str, str] | None = None,
|
|
905
905
|
on_last_gpu: bool = False,
|
|
906
|
-
|
|
906
|
+
source_snapshot: dict | None = None,
|
|
907
907
|
_deadline_at: float | None = None,
|
|
908
908
|
) -> PollResult:
|
|
909
909
|
"""Deploy/rent -> submit -> persist handle (via ``on_handle``) -> poll to terminal.
|
|
@@ -55,7 +55,7 @@ class LambdaProvider(InstanceProvider):
|
|
|
55
55
|
on_handle: Any,
|
|
56
56
|
attempt: int,
|
|
57
57
|
runtime_secrets: dict[str, str] | None,
|
|
58
|
-
|
|
58
|
+
source_snapshot: dict | None,
|
|
59
59
|
deadline_at: float | None,
|
|
60
60
|
) -> PollResult:
|
|
61
61
|
from flash.providers.lambda_.jobs import submit_run_lambda
|
|
@@ -67,7 +67,7 @@ class LambdaProvider(InstanceProvider):
|
|
|
67
67
|
on_handle=on_handle,
|
|
68
68
|
attempt=attempt,
|
|
69
69
|
runtime_secrets=runtime_secrets,
|
|
70
|
-
|
|
70
|
+
source_snapshot=source_snapshot,
|
|
71
71
|
deadline_at=deadline_at,
|
|
72
72
|
)
|
|
73
73
|
|