freesolo-flash-dev 1.4.20__tar.gz → 1.4.22__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.env.example +10 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/PKG-INFO +1 -1
- freesolo_flash_dev-1.4.22/SELF_HOSTING.md +80 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/ops/catalog.py +10 -1
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/scaffold/TRAINING.md +24 -1
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/ui/tables.py +5 -1
- freesolo_flash_dev-1.4.22/flash/core/checkpoint_policy.py +20 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/core/spec.py +20 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cost/analytical.py +22 -6
- freesolo_flash_dev-1.4.22/flash/engine/worker/train/core/child/checkpoint_schedule.py +70 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/trainer.py +14 -2
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/entry/sft_train.py +4 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/entry/sft_train_runner.py +5 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/launch/inputs.py +3 -1
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/sft/child/trainer.py +14 -2
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/sft/setup/checkpoints.py +5 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/core/allocator.py +22 -3
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/core/base.py +4 -2
- freesolo_flash_dev-1.4.22/flash/providers/core/handles.py +11 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/core/preflight.py +7 -2
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/core/registry.py +16 -4
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/modal/auth.py +6 -0
- freesolo_flash_dev-1.4.22/flash/providers/nebius/__init__.py +1 -0
- freesolo_flash_dev-1.4.22/flash/providers/nebius/api.py +268 -0
- freesolo_flash_dev-1.4.22/flash/providers/nebius/bootstrap.py +48 -0
- freesolo_flash_dev-1.4.22/flash/providers/nebius/config.py +31 -0
- freesolo_flash_dev-1.4.22/flash/providers/nebius/handles.py +56 -0
- freesolo_flash_dev-1.4.22/flash/providers/nebius/jobs.py +160 -0
- freesolo_flash_dev-1.4.22/flash/providers/nebius/prices.py +48 -0
- freesolo_flash_dev-1.4.22/flash/providers/nebius/pricing.py +54 -0
- freesolo_flash_dev-1.4.22/flash/providers/nebius/provider.py +127 -0
- freesolo_flash_dev-1.4.22/flash/providers/nebius/queue.py +30 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/accounting/costs.py +11 -4
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/lifecycle/cleanup.py +4 -4
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/lifecycle/state.py +1 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/lifecycle/status.py +1 -1
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/lifecycle/submit.py +5 -1
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/supervise/attach.py +1 -1
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/supervise/execution.py +32 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/supervise/recovery.py +16 -11
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/supervise/retry_decision.py +23 -4
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/schema/__init__.py +15 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/platform/runtime.py +1 -1
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/app/modal_app.py +4 -26
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/app/rollback.py +1 -4
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/app/rollout.py +5 -17
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/boot.py +4 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/pyproject.toml +2 -2
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/smoke_modal_sft.py +2 -2
- freesolo_flash_dev-1.4.22/scripts/smoke_nebius_sft.py +145 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_model_config.py +2 -3
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_per_model_gpu.py +16 -31
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_rollback_compatibility.py +3 -4
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_rollout_readiness.py +5 -4
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_usage_reporter.py +7 -16
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_gpus.py +3 -1
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_managed_config_fields.py +2 -1
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_modal_provider.py +3 -2
- freesolo_flash_dev-1.4.22/tests/test_nebius_spot.py +557 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_persisted_spec_envelope.py +44 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_resume_on_retry.py +2 -2
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_retry_decision.py +38 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_runmgmt.py +1 -1
- freesolo_flash_dev-1.4.22/tests/test_spot_billing.py +83 -0
- freesolo_flash_dev-1.4.22/tests/test_spot_checkpoint_schedule.py +210 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/uv.lock +1 -1
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.dockerignore +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/CODEOWNERS +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/dependabot.yml +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/scripts/ci_sharding.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/scripts/notify_tests_repo.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/auto-rebake.yml +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/bake-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/ci.yml +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/deploy-deepinfer.yml +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/deploy-modal-dev.yml +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/deploy-modal.yml +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/dev-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/main-source-guard.yml +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/notify-tests-repo.yml +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/production-kernel-cache-ready.yml +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/publish-dev.yml +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/publish-image.yml +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/publish-serving-image.yml +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/publish.yml +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/version-parity.yml +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.github/workflows/worker-image.yml +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/.gitignore +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/Dockerfile +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/Dockerfile.serve +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/Dockerfile.worker +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/LICENSE +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/NOTICE +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/build/kernel_cache/.gitignore +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/build/kernel_cache/.keep +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/deploy/infisical/entrypoint.sh +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/docker/Dockerfile.kernelcache +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/docker/Dockerfile.kernelcache.relayer +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/docker/bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/docker/bake_sandbox_entry.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/docker/extract_cudart_fix.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/docker/kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/docker/patch_vllm_moe_lora.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/_internal/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/_internal/background.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/_internal/channel.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/_internal/diagnostics.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/_internal/fileio.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/_internal/http.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/_internal/http_deadline.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/_internal/logging.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/_internal/openai_sse.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/_internal/paths.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/_internal/version.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/adapters/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/adapters/artifacts.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/adapters/config.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/adapters/fused_experts.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/adapters/lora_rank.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/adapters/targets.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/artifacts/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/artifacts/api.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/artifacts/config.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/artifacts/errors.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/artifacts/manifest.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/artifacts/storage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/__main__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/ops/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/ops/imports.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/ops/list.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/ops/push.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/ops/retained.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/ops/setup.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/ops/setup_wandb.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/testing/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/testing/episode.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/testing/eval.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/testing/eval_args.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/testing/evaluations.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/testing/params.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/testing/test.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/env/testing/warnings.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/ops/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/ops/account.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/ops/deploy.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/ops/log_follow.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/ops/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/ops/runs.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/ops/traces.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/ops/train.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/ops/worker_output.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/serving/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/serving/deploy.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/serving/identity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/serving/status.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/commands/serving/undeploy.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/parsing/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/parsing/account.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/parsing/custom.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/parsing/env.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/parsing/errors.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/parsing/main.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/parsing/models.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/parsing/serve_parser.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/parsing/traces.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/parsing/training.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/scaffold/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/ui/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/ui/cost.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/ui/env_panels.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/ui/heartbeat.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/ui/render.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cli/ui/tty.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/client/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/client/config.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/client/freesolo_api.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/client/http.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/client/runtime_secrets.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/client/shapes.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/client/specs.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/client/streaming.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/content/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/content/image_descriptors.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/content/multimodal.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/content/processor.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/content/reasoning_normalization.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/content/stop_tokens.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/content/structured_options.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/content/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/content/thinking.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/content/training_template.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/core/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/core/catalog.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/core/grpo.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/core/spec_persistence.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cost/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cost/currency.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cost/facts.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cost/spec.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/cost/types.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/async_client.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/backend.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/billing.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/checkpoints.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/client.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/controller.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/managed.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/server.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/session.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/starter.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/types.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/validation.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/custom/worker.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/plan/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/plan/kv_sizing.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/plan/model_config_probe.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/plan/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/plan/recipe.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/plan/steps.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/plan/vram.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/profiling/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/profiling/dataset_profile.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/profiling/image_tokens.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/profiling/reasoning_render.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/profiling/sft_image_rows.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/profiling/sft_rows.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/profiling/sft_tools.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/profiling/sft_workload.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/profiling/tokenizer.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/profiling/workload_profile.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/result/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/result/accounting.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/result/rollout_samples.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/support/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/support/checkpoint_transport.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/support/huggingface.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/support/model_snapshot.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/support/verl_checkpoint.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/support/worker_entrypoint.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/__main__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/entry/rl.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/entry/worker.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/io/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/io/artifacts.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/io/cpu_handoff.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/io/heartbeat.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/io/prefetch.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/io/transfer.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/io/wandb_log.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/model/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/model/adapter.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/model/chatml_mask.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/model/decoding.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/model/lora.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/model/packing.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/perf/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/perf/diagnostics.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/perf/lifecycle.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/perf/memory.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/perf/model_size.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/runtime/phases.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/runtime/rng.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/runtime/state.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/agents.yaml +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/batch.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/compact_checkpoint.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/configuration.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/engine.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/flashinfer_cache.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/glue.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/launch.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/model.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/observations.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/options.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/prompt_media.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/queue.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/readiness.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/reference.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/registration.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/replay.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/replay_guard.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/rollout.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/rollout_contract.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/startup.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/tool_messages.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/tracking.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/upstream.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/vllm_worker.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/child/worker.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/lifecycle/finalize.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/lifecycle/ledger.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/lifecycle/persistence.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/lifecycle/step_timing.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/lifecycle/timing.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/rollout/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/rollout/contract.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/rollout/episode.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/rollout/generation.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/rollout/identity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/core/rollout/lifecycle.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/entry/backend_common.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/entry/prompt_rows.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/entry/rl_train.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/entry/rl_train_runner.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/entry/score_batcher.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/child/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/child/contract.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/child/credit.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/child/entry.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/child/identity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/child/metrics.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/child/reward.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/child/rollout.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/child/trainer.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/child/transport.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/launch/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/launch/checkpoints.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/launch/config.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/launch/verl_config.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/rollout/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/rollout/identity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/rollout/multi_turn.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/rollout/scoring.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/rl/rollout/single_turn.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/sft/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/sft/child/dataset.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/sft/child/entry.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/sft/child/loop.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/sft/child/schedule.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/sft/setup/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/sft/setup/config.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/verl/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/verl/adapter_merger.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/verl/capabilities.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/verl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/verl/child_io.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/verl/diagnostics.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/verl/parallelism.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/verl/parent_work.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/loading/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/loading/adapter.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/loading/base.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/loading/loader.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/loading/pull.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/loading/staged.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/meta/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/meta/cache_security.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/meta/cache_storage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/meta/dataset_selection.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/meta/evaluations.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/meta/identity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/meta/namespace_listing.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/package/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/package/direct_tokens.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/package/limits.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/package/unpack.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/registry/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/registry/azure.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/registry/packages.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/scoring/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/scoring/context.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/envs/scoring/response.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/bootstrapping/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/bootstrapping/attempt.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/bootstrapping/bootstrap.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/bootstrapping/console.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/bootstrapping/pip.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/bootstrapping/processes.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/bootstrapping/secrets.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/instances/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/instances/instance.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/instances/poll.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/instances/poll_instance.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/instances/terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/net/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/net/auth.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/net/deadline.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/net/http.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/_lifecycle/net/worker.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/artifacts/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/artifacts/channel.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/artifacts/weight_cache.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/core/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/core/fit_errors.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/core/sharding.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/modal/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/modal/api.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/modal/checkpoint_upload.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/modal/handles.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/modal/jobs.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/modal/prefetch.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/modal/pricing.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/modal/provider.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/providers/modal/startup.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/py.typed +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/accounting/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/accounting/artifacts.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/accounting/weight_cache.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/lifecycle/attempts.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/lifecycle/claim_lock.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/lifecycle/deadlines.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/lifecycle/preparation.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/lifecycle/reporting.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/lifecycle/runtime_credentials.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/results/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/results/checkpoints.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/results/deployments.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/supervise/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/supervise/deploy.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/supervise/errors.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/supervise/lifecycle.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runner/supervise/transitions.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runtime_capsule/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runtime_capsule/build.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runtime_capsule/manifest.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/runtime_capsule/profiles.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/schema/custom.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/schema/fields.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/app/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/app/__main__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/app/bootstrap.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/app/chat_stream.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/app/http.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/app/hydration_credentials.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/app/launch.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/app/manifest.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/app/materialize.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/app/openai.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/app/progress.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/contract/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/contract/errors.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/contract/protocol.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/contract/provenance.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/contract/responses.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/contract/urls.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/control/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/control/_canonical.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/control/_serialization.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/control/_urls.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/control/credentials.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/control/planning.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/control/types.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/deployment/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/deployment/adapter_check.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/deployment/deploy.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/deployment/download.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/deployment/export.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/deployment/preflight.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/deployment/profiles.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/deployment/readiness.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/deployment/resolve.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/common/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/common/records.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/execution/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/execution/deployment.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/execution/lifecycle.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/execution/operations.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/execution/sdk.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/planning/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/planning/plan.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/planning/resources.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/planning/wrapper.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/readiness_checks/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/readiness_checks/probe.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/readiness_checks/readiness.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/provisioning/modal/readiness_checks/teardown.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/request/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/request/openai.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/request/runtime_support.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/request/schema_types.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/request/streaming.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/request/text_scan.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/request/thinking.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/request/tool_calls.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/request/tool_template.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/request/transport.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/request/validation.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/adapters.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/cache_admission.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/cache_retention.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/cache_scheduler.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/engine.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/errors.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/hub.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/multimodal.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/prompt.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/prompt_cache.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/reasoning_tools.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/sampling.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/token_batch.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/token_prefix_cache.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/tool_calls.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serve/runtime/types.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/__main__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/asgi/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/asgi/app.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/asgi/cli.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/billing/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/billing/charges.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/billing/retry.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/ops/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/ops/repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/ops/serving_resources.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/registry/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/registry/blob_envs.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/registry/checkpoints.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/registry/env_files.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/registry/environment_registry.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/registry/envs.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/registry/projects.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/domain/registry/runs.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/platform/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/platform/auth.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/platform/db.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/platform/deployment_jobs.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/platform/deployment_state.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/platform/deps.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/platform/internal_client.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/platform/locks.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/platform/plane_lease.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/platform/submission_admission.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/adapter_download.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/custom.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/env_files.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/envs.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/meta.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/runs.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/serving.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/serving_chat.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/serving_completion.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/serving_errors.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/serving_revisions.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/serving_smoke.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/server/routes/submissions.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/app/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/app/timeouts.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/app/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/app/autoscaling.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/app/client.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/app/events.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/app/http.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/app/modal_app.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/app/render.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/app/retries.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/app/rollout.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/contract/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/contract/config.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/contract/errors.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/contract/protocol.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/contract/tokenizer.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/native/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/native/engram_transport.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/native/image.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/native/patches.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/native/transport.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/runtime/bridge.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/runtime/kernel_cache.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/runtime/prefill_scheduler.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/runtime/prefix_cache.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/runtime/provenance.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/runtime/routing.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/runtime/snapshots.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/runtime/tiered_cache.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/runtime/warmup.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/deepinfer/runtime/worker.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/promotion/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/promotion/accounting_smoke_test.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/promotion/canary.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/promotion/evidence.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/promotion/gate.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/accounting/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/accounting/usage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/accounting/usage_facts.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/accounting/usage_outbox.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/accounting/usage_retry.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/errors.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/generation.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/hub.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/lora_engine.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/lora_entries.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/model_config.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/prequant_config.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/reasoning_usage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/support.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/text_tokenizer.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/engine/warmup.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/adapter_routes.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/authorization_transport.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/body_limit.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/context.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/headers.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/inference_routes.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/key_rate_limit.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/rate_limit.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/router.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/routing.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/http/stream_response.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/io/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/io/cache_namespace.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/io/multimodal.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/io/openai_request.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/io/openai_stream.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/io/provenance.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/io/requests.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/io/responses.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/io/schemas.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/io/streaming.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/io/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/store/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/store/access.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/store/lookup.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/store/persisted_columns.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/store/persistence.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/store/registration.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/store/registry.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/store/settings.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/store/supabase_rest.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/store/undeploy.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/stream_channel/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/stream_channel/_tasks.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/stream_channel/client.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/stream_channel/engine.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/serving/src/stream_channel/protocol.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/snapshot/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/snapshot/archive.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/benchmark_qwen_serving.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/benchmark_router_resources.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/build_dev_dist.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/check_dev_release.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/check_file_size.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/check_function_size.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/check_rollout_identity_actor.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/check_source_layout.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/check_verl_pin_exists.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/fixtures/custom_algorithm.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/fixtures/modal_environment/dataset/train.jsonl +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/fixtures/modal_environment/environment.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/fixtures/modal_environment/evaluations.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/qualify_serving_profile.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/qualify_serving_rollout.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/quantize_qwen35_base.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/smoke_custom_training.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/scripts/smoke_modal_training.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/serve_launch.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/billing_precheck.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/chat_provenance.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/chat_transport.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/deployments.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/managed_chat.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/modal.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/profile.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/runner.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/server_api_plugin.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/source_snapshot.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/specs.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/_helpers/wire_headers.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/capture_image_sft_processor_oracle.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/capture_qwen38_27b_metadata.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/conftest.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/fixtures/image_sft_processor_oracle.json +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/fixtures/qwen35_9b_target_metadata.json +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/fixtures/qwen38_27b_target_metadata.json +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/fixtures/qwen3_5_9b_chat_template.jinja +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/fixtures/vllm_023_moe_lora/lora_context.py.gz +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/fixtures/vllm_023_moe_lora/modular_kernel.py.gz +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/fixtures/vllm_023_moe_lora/triton_moe.py.gz +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/live/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/live/conftest.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/live/test_sft_thinking_render_live.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/checkpoint_fixtures.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/conftest.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_adapter_hub.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_artifact_protections.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_authorization_rollout.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_authorization_transport.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_base_model_serving.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_chat_auth.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_chat_authorizer.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_checkpoint_fingerprint_validation.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_checkpoint_identity_repairs.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_checkpoint_model_validation.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_checkpoint_revocation.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_autoscaling.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_deadline.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_hosted.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_http_deadline.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_latency.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_optimizations.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_parallel.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_prefill_scheduler.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_provenance.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_retention.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_retries.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_rollout.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_routing.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_deepinfer_tiering.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_engine_error_status.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_engine_shutdown.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_fp8_config.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_immutable_engine.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_immutable_revisions.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_immutable_schemas.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_inference_duration.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_internal_header_integrity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_key_rate_limit.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_key_rate_limit_review.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_kv_namespace.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_latency_admission.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_mirror_sampling_parity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_modal_deploy_identity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_modal_image_paths.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_multimodal.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_openai_stream_options.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_persistence.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_pre_first_disconnect.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_prequant_config.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_promotion_accounting_smoke.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_promotion_canary.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_promotion_evidence.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_promotion_gate.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_promotion_release_handoff.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_qwen_warmup.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_rate_limit.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_reasoning_usage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_registration_endpoint.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_registry.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_registry_coverage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_request_body_limit.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_router.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_router_coverage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_router_edge_coverage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_schemas_coverage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_serve_reasoning_split.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_serve_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_serve_thinking.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_settings.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_stream_channel.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_stream_response_disconnect.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_stream_wait_cleanup.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_structured_outputs_coverage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_supabase_rest_coverage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_token_prefix_cache.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_usage_delivery_concurrency.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_usage_integrity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving/test_usage_outbox.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving_conformance/__init__.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving_conformance/conftest.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/serving_conformance/test_contract.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_accounting_coverage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_adapter_download.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_adapter_shard_completeness.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_agent_flash_cli_contract.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_algorithms.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_allocator.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_authenticated_redirects.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_azure_artifacts.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_azure_environment_registry.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_backend_common.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_backend_jobspec_contract.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_background_supervisor.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_bake_sandbox_entry.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_base_environment_integrity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_base_model_provenance.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_billing_response_integrity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_billing_retry.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_bootstrap_process_groups.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_bootstrap_reentry.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_bootstrap_worker_cleanup.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_build_context_contract.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cache_admission.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cache_retention.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cache_scheduler.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_capture_qwen38_metadata.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_catalog_consistency.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_catalog_only_models.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_charge_pricing.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_chat_foundations.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_chat_stop_tokens.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_chat_worker_isolation.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_checkpoint_cancellation.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_checkpoint_deployment_inventory_api.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_checkpoint_deployments.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_checkpoint_lifecycle.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_checkpoint_listing_integrity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_checkpoint_storage_overlap.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_checkpoint_transport.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_checkpoints.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_ci_sharding.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_commands.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_commands_coverage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_credential_shadowing.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_errors.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_estimate.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_gpus_flag.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_help.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_main_coverage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_managed.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_render_coverage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_render_theme.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_serve_deploy.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_serve_status.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_serve_undeploy.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_traces.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cli_wandb_warning.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_client.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_client_deadline_integrity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_client_import_purity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_client_server_integration.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_client_stream_reads.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_compact_checkpoint.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_config_env_vars.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_config_overrides.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_console_upload.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_controlled_experiment_repairs.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cost_analytical.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cost_currency.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cost_equation.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cost_estimate.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cost_hardware.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cost_models.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cpu_checkpoint_handoff.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_cpu_checkpoint_upload_retry.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_custom_checkpoints.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_custom_client.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_custom_controller_connect.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_custom_cuda_headroom.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_custom_gpu_selection.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_custom_gradients.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_custom_managed.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_custom_session.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_custom_worker.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_customer_serving_contract.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_dataset_profile.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_deploy_latency.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_deployment_cleanup_resilience.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_deployment_generation_completion.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_deployment_registration_cleanup.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_dev_channel.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_dev_publish_decision.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_disk_gb.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_cache_evict.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_delete.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_download.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_download_api.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_evaluations.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_glue_tool_replies.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_list_api.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_list_cli.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_list_registry.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_no_install.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_publish.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_pull.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_pull_coverage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_pull_loader_coverage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_pull_managed_control_plane.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_push.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_rate_limit_resolve.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_ref_pinning.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_env_test.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_environment_cache_integrity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_environment_publish_integrity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_export.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_flash_mvp.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_flash_worker.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_flashinfer_aot_cache.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_flashinfer_cache_dirs.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_freesolo_api_transport.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_fused_expert_warmstart.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_generation_eos.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_github_urlopen_retry.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_gpu_type_single_field.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_grpo_checkpoint_durability.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_grpo_metric_stream.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_grpo_params.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_grpo_resident_sizing.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_grpo_reward_batching.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_grpo_reward_context.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_grpo_rollout_contract.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_grpo_rollout_identity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_health_liveness.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_heartbeat_startup_cleanup.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_hf_retry.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_hosted_adapter_admission.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_idempotent_submissions.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_image_environment_capability.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_image_incremental_processor.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_image_sft_markers.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_image_sft_processor_parity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_image_tokens.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_infisical_secrets.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_instance_bootstrap_coverage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_internal_client.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_kernel_bake_build_contracts.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_kernel_cache_promotion.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_kv_util.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_local_credential_integrity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_logging.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_login_perms.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_lora_rank_coverage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_lora_rank_nested_rung.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_lora_rank_preflight.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_lora_targeting.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_lora_targeting_pinned_verl.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_managed_hf_repo.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_metrics_schema_agent_contract.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_mig_guard.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_mirror_sampling_parity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_modal_api_loop.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_modal_prefetch_snapshot.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_modal_startup.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_modal_training_lifecycle.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_modal_weight_warm.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_multi_gpu_gate.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_multimodal_boundary_integrity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_multimodal_training.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_named_reward_metrics.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_notify_tests_repo.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_offline_http.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_oom_escalate_gpu.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_orchestrator_flash.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_packing.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_packing_coverage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_plane_lease.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_poll_helpers.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_preflight.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_processor_chat_template.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_projects.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_prompt_budget.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_qwen9b_base.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_removed_algorithms.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_removed_training_settings.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_replay_guard.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_resolve_params_b.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_reward_server_cleanup.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_rl_native_tool_calls.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_rl_tool_validation.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_rl_train.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_rollout_engine_prompt.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_rollout_samples.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_run_log_integrity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_run_registry_lifecycle.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_runtime_capsule.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_runtime_credentials.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_runtime_secret_integrity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_schema_boundary_integrity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_app_bootstrap_http.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_app_launch.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_app_manifest.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_app_materialize.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_app_packaging.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_app_progress.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_cache_resource_cleanup.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_chat_transport.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_control.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_modal_contract_lock.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_modal_sdk.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_modal_sdk_deadlines.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_modal_teardown_identity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_profile_qualification.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_profiles.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_provisioning_common.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_provisioning_modal.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_reasoning_content.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_resolve_provenance.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_runtime_adapters.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_runtime_engine.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_runtime_hub.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_runtime_package.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serve_runtime_types.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_server_api.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_server_app_coverage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_server_auth_singleflight.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_server_billing.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_server_checkpoints_coverage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_server_db.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_server_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_server_locks_coverage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_server_managed_chat_requests.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_server_serving_resources.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_server_standalone.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serving_conformance_gate.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serving_context_preflight.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serving_contract.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serving_input_integrity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serving_schema_coverage.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_serving_unavailable_errors.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_batch_prefetch.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_cancel_profile_pricing.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_chunked_nll.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_cost_reduction.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_dataset_lazy_images.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_dataset_nulls.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_example_selection.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_gc_off.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_max_context.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_memory_policy.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_step_floor.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_tools.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_train.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_warmup_schedule.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_sft_workload.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_smoke_content_integrity.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_source_attestation_flow.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_source_layout.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_source_snapshot.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_spec_and_validation.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_spec_contract_bytes.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_staged_environment.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_status_reporting.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_status_updates.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_step_floor.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_step_metrics.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_step_timing.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_structured_option_safety.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_structured_runtime_options.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_submission_outcome.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_thinking_config.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_thinking_tool_calls.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_tool_call_exact_parsing.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_tool_scalar_unions.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_train_context_preflight.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_training_controls.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_training_phases.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_transfer_queue_init.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_type_comment_prose.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_upstream_rollout_contract.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_upstream_runtime_policy.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_upstream_verl_contract.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_verifiers.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_verl_checkpoint_export.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_verl_child_plugins.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_verl_silence_watchdog.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_version.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_versioned_rollout_contract.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_vl_warmstart_adapter_keys.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_vllm_moe_lora_backport.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_vram_architecture.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_wandb_link.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_wandb_naming.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_warmstart_adapter_download.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_warmstart_cross_repo.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_warmstart_error_attribution.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_warmstart_image_adapters.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_watchdog_startup_cleanup.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_weight_cache.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_worker_dryrun.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_worker_hardexit.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_worker_image.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_worker_init_heartbeat.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_worker_stack.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_worker_thinking.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_workflow_contracts.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_workload_profile.py +0 -0
- {freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/tests/test_zero2_sharding_gate.py +0 -0
|
@@ -114,3 +114,13 @@ GITHUB_TOKEN=
|
|
|
114
114
|
# The worker container image is not configurable: every provider runs the published
|
|
115
115
|
# ghcr.io/freesolo-co/flash-worker tags (per-GPU-arch kernel-cache variants, falling back to the
|
|
116
116
|
# base :cu128), selected by GPU class in flash/providers/_lifecycle/net/worker.py.
|
|
117
|
+
|
|
118
|
+
# Optional Nebius-only Spot training. Install/authenticate the Nebius CLI on the control plane.
|
|
119
|
+
# Public config: [gpu] spot = true. Spot is never an implicit Modal fallback.
|
|
120
|
+
# Use a USD-billed project. Region must match the project/subnet and host image.
|
|
121
|
+
# Host image must include Docker, NVIDIA driver/container toolkit, and outbound internet.
|
|
122
|
+
# Worker images are the same curated per-GPU images used by Modal.
|
|
123
|
+
FLASH_NEBIUS_PROJECT_ID=
|
|
124
|
+
FLASH_NEBIUS_REGION=
|
|
125
|
+
FLASH_NEBIUS_SUBNET_ID=
|
|
126
|
+
FLASH_NEBIUS_IMAGE_ID=
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: freesolo-flash-dev
|
|
3
|
-
Version: 1.4.
|
|
3
|
+
Version: 1.4.22
|
|
4
4
|
Summary: Flash — managed LoRA post-training (SFT/GRPO) for Freesolo environments, driven by the `flash` CLI
|
|
5
5
|
Project-URL: Homepage, https://github.com/freesolo-co/flash
|
|
6
6
|
Project-URL: Repository, https://github.com/freesolo-co/flash
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Nebius Spot training
|
|
2
|
+
|
|
3
|
+
Set `[gpu] spot = true` to opt into Nebius preemptible VMs. Modal remains
|
|
4
|
+
the default; Spot never falls back to Modal or Nebius on-demand instances. Only
|
|
5
|
+
H100, H200 and B200 are offered. RTX Pro 6000 and L40S are excluded.
|
|
6
|
+
|
|
7
|
+
| GPU | Start below / fixed estimate | Keep running through |
|
|
8
|
+
| --- | ---: | ---: |
|
|
9
|
+
| H100 | $1.00 | $1.50 |
|
|
10
|
+
| H200 | $1.00 | $2.00 |
|
|
11
|
+
| B200 | $4.00 | $5.00 |
|
|
12
|
+
|
|
13
|
+
The table lives in `flash/providers/nebius/pricing.py`. Live regional prices
|
|
14
|
+
admit fitting rentals in H100, H200, B200 priority order, even when H200 is cheaper.
|
|
15
|
+
The entry thresholds price Flash's estimates; running prices can be higher. Estimates exclude disk, network and taxes and are not Nebius invoices.
|
|
16
|
+
Nebius presets are 1 or 8 GPUs. All rented cards contribute to the price.
|
|
17
|
+
|
|
18
|
+
Customer charges use the accepted Spot-priced quote: $1 per GPU-hour for H100/H200
|
|
19
|
+
or $4 for B200 in the work estimate. Completion charges that quote; early completion
|
|
20
|
+
or cancellation charges its completed-work fraction, capped at the accepted quote.
|
|
21
|
+
Recovery preserves Spot pricing even when a saved resource record lacks its provider.
|
|
22
|
+
These are fixed Flash Spot rates, not a pass-through of fluctuating Nebius invoices.
|
|
23
|
+
|
|
24
|
+
Flash reads Nebius's public spot-price API and queues jobs if prices are over the
|
|
25
|
+
cap, absent, stale, or unavailable. It checks again every 60 seconds, without
|
|
26
|
+
consuming training retries or creating a VM. Queueing respects cancellation and
|
|
27
|
+
the run's wall-clock deadline. Admission is rechecked before launch, and every VM
|
|
28
|
+
also carries a Nebius maximum-price policy so a later price rise cannot silently
|
|
29
|
+
switch to uncapped pricing. On preemption, Flash provisions another eligible Spot
|
|
30
|
+
VM and resumes the latest durable trainer checkpoint using its existing retry
|
|
31
|
+
budget. Spot uses a greedy scheduler based on the latest completed step duration and checkpoints before another similar
|
|
32
|
+
step would exceed **10 minutes** of unsaved training (for example, every 2 five-minute
|
|
33
|
+
steps or 10 one-minute steps). It also saves the first and final completed step.
|
|
34
|
+
Steps lasting 10 minutes or longer checkpoint after every step. This is a recovery target: indivisible steps and asynchronous uploads can exceed it.
|
|
35
|
+
Do not set `train.save_every` for Spot. Optional `train.save_at_steps` exports
|
|
36
|
+
cannot suppress automatic recovery saves.
|
|
37
|
+
Work since the latest fully uploaded checkpoint may be repeated, including any
|
|
38
|
+
checkpoint whose upload was still in progress. Portal is not used.
|
|
39
|
+
|
|
40
|
+
On the control-plane host:
|
|
41
|
+
|
|
42
|
+
1. Install and authenticate the current Nebius CLI with access to the intended
|
|
43
|
+
USD-billed project, compute resources and billing pricing policies.
|
|
44
|
+
2. Set `FLASH_NEBIUS_PROJECT_ID`, `FLASH_NEBIUS_REGION`,
|
|
45
|
+
`FLASH_NEBIUS_SUBNET_ID`, and `FLASH_NEBIUS_IMAGE_ID`. The region must match
|
|
46
|
+
the project and subnet. The configured GPU host image must have Docker,
|
|
47
|
+
a suitable NVIDIA driver and NVIDIA container toolkit installed, plus outbound
|
|
48
|
+
access to the worker container registry and Azure Blob Storage. B200 requires the
|
|
49
|
+
driver/CUDA support of Flash's configured Blackwell worker image.
|
|
50
|
+
3. Retain the existing worker image, artifact and runtime-secret configuration.
|
|
51
|
+
The VM launches the same Flash worker capsule and training container as Modal.
|
|
52
|
+
4. Start the control plane and submit with `spot = true`. `flash gpus`
|
|
53
|
+
lists the fixed Spot estimates alongside Modal rates. Set `spot = false` for regular
|
|
54
|
+
Modal training. Legacy `provider = "spot"` is also accepted.
|
|
55
|
+
|
|
56
|
+
Supported platform IDs are `gpu-h100-sxm`, `gpu-h200-sxm`, and `gpu-b200-sxm`;
|
|
57
|
+
only platforms offered in the configured region can be admitted. Managed boot
|
|
58
|
+
disks use fast ephemeral Network SSD Non-replicated storage, rounded to 93-GiB
|
|
59
|
+
allocation units with a 279-GiB minimum for the image, model and checkpoints.
|
|
60
|
+
They are deleted with the VM; fully uploaded Azure Blob Storage checkpoints are the
|
|
61
|
+
durable recovery source. Runtime secrets are in root-only cloud-init files;
|
|
62
|
+
restrict access to VM metadata and the image accordingly. Use a dedicated project
|
|
63
|
+
for Flash training resources. The worker has a deadline shutdown, and normal
|
|
64
|
+
cancellation, completion and orphan reconciliation delete the VM and its disk.
|
|
65
|
+
|
|
66
|
+
References: [Nebius spot prices](https://docs.nebius.com/signup-billing/spot-prices),
|
|
67
|
+
[maximum-price policies](https://docs.nebius.com/signup-billing/manage-pricing-policy),
|
|
68
|
+
and [preemptible VM lifecycle](https://docs.nebius.com/compute/virtual-machines/preemptible).
|
|
69
|
+
|
|
70
|
+
To qualify a configured Nebius account, create a disposable private Azure artifact repository, configure Azure artifact storage locally, and run:
|
|
71
|
+
|
|
72
|
+
```sh
|
|
73
|
+
python scripts/smoke_nebius_sft.py --run-paid-test --repo owner/private-test-dataset
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
This rents one H100 at a time, interrupts a two-step SFT job after checkpoint 1
|
|
77
|
+
is fully uploaded, then verifies that a replacement VM resumes and finishes step 2. Each attempt is limited to 45 minutes to allow cold image downloads and full-state checkpoint transfers.
|
|
78
|
+
The harness deletes its VMs and managed disks; test artifacts remain in the private
|
|
79
|
+
repository. GPU quota and active billing are required. Price thresholds, GPU
|
|
80
|
+
priority, cancellation and adaptive checkpoint timing are covered by offline tests.
|
|
@@ -20,6 +20,7 @@ def cmd_gpus(args) -> int:
|
|
|
20
20
|
"""List validated managed GPU classes, VRAM, and estimated $/hr."""
|
|
21
21
|
from flash.providers.core.base import GPU_INFO
|
|
22
22
|
from flash.providers.modal.pricing import static_rates as modal_static_rates
|
|
23
|
+
from flash.providers.nebius.pricing import SPOT_GPUS
|
|
23
24
|
|
|
24
25
|
modal_rates = modal_static_rates()
|
|
25
26
|
infos = sorted(
|
|
@@ -28,10 +29,16 @@ def cmd_gpus(args) -> int:
|
|
|
28
29
|
tip = (
|
|
29
30
|
"Tip: GPU allocation is automatic by default.\n"
|
|
30
31
|
"The allocator picks the cheapest validated class that fits. Pin a specific class by "
|
|
31
|
-
'adding type = "<CLASS>" to the [gpu] section
|
|
32
|
+
'adding type = "<CLASS>" to the [gpu] section.\n'
|
|
33
|
+
"Set spot = true for Nebius only. Spot rates are entry estimates; jobs start strictly below them.\n"
|
|
34
|
+
"Spot priority: H100, H200, B200. Keep-running caps: $1.50, $2.00, $5.00 per GPU-hour."
|
|
32
35
|
)
|
|
33
36
|
if render.styled():
|
|
34
37
|
rows = [(info.name, info.vram_gb, modal_rates.get(info.name)) for info in infos]
|
|
38
|
+
rows += [
|
|
39
|
+
(name + " (Spot)", GPU_INFO[name].vram_gb, float(shape.hourly_usd))
|
|
40
|
+
for name, shape in SPOT_GPUS.items()
|
|
41
|
+
]
|
|
35
42
|
print(tables.gpus_table(rows, tip))
|
|
36
43
|
return 0
|
|
37
44
|
|
|
@@ -42,5 +49,7 @@ def cmd_gpus(args) -> int:
|
|
|
42
49
|
for info in infos:
|
|
43
50
|
modal_rate = modal_rates.get(info.name)
|
|
44
51
|
print(f"{info.name:<16}{info.vram_gb:>5}G{fmt_rate(modal_rate):>11}")
|
|
52
|
+
for name, shape in SPOT_GPUS.items():
|
|
53
|
+
print(f"{name + ' (Spot)':<16}{GPU_INFO[name].vram_gb:>5}G{float(shape.hourly_usd):>11.3f}")
|
|
45
54
|
print(f"\n{tip}")
|
|
46
55
|
return 0
|
|
@@ -407,6 +407,17 @@ There is no "all" sentinel, so this number is duplicated from the data into the
|
|
|
407
407
|
**can drift**: if the dataset later grows, a stale `max_examples` silently trains on a
|
|
408
408
|
subset instead of erroring. Re-check it whenever the dataset or the params change.
|
|
409
409
|
|
|
410
|
+
Select Spot directly in your editable training TOML:
|
|
411
|
+
|
|
412
|
+
```toml
|
|
413
|
+
[gpu]
|
|
414
|
+
spot = false # set true for Nebius Spot; false uses regular training
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
Spot only uses Nebius and prefers fitting H100s, then H200s, then B200s.
|
|
418
|
+
It queues until the price is below $1, $1, or $4 per GPU-hour respectively.
|
|
419
|
+
Once running, the corresponding maximum prices are $1.50, $2, and $5.
|
|
420
|
+
|
|
410
421
|
GPU allocation and Azure artifacts are **managed by default**: leave `[gpu] type` unset to
|
|
411
422
|
let the allocator pick the cheapest fitting validated class, while `train.hf_repo` remains
|
|
412
423
|
platform-managed. `[gpu] providers` takes an ordered list of provider names and prefers them in
|
|
@@ -941,7 +952,7 @@ an epoch is one pass over the retained prompt pool after `max_examples` and prom
|
|
|
941
952
|
optimizer-step counts are derived from those epochs. A positive `[train] max_steps` replaces that
|
|
942
953
|
derived count with an exact update horizon for every algorithm. `[train] save_at_steps`
|
|
943
954
|
requires a positive `max_steps` so its horizon is authoritative even when SFT packing changes the
|
|
944
|
-
realized batch shape.
|
|
955
|
+
realized batch shape. For Modal, non-empty exact save steps suppress periodic `save_every` checkpoints, and the
|
|
945
956
|
run fails if a requested exact save cannot be saved and published.
|
|
946
957
|
|
|
947
958
|
---
|
|
@@ -1644,3 +1655,15 @@ See the full reference at https://docs.freesolo.co.
|
|
|
1644
1655
|
LoRA+ and entropy-quantile filtering have been removed, including their stored configuration
|
|
1645
1656
|
fields and resume support. Configs and stored job payloads containing either removed field are
|
|
1646
1657
|
rejected as unknown settings; no legacy optimizer or loss shim is installed.
|
|
1658
|
+
|
|
1659
|
+
### Spot recovery checkpoints
|
|
1660
|
+
|
|
1661
|
+
With `[gpu] spot = true`, Flash uses Nebius and manages recovery checkpoints automatically.
|
|
1662
|
+
A greedy scheduler uses the latest step duration, targeting at most 10 minutes of
|
|
1663
|
+
unsaved training: 5-minute steps save every 2 steps; 1-minute steps every 10.
|
|
1664
|
+
The first and final completed steps also save. Steps lasting 10 minutes or longer save after every step. Slow steps or uploads can exceed
|
|
1665
|
+
the recovery target. Omit `train.save_every`. Set `spot = false` for regular training.
|
|
1666
|
+
An optional `train.save_at_steps` schedule adds model exports to those automatic
|
|
1667
|
+
saves; it cannot disable them. After preemption, the replacement Nebius Spot VM
|
|
1668
|
+
resumes the latest fully uploaded trainer checkpoint. An interrupted upload is
|
|
1669
|
+
not a valid resume point.
|
|
@@ -60,7 +60,11 @@ def gpus_table(rows: list[tuple[str, int, float | None]], tip: str) -> str:
|
|
|
60
60
|
"""GPU classes: (name, vram_gb, $/hr or None)."""
|
|
61
61
|
body = []
|
|
62
62
|
for name, vram, rate in rows:
|
|
63
|
-
rate_cell = (
|
|
63
|
+
rate_cell = (
|
|
64
|
+
((f"${rate:.3f}" if "(Spot)" in name else f"${rate:.2f}"), _TEAL)
|
|
65
|
+
if rate
|
|
66
|
+
else ("-", _FAINT)
|
|
67
|
+
)
|
|
64
68
|
body.append([(name, _ACCENT2), (f"{vram} GB", _GRAY), rate_cell])
|
|
65
69
|
table = _format_table(["GPU", "VRAM", "$/HR"], body, aligns=["l", "r", "r"])
|
|
66
70
|
return _stdout_encodable_text(
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""Automatic Spot recovery policy shared by all training backends."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import replace
|
|
4
|
+
|
|
5
|
+
SPOT_CHECKPOINT_SECONDS = 600
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def spot_checkpoint_train(train):
|
|
9
|
+
"""Keep requested model exports separate from the runtime recovery clock.
|
|
10
|
+
|
|
11
|
+
Ten was the legacy automatic interval. Accept it on old persisted specs but
|
|
12
|
+
normalize it away; newly authored Spot jobs should omit save_every entirely.
|
|
13
|
+
"""
|
|
14
|
+
if train.save_every not in (None, 10):
|
|
15
|
+
raise ValueError("Spot checkpointing is time-based and automatic; remove train.save_every")
|
|
16
|
+
return replace(train, save_every=None)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def is_spot_spec(spec) -> bool:
|
|
20
|
+
return bool(getattr(getattr(spec, "gpu", None), "spot", False))
|
|
@@ -424,6 +424,7 @@ class GpuSpec:
|
|
|
424
424
|
# PLATFORM-MANAGED: runner assigns weight-cache volume; None = cold download.
|
|
425
425
|
network_volume: str | None = None
|
|
426
426
|
network_volume_gb: int = 100
|
|
427
|
+
spot: bool = False
|
|
427
428
|
provider: str = ""
|
|
428
429
|
providers: tuple[str, ...] = ()
|
|
429
430
|
# number of cards of `type` a single training worker occupies (1..8). count > 1 provisions a
|
|
@@ -441,6 +442,17 @@ class GpuSpec:
|
|
|
441
442
|
)
|
|
442
443
|
if self.provider and providers:
|
|
443
444
|
raise ValueError("gpu.provider and gpu.providers cannot both be set")
|
|
445
|
+
if type(self.spot) is not bool:
|
|
446
|
+
raise TypeError("gpu.spot must be a boolean")
|
|
447
|
+
if self.spot:
|
|
448
|
+
if self.provider not in ("", "spot") or providers not in ((), ("spot",)):
|
|
449
|
+
raise ValueError(
|
|
450
|
+
"gpu.spot=true requires Nebius Spot; remove other provider choices"
|
|
451
|
+
)
|
|
452
|
+
if not providers:
|
|
453
|
+
object.__setattr__(self, "provider", "spot")
|
|
454
|
+
if self.provider == "spot" or providers == ("spot",):
|
|
455
|
+
object.__setattr__(self, "spot", True)
|
|
444
456
|
if not isinstance(self.type, str):
|
|
445
457
|
raise TypeError("gpu.type must be a string")
|
|
446
458
|
gpu_type = (
|
|
@@ -564,6 +576,10 @@ class JobSpec:
|
|
|
564
576
|
custom: dict[str, Any] = field(default_factory=dict)
|
|
565
577
|
|
|
566
578
|
def __post_init__(self) -> None:
|
|
579
|
+
if self.gpu.provider.strip().lower() == "spot" or self.gpu.providers == ("spot",):
|
|
580
|
+
from flash.core.checkpoint_policy import spot_checkpoint_train
|
|
581
|
+
|
|
582
|
+
object.__setattr__(self, "train", spot_checkpoint_train(self.train))
|
|
567
583
|
object.__setattr__(self, "seed", parse_seed(self.seed))
|
|
568
584
|
object.__setattr__(self, "model_revision", _model_revision(self.model_revision))
|
|
569
585
|
for field_name in ("model_revision_auto", "model_revision_force_pin"):
|
|
@@ -687,6 +703,9 @@ class JobSpec:
|
|
|
687
703
|
differently, so removing either pop would break existing digests.
|
|
688
704
|
"""
|
|
689
705
|
data = asdict(self)
|
|
706
|
+
# Keep pre-Spot preparation digests stable while binding opt-in Spot to integrity checks.
|
|
707
|
+
if not self.gpu.spot:
|
|
708
|
+
data["gpu"].pop("spot", None)
|
|
690
709
|
if not data["custom"]:
|
|
691
710
|
data.pop("custom")
|
|
692
711
|
# Preserve public and worker preparation digests for all existing runs.
|
|
@@ -818,6 +837,7 @@ class JobSpec:
|
|
|
818
837
|
type=gpu_type,
|
|
819
838
|
provider=provider,
|
|
820
839
|
providers=providers,
|
|
840
|
+
spot=gpu.get("spot", False),
|
|
821
841
|
disk_gb=int(gpu.get("disk_gb", 60)),
|
|
822
842
|
max_wall_seconds=int(gpu.get("max_wall_seconds", 24 * 3600)),
|
|
823
843
|
max_retries=int(gpu.get("max_retries", 5)),
|
|
@@ -438,6 +438,8 @@ def _quote_gpu_ceiling(
|
|
|
438
438
|
return geometry_safe_gpu_cap(config.model_id, ceiling, model_revision=config.model_revision)
|
|
439
439
|
from flash.providers.core.base import smallest_fitting_gpu_count
|
|
440
440
|
|
|
441
|
+
if config.provider == "spot":
|
|
442
|
+
return auto_cap
|
|
441
443
|
return (
|
|
442
444
|
smallest_fitting_gpu_count(
|
|
443
445
|
need,
|
|
@@ -462,7 +464,7 @@ def _offline_preferred_gpu_shape(config: RunConfig) -> tuple[str, int, int, str,
|
|
|
462
464
|
configured = available_providers()
|
|
463
465
|
# an unconfigured plane (no credentials anywhere) has nothing to filter against; fall back to the
|
|
464
466
|
# registered set so the quote keeps its historical structural answer instead of going empty.
|
|
465
|
-
eligible = configured or PROVIDER_NAMES
|
|
467
|
+
eligible = tuple(name for name in (configured or PROVIDER_NAMES) if name != "spot")
|
|
466
468
|
for provider in config.providers:
|
|
467
469
|
if provider not in eligible:
|
|
468
470
|
continue
|
|
@@ -497,6 +499,10 @@ def _offline_gpu_shape(config: RunConfig) -> tuple[str, int, int, str, float]:
|
|
|
497
499
|
Preparation must not consume live-capacity failures before run creation. Rank rentable shapes
|
|
498
500
|
offline, then replace the quote with the selected live candidate before provisioning.
|
|
499
501
|
"""
|
|
502
|
+
if config.providers == ("spot",):
|
|
503
|
+
from dataclasses import replace
|
|
504
|
+
|
|
505
|
+
return _offline_gpu_shape(replace(config, provider="spot", providers=()))
|
|
500
506
|
if config.providers:
|
|
501
507
|
return _offline_preferred_gpu_shape(config)
|
|
502
508
|
# Fail closed on a model that cannot be sized at all. Curated entries answer from the catalog
|
|
@@ -522,7 +528,7 @@ def _offline_gpu_shape(config: RunConfig) -> tuple[str, int, int, str, float]:
|
|
|
522
528
|
combined_vram_gb,
|
|
523
529
|
)
|
|
524
530
|
|
|
525
|
-
provider = config.provider
|
|
531
|
+
provider = config.provider
|
|
526
532
|
if config.gpu_type:
|
|
527
533
|
# rank every class the author declared acceptable, not just the head. `allocate()` cost-ranks
|
|
528
534
|
# the whole ordered set, so quoting the head alone prices a shape the run may never be given
|
|
@@ -547,7 +553,12 @@ def _offline_gpu_shape(config: RunConfig) -> tuple[str, int, int, str, float]:
|
|
|
547
553
|
ranked = []
|
|
548
554
|
for gpu in names:
|
|
549
555
|
info = GPU_INFO[gpu]
|
|
550
|
-
|
|
556
|
+
counts = rentable_gpu_counts(min(safe_gpu_count, info.max_count))
|
|
557
|
+
if provider == "spot":
|
|
558
|
+
from flash.providers.nebius.pricing import SPOT_GPUS
|
|
559
|
+
|
|
560
|
+
counts = tuple(n for n in counts if n in SPOT_GPUS[gpu].counts)
|
|
561
|
+
for count in counts:
|
|
551
562
|
# credit only the cards that JOIN the run, matching the allocator's `_fits`. quoting the
|
|
552
563
|
# billed count here made the two disagree: a 27B at 128k over 10 rows was quoted 4x H200
|
|
553
564
|
# (460 GB credited against a 422 GB need) while the allocator launches 2 ranks -- 234 GB
|
|
@@ -555,15 +566,20 @@ def _offline_gpu_shape(config: RunConfig) -> tuple[str, int, int, str, float]:
|
|
|
555
566
|
launched = executed_gpu_count(config, count)
|
|
556
567
|
if combined_vram_gb(info.vram_gb, launched) < need:
|
|
557
568
|
continue
|
|
558
|
-
from flash.providers.
|
|
569
|
+
from flash.providers.core.registry import get_provider
|
|
559
570
|
|
|
560
|
-
hourly = hourly_rate(gpu)
|
|
571
|
+
hourly = get_provider("modal" if provider == "auto" else provider).hourly_rate(gpu)
|
|
561
572
|
step_seconds = sharded_step_seconds(
|
|
562
573
|
config, gpu, count, "" if provider == "auto" else provider
|
|
563
574
|
)
|
|
575
|
+
from flash.providers.nebius.pricing import priority as spot_priority
|
|
576
|
+
|
|
564
577
|
ranked.append(
|
|
565
578
|
(
|
|
566
|
-
|
|
579
|
+
(
|
|
580
|
+
spot_priority(gpu) if provider == "spot" else 0,
|
|
581
|
+
hourly * count * step_seconds,
|
|
582
|
+
),
|
|
567
583
|
count,
|
|
568
584
|
combined_vram_gb(info.vram_gb, launched),
|
|
569
585
|
info.vram_gb,
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"""Time-based checkpoint decisions; copied unchanged into isolated trainer children."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
import time
|
|
7
|
+
|
|
8
|
+
SPOT_RECOVERY_SECONDS = 600
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def enabled() -> bool:
|
|
12
|
+
return os.environ.get("FLASH_SPOT_CHECKPOINT_SECONDS") == str(SPOT_RECOVERY_SECONDS)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class CheckpointClock:
|
|
16
|
+
"""Observe completed steps and save before another typical step exceeds the target.
|
|
17
|
+
|
|
18
|
+
Save the first completed step after startup/resume to establish a safe baseline.
|
|
19
|
+
Greedily allow another step only when its latest measured duration fits the budget.
|
|
20
|
+
Steps at or above the target save after every completed step.
|
|
21
|
+
Local checkpoint-writing time is excluded from the step-duration samples.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def __init__(self, *, clock=time.monotonic, target_seconds=SPOT_RECOVERY_SECONDS):
|
|
25
|
+
self.clock = clock
|
|
26
|
+
self.target_seconds = target_seconds
|
|
27
|
+
self.last_step = None
|
|
28
|
+
self.last_end = None
|
|
29
|
+
self.last_save = None
|
|
30
|
+
|
|
31
|
+
def due(self, step: int, *, required=(), final_step: int) -> bool:
|
|
32
|
+
now = self.clock()
|
|
33
|
+
if step <= 0 or (self.last_step is not None and step <= self.last_step):
|
|
34
|
+
return False
|
|
35
|
+
step_seconds = (
|
|
36
|
+
max(0.001, (now - self.last_end) / (step - self.last_step))
|
|
37
|
+
if self.last_end is not None
|
|
38
|
+
else 0
|
|
39
|
+
)
|
|
40
|
+
self.last_step, self.last_end = step, now
|
|
41
|
+
if self.last_save is None or step in required or step == final_step:
|
|
42
|
+
return True
|
|
43
|
+
elapsed = now - self.last_save
|
|
44
|
+
return elapsed >= self.target_seconds or elapsed + step_seconds > self.target_seconds
|
|
45
|
+
|
|
46
|
+
def saved(self) -> None:
|
|
47
|
+
self.last_save = self.last_end = self.clock()
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def should_save(owner, step: int, required, final_step: int, *, distributed=False) -> bool:
|
|
51
|
+
timer = getattr(owner, "_flash_checkpoint_clock", None)
|
|
52
|
+
if timer is None:
|
|
53
|
+
timer = owner._flash_checkpoint_clock = CheckpointClock()
|
|
54
|
+
decision = timer.due(step, required=required, final_step=final_step)
|
|
55
|
+
if distributed:
|
|
56
|
+
# SFT calls this on every FSDP rank. One rank's clock must decide for all
|
|
57
|
+
# ranks or some will skip a collective save while others enter it.
|
|
58
|
+
import torch
|
|
59
|
+
import torch.distributed as dist
|
|
60
|
+
|
|
61
|
+
if dist.is_initialized():
|
|
62
|
+
device = torch.cuda.current_device() if dist.get_backend() == "nccl" else "cpu"
|
|
63
|
+
flag = torch.tensor([int(decision)], dtype=torch.int32, device=device)
|
|
64
|
+
dist.broadcast(flag, src=0)
|
|
65
|
+
decision = bool(flag.item())
|
|
66
|
+
return decision
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def saved(owner) -> None:
|
|
70
|
+
owner._flash_checkpoint_clock.saved()
|
|
@@ -7,6 +7,7 @@ from verl.trainer.ppo.utils import Role
|
|
|
7
7
|
from verl.trainer.ppo.v1.trainer_sync import PPOTrainerSync
|
|
8
8
|
|
|
9
9
|
from flash.engine.worker.runtime.phases import training_phase
|
|
10
|
+
from flash.engine.worker.train.core.child import checkpoint_schedule
|
|
10
11
|
from flash.engine.worker.train.core.child.options import RuntimeOptions
|
|
11
12
|
from flash.engine.worker.train.core.child.queue import _init_transfer_queue
|
|
12
13
|
from flash.engine.worker.train.core.child.readiness import publish_ready
|
|
@@ -50,9 +51,20 @@ class FlashSyncTrainer(PPOTrainerSync):
|
|
|
50
51
|
self.role_worker_mapping[role] = ray.remote(FlashActorRolloutWorker)
|
|
51
52
|
|
|
52
53
|
def _save_checkpoint(self):
|
|
53
|
-
|
|
54
|
+
adaptive = checkpoint_schedule.enabled()
|
|
55
|
+
due = (
|
|
56
|
+
checkpoint_schedule.should_save(
|
|
57
|
+
self, int(self.global_steps), self.runtime.save_at_steps, self.runtime.total_steps
|
|
58
|
+
)
|
|
59
|
+
if adaptive
|
|
60
|
+
else self.runtime.should_save(int(self.global_steps))
|
|
61
|
+
)
|
|
62
|
+
if due:
|
|
54
63
|
with checkpoint_phase(int(self.global_steps), "capture"):
|
|
55
|
-
|
|
64
|
+
result = super()._save_checkpoint()
|
|
65
|
+
if adaptive:
|
|
66
|
+
checkpoint_schedule.saved(self)
|
|
67
|
+
return result
|
|
56
68
|
return None
|
|
57
69
|
|
|
58
70
|
def on_train_begin(self):
|
{freesolo_flash_dev-1.4.20 → freesolo_flash_dev-1.4.22}/flash/engine/worker/train/entry/sft_train.py
RENAMED
|
@@ -227,6 +227,10 @@ def _build_verl_child_env(*, wandb_enabled: bool, context: WorkerContext) -> dic
|
|
|
227
227
|
for key, value in os.environ.items()
|
|
228
228
|
if key in _CHILD_ENV_EXACT or key.startswith(_CHILD_ENV_PREFIXES)
|
|
229
229
|
}
|
|
230
|
+
from flash.core.checkpoint_policy import SPOT_CHECKPOINT_SECONDS, is_spot_spec
|
|
231
|
+
|
|
232
|
+
if is_spot_spec(context.config.spec):
|
|
233
|
+
child["FLASH_SPOT_CHECKPOINT_SECONDS"] = str(SPOT_CHECKPOINT_SECONDS)
|
|
230
234
|
if wandb_enabled:
|
|
231
235
|
child.update({key: value for key, value in os.environ.items() if key.startswith("WANDB_")})
|
|
232
236
|
# retained runtime namespaces are filtered by applied-secret provenance. authenticated child-side
|
|
@@ -405,6 +405,11 @@ def _prepare_sft_model(
|
|
|
405
405
|
else max(1, min(options.save_every, update_horizon))
|
|
406
406
|
)
|
|
407
407
|
|
|
408
|
+
from flash.core.checkpoint_policy import is_spot_spec
|
|
409
|
+
|
|
410
|
+
if is_spot_spec(options.spec):
|
|
411
|
+
save_freq = 1
|
|
412
|
+
|
|
408
413
|
card_vram_gb = float(options.gpu_probe.get("memory_gb") or 0.0)
|
|
409
414
|
info = MODELS.get(options.model_id)
|
|
410
415
|
active_params_b = float(getattr(info, "active_params_b", 0.0) or 0.0) or None
|
|
@@ -521,7 +521,9 @@ def _assemble_grpo_inputs(
|
|
|
521
521
|
"epochs": schedule["epochs"],
|
|
522
522
|
"verl_total_epochs": schedule["verl_total_epochs"],
|
|
523
523
|
"steps": schedule["steps"],
|
|
524
|
-
"save_freq":
|
|
524
|
+
"save_freq": 1
|
|
525
|
+
if context.config.spec and context.config.spec.gpu.spot
|
|
526
|
+
else schedule["save_freq"],
|
|
525
527
|
"save_at_steps": schedule["save_at_steps"],
|
|
526
528
|
"ckpt_to_keep": schedule["ckpt_to_keep"],
|
|
527
529
|
# verl's default preserves the update horizon and on-policy baseline; with no generation reuse, each
|
|
@@ -9,6 +9,7 @@ from verl.trainer.sft_trainer import SFTTrainer
|
|
|
9
9
|
from verl.utils.checkpoint import CheckpointHandler
|
|
10
10
|
from verl.utils.dataset.dataset_utils import SFTTensorCollator
|
|
11
11
|
|
|
12
|
+
from flash.engine.worker.train.core.child import checkpoint_schedule
|
|
12
13
|
from flash.engine.worker.train.core.child.options import RuntimeOptions
|
|
13
14
|
from flash.engine.worker.train.core.lifecycle.timing import checkpoint_phase
|
|
14
15
|
from flash.engine.worker.train.sft.child.dataset import FlashTokenizedSFTDataset
|
|
@@ -21,11 +22,22 @@ class FlashCheckpointHandler(CheckpointHandler):
|
|
|
21
22
|
super().__init__(**kwargs)
|
|
22
23
|
|
|
23
24
|
def save_checkpoint(self, step):
|
|
24
|
-
|
|
25
|
+
adaptive = checkpoint_schedule.enabled()
|
|
26
|
+
due = (
|
|
27
|
+
checkpoint_schedule.should_save(
|
|
28
|
+
self, step, self.runtime.save_at_steps, self.runtime.total_steps, distributed=True
|
|
29
|
+
)
|
|
30
|
+
if adaptive
|
|
31
|
+
else self.runtime.should_save(step)
|
|
32
|
+
)
|
|
33
|
+
if due:
|
|
25
34
|
with checkpoint_phase(step, "retention_wait"):
|
|
26
35
|
self._wait_for_publication(step)
|
|
27
36
|
with checkpoint_phase(step, "capture"):
|
|
28
|
-
|
|
37
|
+
result = super().save_checkpoint(step)
|
|
38
|
+
if adaptive:
|
|
39
|
+
checkpoint_schedule.saved(self)
|
|
40
|
+
return result
|
|
29
41
|
return None
|
|
30
42
|
|
|
31
43
|
def _wait_for_publication(self, step):
|
|
@@ -229,7 +229,12 @@ class _VerlCheckpointWatcher:
|
|
|
229
229
|
|
|
230
230
|
def _publish(self, step: int, checkpoint_dir: str) -> None:
|
|
231
231
|
if not self._should_publish(step):
|
|
232
|
+
from flash.core.checkpoint_policy import is_spot_spec
|
|
233
|
+
|
|
232
234
|
self.lifecycle.mark_discovered(step)
|
|
235
|
+
if is_spot_spec(self.context.config.spec):
|
|
236
|
+
staged_dir = self._staged_source(step, checkpoint_dir)
|
|
237
|
+
self._persist_resume(step, staged_dir, job_label="sft")
|
|
233
238
|
return
|
|
234
239
|
staged_dir = self._staged_source(step, checkpoint_dir)
|
|
235
240
|
try:
|
|
@@ -301,7 +301,12 @@ def _structurally_fits(available, need: int, cap: int, executed_width, acceptabl
|
|
|
301
301
|
for gpu_class in classes:
|
|
302
302
|
if allowed and gpu_class.name not in allowed:
|
|
303
303
|
continue
|
|
304
|
-
|
|
304
|
+
counts = rentable_gpu_counts(min(cap, gpu_class.max_count))
|
|
305
|
+
if name == "spot":
|
|
306
|
+
from flash.providers.nebius.pricing import SPOT_GPUS
|
|
307
|
+
|
|
308
|
+
counts = tuple(n for n in counts if n in SPOT_GPUS[gpu_class.name].counts)
|
|
309
|
+
for count in counts:
|
|
305
310
|
if combined_vram_gb(gpu_class.vram_gb, executed_width(count)) >= need:
|
|
306
311
|
return True
|
|
307
312
|
return False
|
|
@@ -629,7 +634,7 @@ def _resolved_gpu_count(
|
|
|
629
634
|
need, max_gpu_count=auto_cap, gpu_names=gpu_names, executed_width=executed_width
|
|
630
635
|
)
|
|
631
636
|
if fitting_count is not None:
|
|
632
|
-
return fitting_count
|
|
637
|
+
return auto_cap if available == ("spot",) else fitting_count
|
|
633
638
|
effective_count = auto_cap
|
|
634
639
|
else:
|
|
635
640
|
effective_count = geometry_safe_gpu_cap(
|
|
@@ -840,6 +845,10 @@ def allocate(
|
|
|
840
845
|
if provider and providers:
|
|
841
846
|
raise UnsupportedGpuError("provider and providers cannot both be set")
|
|
842
847
|
available = available_providers()
|
|
848
|
+
if providers == ("spot",):
|
|
849
|
+
provider = "spot"
|
|
850
|
+
if provider != "spot":
|
|
851
|
+
available = tuple(name for name in available if name != "spot")
|
|
843
852
|
# kept across the narrowing below so a rejection can ask what dropping the pin would restore.
|
|
844
853
|
unpinned = None
|
|
845
854
|
if provider:
|
|
@@ -923,7 +932,7 @@ def allocate(
|
|
|
923
932
|
return _cheapest_allocation(
|
|
924
933
|
candidates,
|
|
925
934
|
need=need,
|
|
926
|
-
cost_per_step=cost_per_step,
|
|
935
|
+
cost_per_step=None if provider == "spot" else cost_per_step,
|
|
927
936
|
provider_rank=provider_rank,
|
|
928
937
|
)
|
|
929
938
|
|
|
@@ -942,12 +951,15 @@ def _cheapest_allocation(
|
|
|
942
951
|
matches. A run the cost model cannot price (``cost_per_step`` is ``None``) falls back to total
|
|
943
952
|
$/hr.
|
|
944
953
|
"""
|
|
954
|
+
from flash.providers.nebius.pricing import priority as spot_priority
|
|
955
|
+
|
|
945
956
|
primary = cost_per_step if cost_per_step is not None else (lambda c: c.total_hourly_usd)
|
|
946
957
|
unnamed_rank = len(provider_rank)
|
|
947
958
|
ranked = sorted(
|
|
948
959
|
candidates,
|
|
949
960
|
key=lambda c: (
|
|
950
961
|
provider_rank.get(c.provider, unnamed_rank),
|
|
962
|
+
spot_priority(c.gpu) if c.provider == "spot" else 0,
|
|
951
963
|
primary(c),
|
|
952
964
|
c.total_hourly_usd,
|
|
953
965
|
c.gpu_count,
|
|
@@ -955,6 +967,13 @@ def _cheapest_allocation(
|
|
|
955
967
|
c.gpu,
|
|
956
968
|
),
|
|
957
969
|
)
|
|
970
|
+
# Spot prioritizes GPU class, then current price; fixed entry rates price estimates.
|
|
971
|
+
from flash.providers.nebius.pricing import hourly_rate as spot_hourly_rate
|
|
972
|
+
|
|
973
|
+
ranked = [
|
|
974
|
+
replace(c, hourly_usd=spot_hourly_rate(c.gpu)) if c.provider == "spot" else c
|
|
975
|
+
for c in ranked
|
|
976
|
+
]
|
|
958
977
|
best = ranked[0]
|
|
959
978
|
return Allocation(
|
|
960
979
|
provider=best.provider,
|
|
@@ -175,8 +175,10 @@ def get_gpu_info(name: str) -> GpuClass:
|
|
|
175
175
|
|
|
176
176
|
def providers_for(name: str) -> tuple[str, ...]:
|
|
177
177
|
"""The training substrate supporting this validated GPU class."""
|
|
178
|
-
|
|
179
|
-
|
|
178
|
+
from flash.providers.nebius.pricing import SPOT_GPUS
|
|
179
|
+
|
|
180
|
+
gpu = get_gpu_info(name)
|
|
181
|
+
return ("modal", "spot") if gpu.name in SPOT_GPUS else ("modal",)
|
|
180
182
|
|
|
181
183
|
|
|
182
184
|
def gpu_short(name: str) -> str:
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Validate persisted training identities before recovery and resource mutations."""
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def parse_handle(data):
|
|
5
|
+
if data.get("provider") == "spot":
|
|
6
|
+
from flash.providers.nebius.handles import SpotJobHandle
|
|
7
|
+
|
|
8
|
+
return SpotJobHandle.from_dict(data)
|
|
9
|
+
from flash.providers.modal.handles import ModalJobHandle
|
|
10
|
+
|
|
11
|
+
return ModalJobHandle.from_dict(data)
|
|
@@ -19,7 +19,10 @@ __all__ = [
|
|
|
19
19
|
|
|
20
20
|
logger = get_logger(__name__)
|
|
21
21
|
|
|
22
|
-
_PROVIDER_SETUP = (
|
|
22
|
+
_PROVIDER_SETUP = (
|
|
23
|
+
("modal", "MODAL_TOKEN_ID + MODAL_TOKEN_SECRET", "Modal workspace credentials"),
|
|
24
|
+
("spot", "FLASH_NEBIUS_PROJECT_ID/REGION/SUBNET_ID/IMAGE_ID", "Nebius CLI and GPU host image"),
|
|
25
|
+
)
|
|
23
26
|
|
|
24
27
|
|
|
25
28
|
def _present(var: str) -> bool:
|
|
@@ -121,4 +124,6 @@ def check_run_preflight() -> None:
|
|
|
121
124
|
require_operator_config()
|
|
122
125
|
if not _present("GITHUB_TOKEN"):
|
|
123
126
|
logger.warning("GITHUB_TOKEN is not set; private environment repositories are unavailable.")
|
|
124
|
-
|
|
127
|
+
from flash.providers.core.registry import available_providers
|
|
128
|
+
|
|
129
|
+
logger.info("GPU providers configured: %s", ", ".join(available_providers()))
|