freesolo-flash-dev 1.0.71__tar.gz → 1.0.72__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.0.71 → freesolo_flash_dev-1.0.72}/PKG-INFO +1 -1
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/opd_train.py +35 -1
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/runner/__init__.py +3 -3
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/spec.py +4 -12
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/pyproject.toml +2 -2
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_grpo_resident_sizing.py +1 -2
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_multi_gpu_gate.py +24 -31
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_opd_train.py +54 -11
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/uv.lock +1 -1
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.dockerignore +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.env.example +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/dependabot.yml +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/auto-rebake.yml +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/bake-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/ci.yml +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/main-source-guard.yml +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/notify-tests-repo.yml +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/publish-dev.yml +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/publish-image.yml +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/publish.yml +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/version-parity.yml +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/worker-image.yml +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.gitignore +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/CODE_OF_CONDUCT.md +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/CONTRIBUTING.md +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/Dockerfile +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/Dockerfile.worker +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/LICENSE +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/NOTICE +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/README.md +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/SECURITY.md +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/build/kernel_cache/.gitignore +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/build/kernel_cache/.keep +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/docker/Dockerfile.kernelcache +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/docker/Dockerfile.kernelcache.relayer +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/docker/bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/docker/bake_pod_entry.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/docker/kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/docker/make_rp_handler.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/__init__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/_channel.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/_fileio.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/_logging.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/_update_check.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/adapter_artifacts.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/catalog.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/TRAINING.md +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/__init__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/__main__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/_tty.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/commands.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/env_eval.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/env_setup.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/env_test.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/envpush.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/render.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/traces.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cli/training_doc.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/client/__init__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/client/config.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/client/http.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/client/runtime_secrets.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/client/specs.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cost/__init__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cost/analytical.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cost/facts.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cost/spec.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/cost/types.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/diagnostics.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/accounting.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/multiturn_reward_scoring.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/recipe.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/reward_profile.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/steps.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/vram.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/__init__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/__main__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/_pkg.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/adapter.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/backend_common.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/decoding.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/finalize.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/grpo.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/grpo_multiturn.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/grpo_plugin.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/heartbeat.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/hf.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/kernel_warmup.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/lora.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/multiturn_glue.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/opd.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/opd_gkd.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/opd_multiturn.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/opd_plugin.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/opd_structured.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/packing.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/perf/__init__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/perf/attn.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/perf/diagnostics.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/perf/lifecycle.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/perf/liger.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/perf/loraplus.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/perf/memory.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/rl.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/rl_train.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/rng.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/rollout_samples.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/sft.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/sft_train.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/teacher.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/tokenizer_align.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/wandb_log.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker_entrypoint.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/envs/__init__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/envs/adapter.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/envs/archive.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/envs/archive_policy.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/envs/base.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/envs/evaluations.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/envs/loader.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/envs/pull.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/envs/registry.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/lora_rank.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/multimodal.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/opd_retry_contract.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/opd_validation.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/__init__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/_auth.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/_deadline.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/_hf_artifacts.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/_hf_retry.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/_http.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/_instance.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/_instance_bootstrap.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/_instance_poll.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/_instance_provider.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/_poll.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/_worker.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/allocator.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/base.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/lambdalabs/__init__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/lambdalabs/api.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/lambdalabs/auth.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/lambdalabs/gpus.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/lambdalabs/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/lambdalabs/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/lambdalabs/preflight.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/lambdalabs/pricing.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/preflight.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/realized.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/__init__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/api.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/auth.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/cost.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/gpus.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/jobs.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/keys.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/preflight.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/pricing.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/slots.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/train/__init__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/runpod/train/endpoints.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/vast/__init__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/vast/api.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/vast/auth.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/vast/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/vast/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/vast/preflight.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/vast/pricing.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/providers/weight_cache_preload.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/py.typed +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/runner/checkpoints.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/runner/deploy.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/runner/lifecycle.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/runner/verified_revisions.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/schema/__init__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/schema/fields.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/serve/__init__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/serve/deploy.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/serve/export.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/serve/preflight.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/serve/pricing.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/serve/urls.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/__init__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/__main__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/_deps.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/_internal_client.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/_locks.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/_runtime.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/app.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/auth.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/billing.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/billing_retry.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/checkpoints.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/db.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/environment_registry.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/envs.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/projects.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/reconcile.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/routes/__init__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/routes/envs.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/routes/meta.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/routes/runs.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/routes/serving.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/server/run_registry.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/thinking.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/infisical-entrypoint.sh +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/scripts/build_dev_dist.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/scripts/scrub_history.sh +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/__init__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/_helpers/__init__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/_helpers/runner.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/_helpers/specs.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/_helpers/vast.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/conftest.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/fixtures/math_eval.jsonl +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/fixtures/math_train.jsonl +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/live/__init__.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/live/conftest.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/live/test_lambda_live.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/live/test_runpod_live.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/live/test_vast_live.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_accounting_coverage.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_agent_flash_cli_contract.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_algorithms.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_allocator.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_async_uploads.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_backend_common.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_backend_jobspec_contract.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_base_model_provenance.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_billing_retry.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cancel_remote.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_catalog_consistency.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_charge_pricing.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_checkpoints.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_commands.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_commands_coverage.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_credential_shadowing.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_errors.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_estimate.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_gpus_flag.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_help.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_main_coverage.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_managed.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_render_coverage.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_render_theme.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_traces.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cli_wandb_warning.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_client.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_client_server_integration.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_client_stream_reads.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_config_overrides.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_controlled_experiment_repairs.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cost_analytical.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cost_equation.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cost_estimate.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cost_hardware.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cost_models.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_cost_rewards.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_deploy_latency.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_dev_channel.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_disk_gb.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_endpoint_name.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_cache_evict.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_delete.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_download.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_download_api.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_evaluations.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_no_install.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_publish.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_pull.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_pull_coverage.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_pull_loader_coverage.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_pull_managed_control_plane.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_push.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_rate_limit_resolve.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_ref_pinning.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_env_test.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_export.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_flash_mvp.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_flash_worker.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_flashinfer_cache_dirs.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_github_urlopen_retry.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_gpu_type_single_field.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_gpus.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_grpo_mask_aware.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_grpo_params.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_health_liveness.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_hf_retry.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_idle_endpoint_reaper.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_instance_bootstrap_coverage.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_internal_client.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_jobs.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_kv_util.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_lambda_api_coverage.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_lambda_runner.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_logging.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_login_perms.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_lora_rank_coverage.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_lora_rank_preflight.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_managed_config_fields.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_managed_hf_repo.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_metrics_schema_agent_contract.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_mig_guard.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_multimodal_input_grads.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_multimodal_training.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_named_reward_metrics.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_oom_escalate_gpu.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_opd.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_opd_resume_safety.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_open_model_policy.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_orchestrator_flash.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_packing.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_packing_coverage.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_poll_helpers.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_preflight.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_projects.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_provider_preflight_coverage.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_provider_routing.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_provider_teardown_robustness.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_providers_symmetry.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_realized_cost.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_resolve_params_b.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_resume_on_retry.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_reward_profile.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_rl_train.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_rollout_samples.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_runmgmt.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_runpod_api_delete.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_runpod_key_fingerprint.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_runpod_key_waterfall.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_runpod_slots.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_serve.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_serve_reasoning_content.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_server_api.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_server_app_coverage.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_server_auth_singleflight.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_server_billing.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_server_checkpoints_coverage.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_server_db.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_server_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_server_locks_coverage.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_serving_context_preflight.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_serving_contract.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_serving_pricing_coverage.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_serving_schema_coverage.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_sft_chunked_nll.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_sft_example_selection.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_sft_gc_off.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_sft_max_context.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_sft_train.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_spec_and_validation.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_step_metrics.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_thinking_config.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_train_context_preflight.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_training_controls.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_update_check.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_vast_api.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_vast_api_coverage.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_vast_offers.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_vast_provider_coverage.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_vast_runner.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_verified_revisions.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_verifiers.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_version.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_vl_warmstart_adapter_keys.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_vram_architecture.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_wandb_link.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_wandb_log_coverage.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_wandb_naming.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_warmstart_adapter_download.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_warmstart_cross_repo.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_warmstart_error_attribution.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_weight_cache.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_worker_dryrun.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_worker_hardexit.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_worker_image.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_worker_init_heartbeat.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_worker_stack.py +0 -0
- {freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/tests/test_worker_thinking.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: freesolo-flash-dev
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.72
|
|
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
|
|
@@ -38,6 +38,7 @@ from flash.engine.worker.backend_common import (
|
|
|
38
38
|
parse_wandb_link,
|
|
39
39
|
ray_num_cpus,
|
|
40
40
|
render_wandb_link_shim,
|
|
41
|
+
resolve_blackwell_attention_backends,
|
|
41
42
|
resolve_rollout_enforce_eager,
|
|
42
43
|
resolve_verl_device_capability,
|
|
43
44
|
resolve_verl_loggers,
|
|
@@ -1561,6 +1562,25 @@ def build_opd_overrides(config: dict) -> list[str]:
|
|
|
1561
1562
|
# rollout.enforce_eager is a real verl field, so this is a plain override, not a '+' append.
|
|
1562
1563
|
# the caller resolves it from the device capability; absent/false keeps verl's default.
|
|
1563
1564
|
*(["actor_rollout_ref.rollout.enforce_eager=True"] if config.get("enforce_eager") else []),
|
|
1565
|
+
# blackwell attention pins, resolved by the caller and absent off blackwell. both are real
|
|
1566
|
+
# AsyncEngineArgs fields in the pinned vllm 0.19.1 and verl spreads engine_kwargs.vllm
|
|
1567
|
+
# straight into them, so '+' appends under the existing struct exactly as on the grpo path.
|
|
1568
|
+
*(
|
|
1569
|
+
[
|
|
1570
|
+
"+actor_rollout_ref.rollout.engine_kwargs.vllm.attention_backend="
|
|
1571
|
+
f"{config['attention_backend']}"
|
|
1572
|
+
]
|
|
1573
|
+
if config.get("attention_backend")
|
|
1574
|
+
else []
|
|
1575
|
+
),
|
|
1576
|
+
*(
|
|
1577
|
+
[
|
|
1578
|
+
"+actor_rollout_ref.rollout.engine_kwargs.vllm.mm_encoder_attn_backend="
|
|
1579
|
+
f"{config['mm_encoder_attn_backend']}"
|
|
1580
|
+
]
|
|
1581
|
+
if config.get("mm_encoder_attn_backend")
|
|
1582
|
+
else []
|
|
1583
|
+
),
|
|
1564
1584
|
# keep the rollout engine RESIDENT for models whose vLLM wake/reload HANGS (catalog
|
|
1565
1585
|
# sleep_unsupported), exactly as the grpo path does. opd is NOT exempt: main_ppo_sync calls
|
|
1566
1586
|
# checkpoint_manager.sleep_replicas() during init_workers and again around validation, which
|
|
@@ -2389,7 +2409,19 @@ def run_opd_train(spec=None) -> None:
|
|
|
2389
2409
|
# oom. see resolve_rollout_enforce_eager for why this one knob is enough and cannot fight
|
|
2390
2410
|
# verl's: vllm resolves enforce_eager LAST (config/vllm.py:1024), after the async server has set
|
|
2391
2411
|
# cudagraph_mode, and forces both compilation mode and cudagraph_mode to NONE.
|
|
2392
|
-
|
|
2412
|
+
# one capability probe feeds both rollout decisions, as it does on the grpo path.
|
|
2413
|
+
verl_cc = resolve_verl_device_capability(python_bin)
|
|
2414
|
+
enforce_eager = resolve_rollout_enforce_eager(verl_cc)
|
|
2415
|
+
# the same grpo/opd divergence as enforce_eager above, one knob over: blackwell needs both
|
|
2416
|
+
# rollout attention backends pinned because vllm 0.19.1's defaults are wrong there, and opd
|
|
2417
|
+
# never pinned them. the ViT default routes into a CUTE flash-attn that is unimportable against
|
|
2418
|
+
# every published nvidia-cutlass-dsl, which aborts the engine with
|
|
2419
|
+
# `RuntimeError: Worker failed with error 'module 'cutlass.cute.core' has no attribute
|
|
2420
|
+
# 'ThrMma''` -- and a VL model builds its vision tower even for a text-only rollout, so this
|
|
2421
|
+
# reaches text-only opd too. no-op off blackwell. see resolve_blackwell_attention_backends.
|
|
2422
|
+
attention_backend, mm_encoder_attn_backend = resolve_blackwell_attention_backends(
|
|
2423
|
+
python_bin, verl_cc
|
|
2424
|
+
)
|
|
2393
2425
|
|
|
2394
2426
|
plugin_path = os.path.join(shim_dir, "flash_opd_plugin.py")
|
|
2395
2427
|
shutil.copy2(os.path.join(os.path.dirname(__file__), "opd_plugin.py"), plugin_path)
|
|
@@ -2489,6 +2521,8 @@ def run_opd_train(spec=None) -> None:
|
|
|
2489
2521
|
"structured_outputs": structured_outputs,
|
|
2490
2522
|
"fp8_kv": fp8_kv,
|
|
2491
2523
|
"enforce_eager": enforce_eager,
|
|
2524
|
+
"attention_backend": attention_backend,
|
|
2525
|
+
"mm_encoder_attn_backend": mm_encoder_attn_backend,
|
|
2492
2526
|
"sleep_unsupported": rollout_sleep_unsupported(model_id),
|
|
2493
2527
|
"loggers": loggers,
|
|
2494
2528
|
}
|
|
@@ -29,7 +29,7 @@ from flash.opd_retry_contract import (
|
|
|
29
29
|
require_opd_retry_contract_version,
|
|
30
30
|
)
|
|
31
31
|
from flash.providers._poll import _MAX_ATTEMPT_ID, _attempt_int
|
|
32
|
-
from flash.spec import MANAGED_GPU_KEYS,
|
|
32
|
+
from flash.spec import MANAGED_GPU_KEYS, TRAINER_BACKEND, JobSpec
|
|
33
33
|
|
|
34
34
|
_STATE_DIR = os.path.join(os.path.expanduser("~"), ".flash")
|
|
35
35
|
RUNS_DIR = os.path.join(_STATE_DIR, "runs")
|
|
@@ -1207,7 +1207,7 @@ def _persist_effective_worker_spec(worker_spec: JobSpec) -> bool:
|
|
|
1207
1207
|
"worker_spec": worker_spec.to_internal_dict(),
|
|
1208
1208
|
"adapter_identity": adapter_identity,
|
|
1209
1209
|
"preparation_digest": _preparation_digest(public_spec, worker_spec, adapter_identity),
|
|
1210
|
-
"backend":
|
|
1210
|
+
"backend": TRAINER_BACKEND,
|
|
1211
1211
|
}
|
|
1212
1212
|
return _update(
|
|
1213
1213
|
worker_spec.run_id,
|
|
@@ -1297,7 +1297,7 @@ def submit_job(
|
|
|
1297
1297
|
"preparation_digest": _preparation_digest(
|
|
1298
1298
|
public_spec, worker_spec, prepared.adapter_identity
|
|
1299
1299
|
),
|
|
1300
|
-
"backend":
|
|
1300
|
+
"backend": TRAINER_BACKEND,
|
|
1301
1301
|
},
|
|
1302
1302
|
# Snapshot the instance providers available at submit so a later handle-less recovery can fail
|
|
1303
1303
|
# closed for any phantom-capable one whose creds were since dropped (see _confirm_run_clear).
|
|
@@ -215,18 +215,10 @@ def validate_worker_env_reserved(worker_env: Any) -> None:
|
|
|
215
215
|
)
|
|
216
216
|
|
|
217
217
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
spec resolves "verl" whatever [worker_env] says.
|
|
223
|
-
|
|
224
|
-
kept as a function rather than folded into its call sites because the answer is load-bearing --
|
|
225
|
-
it picks the allocator conf (a spec that resolved "trl" would take expandable_segments and crash
|
|
226
|
-
its vLLM rollout outright, cumem.py CuMemAllocator assert) and gates multi-gpu, so the
|
|
227
|
-
resolution belongs in one place even now that it has one answer.
|
|
228
|
-
"""
|
|
229
|
-
return "verl"
|
|
218
|
+
# the trainer every run reports. run_sft, run_opd and run_rl all delegate straight to verl, so this
|
|
219
|
+
# is a constant rather than a resolution: nothing in [worker_env] or the spec can select anything
|
|
220
|
+
# else. recorded on effective_preparation so a stored run says which trainer produced it.
|
|
221
|
+
TRAINER_BACKEND = "verl"
|
|
230
222
|
|
|
231
223
|
|
|
232
224
|
def require_matching_seed(spec: JobSpec, seed: Any) -> int:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "freesolo-flash-dev"
|
|
3
|
-
version = "1.0.
|
|
3
|
+
version = "1.0.72"
|
|
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).
|
|
@@ -123,7 +123,7 @@ artifacts = ["flash/py.typed"]
|
|
|
123
123
|
# auto-published by .github/workflows/publish-dev.yml: a push to `dev` whose version isn't yet on
|
|
124
124
|
# PyPI publishes it; pushes that don't change it find it already published and no-op. So cutting a
|
|
125
125
|
# dev-channel release = bump this (and [project].version) and merge to `dev`.
|
|
126
|
-
version = "1.0.
|
|
126
|
+
version = "1.0.72"
|
|
127
127
|
|
|
128
128
|
[tool.pytest.ini_options]
|
|
129
129
|
pythonpath = ["."]
|
|
@@ -288,7 +288,7 @@ def test_a_stale_backend_key_cannot_change_the_allocator(stale_backend):
|
|
|
288
288
|
trainer that cannot run, and "trl" on grpo/opd would hand verl's rollout the expandable conf that
|
|
289
289
|
trips the CuMemAllocator assert before step 1."""
|
|
290
290
|
from flash.providers._worker import build_worker_env
|
|
291
|
-
from flash.spec import JobSpec
|
|
291
|
+
from flash.spec import JobSpec
|
|
292
292
|
|
|
293
293
|
for algorithm, phase, expect_expandable in (
|
|
294
294
|
("grpo", "rl", False),
|
|
@@ -304,7 +304,6 @@ def test_a_stale_backend_key_cannot_change_the_allocator(stale_backend):
|
|
|
304
304
|
}
|
|
305
305
|
)
|
|
306
306
|
env = build_worker_env(spec, 0)
|
|
307
|
-
assert effective_backend(spec) == "verl"
|
|
308
307
|
for key in ("PYTORCH_ALLOC_CONF", "PYTORCH_CUDA_ALLOC_CONF"):
|
|
309
308
|
assert ("expandable_segments" in env[key]) is expect_expandable, (
|
|
310
309
|
f"{algorithm} allocator moved under a stale {stale_backend!r} key"
|
|
@@ -42,33 +42,37 @@ def test_gate_helper_allows_single_gpu():
|
|
|
42
42
|
|
|
43
43
|
|
|
44
44
|
@pytest.mark.parametrize("algorithm", ["sft", "grpo", "opd"])
|
|
45
|
-
def
|
|
45
|
+
def test_gate_allows_multi_gpu_on_a_provider_that_rents_n_cards(algorithm):
|
|
46
|
+
# no phase has a selector left: run_sft, run_rl and run_opd all delegate to verl, whose worker
|
|
47
|
+
# launches nproc-per-node == gpu.count ranks. so multi-gpu needs no opt-in beyond the provider.
|
|
46
48
|
from flash import runner
|
|
47
49
|
|
|
48
|
-
# every verl worker launches nproc-per-node == gpu.count ranks, so all three shard.
|
|
49
|
-
assert runner._require_supported_gpu_count(_spec(4, algorithm, backend="verl")) is None
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
@pytest.mark.parametrize("algorithm", ["sft", "grpo", "opd"])
|
|
53
|
-
def test_gate_allows_multi_gpu_with_no_key_at_all(algorithm):
|
|
54
|
-
from flash import runner
|
|
55
|
-
|
|
56
|
-
# no phase has a selector: run_sft, run_rl and run_opd all delegate to verl, so multi-gpu needs
|
|
57
|
-
# no opt-in anywhere.
|
|
58
50
|
assert runner._require_supported_gpu_count(_spec(4, algorithm)) is None
|
|
59
51
|
|
|
60
52
|
|
|
61
|
-
@pytest.mark.parametrize("
|
|
62
|
-
|
|
53
|
+
@pytest.mark.parametrize("stale", ["verl", "trl", "bogus"])
|
|
54
|
+
@pytest.mark.parametrize("provider", ["runpod", "vast"])
|
|
55
|
+
def test_a_stale_backend_key_changes_no_gate_outcome(stale, provider):
|
|
56
|
+
"""A [worker_env] selector carried over from the trl era must not move this gate either way.
|
|
57
|
+
|
|
58
|
+
Asserted as "same outcome as the identical spec WITHOUT the key" rather than as a fixed verdict:
|
|
59
|
+
a bare `is None` on a runpod spec passes no matter what the gate does with the key, since the
|
|
60
|
+
provider alone already decides it. Pairing against the no-key baseline on BOTH an accepting and
|
|
61
|
+
a rejecting provider is what makes the claim able to fail -- it breaks the moment the gate starts
|
|
62
|
+
reading worker_env, in either direction.
|
|
63
|
+
"""
|
|
63
64
|
from flash import runner
|
|
64
|
-
from flash.spec import effective_backend
|
|
65
65
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
66
|
+
def outcome(backend: str) -> str:
|
|
67
|
+
try:
|
|
68
|
+
runner._require_supported_gpu_count(
|
|
69
|
+
_spec(4, "grpo", backend=backend, provider=provider)
|
|
70
|
+
)
|
|
71
|
+
except ValueError as exc:
|
|
72
|
+
return f"rejected: {exc}"
|
|
73
|
+
return "allowed"
|
|
74
|
+
|
|
75
|
+
assert outcome(stale) == outcome("")
|
|
72
76
|
|
|
73
77
|
|
|
74
78
|
def test_gate_rejects_multi_gpu_on_providers_that_ignore_count():
|
|
@@ -81,17 +85,6 @@ def test_gate_rejects_multi_gpu_on_providers_that_ignore_count():
|
|
|
81
85
|
runner._require_supported_gpu_count(_spec(4, backend="verl", provider=provider))
|
|
82
86
|
|
|
83
87
|
|
|
84
|
-
def test_effective_backend_is_verl_for_every_phase():
|
|
85
|
-
from flash.spec import effective_backend
|
|
86
|
-
|
|
87
|
-
# verl is the only backend. this stays pinned because the answer is load-bearing: it picks the
|
|
88
|
-
# allocator conf and gates multi-gpu, and a spec that resolved anything else would take
|
|
89
|
-
# expandable_segments and crash its vllm rollout on the CuMemAllocator assert.
|
|
90
|
-
for algorithm in ("sft", "grpo", "opd"):
|
|
91
|
-
assert effective_backend(_spec(1, algorithm)) == "verl"
|
|
92
|
-
assert effective_backend(_spec(1, algorithm, backend="trl")) == "verl"
|
|
93
|
-
|
|
94
|
-
|
|
95
88
|
def test_submit_job_rejects_multi_gpu_at_boundary(monkeypatch):
|
|
96
89
|
from flash import runner
|
|
97
90
|
|
|
@@ -4641,10 +4641,57 @@ def test_the_resolved_eager_flag_reaches_the_opd_verl_config():
|
|
|
4641
4641
|
# the string assertions above pass against a resolver whose answer is never carried into the
|
|
4642
4642
|
# config, which is exactly the shape of the bug this fixes. pin the wiring.
|
|
4643
4643
|
built = inspect.getsource(opd_train.run_opd_train)
|
|
4644
|
-
|
|
4644
|
+
# one probe now feeds both eager and the attention pins, so the call is bound to a name rather
|
|
4645
|
+
# than nested inline. assert the resolver still consumes THAT probe, not a second one.
|
|
4646
|
+
assert "verl_cc = resolve_verl_device_capability(python_bin)" in built
|
|
4647
|
+
assert "resolve_rollout_enforce_eager(verl_cc)" in built
|
|
4645
4648
|
assert '"enforce_eager": enforce_eager,' in built
|
|
4646
4649
|
|
|
4647
4650
|
|
|
4651
|
+
def test_opd_pins_the_blackwell_attention_backends_like_grpo_does():
|
|
4652
|
+
"""VERL-156: opd's rollout died on B200 because it never pinned the ViT attention backend.
|
|
4653
|
+
|
|
4654
|
+
vllm 0.19.1 defaults the ViT to a CUTE flash-attn that is unimportable against every published
|
|
4655
|
+
nvidia-cutlass-dsl, so the engine aborts with `cutlass.cute.core has no attribute 'ThrMma'`.
|
|
4656
|
+
grpo has pinned both backends since the trl driver; opd never did, which is the same one-sided
|
|
4657
|
+
fix that produced the enforce_eager bug directly above. two attempts on two fresh B200s
|
|
4658
|
+
reproduced it byte-identically before this was found.
|
|
4659
|
+
"""
|
|
4660
|
+
# off blackwell the resolver answers (None, None) and nothing may be emitted -- an unconditional
|
|
4661
|
+
# pin would change the rollout on every other card.
|
|
4662
|
+
off = build_opd_overrides(_config())
|
|
4663
|
+
assert not any("attention_backend" in value for value in off)
|
|
4664
|
+
|
|
4665
|
+
on = build_opd_overrides(
|
|
4666
|
+
_config(attention_backend="FLASHINFER", mm_encoder_attn_backend="TORCH_SDPA")
|
|
4667
|
+
)
|
|
4668
|
+
# '+' appends under the existing engine_kwargs.vllm struct: these are AsyncEngineArgs fields
|
|
4669
|
+
# spread by verl, not declared RolloutConfig fields, so a bare assignment would not reach them.
|
|
4670
|
+
assert "+actor_rollout_ref.rollout.engine_kwargs.vllm.attention_backend=FLASHINFER" in on, on
|
|
4671
|
+
assert (
|
|
4672
|
+
"+actor_rollout_ref.rollout.engine_kwargs.vllm.mm_encoder_attn_backend=TORCH_SDPA" in on
|
|
4673
|
+
), on
|
|
4674
|
+
|
|
4675
|
+
|
|
4676
|
+
def test_both_ray_rollouts_pin_blackwell_attention_from_the_same_resolver():
|
|
4677
|
+
# the enforce_eager cross-trainer check below exists because a one-sided fix is how that bug
|
|
4678
|
+
# shipped. the attention pins are the same divergence one knob over, so assert them the same
|
|
4679
|
+
# way rather than trusting opd alone.
|
|
4680
|
+
for module, source in (
|
|
4681
|
+
("rl_train", inspect.getsource(rl_train.run_rl_train)),
|
|
4682
|
+
("opd_train", inspect.getsource(opd_train.run_opd_train)),
|
|
4683
|
+
):
|
|
4684
|
+
# the resolver must be CALLED and its second return value must be carried onward. the two
|
|
4685
|
+
# trainers spell the handoff differently (rl_train passes it as a kwarg into
|
|
4686
|
+
# _rl_runconfig, opd_train builds its config dict inline), so assert the binding both
|
|
4687
|
+
# share rather than either one's syntax.
|
|
4688
|
+
assert "resolve_blackwell_attention_backends(" in source, module
|
|
4689
|
+
assert "attention_backend, mm_encoder_attn_backend = " in source, module
|
|
4690
|
+
assert "mm_encoder_attn_backend=mm_encoder_attn_backend" in source or (
|
|
4691
|
+
'"mm_encoder_attn_backend": mm_encoder_attn_backend,' in source
|
|
4692
|
+
), module
|
|
4693
|
+
|
|
4694
|
+
|
|
4648
4695
|
def test_both_ray_rollouts_resolve_eager_from_the_same_hardware_probe():
|
|
4649
4696
|
# asserted across BOTH trainers rather than in one file: grpo has resolved this since the trl
|
|
4650
4697
|
# driver and opd did not, so opd captured 102 cuda graphs on an rtx 4090 and died on HOST ram
|
|
@@ -5384,19 +5431,17 @@ def test_opd_delegates_to_verl_with_no_selector_left(monkeypatch):
|
|
|
5384
5431
|
|
|
5385
5432
|
|
|
5386
5433
|
def test_opd_spec_never_resolves_the_allocator_conf_that_kills_vllm(monkeypatch):
|
|
5387
|
-
"""An OPD spec must
|
|
5434
|
+
"""An OPD spec must build a NON-expandable allocator conf.
|
|
5388
5435
|
|
|
5389
|
-
|
|
5390
|
-
|
|
5391
|
-
|
|
5392
|
-
defaulted True, so the engine always builds a CuMemAllocator, which asserts outright on
|
|
5393
|
-
expandable_segments (cumem.py, pytorch#147851) -- the run would die before step 1.
|
|
5436
|
+
verl leaves rollout.enable_sleep_mode defaulted True, so the engine always builds a
|
|
5437
|
+
CuMemAllocator, which asserts outright on expandable_segments (cumem.py, pytorch#147851) -- the
|
|
5438
|
+
run would die before step 1.
|
|
5394
5439
|
|
|
5395
5440
|
A [worker_env] selector must not be able to reintroduce it either: run_opd delegates to verl
|
|
5396
|
-
unconditionally, so honoring
|
|
5441
|
+
unconditionally, so honoring a stale key would pick an allocator for a backend that cannot run.
|
|
5397
5442
|
"""
|
|
5398
5443
|
from flash.providers._worker import build_worker_env
|
|
5399
|
-
from flash.spec import JobSpec
|
|
5444
|
+
from flash.spec import JobSpec
|
|
5400
5445
|
|
|
5401
5446
|
def _spec(worker_env=None):
|
|
5402
5447
|
payload = {
|
|
@@ -5415,7 +5460,6 @@ def test_opd_spec_never_resolves_the_allocator_conf_that_kills_vllm(monkeypatch)
|
|
|
5415
5460
|
for worker_env in (None, {"FLASH_OPD_BACKEND": "trl"}, {"FLASH_OPD_BACKEND": "bogus"}):
|
|
5416
5461
|
spec = _spec(worker_env)
|
|
5417
5462
|
assert spec.phase == "opd"
|
|
5418
|
-
assert effective_backend(spec) == "verl", worker_env
|
|
5419
5463
|
alloc = build_worker_env(spec, spec.seed)["PYTORCH_CUDA_ALLOC_CONF"]
|
|
5420
5464
|
assert "expandable_segments" not in alloc, (worker_env, alloc)
|
|
5421
5465
|
|
|
@@ -5431,7 +5475,6 @@ def test_opd_spec_never_resolves_the_allocator_conf_that_kills_vllm(monkeypatch)
|
|
|
5431
5475
|
"gpu": {"type": "B200", "count": 1, "provider": "runpod"},
|
|
5432
5476
|
}
|
|
5433
5477
|
)
|
|
5434
|
-
assert effective_backend(sft) == "verl"
|
|
5435
5478
|
assert build_worker_env(sft, sft.seed)["PYTORCH_CUDA_ALLOC_CONF"] == "expandable_segments:True"
|
|
5436
5479
|
|
|
5437
5480
|
|
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/ISSUE_TEMPLATE/bug_report.yml
RENAMED
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/ISSUE_TEMPLATE/feature_request.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/bake-kernel-cache.yml
RENAMED
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/main-source-guard.yml
RENAMED
|
File without changes
|
{freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.github/workflows/notify-tests-repo.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/.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
|
{freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/multiturn_reward_scoring.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
|
{freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/backend_common.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/grpo_multiturn.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/kernel_warmup.py
RENAMED
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/multiturn_glue.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/opd_multiturn.py
RENAMED
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/opd_structured.py
RENAMED
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/perf/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/perf/diagnostics.py
RENAMED
|
File without changes
|
{freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/perf/lifecycle.py
RENAMED
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.0.71 → freesolo_flash_dev-1.0.72}/flash/engine/worker/perf/loraplus.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|