freesolo-flash-dev 1.2.70__tar.gz → 1.2.87__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.70 → freesolo_flash_dev-1.2.87}/Dockerfile.worker +12 -5
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/PKG-INFO +1 -1
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/adapters/fused_experts.py +30 -28
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/plan/vram.py +28 -2
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/backend_common.py +1 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/opd_train.py +3 -2
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/perf/__init__.py +4 -3
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/rl_train.py +5 -2
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/verl/capabilities.py +35 -4
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/pyproject.toml +2 -2
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_fused_expert_warmstart.py +148 -21
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_multi_gpu_gate.py +103 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_opd.py +173 -8
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_worker_stack.py +80 -21
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/uv.lock +1 -1
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.dockerignore +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.env.example +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/CODEOWNERS +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/dependabot.yml +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/auto-rebake.yml +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/bake-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/ci.yml +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/dev-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/main-source-guard.yml +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/notify-tests-repo.yml +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/production-kernel-cache-ready.yml +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/publish-dev.yml +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/publish-image.yml +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/publish.yml +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/version-parity.yml +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.github/workflows/worker-image.yml +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/.gitignore +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/CHANGELOG.md +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/CODE_OF_CONDUCT.md +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/CONTRIBUTING.md +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/Dockerfile +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/LICENSE +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/NOTICE +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/README.md +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/SECURITY.md +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/SELF_HOSTING.md +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/build/kernel_cache/.gitignore +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/build/kernel_cache/.keep +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/deploy/infisical/README.md +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/deploy/infisical/entrypoint.sh +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/docker/Dockerfile.kernelcache +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/docker/Dockerfile.kernelcache.relayer +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/docker/bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/docker/bake_pod_entry.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/docker/extract_cudart_fix.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/docker/kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/docker/make_rp_handler.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/_internal/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/_internal/channel.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/_internal/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/_internal/fileio.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/_internal/logging.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/_internal/paths.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/adapters/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/adapters/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/adapters/lora_rank.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/__main__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/deploy.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/episode.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/eval.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/eval_args.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/imports.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/list.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/push.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/retained.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/setup.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/setup_wandb.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/test.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/test_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/test_params.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/env/test_warnings.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/traces.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/commands/train_cost.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/scaffold/TRAINING.md +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/scaffold/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/ui/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/ui/cost.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/ui/env_panels.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/ui/heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/ui/render.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/ui/tables.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cli/ui/tty.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/client/config.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/client/freesolo_api.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/client/http.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/client/runtime_secrets.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/client/shapes.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/client/specs.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/client/streaming.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/content/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/content/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/content/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/content/thinking.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/core/catalog.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/core/spec.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/core/spec_persistence.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cost/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cost/analytical.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cost/facts.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cost/spec.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/cost/types.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/huggingface.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/plan/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/plan/kv_sizing.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/plan/model_config_probe.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/plan/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/plan/recipe.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/plan/steps.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/image_tokens.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/reasoning_render.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/sft_image_rows.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/tokenizer.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/profiling/workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/result/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/result/accounting.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/result/rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/__main__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/entry/opd.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/entry/rl.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/entry/sft.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/io/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/io/heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/io/hf.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/io/prefetch.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/io/wandb_log.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/model/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/model/adapter.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/model/chatml_mask.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/model/decoding.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/model/lora.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/model/packing.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/opd_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/perf/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/perf/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/perf/liger.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/perf/memory.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/rl_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/runtime/rng.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/score_batcher.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/sft_train.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/sft_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/teacher/client.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/teacher/encoding.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/core/checkpoint_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/core/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/core/child/glue.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/core/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/core/step_timing.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/finalize.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/batching.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/bridge.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/bridge_failures.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/bridge.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/child/structured.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/failures.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/gkd.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/overrides.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/prompts.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/reporting.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/scoring.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/state.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/opd/validation.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/child/patches.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/config.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/inputs.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/multi_turn.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/reward_module.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/scoring.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/single_turn.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/rl/verl_config.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/sft/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/sft/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/sft/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/sft/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/train/sft/config.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/verl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/verl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/verl/child_io.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/verl/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/verl/parallelism.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/verl/parent_work.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker_entrypoint.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/adapter.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/base.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/cache_security.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/dataset_selection.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/evaluations.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/identity.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/loader.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/namespace_listing.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/package/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/package/direct_tokens.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/package/limits.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/package/unpack.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/envs/pull.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/auth.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/bootstrap.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/bootstrap_console.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/deadline.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/host/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/host/failmark.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/host/hostlog.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/http.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/instance.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/poll.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/poll_instance.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/provider.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/_lifecycle/worker.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/allocator.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/artifacts/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/artifacts/hf.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/artifacts/preload_runpod.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/artifacts/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/base.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/fit_errors.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/api.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/auth.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/gpus.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/jobs/reap.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/preflight.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/lambda_/pricing.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/preflight.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/realized.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/api.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/auth.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/cost.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/gpus.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/job_execution.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/jobs.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/preflight.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/pricing.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/resources.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/serverless/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/runpod/serverless/endpoints.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/sharding.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/vast/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/vast/api.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/vast/auth.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/vast/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/vast/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/vast/preflight.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/providers/vast/pricing.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/py.typed +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/attempts.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/costs.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/deadlines.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/preparation.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/reconciliation.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/results/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/results/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/results/verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/status.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/submit.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/attach.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/deploy.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/recovery.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/retry_decision.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/seed_submission.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/supervise/transitions.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runner/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runtime_capsule/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runtime_capsule/build.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runtime_capsule/manifest.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/runtime_capsule/profiles.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/schema/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/schema/fields.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/serve/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/serve/adapter_check.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/serve/deploy.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/serve/errors.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/serve/export.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/serve/preflight.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/serve/responses.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/serve/streaming.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/serve/thinking.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/serve/urls.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/__main__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/app.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/billing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/billing/charges.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/billing/retry.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/domain/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/domain/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/domain/environment_registry.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/domain/envs.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/domain/projects.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/domain/reconcile.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/domain/repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/domain/run_registry.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/domain/teacher_broker.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/domain/teacher_errors.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/domain/teacher_requests.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/platform/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/platform/auth.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/platform/db.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/platform/deps.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/platform/internal_client.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/platform/locks.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/platform/runtime.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/routes/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/routes/envs.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/routes/meta.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/routes/runs.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/routes/serving.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/routes/serving_completion.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/routes/serving_revisions.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/routes/serving_smoke.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/server/routes/teacher.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/source_snapshot.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/teacher/limits.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/teacher/retry_contract.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/scripts/build_dev_dist.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/scripts/check_file_size.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/scripts/check_function_size.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/scripts/check_verl_pin_exists.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/scripts/scrub_history.sh +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/_helpers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/_helpers/profile.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/_helpers/runner.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/_helpers/source_snapshot.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/_helpers/specs.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/_helpers/teacher.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/_helpers/vast.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/capture_image_sft_processor_oracle.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/conftest.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/fixtures/image_sft_processor_oracle.json +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/fixtures/math_eval.jsonl +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/fixtures/math_train.jsonl +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/live/__init__.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/live/conftest.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/live/test_lambda_live.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/live/test_runpod_live.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/live/test_sft_thinking_render_live.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/live/test_vast_live.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_accounting_coverage.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_adapter_shard_completeness.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_agent_flash_cli_contract.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_algorithms.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_allocator.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_backend_common.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_backend_jobspec_contract.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_base_model_provenance.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_billing_retry.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_build_context_contract.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cancel_remote.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_catalog_consistency.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_catalog_only_models.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_charge_pricing.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_checkpoint_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_commands.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_commands_coverage.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_credential_shadowing.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_errors.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_estimate.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_gpus_flag.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_help.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_main_coverage.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_managed.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_render_coverage.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_render_theme.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_traces.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cli_wandb_warning.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_client.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_client_import_purity.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_client_server_integration.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_client_stream_reads.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_config_env_vars.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_config_overrides.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_console_upload.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_controlled_experiment_repairs.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cost_analytical.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cost_equation.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cost_estimate.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cost_hardware.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_cost_models.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_deploy_alias_move_warning.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_deploy_latency.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_dev_channel.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_disk_gb.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_endpoint_name.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_cache_evict.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_delete.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_download.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_download_api.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_list_api.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_list_cli.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_list_hub.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_no_install.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_publish.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_pull.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_pull_coverage.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_pull_loader_coverage.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_pull_managed_control_plane.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_push.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_rate_limit_resolve.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_ref_pinning.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_env_test.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_export.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_flash_mvp.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_flash_worker.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_flashinfer_cache_dirs.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_freesolo_api_transport.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_github_urlopen_retry.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_gpu_type_single_field.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_gpus.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_grpo_params.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_grpo_resident_sizing.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_grpo_reward_batching.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_health_liveness.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_hf_retry.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_idle_endpoint_reaper.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_image_sft_markers.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_image_sft_processor_parity.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_image_tokens.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_infisical_secrets.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_instance_bootstrap_coverage.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_internal_client.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_jobs.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_kv_util.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_lambda_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_lambda_runner.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_logging.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_login_perms.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_lora_rank_coverage.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_lora_rank_preflight.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_managed_config_fields.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_managed_hf_repo.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_metrics_schema_agent_contract.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_mig_guard.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_multimodal_training.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_named_reward_metrics.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_oom_escalate_gpu.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_opd_limits.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_opd_multiturn_eos_boundary.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_opd_multiturn_failure_exit.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_opd_replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_opd_resume_safety.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_opd_train.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_orchestrator_flash.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_packing.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_packing_coverage.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_parasail_teacher.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_persisted_spec_envelope.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_poll_helpers.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_preflight.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_projects.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_provider_preflight_coverage.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_provider_routing.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_provider_teardown_robustness.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_providers_symmetry.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_realized_cost.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_resolve_params_b.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_resume_on_retry.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_rl_train.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_runmgmt.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_runpod_api_delete.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_runpod_key_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_runpod_key_waterfall.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_runtime_capsule.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_serve.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_serve_reasoning_content.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_server_api.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_server_app_coverage.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_server_auth_singleflight.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_server_billing.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_server_checkpoints_coverage.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_server_db.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_server_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_server_locks_coverage.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_server_standalone.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_serving_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_serving_contract.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_serving_schema_coverage.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_sft_chunked_nll.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_sft_example_selection.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_sft_gc_off.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_sft_max_context.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_sft_startup_block.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_sft_train.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_source_attestation_flow.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_source_snapshot.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_spec_and_validation.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_spec_contract_bytes.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_step_floor.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_step_metrics.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_step_timing.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_teacher_broker.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_teacher_encoding_contract.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_thinking_config.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_train_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_training_controls.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_type_comment_prose.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_vast_api.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_vast_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_vast_offers.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_vast_provider_coverage.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_vast_runner.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_verifiers.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_verl_checkpoint_export.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_verl_child_plugins.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_verl_silence_watchdog.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_version.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_vl_warmstart_adapter_keys.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_vram_architecture.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_wandb_link.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_wandb_naming.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_warmstart_adapter_download.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_warmstart_cross_repo.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_warmstart_error_attribution.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_worker_dryrun.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_worker_hardexit.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_worker_image.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_worker_init_heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_worker_thinking.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_workflow_contracts.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_zero2_sharding_gate.py +0 -0
|
@@ -59,15 +59,15 @@ RUN pip install --no-cache-dir \
|
|
|
59
59
|
"wandb>=0.17" \
|
|
60
60
|
"flash-linear-attention @ git+https://github.com/fla-org/flash-linear-attention.git@9c8e42e762fce087c27b673af4922795d9edb85e" \
|
|
61
61
|
"flash-qla==0.1.2" \
|
|
62
|
-
"tilelang==0.1.
|
|
63
|
-
"apache-tvm-ffi==0.1.
|
|
62
|
+
"tilelang==0.1.9" \
|
|
63
|
+
"apache-tvm-ffi==0.1.9" \
|
|
64
64
|
"hf_transfer" \
|
|
65
65
|
"freesolo>=0.4.1" \
|
|
66
66
|
"runpod"
|
|
67
67
|
# Gated-DeltaNet (Qwen3.5/3.6) runs on flash-linear-attention's Triton kernels. On consumer cards
|
|
68
68
|
# (Ampere/Ada/Blackwell) the Triton path is correct. On Hopper (sm90) fla's GDN chunk_bwd is
|
|
69
69
|
# miscomputed with Triton>=3.4 (fla #640) — the fix is fla's TILELANG backend (correct there), so
|
|
70
|
-
# we bake the pinned tilelang==0.1.
|
|
70
|
+
# we bake the pinned tilelang==0.1.9 + apache-tvm-ffi==0.1.9 (0.1.12 double-registers TVM-FFI ->
|
|
71
71
|
# `import tilelang` aborts) and KEEP fla on every arch; flash.engine.worker.perf._ensure_fla_fastpath_on_hopper
|
|
72
72
|
# ensures the tilelang backend is live on sm90 before any model import. The INVERSE holds on
|
|
73
73
|
# B200/sm100: THERE the tilelang chunk_bwd_dqkwg miscomputes gradients while the Triton path is
|
|
@@ -79,6 +79,13 @@ RUN pip install --no-cache-dir \
|
|
|
79
79
|
# seq16384 12.6x / 1.9x, loss matches to 1.8e-4. fla is from git: the PyPI wheel is a broken stub
|
|
80
80
|
# (no fla.modules). The git URL is PINNED to a commit (not the moving default branch) for
|
|
81
81
|
# reproducible image builds; keep this sha in lockstep with the worker dependencies in flash/providers/_lifecycle/worker.py.
|
|
82
|
+
# tilelang is 0.1.9, not the newest release: flash-qla (added for the sm90 GDN backend) hard-requires
|
|
83
|
+
# tilelang==0.1.9 AND apache-tvm-ffi==0.1.9, so 0.1.11 made this layer unsatisfiable and every image
|
|
84
|
+
# build failed from 2026-08-12 until the downgrade. 0.1.11 was only ever "latest stable at the time"
|
|
85
|
+
# (the pin exists for determinism, not to dodge a 0.1.9 defect), and the version predates flash-qla.
|
|
86
|
+
# Keep all four sites in lockstep -- both installs here, capabilities.py, and perf's TILELANG_PIN --
|
|
87
|
+
# because perf fails CLOSED: a resolved version != TILELANG_PIN deletes fla and drops sm90 to the
|
|
88
|
+
# pure-PyTorch fallback, which is correct but far slower.
|
|
82
89
|
|
|
83
90
|
# FlashAttention: PREFER a prebuilt wheel. There is no OFFICIAL Dao-AILab wheel for torch 2.10 yet,
|
|
84
91
|
# but community CI publishes matching wheels (cu128/torch2.10/cp312); CI passes one as FLASH_ATTN_SPEC
|
|
@@ -334,8 +341,8 @@ RUN printf '%s\n' "numpy==2.2.6" "xgrammar==0.1.25" "vllm==0.19.1" "transformers
|
|
|
334
341
|
cachetools uvicorn fastapi torchvision tqdm pyarrow \
|
|
335
342
|
"flash-linear-attention @ git+https://github.com/fla-org/flash-linear-attention.git@9c8e42e762fce087c27b673af4922795d9edb85e" \
|
|
336
343
|
"flash-qla==0.1.2" \
|
|
337
|
-
"tilelang==0.1.
|
|
338
|
-
"apache-tvm-ffi==0.1.
|
|
344
|
+
"tilelang==0.1.9" \
|
|
345
|
+
"apache-tvm-ffi==0.1.9" \
|
|
339
346
|
&& rm -f /tmp/verl-overrides.txt \
|
|
340
347
|
&& uv cache clean
|
|
341
348
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: freesolo-flash-dev
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.87
|
|
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
|
|
@@ -14,6 +14,8 @@ from flash.adapters.lora_rank import (
|
|
|
14
14
|
)
|
|
15
15
|
from flash.core.catalog import get_model
|
|
16
16
|
|
|
17
|
+
_LORA_FACTOR_PATTERN = re.compile(r"\.lora_[AB]\.")
|
|
18
|
+
_LORA_PARAMETER = "weight"
|
|
17
19
|
_QWEN36_MODEL_ID = "Qwen/Qwen3.6-35B-A3B"
|
|
18
20
|
_QWEN36_EXPERT_TARGET_PARAMETERS = (
|
|
19
21
|
"mlp.experts.gate_up_proj",
|
|
@@ -31,7 +33,7 @@ _FUSED_EXPERT_SYNTHETIC_MODULES = frozenset({"experts", "base_layer"})
|
|
|
31
33
|
_FUSED_EXPERT_WRAPPER_MODULES = ("mlp.experts", "mlp.experts.base_layer")
|
|
32
34
|
_INVALID_FUSED_LOCATION = object()
|
|
33
35
|
|
|
34
|
-
_LoraTensor = tuple[str, str, str,
|
|
36
|
+
_LoraTensor = tuple[str, str, str, tuple[int, ...]]
|
|
35
37
|
_LoraPair = tuple[tuple[int, ...], tuple[int, ...]]
|
|
36
38
|
|
|
37
39
|
|
|
@@ -166,12 +168,13 @@ def has_complete_fused_expert_tensors(
|
|
|
166
168
|
expected = _expected_fused_expert_rungs(config, model_id)
|
|
167
169
|
if expected is None:
|
|
168
170
|
return False
|
|
171
|
+
lora_keys = {key: shape for key, shape in tensors.items() if _LORA_FACTOR_PATTERN.search(key)}
|
|
169
172
|
parsed = [
|
|
170
173
|
tensor
|
|
171
|
-
for key, shape in
|
|
174
|
+
for key, shape in lora_keys.items()
|
|
172
175
|
if (tensor := _parse_lora_tensor(key, shape)) is not None
|
|
173
176
|
]
|
|
174
|
-
if len(
|
|
177
|
+
if len(parsed) != len(lora_keys):
|
|
175
178
|
return False
|
|
176
179
|
return _has_complete_fused_rungs(parsed, expected, model_id) and _has_ordinary_evidence(
|
|
177
180
|
parsed, config, expected
|
|
@@ -179,7 +182,17 @@ def has_complete_fused_expert_tensors(
|
|
|
179
182
|
|
|
180
183
|
|
|
181
184
|
def _parse_lora_tensor(key: str, shape: tuple[int, ...]) -> _LoraTensor | None:
|
|
182
|
-
"""Parse one canonical PEFT LoRA tensor key.
|
|
185
|
+
"""Parse one canonical PEFT LoRA tensor key.
|
|
186
|
+
|
|
187
|
+
Accept exactly the grammar PEFT writes: a bare ``lora_A.weight`` leaf with no adapter
|
|
188
|
+
namespace. ``get_peft_model_state_dict`` documents stripping the namespace on save, verl's
|
|
189
|
+
merger reproduces that strip, and ``_insert_adapter_name_into_state_dict`` re-inserts it on
|
|
190
|
+
load, so the stripped form is the only spelling that round-trips. Verified against peft 0.19.1:
|
|
191
|
+
``...lora_A.weight`` loads as ``...lora_A.default.weight`` and matches the live module, while a
|
|
192
|
+
file that already carries the namespace loads as ``...lora_A.default.default.weight`` and
|
|
193
|
+
matches nothing. Since one grammar is accepted, the adapter namespace is no longer part of the
|
|
194
|
+
parsed identity.
|
|
195
|
+
"""
|
|
183
196
|
matches = [
|
|
184
197
|
(factor, infix) for factor, infix in (("A", ".lora_A."), ("B", ".lora_B.")) if infix in key
|
|
185
198
|
]
|
|
@@ -187,13 +200,9 @@ def _parse_lora_tensor(key: str, shape: tuple[int, ...]) -> _LoraTensor | None:
|
|
|
187
200
|
return None
|
|
188
201
|
factor, infix = matches[0]
|
|
189
202
|
module_path, _, leaf = key.partition(infix)
|
|
190
|
-
|
|
191
|
-
if not module_path or len(leaf_parts) != 2:
|
|
203
|
+
if not module_path or module_path.endswith(".") or leaf != _LORA_PARAMETER:
|
|
192
204
|
return None
|
|
193
|
-
|
|
194
|
-
if not adapter_name or parameter != "weight":
|
|
195
|
-
return None
|
|
196
|
-
return module_path, factor, adapter_name, key, shape
|
|
205
|
+
return module_path, factor, key, shape
|
|
197
206
|
|
|
198
207
|
|
|
199
208
|
def _expected_fused_expert_rungs(
|
|
@@ -237,31 +246,25 @@ def _expected_fused_expert_rungs(
|
|
|
237
246
|
def _has_complete_fused_rungs(
|
|
238
247
|
tensors: list[_LoraTensor], expected: Mapping[str, Mapping[str, _LoraPair]], model_id: str
|
|
239
248
|
) -> bool:
|
|
240
|
-
"""Validate every concrete fused owner, rung,
|
|
249
|
+
"""Validate every concrete fused owner, rung, and factor shape."""
|
|
241
250
|
model = get_model(model_id)
|
|
242
251
|
for owner, expected_rungs in expected.items():
|
|
243
|
-
factors: dict[str, dict[str, dict[str,
|
|
244
|
-
for module_path, factor,
|
|
252
|
+
factors: dict[str, dict[str, dict[str, tuple[int, ...]]]] = {}
|
|
253
|
+
for module_path, factor, _key, shape in tensors:
|
|
245
254
|
location = _fused_tensor_location(module_path, owner, frozenset(expected_rungs))
|
|
246
255
|
if location is _INVALID_FUSED_LOCATION:
|
|
247
256
|
return False
|
|
248
257
|
if location is None:
|
|
249
258
|
continue
|
|
250
259
|
instance, rung = location
|
|
251
|
-
factors.setdefault(instance, {}).setdefault(rung, {})
|
|
252
|
-
factor
|
|
253
|
-
] = shape
|
|
260
|
+
factors.setdefault(instance, {}).setdefault(rung, {})[factor] = shape
|
|
254
261
|
if not factors:
|
|
255
262
|
return False
|
|
256
263
|
for seen_rungs in factors.values():
|
|
257
264
|
if set(seen_rungs) != set(expected_rungs):
|
|
258
265
|
return False
|
|
259
266
|
for rung, expected_pair in expected_rungs.items():
|
|
260
|
-
|
|
261
|
-
if len(namespaces) != 1:
|
|
262
|
-
return False
|
|
263
|
-
seen_factors = next(iter(namespaces.values()))
|
|
264
|
-
if _lora_pair_shapes(seen_factors) != expected_pair:
|
|
267
|
+
if _lora_pair_shapes(seen_rungs[rung]) != expected_pair:
|
|
265
268
|
return False
|
|
266
269
|
expert_layers = {
|
|
267
270
|
prefix
|
|
@@ -303,28 +306,27 @@ def _has_ordinary_evidence(
|
|
|
303
306
|
config: Mapping[str, Any],
|
|
304
307
|
fused_rungs: Mapping[str, Mapping[str, _LoraPair]],
|
|
305
308
|
) -> bool:
|
|
306
|
-
"""Validate concrete ordinary target evidence with per-module ranks
|
|
309
|
+
"""Validate concrete ordinary target evidence with per-module ranks."""
|
|
307
310
|
modules = config.get("target_modules")
|
|
308
311
|
all_linear = modules == "all-linear"
|
|
309
312
|
targets = () if all_linear else tuple(modules) if isinstance(modules, list) else ()
|
|
310
|
-
groups: dict[str, dict[str,
|
|
313
|
+
groups: dict[str, dict[str, tuple[str, tuple[int, ...]]]] = {}
|
|
311
314
|
evidence: set[str] = set()
|
|
312
|
-
for module_path, factor,
|
|
315
|
+
for module_path, factor, key, shape in tensors:
|
|
313
316
|
if _is_fused_rung(module_path, fused_rungs):
|
|
314
317
|
continue
|
|
315
318
|
matched = tuple(target for target in targets if _anchored_suffix_match(module_path, target))
|
|
316
319
|
if not all_linear and not matched:
|
|
317
320
|
continue
|
|
318
321
|
evidence.update(matched)
|
|
319
|
-
groups.setdefault(module_path, {})
|
|
322
|
+
groups.setdefault(module_path, {})[factor] = (key, shape)
|
|
320
323
|
if not groups or (not all_linear and evidence != set(targets)):
|
|
321
324
|
return False
|
|
322
325
|
|
|
323
326
|
declared = declared_lora_ranks(config)
|
|
324
|
-
for module_path,
|
|
325
|
-
if
|
|
327
|
+
for module_path, factors in groups.items():
|
|
328
|
+
if _rank_for_module(module_path, declared) is None:
|
|
326
329
|
return False
|
|
327
|
-
factors = next(iter(namespaces.values()))
|
|
328
330
|
if set(factors) != {"A", "B"}:
|
|
329
331
|
return False
|
|
330
332
|
for key, shape in factors.values():
|
|
@@ -249,10 +249,31 @@ def grpo_kv_floor_gb(
|
|
|
249
249
|
return upper
|
|
250
250
|
|
|
251
251
|
|
|
252
|
+
def _rollout_stays_resident(model_info, model_id: str = "") -> bool:
|
|
253
|
+
"""True when the rollout engine is pinned resident and never sleeps.
|
|
254
|
+
|
|
255
|
+
Named for the property sizing actually depends on rather than the catalog flag that currently
|
|
256
|
+
implies it: ``sleep_unsupported`` records that a model HANGS on wake, and
|
|
257
|
+
``rollout_resident_overrides`` turns that into ``free_cache_engine=false``. Sizing cares only
|
|
258
|
+
about the second fact, so it reads through this predicate -- the worker gate
|
|
259
|
+
(``rollout_fp8_kv``) answers the same question, and the two must not drift.
|
|
260
|
+
"""
|
|
261
|
+
if getattr(model_info, "sleep_unsupported", False):
|
|
262
|
+
return True
|
|
263
|
+
if not model_id:
|
|
264
|
+
return False
|
|
265
|
+
from flash.core.catalog import MODELS
|
|
266
|
+
|
|
267
|
+
info = MODELS.get(model_id)
|
|
268
|
+
return bool(info is not None and getattr(info, "sleep_unsupported", False))
|
|
269
|
+
|
|
270
|
+
|
|
252
271
|
def _declares_linear_attention(model_info, model_id: str = "") -> bool:
|
|
253
272
|
"""True for a GDN hybrid, using the catalog rather than a network config fetch.
|
|
254
273
|
|
|
255
|
-
GDN
|
|
274
|
+
A GDN worker rejects fp8 KV only when its rollout engine sleeps, because the crash is vllm's
|
|
275
|
+
``init_fp8_kv_scales`` on wake; a model the catalog pins resident keeps fp8. Callers that size a
|
|
276
|
+
KV pool must therefore pair this with ``_rollout_stays_resident``. Fall back to catalog lookup
|
|
256
277
|
by model id for pinned revisions because attention family is revision-independent.
|
|
257
278
|
"""
|
|
258
279
|
if int(getattr(model_info, "num_linear_attention_layers", 0) or 0) > 0:
|
|
@@ -661,7 +682,12 @@ def _opd_fp8_adjust(
|
|
|
661
682
|
"""Re-size an OPD requirement with fp8 KV on modern cards when sufficient."""
|
|
662
683
|
from flash.providers.base import max_non_fp8_kv_vram_gb
|
|
663
684
|
|
|
664
|
-
|
|
685
|
+
# a gdn hybrid keeps the bf16 reservation only while its engine sleeps. once the catalog pins
|
|
686
|
+
# it resident the worker sends fp8 (rollout_fp8_kv), so sizing must price the same cache or it
|
|
687
|
+
# reserves a full-width pool nobody allocates.
|
|
688
|
+
if _declares_linear_attention(model_info, model_id) and not _rollout_stays_resident(
|
|
689
|
+
model_info, model_id
|
|
690
|
+
):
|
|
665
691
|
return need
|
|
666
692
|
ceiling = max_non_fp8_kv_vram_gb()
|
|
667
693
|
if need <= ceiling:
|
{freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/backend_common.py
RENAMED
|
@@ -935,6 +935,7 @@ from flash.engine.worker.verl.capabilities import ( # noqa: E402,F401
|
|
|
935
935
|
resolve_rollout_enforce_eager,
|
|
936
936
|
resolve_verl_loggers,
|
|
937
937
|
resolve_verl_python,
|
|
938
|
+
rollout_fp8_kv,
|
|
938
939
|
rollout_mm_processor_cache_overrides,
|
|
939
940
|
rollout_resident_overrides,
|
|
940
941
|
rollout_sleep_unsupported,
|
|
@@ -35,6 +35,7 @@ from flash.engine.worker.backend_common import ( # noqa: F401
|
|
|
35
35
|
resolve_rollout_enforce_eager,
|
|
36
36
|
resolve_verl_loggers,
|
|
37
37
|
resolve_verl_python,
|
|
38
|
+
rollout_fp8_kv,
|
|
38
39
|
rollout_sleep_unsupported,
|
|
39
40
|
run_verl_training,
|
|
40
41
|
shim_marker_file,
|
|
@@ -321,7 +322,7 @@ def run_opd_train(spec=None) -> None:
|
|
|
321
322
|
gdn_module = gdn_probe_module(model_id, model_revision) if gdn_hybrid else ""
|
|
322
323
|
# ONE child answers every independent capability question. each used to cost its own interpreter, and the torch/verl import -- not the question -- was the price.
|
|
323
324
|
caps = probe_verl_capabilities(python_bin, gdn_module)
|
|
324
|
-
# enable fp8 kv on cc >= 8.9 only
|
|
325
|
+
# enable fp8 kv on cc >= 8.9. a gdn hybrid qualifies only when the catalog pins its rollout engine resident: it is sleep/WAKE that crashes on the hybrid cache, not gdn itself. see rollout_fp8_kv. keep this aligned with vram.py, and keep the device probe separate from gdn classification.
|
|
325
326
|
try:
|
|
326
327
|
import torch as _torch_cc
|
|
327
328
|
|
|
@@ -330,7 +331,7 @@ def run_opd_train(spec=None) -> None:
|
|
|
330
331
|
)
|
|
331
332
|
except Exception: # no cuda / probe failure -> conservative bf16 kv
|
|
332
333
|
_cc_ok = False
|
|
333
|
-
fp8_kv = _cc_ok
|
|
334
|
+
fp8_kv = rollout_fp8_kv(_cc_ok, gdn_hybrid, model_id)
|
|
334
335
|
# gdn packing requires child support for seq_idx and cu_seqlens; fallbacks discard both and silently bleed state across examples. record whether the child can reset gdn state because successful runs upload no console and failure here is silent contamination; none means non-gdn. see require_gdn_boundary_resets.
|
|
335
336
|
gdn_reset_arch = require_gdn_boundary_resets(caps, gdn_module)
|
|
336
337
|
# run sm86 eagerly because vllm 0.19.1 graph capture degenerates there. sm89 capture is empirically acceptable; enforce_eager overrides async cudagraph settings last at config/vllm.py:1024.
|
{freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/perf/__init__.py
RENAMED
|
@@ -315,9 +315,10 @@ def _ensure_fla_fastpath_on_hopper() -> None:
|
|
|
315
315
|
return False
|
|
316
316
|
return rc == 0
|
|
317
317
|
|
|
318
|
-
# 0.1.12 double-registers the TVM-FFI runtime ->
|
|
319
|
-
|
|
320
|
-
|
|
318
|
+
# flash-qla requires exactly these two, and 0.1.12 double-registers the TVM-FFI runtime ->
|
|
319
|
+
# `import tilelang` aborts; keep in lockstep with Dockerfile.worker and capabilities.py.
|
|
320
|
+
TVM_FFI_PIN = "0.1.9"
|
|
321
|
+
TILELANG_PIN = "0.1.9"
|
|
321
322
|
|
|
322
323
|
try:
|
|
323
324
|
tilelang_ok = True
|
|
@@ -41,6 +41,7 @@ from flash.engine.worker.backend_common import ( # noqa: F401
|
|
|
41
41
|
resolve_rollout_enforce_eager,
|
|
42
42
|
resolve_verl_loggers,
|
|
43
43
|
resolve_verl_python,
|
|
44
|
+
rollout_fp8_kv,
|
|
44
45
|
stamp_adapter_dir_provenance,
|
|
45
46
|
verl_declares_rollout_field,
|
|
46
47
|
verl_device_capability,
|
|
@@ -266,8 +267,10 @@ def _configure_rl_child(
|
|
|
266
267
|
gdn_reset_arch=gdn_reset_arch,
|
|
267
268
|
loggers=loggers,
|
|
268
269
|
)
|
|
269
|
-
# reuse the gdn answer resolved above rather than re-probing; see gdn_hybrid.
|
|
270
|
-
|
|
270
|
+
# reuse the gdn answer resolved above rather than re-probing; see gdn_hybrid. a gdn hybrid keeps
|
|
271
|
+
# fp8 only when the catalog pins its engine resident -- see rollout_fp8_kv for why sleep is the
|
|
272
|
+
# thing that actually crashes, not gdn.
|
|
273
|
+
fp8_kv = rollout_fp8_kv(cc_ok, gdn_hybrid, inp["model_id"])
|
|
271
274
|
# one capability probe, both rollout decisions below. asked of the verl interpreter, whose
|
|
272
275
|
# torch/vllm stack is the one that has to run the rollout.
|
|
273
276
|
verl_cc = verl_device_capability(caps)
|
{freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/flash/engine/worker/verl/capabilities.py
RENAMED
|
@@ -479,15 +479,15 @@ def resolve_verl_python(workdir: str, *, install_wandb: bool = False) -> str:
|
|
|
479
479
|
# binds chunk_gated_delta_rule to the pure-torch fallback that
|
|
480
480
|
# takes **kwargs and discards cu_seqlens, and packed gdn runs
|
|
481
481
|
# train across example boundaries while looking patched.
|
|
482
|
-
# apache-tvm-ffi is pinned to 0.1.
|
|
483
|
-
# double-registers TVM-FFI and aborts `import tilelang`.
|
|
482
|
+
# apache-tvm-ffi is pinned to 0.1.9 because flash-qla requires exactly that, and
|
|
483
|
+
# 0.1.12 double-registers TVM-FFI and aborts `import tilelang`.
|
|
484
484
|
FLA_REQUIREMENT,
|
|
485
485
|
# the flashqla GDN backend fla 0.5.2 dispatches to. same lockstep requirement:
|
|
486
486
|
# the shim binds it in THIS interpreter, so a wheel present only in the worker's
|
|
487
487
|
# env would leave the child on the old kernel while the marker still printed.
|
|
488
488
|
FLASH_QLA_REQUIREMENT,
|
|
489
|
-
"tilelang==0.1.
|
|
490
|
-
"apache-tvm-ffi==0.1.
|
|
489
|
+
"tilelang==0.1.9",
|
|
490
|
+
"apache-tvm-ffi==0.1.9",
|
|
491
491
|
],
|
|
492
492
|
check=True,
|
|
493
493
|
)
|
|
@@ -742,6 +742,37 @@ def rollout_sleep_unsupported(model_id: str) -> bool:
|
|
|
742
742
|
return bool(info is not None and getattr(info, "sleep_unsupported", False))
|
|
743
743
|
|
|
744
744
|
|
|
745
|
+
def rollout_fp8_kv(cc_ok: bool, gdn_hybrid: bool, model_id: str) -> bool:
|
|
746
|
+
"""whether the rollout engine may cache KV in fp8. shared by grpo and opd.
|
|
747
|
+
|
|
748
|
+
``cc_ok`` (cc>=8.9) is the hardware floor. the gdn exclusion on top of it is narrower than it
|
|
749
|
+
looks: the crash it avoids is vllm's ``init_fp8_kv_scales``, which zeroes each cache tensor and
|
|
750
|
+
hits ``'list' object has no attribute 'zero_'`` on a hybrid cache. that function is reachable
|
|
751
|
+
from exactly ONE place -- ``gpu_worker.wake_up`` (``v1/worker/gpu_worker.py:198-203``) -- and
|
|
752
|
+
verl only ever wakes an engine it put to sleep: both training-path callers are gated on
|
|
753
|
+
``rollout.free_cache_engine`` (``engine_workers.py:706,741`` -> ``vllm_rollout.py:161``). a model
|
|
754
|
+
the catalog flags ``sleep_unsupported`` runs with that flag pinned false by
|
|
755
|
+
``rollout_resident_overrides``, so it never sleeps, never wakes, and never reaches the crash.
|
|
756
|
+
|
|
757
|
+
the resident engine still gets fp8 for its ordinary attention layers: the recurrent state is a
|
|
758
|
+
separate ``MambaSpec`` carrying its own dtypes, so fp8 never applies to it. vram sizing already
|
|
759
|
+
prices this exact combination -- ``mamba_block_size=1072`` is the fp8-derived attention-token
|
|
760
|
+
page (the 1,097,728-byte gdn state over a 1024-byte fp8 attention token, rounded to vllm's
|
|
761
|
+
16-token alignment) and ``kv_sizing`` applies it only when ``fp8_kv`` is set.
|
|
762
|
+
|
|
763
|
+
this also closes a planner/worker disagreement rather than merely freeing memory: the grpo
|
|
764
|
+
resident wall in ``vram.py`` sizes a ``sleep_unsupported`` model with ``fp8_kv=True`` already,
|
|
765
|
+
so a worker that sent bf16 needed ~6-7 GB MORE than the planner had reserved for it (measured
|
|
766
|
+
at 4096x8 and 8192x4). the two halves now assume the same cache dtype.
|
|
767
|
+
"""
|
|
768
|
+
if not cc_ok:
|
|
769
|
+
return False
|
|
770
|
+
if not gdn_hybrid:
|
|
771
|
+
return True
|
|
772
|
+
# gdn + sleeping engine is the combination that crashes on wake; gdn + resident is not.
|
|
773
|
+
return rollout_sleep_unsupported(model_id)
|
|
774
|
+
|
|
775
|
+
|
|
745
776
|
def rollout_resident_overrides(sleep_unsupported: bool) -> list[str]:
|
|
746
777
|
"""verl overrides that pin the rollout engine resident, or ``[]`` to keep verl's default.
|
|
747
778
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "freesolo-flash-dev"
|
|
3
|
-
version = "1.2.
|
|
3
|
+
version = "1.2.87"
|
|
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.87"
|
|
141
141
|
|
|
142
142
|
[tool.pytest.ini_options]
|
|
143
143
|
pythonpath = ["."]
|
{freesolo_flash_dev-1.2.70 → freesolo_flash_dev-1.2.87}/tests/test_fused_expert_warmstart.py
RENAMED
|
@@ -28,7 +28,10 @@ def _import_worker(monkeypatch):
|
|
|
28
28
|
return worker
|
|
29
29
|
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
_SERIALIZED_LEAVES = ("weight", "weight")
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _wrapper_tensors(prefix, pair, factor_leaves=_SERIALIZED_LEAVES):
|
|
32
35
|
shape_a, shape_b = pair
|
|
33
36
|
leaf_a, leaf_b = factor_leaves
|
|
34
37
|
return {
|
|
@@ -40,7 +43,7 @@ def _wrapper_tensors(prefix, pair, factor_leaves=("default.weight", "default.wei
|
|
|
40
43
|
def _ordinary_tensors(
|
|
41
44
|
target="q_proj",
|
|
42
45
|
pair=((32, 2048), (2048, 32)),
|
|
43
|
-
factor_leaves=
|
|
46
|
+
factor_leaves=_SERIALIZED_LEAVES,
|
|
44
47
|
):
|
|
45
48
|
prefix = f"base_model.model.layers.0.self_attn.{target}"
|
|
46
49
|
return _wrapper_tensors(prefix, pair, factor_leaves)
|
|
@@ -51,7 +54,7 @@ def _complete_expert_tensors(
|
|
|
51
54
|
owner_segment="mlp.experts",
|
|
52
55
|
pairs=_EXPECTED_PAIRS,
|
|
53
56
|
swap_rungs=False,
|
|
54
|
-
factor_leaves=
|
|
57
|
+
factor_leaves=_SERIALIZED_LEAVES,
|
|
55
58
|
include_ordinary=True,
|
|
56
59
|
):
|
|
57
60
|
tensors = {}
|
|
@@ -356,20 +359,19 @@ def test_tensor_analyzer_rejects_swapped_qwen36_rungs():
|
|
|
356
359
|
)
|
|
357
360
|
|
|
358
361
|
|
|
359
|
-
def
|
|
362
|
+
def test_tensor_analyzer_rejects_every_adapter_namespace_on_disk():
|
|
363
|
+
"""No namespaced spelling is a real serialized artifact, uniform or not.
|
|
364
|
+
|
|
365
|
+
PEFT strips the namespace on save and re-inserts it on load, so a file that still carries one
|
|
366
|
+
loads with the namespace doubled and matches no module.
|
|
367
|
+
"""
|
|
360
368
|
from flash.adapters.fused_experts import has_complete_fused_expert_tensors
|
|
361
369
|
|
|
362
370
|
config = _valid_config()
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
)
|
|
368
|
-
assert not has_complete_fused_expert_tensors(
|
|
369
|
-
_complete_expert_tensors(factor_leaves=("foo.weight", "bar.weight")),
|
|
370
|
-
config,
|
|
371
|
-
_MODEL_ID,
|
|
372
|
-
)
|
|
371
|
+
for leaves in (("foo.weight", "foo.weight"), ("foo.weight", "bar.weight")):
|
|
372
|
+
assert not has_complete_fused_expert_tensors(
|
|
373
|
+
_complete_expert_tensors(factor_leaves=leaves), config, _MODEL_ID
|
|
374
|
+
)
|
|
373
375
|
|
|
374
376
|
|
|
375
377
|
def test_tensor_analyzer_rejects_namespace_changes_across_wrapper_rungs():
|
|
@@ -426,11 +428,7 @@ def test_tensor_analyzer_requires_every_catalog_layer_and_both_lora_factors():
|
|
|
426
428
|
_MODEL_ID,
|
|
427
429
|
)
|
|
428
430
|
assert not has_complete_fused_expert_tensors(
|
|
429
|
-
{
|
|
430
|
-
key: shape
|
|
431
|
-
for key, shape in complete.items()
|
|
432
|
-
if not key.endswith("lora_B.default.weight")
|
|
433
|
-
},
|
|
431
|
+
{key: shape for key, shape in complete.items() if not key.endswith("lora_B.weight")},
|
|
434
432
|
config,
|
|
435
433
|
_MODEL_ID,
|
|
436
434
|
)
|
|
@@ -463,8 +461,7 @@ def _expert_namespace_mismatch(rung):
|
|
|
463
461
|
tensors = _complete_expert_tensors()
|
|
464
462
|
suffix = "" if rung == "outer" else ".base_layer"
|
|
465
463
|
prefix = f"base_model.model.layers.0.mlp.experts{suffix}"
|
|
466
|
-
|
|
467
|
-
tensors[f"{prefix}.lora_B.other.weight"] = tensors.pop(default_key)
|
|
464
|
+
tensors[f"{prefix}.lora_B.other.weight"] = tensors.pop(f"{prefix}.lora_B.weight")
|
|
468
465
|
return tensors
|
|
469
466
|
|
|
470
467
|
|
|
@@ -649,3 +646,133 @@ def test_tensor_analyzer_rejects_non_peft_fused_shapes(tensors, config):
|
|
|
649
646
|
from flash.adapters.fused_experts import has_complete_fused_expert_tensors
|
|
650
647
|
|
|
651
648
|
assert not has_complete_fused_expert_tensors(tensors, config, _MODEL_ID)
|
|
649
|
+
|
|
650
|
+
|
|
651
|
+
def test_tensor_analyzer_accepts_the_grammar_peft_and_verl_actually_write():
|
|
652
|
+
from flash.adapters.fused_experts import has_complete_fused_expert_tensors
|
|
653
|
+
|
|
654
|
+
stripped = _complete_expert_tensors()
|
|
655
|
+
|
|
656
|
+
assert not any(".default." in key for key in stripped)
|
|
657
|
+
assert has_complete_fused_expert_tensors(stripped, _valid_config(), _MODEL_ID)
|
|
658
|
+
|
|
659
|
+
|
|
660
|
+
def test_export_stamps_an_adapter_serialized_without_the_adapter_namespace(monkeypatch, tmp_path):
|
|
661
|
+
import flash.engine.worker.verl.checkpoints as checkpoints
|
|
662
|
+
|
|
663
|
+
tensors = _complete_expert_tensors()
|
|
664
|
+
tensors.update(_ordinary_tensors(target="v_proj"))
|
|
665
|
+
monkeypatch.setattr(checkpoints, "_read_adapter_tensor_metadata", lambda _path: tensors)
|
|
666
|
+
config = {
|
|
667
|
+
"peft_type": "LORA",
|
|
668
|
+
"r": 32,
|
|
669
|
+
"target_modules": ["v_proj", "experts", "base_layer"],
|
|
670
|
+
"target_parameters": None,
|
|
671
|
+
}
|
|
672
|
+
_write_expert_adapter(tmp_path, config=config)
|
|
673
|
+
|
|
674
|
+
checkpoints.stamp_adapter_dir_provenance(str(tmp_path), _MODEL_ID, "e" * 40)
|
|
675
|
+
|
|
676
|
+
saved = json.loads((tmp_path / "adapter_config.json").read_text(encoding="utf-8"))
|
|
677
|
+
assert saved["target_parameters"] == _TARGETS
|
|
678
|
+
assert saved["base_model_name_or_path"] == _MODEL_ID
|
|
679
|
+
|
|
680
|
+
|
|
681
|
+
def test_warmstart_accepts_an_adapter_serialized_without_the_adapter_namespace(
|
|
682
|
+
monkeypatch, tmp_path
|
|
683
|
+
):
|
|
684
|
+
import flash.engine.worker.model.adapter as adapter
|
|
685
|
+
|
|
686
|
+
worker = _import_worker(monkeypatch)
|
|
687
|
+
tensors = _complete_expert_tensors()
|
|
688
|
+
monkeypatch.setattr(adapter, "_read_adapter_tensor_metadata", lambda _path: tensors)
|
|
689
|
+
|
|
690
|
+
worker.validate_warmstart_adapter(_valid_config(), _MODEL_ID, str(tmp_path))
|
|
691
|
+
|
|
692
|
+
|
|
693
|
+
@pytest.mark.parametrize("rung", ["outer", "nested"])
|
|
694
|
+
def test_tensor_analyzer_still_rejects_cross_namespace_pairs_when_serialized(rung):
|
|
695
|
+
from flash.adapters.fused_experts import has_complete_fused_expert_tensors
|
|
696
|
+
|
|
697
|
+
tensors = _complete_expert_tensors()
|
|
698
|
+
suffix = "" if rung == "outer" else ".base_layer"
|
|
699
|
+
prefix = f"base_model.model.layers.0.mlp.experts{suffix}"
|
|
700
|
+
tensors[f"{prefix}.lora_B.other.weight"] = tensors.pop(f"{prefix}.lora_B.weight")
|
|
701
|
+
|
|
702
|
+
assert not has_complete_fused_expert_tensors(tensors, _valid_config(), _MODEL_ID)
|
|
703
|
+
|
|
704
|
+
|
|
705
|
+
@pytest.mark.parametrize(
|
|
706
|
+
("leaf", "expected"),
|
|
707
|
+
[
|
|
708
|
+
pytest.param("weight", "module", id="serialized-bare-leaf"),
|
|
709
|
+
pytest.param("default.weight", None, id="explicit-default-does-not-roundtrip"),
|
|
710
|
+
pytest.param("other.weight", None, id="explicit-namespace-does-not-roundtrip"),
|
|
711
|
+
pytest.param("not_peft", None, id="wrong-parameter-name"),
|
|
712
|
+
pytest.param("default.not_peft", None, id="namespaced-wrong-parameter-name"),
|
|
713
|
+
pytest.param("default.weight.extra", None, id="extra-segment"),
|
|
714
|
+
pytest.param(".weight", None, id="empty-adapter-name"),
|
|
715
|
+
pytest.param("", None, id="empty-leaf"),
|
|
716
|
+
],
|
|
717
|
+
)
|
|
718
|
+
def test_parse_lora_tensor_pins_the_exact_accepted_leaf_grammar(leaf, expected):
|
|
719
|
+
"""Pin the grammar directly.
|
|
720
|
+
|
|
721
|
+
Routing these through the whole-artifact analyzer used to be inert: a malformed key merely
|
|
722
|
+
failed to parse, and the surviving tensors still satisfied every downstream check, so the
|
|
723
|
+
assertion passed for the wrong reason. Sabotaging the parser to accept an empty adapter name
|
|
724
|
+
left the artifact-level version green.
|
|
725
|
+
"""
|
|
726
|
+
from flash.adapters.fused_experts import _parse_lora_tensor
|
|
727
|
+
|
|
728
|
+
parsed = _parse_lora_tensor(f"module.lora_A.{leaf}", (8, 16))
|
|
729
|
+
|
|
730
|
+
if expected is None:
|
|
731
|
+
assert parsed is None
|
|
732
|
+
else:
|
|
733
|
+
module_path, factor, key, shape = parsed
|
|
734
|
+
assert (module_path, factor) == (expected, "A")
|
|
735
|
+
assert (key, shape) == (f"module.lora_A.{leaf}", (8, 16))
|
|
736
|
+
|
|
737
|
+
|
|
738
|
+
def test_parse_lora_tensor_requires_exactly_one_factor_infix():
|
|
739
|
+
from flash.adapters.fused_experts import _parse_lora_tensor
|
|
740
|
+
|
|
741
|
+
assert _parse_lora_tensor("m.lora_A.lora_B.weight", (8, 16)) is None
|
|
742
|
+
assert _parse_lora_tensor("lora_A.weight", (8, 16)) is None
|
|
743
|
+
|
|
744
|
+
|
|
745
|
+
def test_tensor_analyzer_rejects_an_artifact_carrying_the_adapter_namespace():
|
|
746
|
+
"""Only the stripped grammar round-trips through PEFT, so a namespaced file must not validate.
|
|
747
|
+
|
|
748
|
+
Verified against the locked peft 0.19.1 ``_insert_adapter_name_into_state_dict``: a stripped
|
|
749
|
+
``...lora_A.weight`` loads as ``...lora_A.default.weight`` and matches the live module, while
|
|
750
|
+
``...lora_A.default.weight`` loads as ``...lora_A.default.default.weight`` and matches nothing.
|
|
751
|
+
"""
|
|
752
|
+
from flash.adapters.fused_experts import has_complete_fused_expert_tensors
|
|
753
|
+
|
|
754
|
+
for leaves in (("default.weight", "default.weight"), ("other.weight", "other.weight")):
|
|
755
|
+
tensors = _complete_expert_tensors(factor_leaves=leaves)
|
|
756
|
+
|
|
757
|
+
assert not has_complete_fused_expert_tensors(tensors, _valid_config(), _MODEL_ID)
|
|
758
|
+
|
|
759
|
+
|
|
760
|
+
def test_tensor_analyzer_rejects_an_unparseable_lora_key():
|
|
761
|
+
"""An unrecognized lora key must fail the artifact rather than be skipped.
|
|
762
|
+
|
|
763
|
+
Dropping it would let a malformed tensor ride along beside a complete canonical set, and a
|
|
764
|
+
trailing-dot module alias would then collapse onto the outer rung and make the verdict depend
|
|
765
|
+
on mapping iteration order.
|
|
766
|
+
"""
|
|
767
|
+
from flash.adapters.fused_experts import has_complete_fused_expert_tensors
|
|
768
|
+
|
|
769
|
+
owner = "base_model.model.layers.0.mlp.experts"
|
|
770
|
+
for alias in (f"{owner}..lora_A.weight", f"{owner}.lora_A.not_peft"):
|
|
771
|
+
for alias_first in (True, False):
|
|
772
|
+
tensors = _complete_expert_tensors()
|
|
773
|
+
if alias_first:
|
|
774
|
+
tensors = {alias: (1, 1), **tensors}
|
|
775
|
+
else:
|
|
776
|
+
tensors[alias] = (1, 1)
|
|
777
|
+
|
|
778
|
+
assert not has_complete_fused_expert_tensors(tensors, _valid_config(), _MODEL_ID)
|