freesolo-flash-dev 1.2.22__tar.gz → 1.2.28__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.22 → freesolo_flash_dev-1.2.28}/PKG-INFO +1 -1
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/ui/heartbeat.py +61 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/io/heartbeat.py +13 -6
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/opd_train_runner.py +8 -87
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/rl_train.py +6 -2
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/rl_train_runner.py +25 -10
- freesolo_flash_dev-1.2.28/flash/engine/worker/train/core/step_timing.py +62 -0
- freesolo_flash_dev-1.2.28/flash/engine/worker/train/opd/state.py +92 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/job_execution.py +15 -1
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/pyproject.toml +2 -2
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_jobs.py +148 -2
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_rl_train.py +3 -2
- freesolo_flash_dev-1.2.28/tests/test_step_timing.py +389 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/uv.lock +1 -1
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.dockerignore +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.env.example +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/CODEOWNERS +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/dependabot.yml +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/workflows/auto-rebake.yml +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/workflows/bake-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/workflows/ci.yml +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/workflows/main-source-guard.yml +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/workflows/notify-tests-repo.yml +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/workflows/publish-dev.yml +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/workflows/publish-image.yml +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/workflows/publish.yml +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/workflows/version-parity.yml +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/workflows/worker-image.yml +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.gitignore +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/CHANGELOG.md +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/CODE_OF_CONDUCT.md +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/CONTRIBUTING.md +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/Dockerfile +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/Dockerfile.worker +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/LICENSE +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/NOTICE +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/README.md +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/SECURITY.md +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/SELF_HOSTING.md +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/build/kernel_cache/.gitignore +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/build/kernel_cache/.keep +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/deploy/infisical/README.md +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/deploy/infisical/entrypoint.sh +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/docker/Dockerfile.kernelcache +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/docker/Dockerfile.kernelcache.relayer +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/docker/bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/docker/bake_pod_entry.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/docker/extract_cudart_fix.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/docker/kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/docker/make_rp_handler.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/_internal/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/_internal/channel.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/_internal/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/_internal/fileio.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/_internal/logging.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/_internal/paths.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/adapters/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/adapters/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/adapters/lora_rank.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/__main__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/deploy.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/episode.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/eval.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/eval_args.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/imports.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/list.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/push.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/retained.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/setup.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/test.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/test_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/test_params.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/test_warnings.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/traces.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/train_cost.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/scaffold/TRAINING.md +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/scaffold/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/ui/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/ui/cost.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/ui/env_panels.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/ui/render.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/ui/tables.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/ui/tty.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/client/config.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/client/freesolo_api.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/client/http.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/client/runtime_secrets.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/client/shapes.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/client/specs.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/client/streaming.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/content/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/content/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/content/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/content/thinking.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/core/catalog.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/core/spec.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cost/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cost/analytical.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cost/facts.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cost/spec.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cost/types.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/plan/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/plan/kv_sizing.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/plan/model_config_probe.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/plan/recipe.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/plan/steps.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/plan/vram.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/profiling/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/profiling/dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/profiling/reasoning_render.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/profiling/sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/profiling/tokenizer.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/profiling/workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/result/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/result/accounting.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/result/rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/__main__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/backend_common.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/entry/opd.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/entry/rl.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/entry/sft.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/io/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/io/hf.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/io/prefetch.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/io/wandb_log.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/model/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/model/adapter.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/model/decoding.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/model/lora.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/model/packing.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/opd_train.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/perf/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/perf/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/perf/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/perf/liger.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/perf/memory.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/runtime/rng.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/score_batcher.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/sft_train.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/sft_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/teacher/client.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/teacher/encoding.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/core/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/core/child/glue.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/finalize.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/batching.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/bridge.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/child/bridge.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/child/structured.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/failures.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/gkd.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/overrides.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/prompts.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/reporting.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/scoring.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/validation.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/config.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/inputs.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/multi_turn.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/scoring.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/shims.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/single_turn.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/verl_config.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/sft/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/sft/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/sft/config.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/verl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/verl/capabilities.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/verl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/verl/child_io.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/verl/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/verl/parallelism.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker_entrypoint.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/adapter.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/base.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/cache_security.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/dataset_selection.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/evaluations.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/identity.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/loader.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/namespace_listing.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/package/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/package/limits.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/package/unpack.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/pull.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/auth.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/bootstrap.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/deadline.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/http.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/instance.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/poll.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/poll_instance.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/provider.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/worker.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/allocator.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/artifacts/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/artifacts/hf.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/artifacts/preload_runpod.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/artifacts/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/base.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/fit_errors.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/lambda_/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/lambda_/api.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/lambda_/auth.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/lambda_/gpus.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/lambda_/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/lambda_/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/lambda_/jobs/reap.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/lambda_/preflight.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/lambda_/pricing.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/preflight.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/realized.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/api.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/auth.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/cost.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/gpus.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/jobs.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/preflight.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/pricing.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/resources.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/serverless/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/serverless/endpoints.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/sharding.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/vast/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/vast/api.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/vast/auth.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/vast/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/vast/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/vast/preflight.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/vast/pricing.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/py.typed +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/attempts.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/costs.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/deadlines.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/preparation.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/reconciliation.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/results/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/results/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/results/verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/status.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/submit.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/supervise/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/supervise/attach.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/supervise/deploy.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/supervise/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/supervise/recovery.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/supervise/retry_decision.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/supervise/seed_submission.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/supervise/transitions.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/schema/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/schema/fields.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/serve/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/serve/adapter_check.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/serve/deploy.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/serve/errors.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/serve/export.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/serve/preflight.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/serve/responses.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/serve/streaming.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/serve/thinking.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/serve/urls.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/__main__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/app.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/billing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/billing/charges.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/billing/retry.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/domain/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/domain/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/domain/environment_registry.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/domain/envs.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/domain/projects.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/domain/reconcile.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/domain/repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/domain/run_registry.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/domain/teacher_broker.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/domain/teacher_errors.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/domain/teacher_requests.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/platform/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/platform/auth.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/platform/db.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/platform/deps.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/platform/internal_client.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/platform/locks.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/platform/runtime.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/routes/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/routes/envs.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/routes/meta.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/routes/runs.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/routes/serving.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/routes/serving_completion.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/routes/serving_revisions.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/routes/serving_smoke.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/routes/teacher.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/teacher/limits.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/teacher/retry_contract.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/scripts/build_dev_dist.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/scripts/check_file_size.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/scripts/check_function_size.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/scripts/check_verl_pin_exists.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/scripts/scrub_history.sh +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/_helpers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/_helpers/profile.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/_helpers/runner.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/_helpers/specs.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/_helpers/teacher.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/_helpers/vast.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/conftest.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/fixtures/math_eval.jsonl +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/fixtures/math_train.jsonl +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/live/__init__.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/live/conftest.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/live/test_lambda_live.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/live/test_runpod_live.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/live/test_sft_thinking_render_live.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/live/test_vast_live.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_accounting_coverage.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_adapter_shard_completeness.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_agent_flash_cli_contract.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_algorithms.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_allocator.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_backend_common.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_backend_jobspec_contract.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_base_model_provenance.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_billing_retry.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_build_context_contract.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cancel_remote.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_catalog_consistency.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_catalog_only_models.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_charge_pricing.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_commands.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_commands_coverage.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_credential_shadowing.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_errors.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_estimate.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_gpus_flag.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_help.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_main_coverage.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_managed.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_render_coverage.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_render_theme.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_traces.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_wandb_warning.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_client.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_client_import_purity.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_client_server_integration.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_client_stream_reads.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_config_env_vars.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_config_overrides.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_controlled_experiment_repairs.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cost_analytical.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cost_equation.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cost_estimate.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cost_hardware.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cost_models.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_deploy_latency.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_dev_channel.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_disk_gb.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_endpoint_name.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_cache_evict.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_delete.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_download.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_download_api.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_list_api.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_list_cli.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_list_hub.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_no_install.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_publish.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_pull.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_pull_coverage.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_pull_loader_coverage.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_pull_managed_control_plane.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_push.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_rate_limit_resolve.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_ref_pinning.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_test.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_export.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_flash_mvp.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_flash_worker.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_flashinfer_cache_dirs.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_freesolo_api_transport.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_github_urlopen_retry.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_gpu_type_single_field.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_gpus.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_grpo_params.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_grpo_resident_sizing.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_grpo_reward_batching.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_health_liveness.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_hf_retry.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_idle_endpoint_reaper.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_infisical_secrets.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_instance_bootstrap_coverage.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_internal_client.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_kv_util.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_lambda_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_lambda_runner.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_logging.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_login_perms.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_lora_rank_coverage.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_lora_rank_preflight.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_managed_config_fields.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_managed_hf_repo.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_metrics_schema_agent_contract.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_mig_guard.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_multi_gpu_gate.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_multimodal_training.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_named_reward_metrics.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_oom_escalate_gpu.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_opd.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_opd_limits.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_opd_multiturn_eos_boundary.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_opd_resume_safety.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_opd_train.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_orchestrator_flash.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_packing.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_packing_coverage.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_parasail_teacher.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_poll_helpers.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_preflight.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_projects.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_provider_preflight_coverage.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_provider_routing.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_provider_teardown_robustness.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_providers_symmetry.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_realized_cost.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_resolve_params_b.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_resume_on_retry.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_runmgmt.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_runpod_api_delete.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_runpod_key_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_runpod_key_waterfall.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_serve.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_serve_reasoning_content.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_server_api.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_server_app_coverage.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_server_auth_singleflight.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_server_billing.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_server_checkpoints_coverage.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_server_db.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_server_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_server_locks_coverage.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_server_standalone.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_serving_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_serving_contract.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_serving_schema_coverage.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_sft_chunked_nll.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_sft_example_selection.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_sft_gc_off.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_sft_max_context.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_sft_startup_block.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_sft_train.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_spec_and_validation.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_step_floor.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_step_metrics.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_teacher_broker.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_teacher_encoding_contract.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_thinking_config.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_train_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_training_controls.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_type_comment_prose.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_vast_api.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_vast_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_vast_offers.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_vast_provider_coverage.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_vast_runner.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_verifiers.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_version.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_vl_warmstart_adapter_keys.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_vram_architecture.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_wandb_link.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_wandb_naming.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_warmstart_adapter_download.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_warmstart_cross_repo.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_warmstart_error_attribution.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_worker_dryrun.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_worker_hardexit.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_worker_image.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_worker_init_heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_worker_stack.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_worker_thinking.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_workflow_contracts.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/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.28
|
|
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
|
|
@@ -332,6 +332,60 @@ def _superseded_hint(
|
|
|
332
332
|
)
|
|
333
333
|
|
|
334
334
|
|
|
335
|
+
def _finite_positive(value: object) -> float | None:
|
|
336
|
+
"""return a finite positive number from an untrusted heartbeat field."""
|
|
337
|
+
if isinstance(value, bool) or not isinstance(value, (int, float)):
|
|
338
|
+
return None
|
|
339
|
+
try:
|
|
340
|
+
number = float(value)
|
|
341
|
+
except OverflowError:
|
|
342
|
+
return None
|
|
343
|
+
return number if number > 0 and math.isfinite(number) else None
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
def _humanize_duration(seconds: float) -> str:
|
|
347
|
+
if seconds < 90:
|
|
348
|
+
return f"{seconds:.0f}s"
|
|
349
|
+
if seconds < 5400:
|
|
350
|
+
return f"{seconds / 60:.0f}m"
|
|
351
|
+
return f"{seconds / 3600:.1f}h"
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
def _humanize_step_duration(seconds: float) -> str:
|
|
355
|
+
if seconds < 10:
|
|
356
|
+
return f"{seconds:.1f}s"
|
|
357
|
+
if seconds < 600:
|
|
358
|
+
return f"{seconds:.0f}s"
|
|
359
|
+
return f"{seconds / 60:.1f}m"
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
def _step_timing_pairs(
|
|
363
|
+
heartbeat: dict,
|
|
364
|
+
*,
|
|
365
|
+
running: bool,
|
|
366
|
+
current_attempt: bool,
|
|
367
|
+
) -> list[tuple[str, str]]:
|
|
368
|
+
"""render measured RL pace only for the live running attempt."""
|
|
369
|
+
if not running or not current_attempt or heartbeat.get("stage") != "rl_step":
|
|
370
|
+
return []
|
|
371
|
+
step_duration_s = _finite_positive(heartbeat.get("step_duration_s"))
|
|
372
|
+
if step_duration_s is None:
|
|
373
|
+
return []
|
|
374
|
+
|
|
375
|
+
projected_remaining_s = _finite_positive(heartbeat.get("projected_remaining_s"))
|
|
376
|
+
pairs = [("median pace", f"{_humanize_step_duration(step_duration_s)}/step")]
|
|
377
|
+
if projected_remaining_s is not None:
|
|
378
|
+
pairs.append(("mean ETA", f"~{_humanize_duration(projected_remaining_s)} left"))
|
|
379
|
+
if heartbeat.get("wall_deadline_at_risk") is True and projected_remaining_s is not None:
|
|
380
|
+
pairs.append(
|
|
381
|
+
(
|
|
382
|
+
"warning",
|
|
383
|
+
"mean-based remaining-time projection exceeds the run's wall time left",
|
|
384
|
+
)
|
|
385
|
+
)
|
|
386
|
+
return pairs
|
|
387
|
+
|
|
388
|
+
|
|
335
389
|
def _heartbeat_pairs(obj: dict) -> list[tuple[str, str]]:
|
|
336
390
|
"""Worker heartbeat rows for the status panel: stage, step, age, and a quiet-is-normal hint."""
|
|
337
391
|
hb = obj.get("last_heartbeat")
|
|
@@ -363,6 +417,13 @@ def _heartbeat_pairs(obj: dict) -> list[tuple[str, str]]:
|
|
|
363
417
|
if datacenter:
|
|
364
418
|
label = "datacenter" if from_current_attempt else "datacenter (previous attempt)"
|
|
365
419
|
pairs.append((label, str(datacenter)[:64]))
|
|
420
|
+
pairs.extend(
|
|
421
|
+
_step_timing_pairs(
|
|
422
|
+
hb,
|
|
423
|
+
running=running,
|
|
424
|
+
current_attempt=from_current_attempt,
|
|
425
|
+
)
|
|
426
|
+
)
|
|
366
427
|
stale_step = _stale_step_hint(
|
|
367
428
|
hb,
|
|
368
429
|
heartbeat_age_seconds,
|
|
@@ -139,7 +139,13 @@ def _console_heartbeat_snapshot(payload: dict, payload_committed: bool = True) -
|
|
|
139
139
|
|
|
140
140
|
|
|
141
141
|
def heartbeat(
|
|
142
|
-
stage: str,
|
|
142
|
+
stage: str,
|
|
143
|
+
*,
|
|
144
|
+
liveness: bool = False,
|
|
145
|
+
force: bool = False,
|
|
146
|
+
initial: bool = False,
|
|
147
|
+
first_timing: bool = False,
|
|
148
|
+
**kw,
|
|
143
149
|
):
|
|
144
150
|
global _HB_CLAIM_SEQ
|
|
145
151
|
genuine_progress = not liveness
|
|
@@ -204,18 +210,19 @@ def heartbeat(
|
|
|
204
210
|
# requires a step advance, but a sample-bearing payload may match the committed step because
|
|
205
211
|
# the liveness daemon can commit that step first without the samples. the per-force floor still
|
|
206
212
|
# coalesces fast bursts to protect the hf commit cap, while an unrelated liveness commit does
|
|
207
|
-
# not arm the floor and therefore cannot suppress the first sample-bearing payload.
|
|
213
|
+
# not arm the floor and therefore cannot suppress the first sample-bearing payload. the first
|
|
214
|
+
# timing payload gets one dedicated floor bypass because the forced metrics-only payload just
|
|
215
|
+
# before it armed that clock; its caller retries this flag until the timing upload succeeds.
|
|
208
216
|
if force and not upload_due:
|
|
209
217
|
fstep = kw.get("step")
|
|
210
218
|
has_samples = bool(kw.get("sampled_completions"))
|
|
219
|
+
first_timing_due = first_timing and "step_duration_s" in kw
|
|
211
220
|
force_step_due = isinstance(fstep, (int, float)) and (
|
|
212
221
|
fstep > _w._HB_LAST_COMMITTED_STEP
|
|
213
222
|
or (has_samples and fstep == _w._HB_LAST_COMMITTED_STEP)
|
|
214
223
|
)
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
and (now - _w._HB_LAST_FORCED_UPLOAD) >= _w._HB_FORCE_MIN_INTERVAL_S
|
|
218
|
-
):
|
|
224
|
+
force_floor_due = (now - _w._HB_LAST_FORCED_UPLOAD) >= _w._HB_FORCE_MIN_INTERVAL_S
|
|
225
|
+
if force_step_due and (first_timing_due or force_floor_due):
|
|
219
226
|
upload_due = True
|
|
220
227
|
# the initial training snapshot must land before the shared throttle can hide it.
|
|
221
228
|
if initial:
|
{freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/opd_train_runner.py
RENAMED
|
@@ -10,7 +10,6 @@ import os
|
|
|
10
10
|
import random
|
|
11
11
|
import shutil
|
|
12
12
|
import time
|
|
13
|
-
from dataclasses import dataclass
|
|
14
13
|
from pathlib import Path
|
|
15
14
|
from typing import Any
|
|
16
15
|
|
|
@@ -19,6 +18,14 @@ from flash.engine.worker import opd_train as _opd_train
|
|
|
19
18
|
from flash.engine.worker.train.opd.reporting import (
|
|
20
19
|
_build_train_note_sections as _build_train_note_sections,
|
|
21
20
|
)
|
|
21
|
+
from flash.engine.worker.train.opd.state import (
|
|
22
|
+
_ChildCallbacks,
|
|
23
|
+
_ChildResult,
|
|
24
|
+
_OpdRequest,
|
|
25
|
+
_PromptState,
|
|
26
|
+
_RuntimeState,
|
|
27
|
+
_WorkloadState,
|
|
28
|
+
)
|
|
22
29
|
from flash.engine.worker.verl.child_io import (
|
|
23
30
|
LORA_ROLLOUT_GUARD_SHIM,
|
|
24
31
|
render_lora_rollout_guard_fragment,
|
|
@@ -29,92 +36,6 @@ from flash.engine.worker.verl.parallelism import (
|
|
|
29
36
|
)
|
|
30
37
|
|
|
31
38
|
|
|
32
|
-
@dataclass(frozen=True)
|
|
33
|
-
class _OpdRequest:
|
|
34
|
-
spec: Any
|
|
35
|
-
env: Any
|
|
36
|
-
multi_turn: bool
|
|
37
|
-
max_turns: int
|
|
38
|
-
knobs: Any
|
|
39
|
-
model_id: str
|
|
40
|
-
model_revision: str
|
|
41
|
-
structured_outputs: Any = None
|
|
42
|
-
model_vocab_size: int | None = None
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
@dataclass(frozen=True)
|
|
46
|
-
class _PromptState:
|
|
47
|
-
teacher: Any
|
|
48
|
-
tokenizer: Any
|
|
49
|
-
thinking_prefill: str
|
|
50
|
-
max_model_len: int
|
|
51
|
-
prompt_budget: int
|
|
52
|
-
prompts: list[Any]
|
|
53
|
-
dropped_long: int
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
@dataclass(frozen=True)
|
|
57
|
-
class _WorkloadState:
|
|
58
|
-
prompts_per_step: int
|
|
59
|
-
update_horizon: int
|
|
60
|
-
prompt_pool_fingerprint: str
|
|
61
|
-
workdir: str
|
|
62
|
-
shim_dir: str
|
|
63
|
-
local_dir: str
|
|
64
|
-
export_root: str
|
|
65
|
-
mutation_failure_path: str
|
|
66
|
-
score_delivery_failure_path: str
|
|
67
|
-
abandonment_failure_path: str
|
|
68
|
-
resample_failure_path: str
|
|
69
|
-
cycle_commit_failure_path: str
|
|
70
|
-
train_file: str
|
|
71
|
-
val_file: str
|
|
72
|
-
lora_rank: int
|
|
73
|
-
lora_alpha: int
|
|
74
|
-
target_modules: Any
|
|
75
|
-
warmstart_adapter: str | None
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
@dataclass(frozen=True)
|
|
79
|
-
class _RuntimeState:
|
|
80
|
-
python_bin: str
|
|
81
|
-
model_path: str
|
|
82
|
-
gpu_count: int
|
|
83
|
-
save_freq: int
|
|
84
|
-
loggers: list[str]
|
|
85
|
-
project_name: str
|
|
86
|
-
experiment_name: str
|
|
87
|
-
gdn_reset_arch: str | None
|
|
88
|
-
entry_path: str
|
|
89
|
-
reward_path: str
|
|
90
|
-
resume_step: int
|
|
91
|
-
resume_state: dict[str, Any] | None
|
|
92
|
-
bridge: Any
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
@dataclass(frozen=True)
|
|
96
|
-
class _ChildCallbacks:
|
|
97
|
-
on_line: Any
|
|
98
|
-
on_step: Any
|
|
99
|
-
child_heartbeat: Any
|
|
100
|
-
liveness_fields: Any
|
|
101
|
-
progress: dict[str, Any]
|
|
102
|
-
wandb_link: dict[str, str | None]
|
|
103
|
-
child_tail: Any
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
@dataclass(frozen=True)
|
|
107
|
-
class _ChildResult:
|
|
108
|
-
final_accounting: dict[str, Any]
|
|
109
|
-
actor_dir: str
|
|
110
|
-
final_step: int
|
|
111
|
-
train_wall: float
|
|
112
|
-
peak_gpu_gb: float
|
|
113
|
-
train_started_at: float
|
|
114
|
-
wandb_url: str | None
|
|
115
|
-
wandb_id: str | None
|
|
116
|
-
|
|
117
|
-
|
|
118
39
|
def _prepare_request(spec: Any) -> _OpdRequest:
|
|
119
40
|
env = _opd_train._w.require_active_env()
|
|
120
41
|
if getattr(env, "is_tool_env", False):
|
|
@@ -387,8 +387,11 @@ def run_rl_train():
|
|
|
387
387
|
return state.progress["step"]
|
|
388
388
|
|
|
389
389
|
def _reward_observability() -> dict:
|
|
390
|
-
"""return reward
|
|
391
|
-
return
|
|
390
|
+
"""return reward observability and measured pace for one heartbeat."""
|
|
391
|
+
return {
|
|
392
|
+
**reward_runtime.observability.heartbeat_fields(),
|
|
393
|
+
**_step_timing_fields(inp, state),
|
|
394
|
+
}
|
|
392
395
|
|
|
393
396
|
with liveness_heartbeat(
|
|
394
397
|
"rl_step",
|
|
@@ -491,6 +494,7 @@ from flash.engine.worker.rl_train_runner import ( # noqa: E402,F401
|
|
|
491
494
|
_RewardRuntime,
|
|
492
495
|
_start_resume_uploader,
|
|
493
496
|
_start_reward_runtime,
|
|
497
|
+
_step_timing_fields,
|
|
494
498
|
_StepMetricState,
|
|
495
499
|
_validate_rl_child,
|
|
496
500
|
_write_rl_shim,
|
{freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/rl_train_runner.py
RENAMED
|
@@ -39,6 +39,7 @@ from flash.engine.worker.io.heartbeat import (
|
|
|
39
39
|
)
|
|
40
40
|
from flash.engine.worker.perf import gpu_diagnostics, wait_for_gpu
|
|
41
41
|
from flash.engine.worker.runtime.pkg_proxy import W as _w
|
|
42
|
+
from flash.engine.worker.train.core.step_timing import StepTiming
|
|
42
43
|
from flash.engine.worker.train.rl.multi_turn import (
|
|
43
44
|
MultiTurnBridge,
|
|
44
45
|
copy_multi_turn_child_modules,
|
|
@@ -80,9 +81,10 @@ class _StepMetricState:
|
|
|
80
81
|
loss_curve: list[float] = field(default_factory=list)
|
|
81
82
|
adv_spread_history: list[float] = field(default_factory=list)
|
|
82
83
|
last_dump_step: list[int] = field(default_factory=lambda: [-1])
|
|
83
|
-
step_line_times: list[float] = field(default_factory=list)
|
|
84
84
|
metrics_last: list[dict] = field(default_factory=list)
|
|
85
|
+
step_timing: StepTiming = field(default_factory=StepTiming)
|
|
85
86
|
sent_first_metrics: bool = False
|
|
87
|
+
sent_first_timing: bool = False
|
|
86
88
|
|
|
87
89
|
|
|
88
90
|
@dataclass
|
|
@@ -455,16 +457,23 @@ def _build_rl_child_env(inp, files, loggers, reward_url):
|
|
|
455
457
|
return env_for_verl
|
|
456
458
|
|
|
457
459
|
|
|
460
|
+
def _step_timing_fields(inp, state: _StepMetricState) -> dict:
|
|
461
|
+
return state.step_timing.heartbeat_fields(
|
|
462
|
+
current_step=state.progress["step"],
|
|
463
|
+
total_steps=int(inp["steps"]),
|
|
464
|
+
remaining_wall_s=_w._remaining_worker_wall_seconds(),
|
|
465
|
+
)
|
|
466
|
+
|
|
467
|
+
|
|
458
468
|
def _ingest_step_metrics(
|
|
459
469
|
line: str,
|
|
460
470
|
inp,
|
|
461
471
|
state: _StepMetricState,
|
|
462
472
|
_reward_observability: Callable[[], dict],
|
|
463
473
|
) -> None:
|
|
464
|
-
sent_first_metrics = state.sent_first_metrics
|
|
465
474
|
step_metrics = parse_verl_step_metrics(line)
|
|
466
475
|
if step_metrics is not None:
|
|
467
|
-
state.
|
|
476
|
+
state.step_timing.record_duration(parse_verl_metric(line, "timing_s/step"))
|
|
468
477
|
# a run constant rather than a verl metric, so it is stamped here from
|
|
469
478
|
# the resolved run config.
|
|
470
479
|
step_metrics["max_completion_tokens"] = inp["max_completion"]
|
|
@@ -472,19 +481,25 @@ def _ingest_step_metrics(
|
|
|
472
481
|
# the worker's error path reads this global, so a run that dies mid-training
|
|
473
482
|
# still reports the steps it did complete (worker/__init__.py:_err_metrics).
|
|
474
483
|
LATEST_GRPO_METRICS_LAST[:] = state.metrics_last
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
#
|
|
478
|
-
|
|
479
|
-
|
|
484
|
+
heartbeat_fields = _reward_observability()
|
|
485
|
+
has_step_timing = "step_duration_s" in heartbeat_fields
|
|
486
|
+
# rl_train_start arms a 900s throttle, so force until both the first backlog and the first
|
|
487
|
+
# usable timing payload commit. the backlog commit also arms the force floor, so mark the first
|
|
488
|
+
# timing attempt for the wrapper's dedicated floor bypass until that upload succeeds.
|
|
489
|
+
if not state.sent_first_metrics or (has_step_timing and not state.sent_first_timing):
|
|
490
|
+
heartbeat_committed = _w.heartbeat(
|
|
480
491
|
"rl_step",
|
|
481
492
|
force=True,
|
|
493
|
+
first_timing=has_step_timing and not state.sent_first_timing,
|
|
482
494
|
step=step_metrics["step"],
|
|
483
495
|
metrics_last=list(state.metrics_last),
|
|
484
|
-
**
|
|
496
|
+
**heartbeat_fields,
|
|
485
497
|
gpu=gpu_diagnostics(include_torch=False),
|
|
486
498
|
)
|
|
487
|
-
|
|
499
|
+
if heartbeat_committed:
|
|
500
|
+
state.sent_first_metrics = True
|
|
501
|
+
if has_step_timing:
|
|
502
|
+
state.sent_first_timing = True
|
|
488
503
|
# per-step series for train_meta observability parity. these live on the same
|
|
489
504
|
# line as everything else: verl's only console metric sink is LocalLogger,
|
|
490
505
|
# which always prints "step:N - ..." (verl/utils/logger/aggregate_logger.py),
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"""RL step pace derived from Verl's native per-step duration metric."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import math
|
|
6
|
+
import statistics
|
|
7
|
+
from dataclasses import dataclass, field
|
|
8
|
+
|
|
9
|
+
_RETAINED_DURATION_SAMPLES = 64
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass
|
|
13
|
+
class StepTiming:
|
|
14
|
+
"""Retain recent steady-state RL durations for heartbeat projections."""
|
|
15
|
+
|
|
16
|
+
_warmup_seen: bool = False
|
|
17
|
+
_durations: list[float] = field(default_factory=list)
|
|
18
|
+
|
|
19
|
+
def record_duration(self, duration: float | None) -> None:
|
|
20
|
+
"""record one positive native duration from a parsed Verl training step."""
|
|
21
|
+
if duration is None or duration <= 0:
|
|
22
|
+
return
|
|
23
|
+
if not self._warmup_seen:
|
|
24
|
+
self._warmup_seen = True
|
|
25
|
+
return
|
|
26
|
+
self._durations = [*self._durations, duration][-_RETAINED_DURATION_SAMPLES:]
|
|
27
|
+
|
|
28
|
+
def heartbeat_fields(
|
|
29
|
+
self,
|
|
30
|
+
*,
|
|
31
|
+
current_step: int,
|
|
32
|
+
total_steps: int,
|
|
33
|
+
remaining_wall_s: float | None,
|
|
34
|
+
) -> dict[str, float | bool]:
|
|
35
|
+
"""Return measured pace and a best-effort remaining-training projection."""
|
|
36
|
+
durations = self._durations
|
|
37
|
+
if not durations:
|
|
38
|
+
return {}
|
|
39
|
+
|
|
40
|
+
remaining_steps = max(0, int(total_steps) - int(current_step))
|
|
41
|
+
try:
|
|
42
|
+
median_duration_s = statistics.median(durations)
|
|
43
|
+
mean_duration_s = statistics.fmean(durations)
|
|
44
|
+
projected_remaining_s = mean_duration_s * remaining_steps
|
|
45
|
+
except OverflowError:
|
|
46
|
+
return {}
|
|
47
|
+
if not all(
|
|
48
|
+
math.isfinite(value)
|
|
49
|
+
for value in (median_duration_s, mean_duration_s, projected_remaining_s)
|
|
50
|
+
):
|
|
51
|
+
return {}
|
|
52
|
+
fields: dict[str, float | bool] = {
|
|
53
|
+
"step_duration_s": median_duration_s,
|
|
54
|
+
"projected_remaining_s": projected_remaining_s,
|
|
55
|
+
}
|
|
56
|
+
if (
|
|
57
|
+
remaining_wall_s is not None
|
|
58
|
+
and remaining_wall_s >= 0
|
|
59
|
+
and projected_remaining_s > remaining_wall_s
|
|
60
|
+
):
|
|
61
|
+
fields["wall_deadline_at_risk"] = True
|
|
62
|
+
return fields
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"""immutable state carriers for OPD parent-runner stages."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@dataclass(frozen=True)
|
|
10
|
+
class _OpdRequest:
|
|
11
|
+
spec: Any
|
|
12
|
+
env: Any
|
|
13
|
+
multi_turn: bool
|
|
14
|
+
max_turns: int
|
|
15
|
+
knobs: Any
|
|
16
|
+
model_id: str
|
|
17
|
+
model_revision: str
|
|
18
|
+
structured_outputs: Any = None
|
|
19
|
+
model_vocab_size: int | None = None
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass(frozen=True)
|
|
23
|
+
class _PromptState:
|
|
24
|
+
teacher: Any
|
|
25
|
+
tokenizer: Any
|
|
26
|
+
thinking_prefill: str
|
|
27
|
+
max_model_len: int
|
|
28
|
+
prompt_budget: int
|
|
29
|
+
prompts: list[Any]
|
|
30
|
+
dropped_long: int
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@dataclass(frozen=True)
|
|
34
|
+
class _WorkloadState:
|
|
35
|
+
prompts_per_step: int
|
|
36
|
+
update_horizon: int
|
|
37
|
+
prompt_pool_fingerprint: str
|
|
38
|
+
workdir: str
|
|
39
|
+
shim_dir: str
|
|
40
|
+
local_dir: str
|
|
41
|
+
export_root: str
|
|
42
|
+
mutation_failure_path: str
|
|
43
|
+
score_delivery_failure_path: str
|
|
44
|
+
abandonment_failure_path: str
|
|
45
|
+
resample_failure_path: str
|
|
46
|
+
cycle_commit_failure_path: str
|
|
47
|
+
train_file: str
|
|
48
|
+
val_file: str
|
|
49
|
+
lora_rank: int
|
|
50
|
+
lora_alpha: int
|
|
51
|
+
target_modules: Any
|
|
52
|
+
warmstart_adapter: str | None
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@dataclass(frozen=True)
|
|
56
|
+
class _RuntimeState:
|
|
57
|
+
python_bin: str
|
|
58
|
+
model_path: str
|
|
59
|
+
gpu_count: int
|
|
60
|
+
save_freq: int
|
|
61
|
+
loggers: list[str]
|
|
62
|
+
project_name: str
|
|
63
|
+
experiment_name: str
|
|
64
|
+
gdn_reset_arch: str | None
|
|
65
|
+
entry_path: str
|
|
66
|
+
reward_path: str
|
|
67
|
+
resume_step: int
|
|
68
|
+
resume_state: dict[str, Any] | None
|
|
69
|
+
bridge: Any
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
@dataclass(frozen=True)
|
|
73
|
+
class _ChildCallbacks:
|
|
74
|
+
on_line: Any
|
|
75
|
+
on_step: Any
|
|
76
|
+
child_heartbeat: Any
|
|
77
|
+
liveness_fields: Any
|
|
78
|
+
progress: dict[str, Any]
|
|
79
|
+
wandb_link: dict[str, str | None]
|
|
80
|
+
child_tail: Any
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
@dataclass(frozen=True)
|
|
84
|
+
class _ChildResult:
|
|
85
|
+
final_accounting: dict[str, Any]
|
|
86
|
+
actor_dir: str
|
|
87
|
+
final_step: int
|
|
88
|
+
train_wall: float
|
|
89
|
+
peak_gpu_gb: float
|
|
90
|
+
train_started_at: float
|
|
91
|
+
wandb_url: str | None
|
|
92
|
+
wandb_id: str | None
|
{freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/job_execution.py
RENAMED
|
@@ -513,7 +513,21 @@ def _classify_queue_state(
|
|
|
513
513
|
# between unhealthy and empty cannot make a broken box look like starvation.
|
|
514
514
|
state.ever_saw_worker = True
|
|
515
515
|
if any(workers.get(k) for k in ("throttled", "unhealthy", "initializing")) or not usable:
|
|
516
|
-
|
|
516
|
+
message = f"queued; workers: {workers}"
|
|
517
|
+
if (
|
|
518
|
+
not usable
|
|
519
|
+
and not recovering
|
|
520
|
+
and not state.ever_saw_worker
|
|
521
|
+
and state.queued_timer.since is not None
|
|
522
|
+
):
|
|
523
|
+
elapsed_s = max(0, int(now - state.queued_timer.since))
|
|
524
|
+
budget = (
|
|
525
|
+
f"{context.queue_grace_s:g}s"
|
|
526
|
+
if _jobs.math.isfinite(context.queue_grace_s)
|
|
527
|
+
else "unbounded"
|
|
528
|
+
)
|
|
529
|
+
message += f"; waited {elapsed_s}s of {budget} capacity grace"
|
|
530
|
+
context.say(message)
|
|
517
531
|
if state.unhealthy_timer.expired(
|
|
518
532
|
workers.get("unhealthy") and not usable and not recovering,
|
|
519
533
|
now,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "freesolo-flash-dev"
|
|
3
|
-
version = "1.2.
|
|
3
|
+
version = "1.2.28"
|
|
4
4
|
description ="Flash — managed LoRA post-training (SFT/GRPO/OPD) for Freesolo environments, driven by the `flash` CLI"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
# RunPod Flash supports Python 3.11-3.12 (not 3.13 yet).
|
|
@@ -137,7 +137,7 @@ artifacts = ["flash/py.typed"]
|
|
|
137
137
|
# auto-published by .github/workflows/publish-dev.yml: a push to `dev` whose version isn't yet on
|
|
138
138
|
# PyPI publishes it; pushes that don't change it find it already published and no-op. So cutting a
|
|
139
139
|
# dev-channel release = bump this (and [project].version) and merge to `dev`.
|
|
140
|
-
version = "1.2.
|
|
140
|
+
version = "1.2.28"
|
|
141
141
|
|
|
142
142
|
[tool.pytest.ini_options]
|
|
143
143
|
pythonpath = ["."]
|