freesolo-flash-dev 1.2.14__tar.gz → 1.2.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.2.14 → freesolo_flash_dev-1.2.22}/PKG-INFO +1 -1
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/ui/heartbeat.py +34 -9
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/content/multimodal.py +4 -2
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cost/analytical.py +48 -1
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/io/heartbeat.py +13 -7
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/opd_train_runner.py +3 -77
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/rl_train_runner.py +30 -1
- freesolo_flash_dev-1.2.22/flash/engine/worker/train/opd/reporting.py +94 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/shims.py +378 -23
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/identity.py +15 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/loader.py +11 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/__init__.py +9 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/artifacts.py +65 -30
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/submit.py +13 -5
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/routes/runs.py +3 -22
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/pyproject.toml +2 -2
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/_helpers/profile.py +5 -6
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_render_theme.py +172 -2
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_client_server_integration.py +6 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_controlled_experiment_repairs.py +10 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_rate_limit_resolve.py +37 -1
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_multimodal_training.py +2 -38
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_provider_routing.py +113 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_rl_train.py +498 -7
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_server_billing.py +98 -2
- freesolo_flash_dev-1.2.22/tests/test_sft_startup_block.py +133 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_worker_init_heartbeat.py +73 -13
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/uv.lock +1 -1
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.dockerignore +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.env.example +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/CODEOWNERS +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/dependabot.yml +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/workflows/auto-rebake.yml +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/workflows/bake-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/workflows/ci.yml +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/workflows/main-source-guard.yml +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/workflows/notify-tests-repo.yml +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/workflows/publish-dev.yml +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/workflows/publish-image.yml +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/workflows/publish.yml +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/workflows/version-parity.yml +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.github/workflows/worker-image.yml +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/.gitignore +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/CHANGELOG.md +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/CODE_OF_CONDUCT.md +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/CONTRIBUTING.md +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/Dockerfile +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/Dockerfile.worker +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/LICENSE +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/NOTICE +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/README.md +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/SECURITY.md +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/SELF_HOSTING.md +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/build/kernel_cache/.gitignore +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/build/kernel_cache/.keep +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/deploy/infisical/README.md +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/deploy/infisical/entrypoint.sh +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/docker/Dockerfile.kernelcache +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/docker/Dockerfile.kernelcache.relayer +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/docker/bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/docker/bake_pod_entry.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/docker/extract_cudart_fix.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/docker/kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/docker/make_rp_handler.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/_internal/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/_internal/channel.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/_internal/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/_internal/fileio.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/_internal/logging.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/_internal/paths.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/adapters/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/adapters/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/adapters/lora_rank.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/__main__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/deploy.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/episode.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/eval.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/eval_args.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/imports.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/list.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/push.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/retained.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/setup.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/test.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/test_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/test_params.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/env/test_warnings.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/traces.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/commands/train_cost.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/scaffold/TRAINING.md +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/scaffold/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/ui/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/ui/cost.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/ui/env_panels.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/ui/render.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/ui/tables.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cli/ui/tty.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/client/config.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/client/freesolo_api.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/client/http.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/client/runtime_secrets.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/client/shapes.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/client/specs.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/client/streaming.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/content/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/content/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/content/thinking.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/core/catalog.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/core/spec.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cost/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cost/facts.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cost/spec.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/cost/types.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/plan/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/plan/kv_sizing.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/plan/model_config_probe.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/plan/recipe.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/plan/steps.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/plan/vram.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/profiling/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/profiling/dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/profiling/reasoning_render.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/profiling/sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/profiling/tokenizer.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/profiling/workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/result/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/result/accounting.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/result/rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/__main__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/backend_common.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/entry/opd.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/entry/rl.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/entry/sft.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/io/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/io/hf.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/io/prefetch.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/io/wandb_log.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/model/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/model/adapter.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/model/decoding.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/model/lora.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/model/packing.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/opd_train.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/perf/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/perf/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/perf/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/perf/liger.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/perf/memory.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/rl_train.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/runtime/rng.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/score_batcher.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/sft_train.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/sft_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/teacher/client.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/teacher/encoding.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/core/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/core/child/glue.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/finalize.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/batching.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/bridge.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/child/bridge.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/child/structured.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/failures.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/gkd.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/overrides.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/prompts.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/scoring.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/opd/validation.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/config.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/inputs.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/multi_turn.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/scoring.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/single_turn.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/rl/verl_config.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/sft/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/sft/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/train/sft/config.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/verl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/verl/capabilities.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/verl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/verl/child_io.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/verl/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/verl/parallelism.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker_entrypoint.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/adapter.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/base.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/cache_security.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/dataset_selection.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/evaluations.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/namespace_listing.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/package/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/package/limits.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/package/unpack.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/envs/pull.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/auth.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/bootstrap.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/deadline.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/http.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/instance.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/poll.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/poll_instance.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/provider.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/_lifecycle/worker.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/allocator.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/artifacts/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/artifacts/hf.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/artifacts/preload_runpod.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/artifacts/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/base.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/fit_errors.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/lambda_/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/lambda_/api.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/lambda_/auth.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/lambda_/gpus.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/lambda_/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/lambda_/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/lambda_/jobs/reap.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/lambda_/preflight.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/lambda_/pricing.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/preflight.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/realized.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/api.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/auth.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/cost.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/gpus.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/job_execution.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/jobs.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/preflight.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/pricing.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/resources.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/serverless/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/runpod/serverless/endpoints.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/sharding.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/vast/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/vast/api.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/vast/auth.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/vast/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/vast/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/vast/preflight.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/providers/vast/pricing.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/py.typed +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/attempts.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/costs.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/deadlines.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/preparation.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/reconciliation.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/results/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/results/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/results/verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/status.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/supervise/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/supervise/attach.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/supervise/deploy.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/supervise/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/supervise/recovery.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/supervise/retry_decision.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/supervise/seed_submission.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/supervise/transitions.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/runner/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/schema/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/schema/fields.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/serve/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/serve/adapter_check.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/serve/deploy.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/serve/errors.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/serve/export.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/serve/preflight.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/serve/responses.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/serve/streaming.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/serve/thinking.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/serve/urls.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/__main__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/app.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/billing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/billing/charges.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/billing/retry.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/domain/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/domain/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/domain/environment_registry.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/domain/envs.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/domain/projects.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/domain/reconcile.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/domain/repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/domain/run_registry.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/domain/teacher_broker.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/domain/teacher_errors.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/domain/teacher_requests.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/platform/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/platform/auth.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/platform/db.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/platform/deps.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/platform/internal_client.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/platform/locks.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/platform/runtime.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/routes/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/routes/envs.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/routes/meta.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/routes/serving.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/routes/serving_completion.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/routes/serving_revisions.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/routes/serving_smoke.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/server/routes/teacher.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/teacher/limits.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/teacher/retry_contract.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/scripts/build_dev_dist.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/scripts/check_file_size.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/scripts/check_function_size.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/scripts/check_verl_pin_exists.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/scripts/scrub_history.sh +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/_helpers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/_helpers/runner.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/_helpers/specs.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/_helpers/teacher.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/_helpers/vast.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/conftest.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/fixtures/math_eval.jsonl +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/fixtures/math_train.jsonl +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/live/__init__.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/live/conftest.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/live/test_lambda_live.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/live/test_runpod_live.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/live/test_sft_thinking_render_live.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/live/test_vast_live.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_accounting_coverage.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_adapter_shard_completeness.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_agent_flash_cli_contract.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_algorithms.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_allocator.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_backend_common.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_backend_jobspec_contract.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_base_model_provenance.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_billing_retry.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_build_context_contract.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cancel_remote.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_catalog_consistency.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_catalog_only_models.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_charge_pricing.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_commands.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_commands_coverage.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_credential_shadowing.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_errors.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_estimate.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_gpus_flag.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_help.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_main_coverage.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_managed.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_render_coverage.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_traces.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cli_wandb_warning.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_client.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_client_import_purity.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_client_stream_reads.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_config_env_vars.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_config_overrides.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cost_analytical.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cost_equation.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cost_estimate.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cost_hardware.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_cost_models.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_deploy_latency.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_dev_channel.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_disk_gb.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_endpoint_name.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_cache_evict.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_delete.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_download.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_download_api.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_list_api.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_list_cli.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_list_hub.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_no_install.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_publish.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_pull.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_pull_coverage.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_pull_loader_coverage.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_pull_managed_control_plane.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_push.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_ref_pinning.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_env_test.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_export.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_flash_mvp.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_flash_worker.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_flashinfer_cache_dirs.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_freesolo_api_transport.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_github_urlopen_retry.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_gpu_type_single_field.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_gpus.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_grpo_params.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_grpo_resident_sizing.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_grpo_reward_batching.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_health_liveness.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_hf_retry.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_idle_endpoint_reaper.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_infisical_secrets.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_instance_bootstrap_coverage.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_internal_client.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_jobs.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_kv_util.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_lambda_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_lambda_runner.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_logging.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_login_perms.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_lora_rank_coverage.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_lora_rank_preflight.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_managed_config_fields.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_managed_hf_repo.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_metrics_schema_agent_contract.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_mig_guard.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_multi_gpu_gate.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_named_reward_metrics.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_oom_escalate_gpu.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_opd.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_opd_limits.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_opd_multiturn_eos_boundary.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_opd_resume_safety.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_opd_train.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_orchestrator_flash.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_packing.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_packing_coverage.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_parasail_teacher.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_poll_helpers.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_preflight.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_projects.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_provider_preflight_coverage.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_provider_teardown_robustness.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_providers_symmetry.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_realized_cost.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_resolve_params_b.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_resume_on_retry.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_runmgmt.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_runpod_api_delete.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_runpod_key_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_runpod_key_waterfall.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_serve.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_serve_reasoning_content.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_server_api.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_server_app_coverage.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_server_auth_singleflight.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_server_checkpoints_coverage.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_server_db.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_server_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_server_locks_coverage.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_server_standalone.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_serving_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_serving_contract.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_serving_schema_coverage.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_sft_chunked_nll.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_sft_example_selection.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_sft_gc_off.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_sft_max_context.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_sft_train.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_spec_and_validation.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_step_floor.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_step_metrics.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_teacher_broker.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_teacher_encoding_contract.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_thinking_config.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_train_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_training_controls.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_type_comment_prose.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_vast_api.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_vast_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_vast_offers.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_vast_provider_coverage.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_vast_runner.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_verifiers.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_version.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_vl_warmstart_adapter_keys.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_vram_architecture.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_wandb_link.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_wandb_naming.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_warmstart_adapter_download.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_warmstart_cross_repo.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_warmstart_error_attribution.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_worker_dryrun.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_worker_hardexit.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_worker_image.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_worker_stack.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_worker_thinking.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_workflow_contracts.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/tests/test_zero2_sharding_gate.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: freesolo-flash-dev
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.22
|
|
4
4
|
Summary: Flash — managed LoRA post-training (SFT/GRPO/OPD) for Freesolo environments, driven by the `flash` CLI
|
|
5
5
|
Project-URL: Homepage, https://github.com/freesolo-co/flash
|
|
6
6
|
Project-URL: Repository, https://github.com/freesolo-co/flash
|
|
@@ -13,6 +13,7 @@ CLI tests reach them.
|
|
|
13
13
|
|
|
14
14
|
from __future__ import annotations
|
|
15
15
|
|
|
16
|
+
import math
|
|
16
17
|
import time
|
|
17
18
|
|
|
18
19
|
from flash.cli.ui.render import _dim
|
|
@@ -114,10 +115,13 @@ _QUIET_HEARTBEAT_HINT = (
|
|
|
114
115
|
# than on 900s -- the incident that motivated this reported 559s and 687s, squarely inside that
|
|
115
116
|
# window, where a 900s gate would stay silent and leave only the dead-end quiet hint.
|
|
116
117
|
_STALE_STEP_AFTER_S = _HB_QUIET_HINT_AFTER_S
|
|
117
|
-
#
|
|
118
|
-
#
|
|
119
|
-
#
|
|
120
|
-
|
|
118
|
+
# progress_age_s is the age of latest known progress at payload build time. combine it with upload age
|
|
119
|
+
# for a conservative current bound, and speak once that bound reaches the throttle without claiming
|
|
120
|
+
# either health or a stall: newer progress may be uncommitted, or the worker may be silent.
|
|
121
|
+
_UPLOAD_THROTTLE_S = 900.0
|
|
122
|
+
# only the stages the worker actually holds on the 900s upload throttle. opd_step emits ordinary
|
|
123
|
+
# post-step and liveness heartbeats, so its uploaded step can lag just like rl_step and sft_step.
|
|
124
|
+
_TRAINING_STEP_STAGES = frozenset({"opd_step", "rl_step", "sft_step"})
|
|
121
125
|
|
|
122
126
|
# the setup stages that hold a liveness thread on the 240s tight cadence (_HB_SETUP_LIVENESS_INTERVAL_S).
|
|
123
127
|
# these are the ones where age is genuinely informative: the worker pings every 240s while alive, so
|
|
@@ -255,8 +259,6 @@ def _stale_step_hint(
|
|
|
255
259
|
# throttled progress hides that the replacement has published nothing.
|
|
256
260
|
if not current_attempt:
|
|
257
261
|
return None
|
|
258
|
-
if heartbeat_age_seconds <= _STALE_STEP_AFTER_S:
|
|
259
|
-
return None
|
|
260
262
|
if str(heartbeat.get("stage") or "") not in _TRAINING_STEP_STAGES:
|
|
261
263
|
return None
|
|
262
264
|
# step 0 is the cold, still-running first step: no optimizer update has landed, so there is no
|
|
@@ -266,9 +268,32 @@ def _stale_step_hint(
|
|
|
266
268
|
|
|
267
269
|
if not is_training_heartbeat(heartbeat.get("stage"), heartbeat.get("step")):
|
|
268
270
|
return None
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
271
|
+
progress_age_s = heartbeat.get("progress_age_s")
|
|
272
|
+
progress_age: float | None = None
|
|
273
|
+
if not isinstance(progress_age_s, bool):
|
|
274
|
+
try:
|
|
275
|
+
candidate = float(progress_age_s)
|
|
276
|
+
except (OverflowError, TypeError, ValueError):
|
|
277
|
+
pass
|
|
278
|
+
else:
|
|
279
|
+
if candidate >= 0 and math.isfinite(candidate):
|
|
280
|
+
progress_age = candidate
|
|
281
|
+
if progress_age is not None:
|
|
282
|
+
progress_age_bound_s = heartbeat_age_seconds + progress_age
|
|
283
|
+
if progress_age_bound_s >= _UPLOAD_THROTTLE_S:
|
|
284
|
+
return (
|
|
285
|
+
"the step above is the last one UPLOADED; "
|
|
286
|
+
f"the last known progress can be as old as {progress_age_bound_s:.1f}s. upload "
|
|
287
|
+
"throttling no longer explains the gap, but newer progress may be uncommitted and "
|
|
288
|
+
"a long step may still be running; this signal does not show recent progress"
|
|
289
|
+
)
|
|
290
|
+
# below the 900s hold, throttling still explains the visible lag. fall through to the exact
|
|
291
|
+
# pre-existing reading so new workers never lose guidance in the incident's 300-900s band.
|
|
292
|
+
if heartbeat_age_seconds <= _STALE_STEP_AFTER_S:
|
|
293
|
+
return None
|
|
294
|
+
# old workers do not publish progress_age_s. keep their existing throttle-only reading exactly so
|
|
295
|
+
# content-addressed in-flight runs do not change interpretation when the CLI upgrades. invalid
|
|
296
|
+
# progress ages use the same fallback because they provide no trustworthy worker-side reading.
|
|
272
297
|
return (
|
|
273
298
|
"the step above is the last one UPLOADED, not necessarily the one training is on; "
|
|
274
299
|
"a throttled worker can hold it for many minutes while the trainer advances normally. "
|
|
@@ -697,8 +697,8 @@ def _read_json_records(path: Path) -> list[dict]:
|
|
|
697
697
|
return value
|
|
698
698
|
|
|
699
699
|
|
|
700
|
-
def preflight_validate_image_opd(spec) -> None:
|
|
701
|
-
"""
|
|
700
|
+
def preflight_validate_image_opd(spec, *, scan_packaged_environment: bool = True) -> None:
|
|
701
|
+
"""validate statically discoverable image opd datasets before gpu allocation."""
|
|
702
702
|
if getattr(spec, "algorithm", "") != "opd":
|
|
703
703
|
return
|
|
704
704
|
environment = getattr(spec, "environment", None)
|
|
@@ -708,6 +708,8 @@ def preflight_validate_image_opd(spec) -> None:
|
|
|
708
708
|
if not isinstance(records, list) or not all(isinstance(row, dict) for row in records):
|
|
709
709
|
return
|
|
710
710
|
else:
|
|
711
|
+
if not scan_packaged_environment:
|
|
712
|
+
return
|
|
711
713
|
from flash.envs.loader import (
|
|
712
714
|
_packaged_dataset_file,
|
|
713
715
|
_resolve_environment_reference,
|
|
@@ -87,6 +87,49 @@ def step_floor_seconds(gpu: str, completions: int) -> float:
|
|
|
87
87
|
# by matched multi-card measurements.
|
|
88
88
|
STEP_FLOOR_SHARDED_FRACTION = 0.799
|
|
89
89
|
|
|
90
|
+
# --- sft training-side startup block + per-step floor -------------------------------------------
|
|
91
|
+
# the flops term alone quoted sft at 28.6x UNDER the realized train wall (geometric, 17 measured
|
|
92
|
+
# runpod arms, 0/17 inside the 0.70-1.43x band). it is the same structural gap the rollout floor
|
|
93
|
+
# above closed for grpo, and it is NOT the cold start in `setup_seconds`: `setup_seconds` and
|
|
94
|
+
# `train_wall` are DISJOINT intervals in the worker (sft_train.py stamps setup before launching the
|
|
95
|
+
# training subprocess, and train_wall wraps `run_verl_training` plus the upload drain), so verl
|
|
96
|
+
# startup, model load, lora wrap and fsdp init sit INSIDE the billed train wall and were priced at
|
|
97
|
+
# zero.
|
|
98
|
+
#
|
|
99
|
+
# the block scales with model size -- measured median implied block 82s at 0.8B against 248s at 4B --
|
|
100
|
+
# so a size-blind constant cannot cover both: at the same in-band count it leaves a 3.75x worst arm
|
|
101
|
+
# and log-sd 0.50, against 2.13x and 0.32 for the size-scaled form below.
|
|
102
|
+
#
|
|
103
|
+
# fitted over 17 arms (2 cards, 2 model sizes, step counts 2/32/64/128/256, including the replicate
|
|
104
|
+
# groups) and selected by holding out an ENTIRE step-count class at a time, the same methodology
|
|
105
|
+
# that chose the rollout floor: a random holdout cannot test whether a form extrapolates to a shape
|
|
106
|
+
# it never saw. least squares lands at (58.3, 44.3, 0.948); the shipped triple is the rounded
|
|
107
|
+
# neighbour that survives holdout best. scored: 28.596x -> 1.013x geometric, 0/17 -> 14/17 in band,
|
|
108
|
+
# worst arm 1135x -> 2.13x, and it holds under a model holdout in both directions (0.8B 1.005x,
|
|
109
|
+
# 4B 1.033x), so the size term is not an artifact of the size that dominates the sample.
|
|
110
|
+
#
|
|
111
|
+
# KNOWN RESIDUAL, and the reason this is not tuned further: the same config on a different runpod
|
|
112
|
+
# HOST CLASS (nvidia driver build) spans 1.56x-1.88x, while replicates within one build agree to
|
|
113
|
+
# 1.01x-1.03x. the quote cannot observe which build it will be handed, so roughly half the remaining
|
|
114
|
+
# per-arm error is hardware the estimator has no input for. re-fitting below that resolution would
|
|
115
|
+
# be fitting the confounder. evidence: /home/azureuser/benchmark/cost-calib-20260801/ISSUES.md.
|
|
116
|
+
SFT_STARTUP_BASE_SECONDS = 60.0
|
|
117
|
+
SFT_STARTUP_SECONDS_PER_PARAM_B = 40.0
|
|
118
|
+
SFT_STEP_FLOOR_SECONDS = 0.8
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def sft_overhead_seconds(config: RunConfig, steps: int) -> float:
|
|
122
|
+
"""Training-wall seconds an sft run pays outside its flops term.
|
|
123
|
+
|
|
124
|
+
A one-time startup block that grows with checkpoint size, plus a per-step floor. Neither is
|
|
125
|
+
divided by card count: the block is model load and framework init that every rank pays, and the
|
|
126
|
+
per-step floor is dominated by the same non-shardable publish/sync work as the rollout floor.
|
|
127
|
+
"""
|
|
128
|
+
n = config.normalized()
|
|
129
|
+
params_b = total_params_b(n.model_id, n.model_revision)
|
|
130
|
+
block = SFT_STARTUP_BASE_SECONDS + SFT_STARTUP_SECONDS_PER_PARAM_B * params_b
|
|
131
|
+
return block + SFT_STEP_FLOOR_SECONDS * max(0, steps)
|
|
132
|
+
|
|
90
133
|
|
|
91
134
|
def _step_floor_seconds_for(config: RunConfig, gpu: str) -> float:
|
|
92
135
|
"""Step-floor seconds ``config`` pays on ``gpu``; 0 for sft, which runs no rollout."""
|
|
@@ -814,12 +857,16 @@ def estimate_cost(
|
|
|
814
857
|
# training GPU time, so it belongs in the (billed) train term, not setup. Required saves are also
|
|
815
858
|
# synchronous fixed overhead; neither is divided by the number of cards.
|
|
816
859
|
compile_s = compile_seconds(config, gpu)
|
|
817
|
-
|
|
860
|
+
# sft pays a startup block and per-step floor inside its BILLED train wall that the flops term
|
|
861
|
+
# does not model (see sft_overhead_seconds); grpo/opd carry the equivalent in their step floor.
|
|
862
|
+
sft_overhead_s = sft_overhead_seconds(config, config.steps) if config.method == "sft" else 0.0
|
|
863
|
+
raw_train = compile_s + config.steps * sps + required_save_s + sft_overhead_s
|
|
818
864
|
if not config.is_grpo and config.train_tokens is not None:
|
|
819
865
|
raw_train = (
|
|
820
866
|
compile_s
|
|
821
867
|
+ sft_seconds_for_tokens(config, gpu, config.train_tokens) / speedup
|
|
822
868
|
+ required_save_s
|
|
869
|
+
+ sft_overhead_s
|
|
823
870
|
)
|
|
824
871
|
sps = raw_train / config.steps
|
|
825
872
|
|
|
@@ -142,20 +142,20 @@ def heartbeat(
|
|
|
142
142
|
stage: str, *, liveness: bool = False, force: bool = False, initial: bool = False, **kw
|
|
143
143
|
):
|
|
144
144
|
global _HB_CLAIM_SEQ
|
|
145
|
-
|
|
146
|
-
# liveness pings don't count as progress; provider stall detection skips them.
|
|
147
|
-
if not liveness:
|
|
148
|
-
_w._HB_LAST_PROGRESS_TS = ts
|
|
145
|
+
genuine_progress = not liveness
|
|
149
146
|
with _HB_LOCK:
|
|
150
|
-
|
|
147
|
+
ts = time.time()
|
|
148
|
+
if genuine_progress:
|
|
149
|
+
_w._HB_LAST_PROGRESS_TS = ts
|
|
151
150
|
_w._HB_PROGRESS_SEQ += 1
|
|
152
151
|
elif _w._HB_PROGRESS_SEQ > _w._HB_PROGRESS_UPLOADED_SEQ:
|
|
153
152
|
# progress-carry: a real heartbeat since the last committed snapshot never reached HF
|
|
154
153
|
# (throttled away or its upload failed). upgrade this ping to a real heartbeat so the
|
|
155
154
|
# control plane's stall clock sees that progress instead of killing a healthy run.
|
|
156
|
-
#
|
|
157
|
-
#
|
|
155
|
+
# carried progress is not new progress, so do not advance _HB_LAST_PROGRESS_TS: the
|
|
156
|
+
# worker's own stall-dump timer and the published age keep the original reference point.
|
|
158
157
|
liveness = False
|
|
158
|
+
latest_progress_ts = float(_w._HB_LAST_PROGRESS_TS or 0.0)
|
|
159
159
|
my_progress_seq = _w._HB_PROGRESS_SEQ
|
|
160
160
|
payload = {
|
|
161
161
|
"stage": stage,
|
|
@@ -167,6 +167,12 @@ def heartbeat(
|
|
|
167
167
|
**({"liveness": True} if liveness else {}),
|
|
168
168
|
**kw,
|
|
169
169
|
}
|
|
170
|
+
if genuine_progress:
|
|
171
|
+
payload["progress_age_s"] = 0.0
|
|
172
|
+
elif latest_progress_ts:
|
|
173
|
+
payload["progress_age_s"] = round(max(0.0, ts - latest_progress_ts), 1)
|
|
174
|
+
else:
|
|
175
|
+
payload.pop("progress_age_s", None)
|
|
170
176
|
_dc = os.environ.get("RUNPOD_DC_ID") or ""
|
|
171
177
|
if _dc:
|
|
172
178
|
payload.setdefault("dc", _dc)
|
{freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/opd_train_runner.py
RENAMED
|
@@ -16,6 +16,9 @@ from typing import Any
|
|
|
16
16
|
|
|
17
17
|
from flash.engine.plan.steps import rl_data_parallel_cards
|
|
18
18
|
from flash.engine.worker import opd_train as _opd_train
|
|
19
|
+
from flash.engine.worker.train.opd.reporting import (
|
|
20
|
+
_build_train_note_sections as _build_train_note_sections,
|
|
21
|
+
)
|
|
19
22
|
from flash.engine.worker.verl.child_io import (
|
|
20
23
|
LORA_ROLLOUT_GUARD_SHIM,
|
|
21
24
|
render_lora_rollout_guard_fragment,
|
|
@@ -921,80 +924,3 @@ def _export_and_upload_adapter(
|
|
|
921
924
|
)
|
|
922
925
|
_opd_train._w.hf_upload_folder(adapter_dir, "adapter", required=True)
|
|
923
926
|
return adapter_dir
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
def _build_train_note_sections(
|
|
927
|
-
request: _OpdRequest,
|
|
928
|
-
prompt_state: _PromptState,
|
|
929
|
-
workload: _WorkloadState,
|
|
930
|
-
runtime: _RuntimeState,
|
|
931
|
-
result: _ChildResult,
|
|
932
|
-
download_seconds: float,
|
|
933
|
-
) -> tuple[
|
|
934
|
-
dict[str, Any],
|
|
935
|
-
dict[str, Any],
|
|
936
|
-
dict[str, Any],
|
|
937
|
-
tuple[dict[str, Any], dict[str, Any]],
|
|
938
|
-
]:
|
|
939
|
-
final_accounting = result.final_accounting
|
|
940
|
-
knobs = request.knobs
|
|
941
|
-
initial = {
|
|
942
|
-
"epochs": knobs.epochs,
|
|
943
|
-
"retained_prompts": len(prompt_state.prompts),
|
|
944
|
-
"dropped_long_prompts": prompt_state.dropped_long,
|
|
945
|
-
"method": "gkd",
|
|
946
|
-
"init_from_adapter": request.spec.train.init_from_adapter or None,
|
|
947
|
-
"teacher_model": knobs.teacher_model,
|
|
948
|
-
"download_seconds": download_seconds,
|
|
949
|
-
"thinking": _opd_train._w.THINKING,
|
|
950
|
-
"loss_curve": final_accounting["loss_curve"],
|
|
951
|
-
"mean_coverage": (
|
|
952
|
-
float(final_accounting["coverage_sum"]) / int(final_accounting["aligned_sequences"])
|
|
953
|
-
if final_accounting["aligned_sequences"]
|
|
954
|
-
else 0.0
|
|
955
|
-
),
|
|
956
|
-
}
|
|
957
|
-
accounting = {
|
|
958
|
-
"truncated_rollouts": int(final_accounting["truncated_rollouts"]),
|
|
959
|
-
"forced_tokens": int(final_accounting["forced_tokens"]),
|
|
960
|
-
"dropped_forced_groups": int(final_accounting["dropped_forced_groups"]),
|
|
961
|
-
"teacher_input_tokens": int(final_accounting["teacher_input_tokens"]),
|
|
962
|
-
"teacher_output_tokens": int(final_accounting["teacher_output_tokens"]),
|
|
963
|
-
"aligned_sequences": int(final_accounting["aligned_sequences"]),
|
|
964
|
-
"empty_alignments": int(final_accounting["empty_alignments"]),
|
|
965
|
-
"teacher_ok": int(final_accounting["teacher_ok"]),
|
|
966
|
-
}
|
|
967
|
-
training = {
|
|
968
|
-
"temperature": knobs.temperature,
|
|
969
|
-
"group_size": knobs.group_size,
|
|
970
|
-
"prompts_per_step": workload.prompts_per_step,
|
|
971
|
-
"max_completion_len": knobs.max_completion,
|
|
972
|
-
"multi_turn": request.multi_turn,
|
|
973
|
-
"max_turns": request.max_turns if request.multi_turn else None,
|
|
974
|
-
"episodes": int(final_accounting["episodes_seen"]) if request.multi_turn else None,
|
|
975
|
-
"mean_turns_per_episode": (
|
|
976
|
-
int(final_accounting["mt_turn_records"]) / int(final_accounting["episodes_seen"])
|
|
977
|
-
if request.multi_turn and final_accounting["episodes_seen"]
|
|
978
|
-
else None
|
|
979
|
-
),
|
|
980
|
-
}
|
|
981
|
-
backend = (
|
|
982
|
-
{
|
|
983
|
-
"rollout_backend": "verl_vllm",
|
|
984
|
-
"verl_version": "0.8.0",
|
|
985
|
-
"verl_backend": "fsdp",
|
|
986
|
-
# report the EXECUTED width, not the allocation: the card count here would claim a
|
|
987
|
-
# sequence-parallel run that did not happen. token-balanced batching makes every
|
|
988
|
-
# allocated rank a dp rank, so unlike sft the executed dp width IS the card count.
|
|
989
|
-
"ulysses_sequence_parallel_size": ULYSSES_SEQUENCE_PARALLEL_SIZE,
|
|
990
|
-
"data_parallel_size": runtime.gpu_count,
|
|
991
|
-
},
|
|
992
|
-
{
|
|
993
|
-
"peak_gpu_gb": result.peak_gpu_gb,
|
|
994
|
-
"warm_started": bool(workload.warmstart_adapter),
|
|
995
|
-
"resumed": bool(runtime.resume_step),
|
|
996
|
-
"wandb_project": runtime.project_name if "wandb" in runtime.loggers else None,
|
|
997
|
-
"wandb_run_name": runtime.experiment_name if "wandb" in runtime.loggers else None,
|
|
998
|
-
},
|
|
999
|
-
)
|
|
1000
|
-
return initial, accounting, training, backend
|
{freesolo_flash_dev-1.2.14 → freesolo_flash_dev-1.2.22}/flash/engine/worker/rl_train_runner.py
RENAMED
|
@@ -46,11 +46,13 @@ from flash.engine.worker.train.rl.multi_turn import (
|
|
|
46
46
|
start_reward_server,
|
|
47
47
|
)
|
|
48
48
|
from flash.engine.worker.train.rl.shims import (
|
|
49
|
+
render_deferred_patch_runtime,
|
|
49
50
|
render_entropy_quantile_shim,
|
|
50
51
|
render_exact_save_steps_shim,
|
|
51
52
|
render_image_pad_ban_shim,
|
|
52
53
|
render_kl_ref_adapter_shim,
|
|
53
54
|
render_per_turn_credit_shim,
|
|
55
|
+
render_rank_device_assert_shim,
|
|
54
56
|
render_reentrant_checkpointing_shim,
|
|
55
57
|
render_reward_module,
|
|
56
58
|
render_stop_sequences_shim,
|
|
@@ -178,6 +180,12 @@ def _prepare_rl_files(inp, prompts):
|
|
|
178
180
|
shim_markers = shim_marker_file(shim_dir)
|
|
179
181
|
if os.path.exists(shim_markers):
|
|
180
182
|
os.remove(shim_markers)
|
|
183
|
+
# where each rank records the gpu uuid it opened, so a collision is caught before nccl init.
|
|
184
|
+
# removed for the same reason as the marker file: a stale one from a prior attempt would show
|
|
185
|
+
# ranks claiming devices this attempt never touched, and read as a collision that is not there.
|
|
186
|
+
rank_device_claims = os.path.join(shim_dir, "rank_device_claims.txt")
|
|
187
|
+
if os.path.exists(rank_device_claims):
|
|
188
|
+
os.remove(rank_device_claims)
|
|
181
189
|
return {
|
|
182
190
|
"rollout_examples": rollout_examples,
|
|
183
191
|
"message_prompts": message_prompts,
|
|
@@ -190,6 +198,7 @@ def _prepare_rl_files(inp, prompts):
|
|
|
190
198
|
"shim_dir": shim_dir,
|
|
191
199
|
"shim_py": os.path.join(shim_dir, "sitecustomize.py"),
|
|
192
200
|
"shim_markers": shim_markers,
|
|
201
|
+
"rank_device_claims": rank_device_claims,
|
|
193
202
|
}
|
|
194
203
|
|
|
195
204
|
|
|
@@ -204,6 +213,9 @@ def _write_rl_shim(inp, files) -> list[str]:
|
|
|
204
213
|
# loaded. each feature renderer returns "" when its feature is off; the tf32 fragment is
|
|
205
214
|
# unconditional, so this source is never empty.
|
|
206
215
|
required_fragments = [
|
|
216
|
+
# first, so a collapsed rank->device map is reported before any other patch runs and long
|
|
217
|
+
# before the model load that currently hides it. inert at one card.
|
|
218
|
+
("rank-device-assert", render_rank_device_assert_shim(int(inp["dp_cards"]))),
|
|
207
219
|
(
|
|
208
220
|
"reentrant-checkpointing",
|
|
209
221
|
render_reentrant_checkpointing_shim(
|
|
@@ -238,7 +250,20 @@ def _write_rl_shim(inp, files) -> list[str]:
|
|
|
238
250
|
# into this process there is nothing left to fix.
|
|
239
251
|
render_tilelang_cudart_shim(),
|
|
240
252
|
render_shim_marker_prologue(files["shim_markers"]),
|
|
241
|
-
|
|
253
|
+
# above every wrapped fragment: each one registers with this registry rather than
|
|
254
|
+
# importing verl at startup, which is what keeps ray free to pin each rank to its own
|
|
255
|
+
# card (see train/rl/shims.render_deferred_patch_runtime). unwrapped -- it only defines
|
|
256
|
+
# the registry and touches no cuda, so there is no patch here that could fail open.
|
|
257
|
+
render_deferred_patch_runtime(),
|
|
258
|
+
# every fragment above defers its patch to the import of the module it targets, so this
|
|
259
|
+
# wrapper now spans only the registration. a marker written here would prove a callback
|
|
260
|
+
# was queued, not that the patch ran, and the parent's verify_applied_shim_markers would
|
|
261
|
+
# pass for a child training unpatched. each deferred body records its own name once the
|
|
262
|
+
# patch is actually installed.
|
|
263
|
+
*(
|
|
264
|
+
wrap_shim_fragment(name, source, record_immediately=False)
|
|
265
|
+
for name, source in required_fragments
|
|
266
|
+
),
|
|
242
267
|
# unconditional: every flash rollout is a lora rollout, and a base-model fallback is
|
|
243
268
|
# indistinguishable from a working run in the metrics.
|
|
244
269
|
render_lora_rollout_guard_fragment(),
|
|
@@ -405,6 +430,10 @@ def _build_rl_child_env(inp, files, loggers, reward_url):
|
|
|
405
430
|
shim_dir=files["shim_dir"], wandb_enabled="wandb" in loggers
|
|
406
431
|
)
|
|
407
432
|
env_for_verl["FLASH_VERL_REWARD_URL"] = reward_url
|
|
433
|
+
# where each rank records the gpu it opened. ray fans this env to every actor, which is what
|
|
434
|
+
# makes the file a rendezvous point: the check needs to compare ranks that have no process
|
|
435
|
+
# group yet (see render_rank_device_assert_shim).
|
|
436
|
+
env_for_verl["FLASH_RANK_DEVICE_CLAIMS"] = files["rank_device_claims"]
|
|
408
437
|
# the model is prefetched above; keep the subprocess off hf's rate-limited api.
|
|
409
438
|
env_for_verl["HF_HUB_OFFLINE"] = "1"
|
|
410
439
|
env_for_verl["TRANSFORMERS_OFFLINE"] = "1"
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"""training metadata reporting helpers for opd."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING, Any
|
|
6
|
+
|
|
7
|
+
from flash.engine.worker.runtime.pkg_proxy import W as _w
|
|
8
|
+
from flash.engine.worker.verl.parallelism import ULYSSES_SEQUENCE_PARALLEL_SIZE
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from flash.engine.worker.opd_train_runner import (
|
|
12
|
+
_ChildResult,
|
|
13
|
+
_OpdRequest,
|
|
14
|
+
_PromptState,
|
|
15
|
+
_RuntimeState,
|
|
16
|
+
_WorkloadState,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _build_train_note_sections(
|
|
21
|
+
request: _OpdRequest,
|
|
22
|
+
prompt_state: _PromptState,
|
|
23
|
+
workload: _WorkloadState,
|
|
24
|
+
runtime: _RuntimeState,
|
|
25
|
+
result: _ChildResult,
|
|
26
|
+
download_seconds: float,
|
|
27
|
+
) -> tuple[
|
|
28
|
+
dict[str, Any],
|
|
29
|
+
dict[str, Any],
|
|
30
|
+
dict[str, Any],
|
|
31
|
+
tuple[dict[str, Any], dict[str, Any]],
|
|
32
|
+
]:
|
|
33
|
+
final_accounting = result.final_accounting
|
|
34
|
+
knobs = request.knobs
|
|
35
|
+
initial = {
|
|
36
|
+
"epochs": knobs.epochs,
|
|
37
|
+
"retained_prompts": len(prompt_state.prompts),
|
|
38
|
+
"dropped_long_prompts": prompt_state.dropped_long,
|
|
39
|
+
"method": "gkd",
|
|
40
|
+
"init_from_adapter": request.spec.train.init_from_adapter or None,
|
|
41
|
+
"teacher_model": knobs.teacher_model,
|
|
42
|
+
"download_seconds": download_seconds,
|
|
43
|
+
"thinking": _w.THINKING,
|
|
44
|
+
"loss_curve": final_accounting["loss_curve"],
|
|
45
|
+
"mean_coverage": (
|
|
46
|
+
float(final_accounting["coverage_sum"]) / int(final_accounting["aligned_sequences"])
|
|
47
|
+
if final_accounting["aligned_sequences"]
|
|
48
|
+
else 0.0
|
|
49
|
+
),
|
|
50
|
+
}
|
|
51
|
+
accounting = {
|
|
52
|
+
"truncated_rollouts": int(final_accounting["truncated_rollouts"]),
|
|
53
|
+
"forced_tokens": int(final_accounting["forced_tokens"]),
|
|
54
|
+
"dropped_forced_groups": int(final_accounting["dropped_forced_groups"]),
|
|
55
|
+
"teacher_input_tokens": int(final_accounting["teacher_input_tokens"]),
|
|
56
|
+
"teacher_output_tokens": int(final_accounting["teacher_output_tokens"]),
|
|
57
|
+
"aligned_sequences": int(final_accounting["aligned_sequences"]),
|
|
58
|
+
"empty_alignments": int(final_accounting["empty_alignments"]),
|
|
59
|
+
"teacher_ok": int(final_accounting["teacher_ok"]),
|
|
60
|
+
}
|
|
61
|
+
training = {
|
|
62
|
+
"temperature": knobs.temperature,
|
|
63
|
+
"group_size": knobs.group_size,
|
|
64
|
+
"prompts_per_step": workload.prompts_per_step,
|
|
65
|
+
"max_completion_len": knobs.max_completion,
|
|
66
|
+
"multi_turn": request.multi_turn,
|
|
67
|
+
"max_turns": request.max_turns if request.multi_turn else None,
|
|
68
|
+
"episodes": int(final_accounting["episodes_seen"]) if request.multi_turn else None,
|
|
69
|
+
"mean_turns_per_episode": (
|
|
70
|
+
int(final_accounting["mt_turn_records"]) / int(final_accounting["episodes_seen"])
|
|
71
|
+
if request.multi_turn and final_accounting["episodes_seen"]
|
|
72
|
+
else None
|
|
73
|
+
),
|
|
74
|
+
}
|
|
75
|
+
backend = (
|
|
76
|
+
{
|
|
77
|
+
"rollout_backend": "verl_vllm",
|
|
78
|
+
"verl_version": "0.8.0",
|
|
79
|
+
"verl_backend": "fsdp",
|
|
80
|
+
# report the executed width, not the allocation: the card count here would claim a
|
|
81
|
+
# sequence-parallel run that did not happen. token-balanced batching makes every
|
|
82
|
+
# allocated rank a dp rank, so unlike sft the executed dp width is the card count.
|
|
83
|
+
"ulysses_sequence_parallel_size": ULYSSES_SEQUENCE_PARALLEL_SIZE,
|
|
84
|
+
"data_parallel_size": runtime.gpu_count,
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"peak_gpu_gb": result.peak_gpu_gb,
|
|
88
|
+
"warm_started": bool(workload.warmstart_adapter),
|
|
89
|
+
"resumed": bool(runtime.resume_step),
|
|
90
|
+
"wandb_project": runtime.project_name if "wandb" in runtime.loggers else None,
|
|
91
|
+
"wandb_run_name": runtime.experiment_name if "wandb" in runtime.loggers else None,
|
|
92
|
+
},
|
|
93
|
+
)
|
|
94
|
+
return initial, accounting, training, backend
|