freesolo-flash-dev 1.2.95__tar.gz → 1.2.96__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.95 → freesolo_flash_dev-1.2.96}/PKG-INFO +1 -1
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/__init__.py +3 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/io/heartbeat.py +26 -3
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/io/hf.py +11 -1
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/poll.py +18 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/pyproject.toml +2 -2
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_poll_helpers.py +28 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_training_controls.py +161 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_worker_init_heartbeat.py +67 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/uv.lock +1 -1
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.dockerignore +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.env.example +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/CODEOWNERS +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/dependabot.yml +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/auto-rebake.yml +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/bake-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/ci.yml +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/dev-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/main-source-guard.yml +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/notify-tests-repo.yml +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/production-kernel-cache-ready.yml +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/publish-dev.yml +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/publish-image.yml +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/publish.yml +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/version-parity.yml +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/worker-image.yml +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.gitignore +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/CHANGELOG.md +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/CODE_OF_CONDUCT.md +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/CONTRIBUTING.md +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/Dockerfile +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/Dockerfile.worker +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/LICENSE +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/NOTICE +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/README.md +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/SECURITY.md +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/SELF_HOSTING.md +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/build/kernel_cache/.gitignore +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/build/kernel_cache/.keep +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/deploy/infisical/README.md +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/deploy/infisical/entrypoint.sh +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/docker/Dockerfile.kernelcache +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/docker/Dockerfile.kernelcache.relayer +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/docker/bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/docker/bake_pod_entry.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/docker/extract_cudart_fix.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/docker/kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/docker/make_rp_handler.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/_internal/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/_internal/channel.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/_internal/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/_internal/fileio.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/_internal/logging.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/_internal/paths.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/adapters/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/adapters/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/adapters/fused_experts.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/adapters/lora_rank.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/adapters/targets.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/__main__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/deploy.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/episode.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/eval.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/eval_args.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/imports.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/list.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/push.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/retained.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/setup.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/setup_wandb.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/test.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/test_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/test_params.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/test_warnings.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/traces.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/train_cost.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/worker_output.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/errors.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/scaffold/TRAINING.md +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/scaffold/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/ui/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/ui/cost.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/ui/env_panels.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/ui/heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/ui/render.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/ui/tables.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/ui/tty.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/client/config.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/client/freesolo_api.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/client/http.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/client/runtime_secrets.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/client/shapes.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/client/specs.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/client/streaming.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/content/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/content/image_descriptors.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/content/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/content/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/content/thinking.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/core/catalog.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/core/grpo.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/core/spec.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/core/spec_persistence.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cost/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cost/analytical.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cost/facts.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cost/spec.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cost/types.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/huggingface.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/plan/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/plan/kv_sizing.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/plan/model_config_probe.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/plan/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/plan/recipe.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/plan/steps.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/plan/vram.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/image_tokens.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/reasoning_render.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/sft_image_rows.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/tokenizer.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/result/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/result/accounting.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/result/rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/__main__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/backend_common.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/entry/opd.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/entry/rl.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/entry/sft.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/io/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/io/prefetch.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/io/wandb_log.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/model/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/model/adapter.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/model/chatml_mask.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/model/decoding.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/model/lora.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/model/packing.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/opd_train.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/opd_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/perf/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/perf/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/perf/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/perf/liger.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/perf/memory.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/rl_train.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/rl_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/runtime/rng.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/score_batcher.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/sft_train.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/sft_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/teacher/client.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/teacher/encoding.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/core/checkpoint_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/core/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/core/child/glue.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/core/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/core/step_timing.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/finalize.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/batching.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/bridge.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/bridge_failures.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/bridge.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/structured.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/failures.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/gkd.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/multiturn_media.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/overrides.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/prompts.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/reporting.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/scoring.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/state.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/validation.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/child/patches.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/config.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/identity.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/inputs.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/multi_turn.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/reward_module.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/scoring.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/single_turn.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/verl_config.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/sft/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/sft/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/sft/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/sft/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/sft/config.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/capabilities.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/child_io.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/parallelism.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/parent_work.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/process_census.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker_entrypoint.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/adapter.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/base.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/cache_security.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/dataset_selection.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/evaluations.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/identity.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/loader.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/namespace_listing.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/package/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/package/direct_tokens.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/package/limits.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/package/unpack.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/pull.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/staged.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/auth.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/bootstrap.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/bootstrap_console.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/deadline.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/host/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/host/failmark.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/host/hostlog.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/http.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/instance.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/poll_instance.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/provider.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/worker.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/allocator.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/artifacts/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/artifacts/hf.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/artifacts/preload_runpod.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/artifacts/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/base.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/fit_errors.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/api.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/auth.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/gpus.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/jobs/reap.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/preflight.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/pricing.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/preflight.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/realized.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/api.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/auth.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/cost.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/gpus.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/job_execution.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/jobs.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/preflight.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/pricing.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/resources.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/serverless/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/serverless/endpoints.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/sharding.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/vast/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/vast/api.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/vast/auth.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/vast/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/vast/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/vast/preflight.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/vast/pricing.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/py.typed +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/attempts.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/costs.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/deadlines.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/preparation.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/reconciliation.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/results/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/results/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/results/verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/status.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/submit.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/attach.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/deploy.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/recovery.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/retry_decision.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/seed_submission.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/transitions.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runtime_capsule/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runtime_capsule/build.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runtime_capsule/manifest.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runtime_capsule/profiles.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/schema/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/schema/fields.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/serve/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/serve/adapter_check.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/serve/deploy.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/serve/errors.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/serve/export.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/serve/preflight.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/serve/responses.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/serve/streaming.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/serve/thinking.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/serve/urls.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/__main__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/app.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/billing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/billing/charges.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/billing/retry.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/domain/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/domain/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/domain/environment_registry.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/domain/envs.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/domain/projects.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/domain/reconcile.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/domain/repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/domain/run_registry.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/domain/teacher_broker.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/domain/teacher_errors.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/domain/teacher_requests.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/platform/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/platform/auth.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/platform/db.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/platform/deps.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/platform/internal_client.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/platform/locks.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/platform/runtime.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/routes/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/routes/envs.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/routes/meta.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/routes/runs.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/routes/serving.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/routes/serving_completion.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/routes/serving_revisions.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/routes/serving_smoke.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/routes/teacher.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/source_snapshot.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/teacher/limits.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/teacher/provider_status.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/teacher/retry_contract.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/scripts/build_dev_dist.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/scripts/check_file_size.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/scripts/check_function_size.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/scripts/check_rollout_identity_actor.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/scripts/check_verl_pin_exists.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/scripts/scrub_history.sh +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/_helpers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/_helpers/profile.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/_helpers/runner.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/_helpers/source_snapshot.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/_helpers/specs.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/_helpers/teacher.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/_helpers/vast.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/capture_image_sft_processor_oracle.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/conftest.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/fixtures/image_sft_processor_oracle.json +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/fixtures/qwen35_08b_target_metadata.json +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/live/__init__.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/live/conftest.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/live/test_lambda_live.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/live/test_runpod_live.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/live/test_sft_thinking_render_live.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/live/test_vast_live.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_accounting_coverage.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_adapter_shard_completeness.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_agent_flash_cli_contract.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_algorithms.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_allocator.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_backend_common.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_backend_jobspec_contract.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_base_model_provenance.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_billing_retry.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_build_context_contract.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cancel_remote.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_catalog_consistency.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_catalog_only_models.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_charge_pricing.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_checkpoint_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_commands.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_commands_coverage.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_credential_shadowing.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_errors.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_estimate.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_gpus_flag.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_help.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_main_coverage.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_managed.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_render_coverage.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_render_theme.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_traces.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_wandb_warning.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_client.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_client_import_purity.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_client_server_integration.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_client_stream_reads.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_config_env_vars.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_config_overrides.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_console_upload.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_controlled_experiment_repairs.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cost_analytical.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cost_equation.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cost_estimate.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cost_hardware.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cost_models.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_deploy_alias_move_warning.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_deploy_latency.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_dev_channel.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_disk_gb.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_endpoint_name.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_cache_evict.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_delete.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_download.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_download_api.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_list_api.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_list_cli.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_list_hub.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_no_install.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_publish.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_pull.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_pull_coverage.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_pull_loader_coverage.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_pull_managed_control_plane.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_push.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_rate_limit_resolve.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_ref_pinning.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_test.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_export.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_flash_mvp.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_flash_worker.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_flashinfer_cache_dirs.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_freesolo_api_transport.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_fused_expert_warmstart.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_github_urlopen_retry.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_gpu_type_single_field.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_gpus.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_grpo_params.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_grpo_process_census.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_grpo_resident_sizing.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_grpo_reward_batching.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_grpo_rollout_contract.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_grpo_rollout_identity.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_health_liveness.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_hf_retry.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_idle_endpoint_reaper.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_image_environment_capability.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_image_incremental_processor.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_image_sft_markers.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_image_sft_processor_parity.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_image_tokens.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_infisical_secrets.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_instance_bootstrap_coverage.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_internal_client.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_jobs.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_kv_util.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_lambda_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_lambda_runner.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_logging.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_login_perms.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_lora_rank_coverage.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_lora_rank_nested_rung.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_lora_rank_preflight.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_lora_targeting.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_lora_targeting_pinned_verl.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_managed_config_fields.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_managed_hf_repo.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_metrics_schema_agent_contract.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_mig_guard.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_multi_gpu_gate.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_multimodal_training.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_named_reward_metrics.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_oom_escalate_gpu.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_opd.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_opd_limits.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_opd_multiturn_eos_boundary.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_opd_multiturn_failure_exit.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_opd_replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_opd_resume_safety.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_opd_train.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_orchestrator_flash.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_packing.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_packing_coverage.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_parasail_teacher.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_persisted_spec_envelope.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_preflight.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_projects.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_provider_preflight_coverage.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_provider_routing.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_provider_teardown_robustness.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_providers_symmetry.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_realized_cost.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_resolve_params_b.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_resume_on_retry.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_rl_train.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_runmgmt.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_runpod_api_delete.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_runpod_key_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_runpod_key_waterfall.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_runtime_capsule.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_serve.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_serve_reasoning_content.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_server_api.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_server_app_coverage.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_server_auth_singleflight.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_server_billing.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_server_checkpoints_coverage.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_server_db.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_server_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_server_locks_coverage.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_server_standalone.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_serving_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_serving_contract.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_serving_schema_coverage.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_sft_chunked_nll.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_sft_example_selection.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_sft_gc_off.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_sft_max_context.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_sft_startup_block.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_sft_train.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_source_attestation_flow.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_source_snapshot.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_spec_and_validation.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_spec_contract_bytes.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_staged_environment.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_step_floor.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_step_metrics.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_step_timing.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_teacher_broker.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_teacher_encoding_contract.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_thinking_config.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_train_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_type_comment_prose.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_vast_api.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_vast_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_vast_offers.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_vast_provider_coverage.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_vast_runner.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_verifiers.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_verl_checkpoint_export.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_verl_child_plugins.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_verl_silence_watchdog.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_version.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_vl_warmstart_adapter_keys.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_vram_architecture.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_wandb_link.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_wandb_naming.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_warmstart_adapter_download.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_warmstart_cross_repo.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_warmstart_error_attribution.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_warmstart_image_adapters.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_worker_dryrun.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_worker_hardexit.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_worker_image.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_worker_stack.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_worker_thinking.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_workflow_contracts.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/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.96
|
|
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
|
|
@@ -145,6 +145,9 @@ _HB_LAST_PROGRESS_TS = 0.0
|
|
|
145
145
|
# per-step heartbeat past the provider's stall window, killing a healthy run.
|
|
146
146
|
_HB_PROGRESS_SEQ = 0
|
|
147
147
|
_HB_PROGRESS_UPLOADED_SEQ = 0
|
|
148
|
+
# a replace-in-place failure heartbeat can be overwritten before the provider polls it. retain the
|
|
149
|
+
# failed checkpoint identity and cause so every terminal heartbeat carries the same structured state.
|
|
150
|
+
_HB_PENDING_CHECKPOINT_FAILURE: dict[str, int | str] | None = None
|
|
148
151
|
# Environment-scoped artifact repos are shared by many runs. Keep heartbeat commits below the HF
|
|
149
152
|
# per-repo commit cap while staying under the provider poller's training stall window
|
|
150
153
|
# (STALL_AFTER_S=1500s in flash/providers/_lifecycle/poll.py).
|
|
@@ -78,15 +78,27 @@ _HB_THROTTLED_STAGES = _HB_TIGHT_LIVENESS_STAGES | frozenset({"rl_step", "sft_st
|
|
|
78
78
|
# right after a download that has been pinging throughout, so the throttle would almost always
|
|
79
79
|
# swallow it. the wrap that follows re-emits with liveness=True and stays throttled.
|
|
80
80
|
_HB_MODEL_LOAD_STAGES = frozenset({"sft_model_load", "opd_model_load"})
|
|
81
|
-
|
|
81
|
+
_HB_SUCCESS_TERMINAL_STAGES = frozenset({"done", "already_done"})
|
|
82
82
|
# 600s -> ~6 commits/hr; keeps stall detector alive without hitting the HF commit cap.
|
|
83
83
|
_HB_TERMINAL_ONLY_INTERVAL_S = 600.0
|
|
84
84
|
|
|
85
85
|
|
|
86
|
+
def _is_terminal_stage(stage: str) -> bool:
|
|
87
|
+
"""return whether this stage ends the worker attempt."""
|
|
88
|
+
return stage in _HB_SUCCESS_TERMINAL_STAGES or stage.startswith("error_")
|
|
89
|
+
|
|
90
|
+
|
|
86
91
|
def _is_critical_stage(stage: str) -> bool:
|
|
87
92
|
"""A terminal transition or an error is CRITICAL: never throttled (the commit must land) and
|
|
88
|
-
given the longer upload-lock timeout, because no later heartbeat can repair a missed one.
|
|
89
|
-
|
|
93
|
+
given the longer upload-lock timeout, because no later heartbeat can repair a missed one.
|
|
94
|
+
|
|
95
|
+
`_failed` earns this as much as the `error_` prefix does: a failure heartbeat is emitted once, at
|
|
96
|
+
the moment the failure is known, and nothing later restates it. `checkpoint_upload_failed` is
|
|
97
|
+
raised from inside a long HF upload, which is precisely when `_HB_UPLOAD_IN_FLIGHT` is set and an
|
|
98
|
+
unforced ping is dropped -- so the one report of the failure would be discarded exactly in the
|
|
99
|
+
case that produces it.
|
|
100
|
+
"""
|
|
101
|
+
return _is_terminal_stage(stage) or stage.endswith("_failed")
|
|
90
102
|
|
|
91
103
|
|
|
92
104
|
# Guards throttle bookkeeping; slow HF commit runs outside this lock so heartbeat and liveness
|
|
@@ -210,6 +222,17 @@ def heartbeat(
|
|
|
210
222
|
):
|
|
211
223
|
genuine_progress = not liveness
|
|
212
224
|
with _HB_LOCK:
|
|
225
|
+
if stage == "checkpoint_upload_failed":
|
|
226
|
+
failure = kw.get("checkpoint_failure")
|
|
227
|
+
if isinstance(failure, dict):
|
|
228
|
+
_w._HB_PENDING_CHECKPOINT_FAILURE = dict(failure)
|
|
229
|
+
elif stage == "checkpoint_uploaded":
|
|
230
|
+
# a later full resume checkpoint landed, so the earlier failure no longer describes the
|
|
231
|
+
# run's outcome. deployable or final adapter publication cannot clear this because neither
|
|
232
|
+
# restores the missing full resume state.
|
|
233
|
+
_w._HB_PENDING_CHECKPOINT_FAILURE = None
|
|
234
|
+
elif _is_terminal_stage(stage) and _w._HB_PENDING_CHECKPOINT_FAILURE:
|
|
235
|
+
kw.setdefault("checkpoint_failure", dict(_w._HB_PENDING_CHECKPOINT_FAILURE))
|
|
213
236
|
ts = time.time()
|
|
214
237
|
if genuine_progress:
|
|
215
238
|
_w._HB_LAST_PROGRESS_TS = ts
|
|
@@ -553,7 +553,17 @@ def upload_resume_checkpoint(
|
|
|
553
553
|
)
|
|
554
554
|
if emit_heartbeat:
|
|
555
555
|
with contextlib.suppress(Exception):
|
|
556
|
-
|
|
556
|
+
# worker stdout is not part of control-plane run logs, so the stage
|
|
557
|
+
# name alone would otherwise be the entire failure report.
|
|
558
|
+
_w.heartbeat(
|
|
559
|
+
"checkpoint_upload_failed",
|
|
560
|
+
step=step,
|
|
561
|
+
checkpoint_failure={
|
|
562
|
+
"step": step,
|
|
563
|
+
"operation": failure_stage,
|
|
564
|
+
"error": sanitize_diagnostic(e, limit=300),
|
|
565
|
+
},
|
|
566
|
+
)
|
|
557
567
|
if failure_stage in {"before", "after"}:
|
|
558
568
|
raise
|
|
559
569
|
return False
|
|
@@ -262,7 +262,25 @@ def _format_heartbeat(hb: dict) -> str:
|
|
|
262
262
|
for name, value in reward_metrics.items():
|
|
263
263
|
if isinstance(value, (int, float)):
|
|
264
264
|
msg += f" {name}={value:.3f}"
|
|
265
|
+
error = hb.get("error")
|
|
266
|
+
if isinstance(error, str) and error.strip():
|
|
267
|
+
msg += f" error={error.strip()}"
|
|
268
|
+
checkpoint_failure = hb.get("checkpoint_failure")
|
|
269
|
+
if isinstance(checkpoint_failure, dict):
|
|
270
|
+
failure_step = checkpoint_failure.get("step")
|
|
271
|
+
if isinstance(failure_step, (int, float)) and not isinstance(failure_step, bool):
|
|
272
|
+
msg += f" checkpoint_failure_step={int(failure_step)}"
|
|
273
|
+
operation = checkpoint_failure.get("operation")
|
|
274
|
+
if isinstance(operation, str) and operation.strip():
|
|
275
|
+
msg += f" checkpoint_failure_stage={operation.strip()}"
|
|
276
|
+
checkpoint_error = checkpoint_failure.get("error")
|
|
277
|
+
if isinstance(checkpoint_error, str) and checkpoint_error.strip():
|
|
278
|
+
msg += f" checkpoint_error={checkpoint_error.strip()}"
|
|
265
279
|
msg += format_gpu_status(hb.get("gpu"))
|
|
280
|
+
# everything above is one summary record, including untrusted stage, error, and gpu fallback text.
|
|
281
|
+
# sanitize it once at that boundary so no field can forge a second worker record. the deliberately
|
|
282
|
+
# multiline sample and child-output sections are appended below and retain their line breaks.
|
|
283
|
+
msg = neutralize_control_chars(msg).replace("\n", "\\n")
|
|
266
284
|
sample_lines: list[str] = []
|
|
267
285
|
rendered_samples = 0
|
|
268
286
|
samples = hb.get("sampled_completions")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "freesolo-flash-dev"
|
|
3
|
-
version = "1.2.
|
|
3
|
+
version = "1.2.96"
|
|
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.96"
|
|
141
141
|
|
|
142
142
|
[tool.pytest.ini_options]
|
|
143
143
|
pythonpath = ["."]
|
|
@@ -232,3 +232,31 @@ def test_format_heartbeat_neutralizes_control_chars_in_the_child_tail():
|
|
|
232
232
|
assert "child output before the stall" in msg
|
|
233
233
|
assert "\x1b" not in msg
|
|
234
234
|
assert "\r" not in msg
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
def test_format_heartbeat_escapes_newlines_in_checkpoint_failure():
|
|
238
|
+
injected = "Permission denied\nworker: stage=done step=999"
|
|
239
|
+
|
|
240
|
+
msg = _format_heartbeat(
|
|
241
|
+
{
|
|
242
|
+
"stage": "checkpoint_upload_failed",
|
|
243
|
+
"checkpoint_failure": {"step": 50, "operation": "resume", "error": injected},
|
|
244
|
+
}
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
assert "\n" not in msg
|
|
248
|
+
assert "checkpoint_error=Permission denied\\nworker: stage=done step=999" in msg
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
@pytest.mark.parametrize(
|
|
252
|
+
"heartbeat",
|
|
253
|
+
[
|
|
254
|
+
{"stage": "done\nworker: stage=done step=999"},
|
|
255
|
+
{"stage": "ok", "gpu": {"nvidia_smi": "gpu\nworker: stage=done step=999"}},
|
|
256
|
+
],
|
|
257
|
+
)
|
|
258
|
+
def test_format_heartbeat_summary_fields_cannot_forge_a_worker_record(heartbeat):
|
|
259
|
+
msg = _format_heartbeat(heartbeat)
|
|
260
|
+
|
|
261
|
+
assert "\n" not in msg
|
|
262
|
+
assert "\\nworker: stage=done step=999" in msg
|
|
@@ -212,6 +212,167 @@ def test_resume_first_companion_retries_without_reuploading_full_state(monkeypat
|
|
|
212
212
|
assert calls == {"resume": 1, "deployable": 2}
|
|
213
213
|
|
|
214
214
|
|
|
215
|
+
def test_resume_checkpoint_failure_heartbeat_surfaces_sanitized_error(monkeypatch, tmp_path):
|
|
216
|
+
import flash.engine.worker as worker
|
|
217
|
+
from flash.engine.worker.io import hf as worker_hf
|
|
218
|
+
|
|
219
|
+
secret = "hf_checkpoint_upload_secret"
|
|
220
|
+
calls = 0
|
|
221
|
+
heartbeats: list[tuple[str, dict]] = []
|
|
222
|
+
|
|
223
|
+
class Api:
|
|
224
|
+
def upload_folder(self, **_kwargs):
|
|
225
|
+
nonlocal calls
|
|
226
|
+
calls += 1
|
|
227
|
+
raise PermissionError(f"hf quota refused credential {secret} " + "x" * 400)
|
|
228
|
+
|
|
229
|
+
monkeypatch.setenv("HF_TOKEN", secret)
|
|
230
|
+
monkeypatch.setattr(worker, "HF_REPO", "org/runs")
|
|
231
|
+
monkeypatch.setattr(worker, "hf_api", lambda: Api())
|
|
232
|
+
monkeypatch.setattr(
|
|
233
|
+
worker, "heartbeat", lambda stage, **kwargs: heartbeats.append((stage, kwargs))
|
|
234
|
+
)
|
|
235
|
+
monkeypatch.setattr(worker_hf, "_CKPT_UPLOAD_BACKOFF_S", 0.0)
|
|
236
|
+
|
|
237
|
+
assert not worker_hf.upload_resume_checkpoint(50, str(tmp_path))
|
|
238
|
+
|
|
239
|
+
failed = [fields for stage, fields in heartbeats if stage == "checkpoint_upload_failed"]
|
|
240
|
+
assert calls == worker_hf._CKPT_UPLOAD_RETRIES
|
|
241
|
+
assert len(failed) == 1
|
|
242
|
+
assert failed[0]["step"] == 50
|
|
243
|
+
failure = failed[0]["checkpoint_failure"]
|
|
244
|
+
assert failure["step"] == 50
|
|
245
|
+
assert failure["operation"] == "resume"
|
|
246
|
+
assert failure["error"].startswith("PermissionError: hf quota refused")
|
|
247
|
+
assert "<redacted>" in failure["error"]
|
|
248
|
+
assert secret not in failure["error"]
|
|
249
|
+
assert len(failure["error"]) <= 300
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
@pytest.mark.parametrize("failure_stage", ["before", "after"])
|
|
253
|
+
def test_resume_checkpoint_companion_failure_still_raises(monkeypatch, tmp_path, failure_stage):
|
|
254
|
+
import flash.engine.worker as worker
|
|
255
|
+
from flash.engine.worker.io import hf as worker_hf
|
|
256
|
+
|
|
257
|
+
calls = {"resume": 0, "companion": 0}
|
|
258
|
+
heartbeats: list[tuple[str, dict]] = []
|
|
259
|
+
|
|
260
|
+
class Api:
|
|
261
|
+
def upload_folder(self, **_kwargs):
|
|
262
|
+
calls["resume"] += 1
|
|
263
|
+
|
|
264
|
+
def list_repo_files(self, **_kwargs):
|
|
265
|
+
return []
|
|
266
|
+
|
|
267
|
+
def fail_companion():
|
|
268
|
+
calls["companion"] += 1
|
|
269
|
+
raise RuntimeError(f"{failure_stage} companion failed")
|
|
270
|
+
|
|
271
|
+
callbacks = {f"{failure_stage}_upload": fail_companion}
|
|
272
|
+
monkeypatch.setattr(worker, "HF_REPO", "org/runs")
|
|
273
|
+
monkeypatch.setattr(worker, "hf_api", lambda: Api())
|
|
274
|
+
monkeypatch.setattr(
|
|
275
|
+
worker, "heartbeat", lambda stage, **kwargs: heartbeats.append((stage, kwargs))
|
|
276
|
+
)
|
|
277
|
+
monkeypatch.setattr(worker_hf, "_CKPT_UPLOAD_BACKOFF_S", 0.0)
|
|
278
|
+
|
|
279
|
+
with pytest.raises(RuntimeError, match=f"{failure_stage} companion failed"):
|
|
280
|
+
worker_hf.upload_resume_checkpoint(50, str(tmp_path), **callbacks)
|
|
281
|
+
|
|
282
|
+
failed = [fields for stage, fields in heartbeats if stage == "checkpoint_upload_failed"]
|
|
283
|
+
assert calls["companion"] == worker_hf._CKPT_UPLOAD_RETRIES
|
|
284
|
+
assert calls["resume"] == (0 if failure_stage == "before" else 1)
|
|
285
|
+
assert len(failed) == 1
|
|
286
|
+
failure = failed[0]["checkpoint_failure"]
|
|
287
|
+
assert failure["step"] == 50
|
|
288
|
+
assert failure["operation"] == failure_stage
|
|
289
|
+
assert f"{failure_stage} companion failed" in failure["error"]
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def test_upload_failure_cause_reaches_the_rendered_run_log():
|
|
293
|
+
"""The payload is not the deliverable: `get_logs()` shows only what the formatter renders.
|
|
294
|
+
|
|
295
|
+
The formatter emits a fixed list of numeric metric keys, so a stage whose entire content is an
|
|
296
|
+
explanation rather than a measurement committed the cause and printed `stage=... step=50` alone.
|
|
297
|
+
"""
|
|
298
|
+
from flash.providers._lifecycle.poll import _format_heartbeat
|
|
299
|
+
|
|
300
|
+
line = _format_heartbeat(
|
|
301
|
+
{
|
|
302
|
+
"stage": "checkpoint_upload_failed",
|
|
303
|
+
"step": 50,
|
|
304
|
+
"checkpoint_failure": {
|
|
305
|
+
"step": 50,
|
|
306
|
+
"operation": "resume",
|
|
307
|
+
"error": "PermissionError: hf quota refused credential <redacted>",
|
|
308
|
+
},
|
|
309
|
+
}
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
assert "stage=checkpoint_upload_failed" in line
|
|
313
|
+
assert "step=50" in line
|
|
314
|
+
assert "checkpoint_failure_step=50" in line
|
|
315
|
+
assert "checkpoint_failure_stage=resume" in line
|
|
316
|
+
assert "checkpoint_error=PermissionError: hf quota refused credential <redacted>" in line
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
def test_a_failure_cause_cannot_rewrite_the_log_it_is_printed_in():
|
|
320
|
+
"""This text is an exception message, so it is not ours: a hook or provider response wrote it.
|
|
321
|
+
|
|
322
|
+
The same line already neutralizes child output and sampled completions. Surfacing the cause
|
|
323
|
+
raw would let a `\\x1b[2J` clear the screen or a `\\r` overwrite the line the user is reading
|
|
324
|
+
the failure in -- and the failure report is exactly when the log has to stay legible.
|
|
325
|
+
"""
|
|
326
|
+
from flash.providers._lifecycle.poll import _format_heartbeat
|
|
327
|
+
|
|
328
|
+
line = _format_heartbeat(
|
|
329
|
+
{
|
|
330
|
+
"stage": "checkpoint_upload_failed",
|
|
331
|
+
"step": 50,
|
|
332
|
+
"checkpoint_failure": {
|
|
333
|
+
"step": 50,
|
|
334
|
+
"operation": "resume",
|
|
335
|
+
"error": "boom\x1b[2Jwiped\roverwrite",
|
|
336
|
+
},
|
|
337
|
+
}
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
assert "\x1b" not in line
|
|
341
|
+
assert "\r" not in line
|
|
342
|
+
assert "checkpoint_error=boom\\x1b[2Jwiped\\x0doverwrite" in line
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
def test_a_heartbeat_without_a_failure_cause_is_unchanged():
|
|
346
|
+
"""The failure fields are additive: an ordinary step line must not grow an empty `error=`."""
|
|
347
|
+
from flash.providers._lifecycle.poll import _format_heartbeat
|
|
348
|
+
|
|
349
|
+
line = _format_heartbeat(
|
|
350
|
+
{"stage": "sft_step", "step": 12, "error": " ", "checkpoint_failure": {}}
|
|
351
|
+
)
|
|
352
|
+
|
|
353
|
+
assert line == "worker: stage=sft_step step=12"
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
def test_an_upload_failure_is_critical_so_an_in_flight_commit_cannot_drop_it():
|
|
357
|
+
"""This heartbeat is raised from inside a long HF upload -- when a ping is otherwise dropped.
|
|
358
|
+
|
|
359
|
+
`_HB_UPLOAD_IN_FLIGHT` is set for the duration of that upload, and an unforced non-critical
|
|
360
|
+
stage returns not-due immediately. The failure is reported once and nothing restates it, so the
|
|
361
|
+
one case that produces this heartbeat is the case that would discard it.
|
|
362
|
+
"""
|
|
363
|
+
from flash.engine.worker.io.heartbeat import _is_critical_stage, _is_terminal_stage
|
|
364
|
+
|
|
365
|
+
assert _is_critical_stage("checkpoint_upload_failed")
|
|
366
|
+
# criticality and checkpoint carry use one terminal predicate.
|
|
367
|
+
assert _is_terminal_stage("done")
|
|
368
|
+
assert _is_terminal_stage("error_oom")
|
|
369
|
+
assert not _is_terminal_stage("checkpoint_upload_failed")
|
|
370
|
+
assert _is_critical_stage("done")
|
|
371
|
+
assert _is_critical_stage("error_oom")
|
|
372
|
+
assert not _is_critical_stage("sft_step")
|
|
373
|
+
assert not _is_critical_stage("rl_step")
|
|
374
|
+
|
|
375
|
+
|
|
215
376
|
def test_seed_training_rngs_initializes_all_supported_generators(monkeypatch):
|
|
216
377
|
from flash.engine.worker.runtime import rng
|
|
217
378
|
|
|
@@ -470,6 +470,73 @@ def _reset_console_heartbeat_state(monkeypatch, worker) -> None:
|
|
|
470
470
|
monkeypatch.setattr(worker, "_HB_LAST_PROGRESS_TS", 0.0)
|
|
471
471
|
monkeypatch.setattr(worker, "_HB_PROGRESS_SEQ", 0)
|
|
472
472
|
monkeypatch.setattr(worker, "_HB_PROGRESS_UPLOADED_SEQ", 0)
|
|
473
|
+
monkeypatch.setattr(worker, "_HB_PENDING_CHECKPOINT_FAILURE", None)
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
def _capture_heartbeat_payloads(monkeypatch, worker) -> list[dict]:
|
|
477
|
+
import json
|
|
478
|
+
|
|
479
|
+
committed: list[dict] = []
|
|
480
|
+
|
|
481
|
+
def capture(path, destination, **_kwargs):
|
|
482
|
+
if destination == "heartbeat.json":
|
|
483
|
+
with open(path) as file:
|
|
484
|
+
committed.append(json.load(file))
|
|
485
|
+
return True
|
|
486
|
+
|
|
487
|
+
_reset_console_heartbeat_state(monkeypatch, worker)
|
|
488
|
+
monkeypatch.setattr(worker, "hf_upload_file", capture)
|
|
489
|
+
return committed
|
|
490
|
+
|
|
491
|
+
|
|
492
|
+
def test_fatal_heartbeat_preserves_checkpoint_failure_and_terminal_error(monkeypatch):
|
|
493
|
+
import flash.engine.worker as worker
|
|
494
|
+
|
|
495
|
+
committed = _capture_heartbeat_payloads(monkeypatch, worker)
|
|
496
|
+
failure = {"step": 50, "operation": "resume", "error": "quota denied"}
|
|
497
|
+
|
|
498
|
+
worker.heartbeat("checkpoint_upload_failed", step=50, checkpoint_failure=failure)
|
|
499
|
+
worker.heartbeat("error_sft", error="watcher failed")
|
|
500
|
+
|
|
501
|
+
assert committed[-1]["stage"] == "error_sft"
|
|
502
|
+
assert committed[-1]["error"] == "watcher failed"
|
|
503
|
+
assert committed[-1]["checkpoint_failure"] == failure
|
|
504
|
+
|
|
505
|
+
|
|
506
|
+
def test_finalize_preserves_failed_checkpoint_identity(monkeypatch):
|
|
507
|
+
import flash.engine.worker as worker
|
|
508
|
+
from flash.engine.result.accounting import RunMetrics
|
|
509
|
+
|
|
510
|
+
committed = _capture_heartbeat_payloads(monkeypatch, worker)
|
|
511
|
+
monkeypatch.setattr(worker, "gpu_diagnostics", dict)
|
|
512
|
+
failure = {"step": 50, "operation": "resume", "error": "quota denied"}
|
|
513
|
+
|
|
514
|
+
worker.heartbeat("checkpoint_upload_failed", step=50, checkpoint_failure=failure)
|
|
515
|
+
worker._finalize(RunMetrics(phase="sft", step=100))
|
|
516
|
+
|
|
517
|
+
assert committed[-1]["stage"] == "done"
|
|
518
|
+
assert committed[-1]["step"] == 100
|
|
519
|
+
assert committed[-1]["checkpoint_failure"] == failure
|
|
520
|
+
|
|
521
|
+
|
|
522
|
+
@pytest.mark.parametrize("terminal_stage", ["done", "error_sft"])
|
|
523
|
+
def test_successful_checkpoint_clears_failure_before_any_terminal(monkeypatch, terminal_stage):
|
|
524
|
+
import flash.engine.worker as worker
|
|
525
|
+
from flash.engine.result.accounting import RunMetrics
|
|
526
|
+
|
|
527
|
+
committed = _capture_heartbeat_payloads(monkeypatch, worker)
|
|
528
|
+
failure = {"step": 50, "operation": "resume", "error": "quota denied"}
|
|
529
|
+
|
|
530
|
+
worker.heartbeat("checkpoint_upload_failed", step=50, checkpoint_failure=failure)
|
|
531
|
+
worker.heartbeat("checkpoint_uploaded", step=75)
|
|
532
|
+
if terminal_stage == "done":
|
|
533
|
+
monkeypatch.setattr(worker, "gpu_diagnostics", dict)
|
|
534
|
+
worker._finalize(RunMetrics(phase="sft", step=100))
|
|
535
|
+
else:
|
|
536
|
+
worker.heartbeat(terminal_stage, step=100, error="later fatal")
|
|
537
|
+
|
|
538
|
+
assert committed[-1]["stage"] == terminal_stage
|
|
539
|
+
assert "checkpoint_failure" not in committed[-1]
|
|
473
540
|
|
|
474
541
|
|
|
475
542
|
@pytest.mark.parametrize(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/ISSUE_TEMPLATE/bug_report.yml
RENAMED
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/ISSUE_TEMPLATE/feature_request.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/bake-kernel-cache.yml
RENAMED
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/dev-kernel-cache.yml
RENAMED
|
File without changes
|
{freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/main-source-guard.yml
RENAMED
|
File without changes
|
{freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/notify-tests-repo.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/version-parity.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/docker/Dockerfile.kernelcache.relayer
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/setup_wandb.py
RENAMED
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/test_evaluations.py
RENAMED
|
File without changes
|
{freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/test_params.py
RENAMED
|
File without changes
|
{freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/test_warnings.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|