freesolo-flash-dev 1.2.48__tar.gz → 1.2.52__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.48 → freesolo_flash_dev-1.2.52}/CHANGELOG.md +10 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/PKG-INFO +1 -1
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/scaffold/TRAINING.md +9 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/profiling/sft_workload.py +105 -18
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/entry/sft.py +25 -9
- freesolo_flash_dev-1.2.52/flash/engine/worker/model/chatml_mask.py +551 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/model/packing.py +6 -1
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/sft_train_runner.py +14 -4
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/poll_instance.py +79 -174
- freesolo_flash_dev-1.2.52/flash/providers/_lifecycle/terminal_artifacts.py +261 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/supervise/recovery.py +33 -54
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/pyproject.toml +2 -2
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_packing.py +36 -4
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_runmgmt.py +110 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_sft_train.py +810 -6
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_sft_workload.py +47 -28
- freesolo_flash_dev-1.2.52/tests/test_terminal_artifacts.py +181 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/uv.lock +1 -1
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.dockerignore +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.env.example +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/CODEOWNERS +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/dependabot.yml +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/workflows/auto-rebake.yml +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/workflows/bake-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/workflows/ci.yml +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/workflows/main-source-guard.yml +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/workflows/notify-tests-repo.yml +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/workflows/publish-dev.yml +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/workflows/publish-image.yml +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/workflows/publish.yml +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/workflows/version-parity.yml +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.github/workflows/worker-image.yml +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/.gitignore +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/CODE_OF_CONDUCT.md +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/CONTRIBUTING.md +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/Dockerfile +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/Dockerfile.worker +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/LICENSE +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/NOTICE +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/README.md +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/SECURITY.md +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/SELF_HOSTING.md +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/build/kernel_cache/.gitignore +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/build/kernel_cache/.keep +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/deploy/infisical/README.md +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/deploy/infisical/entrypoint.sh +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/docker/Dockerfile.kernelcache +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/docker/Dockerfile.kernelcache.relayer +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/docker/bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/docker/bake_pod_entry.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/docker/extract_cudart_fix.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/docker/kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/docker/make_rp_handler.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/_internal/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/_internal/channel.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/_internal/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/_internal/fileio.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/_internal/logging.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/_internal/paths.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/adapters/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/adapters/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/adapters/fused_experts.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/adapters/lora_rank.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/__main__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/deploy.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/episode.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/eval.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/eval_args.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/imports.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/list.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/push.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/retained.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/setup.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/test.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/test_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/test_params.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/env/test_warnings.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/traces.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/commands/train_cost.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/scaffold/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/ui/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/ui/cost.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/ui/env_panels.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/ui/heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/ui/render.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/ui/tables.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cli/ui/tty.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/client/config.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/client/freesolo_api.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/client/http.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/client/runtime_secrets.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/client/shapes.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/client/specs.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/client/streaming.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/content/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/content/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/content/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/content/thinking.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/core/catalog.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/core/spec.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/core/spec_persistence.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cost/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cost/analytical.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cost/facts.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cost/spec.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/cost/types.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/plan/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/plan/kv_sizing.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/plan/model_config_probe.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/plan/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/plan/recipe.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/plan/steps.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/plan/vram.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/profiling/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/profiling/dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/profiling/reasoning_render.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/profiling/tokenizer.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/profiling/workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/result/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/result/accounting.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/result/rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/__main__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/backend_common.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/entry/opd.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/entry/rl.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/io/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/io/heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/io/hf.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/io/prefetch.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/io/wandb_log.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/model/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/model/adapter.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/model/decoding.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/model/lora.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/opd_train.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/opd_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/perf/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/perf/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/perf/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/perf/liger.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/perf/memory.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/rl_train.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/rl_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/runtime/rng.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/score_batcher.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/sft_train.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/teacher/client.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/teacher/encoding.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/core/checkpoint_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/core/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/core/child/glue.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/core/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/core/step_timing.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/finalize.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/batching.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/bridge.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/child/bridge.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/child/structured.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/failures.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/gkd.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/overrides.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/prompts.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/reporting.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/scoring.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/state.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/opd/validation.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/child/patches.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/config.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/inputs.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/multi_turn.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/reward_module.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/scoring.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/single_turn.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/rl/verl_config.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/sft/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/sft/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/sft/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/sft/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/train/sft/config.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/verl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/verl/capabilities.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/verl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/verl/child_io.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/verl/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/verl/parallelism.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker/verl/parent_work.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/worker_entrypoint.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/adapter.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/base.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/cache_security.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/dataset_selection.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/evaluations.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/identity.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/loader.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/namespace_listing.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/package/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/package/limits.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/package/unpack.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/envs/pull.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/auth.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/bootstrap.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/bootstrap_console.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/deadline.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/http.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/instance.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/poll.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/provider.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/_lifecycle/worker.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/allocator.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/artifacts/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/artifacts/hf.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/artifacts/preload_runpod.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/artifacts/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/base.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/fit_errors.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/lambda_/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/lambda_/api.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/lambda_/auth.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/lambda_/gpus.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/lambda_/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/lambda_/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/lambda_/jobs/reap.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/lambda_/preflight.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/lambda_/pricing.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/preflight.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/realized.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/api.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/auth.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/cost.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/gpus.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/job_execution.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/jobs.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/preflight.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/pricing.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/resources.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/serverless/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/runpod/serverless/endpoints.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/sharding.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/vast/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/vast/api.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/vast/auth.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/vast/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/vast/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/vast/preflight.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/providers/vast/pricing.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/py.typed +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/attempts.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/costs.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/deadlines.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/preparation.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/reconciliation.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/results/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/results/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/results/verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/status.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/submit.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/supervise/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/supervise/attach.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/supervise/deploy.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/supervise/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/supervise/retry_decision.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/supervise/seed_submission.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/supervise/transitions.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/runner/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/schema/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/schema/fields.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/serve/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/serve/adapter_check.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/serve/deploy.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/serve/errors.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/serve/export.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/serve/preflight.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/serve/responses.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/serve/streaming.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/serve/thinking.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/serve/urls.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/__main__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/app.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/billing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/billing/charges.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/billing/retry.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/domain/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/domain/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/domain/environment_registry.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/domain/envs.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/domain/projects.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/domain/reconcile.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/domain/repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/domain/run_registry.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/domain/teacher_broker.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/domain/teacher_errors.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/domain/teacher_requests.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/platform/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/platform/auth.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/platform/db.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/platform/deps.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/platform/internal_client.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/platform/locks.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/platform/runtime.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/routes/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/routes/envs.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/routes/meta.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/routes/runs.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/routes/serving.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/routes/serving_completion.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/routes/serving_revisions.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/routes/serving_smoke.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/server/routes/teacher.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/teacher/limits.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/teacher/retry_contract.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/scripts/build_dev_dist.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/scripts/check_file_size.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/scripts/check_function_size.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/scripts/check_verl_pin_exists.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/scripts/scrub_history.sh +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/_helpers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/_helpers/profile.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/_helpers/runner.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/_helpers/specs.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/_helpers/teacher.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/_helpers/vast.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/conftest.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/fixtures/math_eval.jsonl +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/fixtures/math_train.jsonl +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/live/__init__.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/live/conftest.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/live/test_lambda_live.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/live/test_runpod_live.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/live/test_sft_thinking_render_live.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/live/test_vast_live.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_accounting_coverage.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_adapter_shard_completeness.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_agent_flash_cli_contract.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_algorithms.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_allocator.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_backend_common.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_backend_jobspec_contract.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_base_model_provenance.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_billing_retry.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_build_context_contract.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cancel_remote.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_catalog_consistency.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_catalog_only_models.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_charge_pricing.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_checkpoint_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_commands.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_commands_coverage.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_credential_shadowing.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_errors.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_estimate.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_gpus_flag.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_help.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_main_coverage.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_managed.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_render_coverage.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_render_theme.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_traces.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cli_wandb_warning.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_client.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_client_import_purity.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_client_server_integration.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_client_stream_reads.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_config_env_vars.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_config_overrides.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_console_upload.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_controlled_experiment_repairs.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cost_analytical.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cost_equation.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cost_estimate.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cost_hardware.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_cost_models.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_deploy_alias_move_warning.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_deploy_latency.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_dev_channel.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_disk_gb.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_endpoint_name.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_cache_evict.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_delete.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_download.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_download_api.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_list_api.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_list_cli.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_list_hub.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_no_install.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_publish.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_pull.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_pull_coverage.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_pull_loader_coverage.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_pull_managed_control_plane.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_push.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_rate_limit_resolve.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_ref_pinning.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_env_test.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_export.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_flash_mvp.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_flash_worker.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_flashinfer_cache_dirs.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_freesolo_api_transport.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_fused_expert_warmstart.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_github_urlopen_retry.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_gpu_type_single_field.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_gpus.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_grpo_params.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_grpo_resident_sizing.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_grpo_reward_batching.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_health_liveness.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_hf_retry.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_idle_endpoint_reaper.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_infisical_secrets.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_instance_bootstrap_coverage.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_internal_client.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_jobs.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_kv_util.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_lambda_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_lambda_runner.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_logging.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_login_perms.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_lora_rank_coverage.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_lora_rank_preflight.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_managed_config_fields.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_managed_hf_repo.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_metrics_schema_agent_contract.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_mig_guard.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_multi_gpu_gate.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_multimodal_training.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_named_reward_metrics.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_oom_escalate_gpu.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_opd.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_opd_limits.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_opd_multiturn_eos_boundary.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_opd_multiturn_failure_exit.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_opd_replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_opd_resume_safety.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_opd_train.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_orchestrator_flash.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_packing_coverage.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_parasail_teacher.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_poll_helpers.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_preflight.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_projects.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_provider_preflight_coverage.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_provider_routing.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_provider_teardown_robustness.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_providers_symmetry.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_realized_cost.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_resolve_params_b.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_resume_on_retry.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_rl_train.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_runpod_api_delete.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_runpod_key_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_runpod_key_waterfall.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_serve.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_serve_reasoning_content.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_server_api.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_server_app_coverage.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_server_auth_singleflight.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_server_billing.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_server_checkpoints_coverage.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_server_db.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_server_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_server_locks_coverage.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_server_standalone.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_serving_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_serving_contract.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_serving_schema_coverage.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_sft_chunked_nll.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_sft_example_selection.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_sft_gc_off.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_sft_max_context.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_sft_startup_block.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_spec_and_validation.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_spec_contract_bytes.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_step_floor.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_step_metrics.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_step_timing.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_teacher_broker.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_teacher_encoding_contract.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_thinking_config.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_train_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_training_controls.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_type_comment_prose.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_vast_api.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_vast_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_vast_offers.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_vast_provider_coverage.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_vast_runner.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_verifiers.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_verl_checkpoint_export.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_verl_child_plugins.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_verl_silence_watchdog.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_version.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_vl_warmstart_adapter_keys.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_vram_architecture.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_wandb_link.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_wandb_naming.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_warmstart_adapter_download.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_warmstart_cross_repo.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_warmstart_error_attribution.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_worker_dryrun.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_worker_hardexit.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_worker_image.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_worker_init_heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_worker_stack.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_worker_thinking.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_workflow_contracts.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/tests/test_zero2_sharding_gate.py +0 -0
|
@@ -21,6 +21,16 @@ This file starts at 1.1.35. Earlier releases are not reconstructed here; use
|
|
|
21
21
|
|
|
22
22
|
### Changed
|
|
23
23
|
|
|
24
|
+
- An attempt's terminal artifacts (its strict marker plus `metrics.json`) are now interpreted by
|
|
25
|
+
one shared protocol instead of being decoded separately by live instance polling and by each
|
|
26
|
+
recovery path. The two decoders disagreed about identical bytes. A marker that could not be tied
|
|
27
|
+
to the attempt was a terminal failure to the live poller but indistinguishable from "no marker
|
|
28
|
+
yet" to recovery, so the same corrupt artifact produced a different story depending on which
|
|
29
|
+
layer happened to observe it; recovery now names it rather than logging silence. Neither path
|
|
30
|
+
ever adopted such a marker as completed work, and neither does now. Recovery also computed a
|
|
31
|
+
fresh observation window for the marker and then another for `metrics.json`, so the real ceiling
|
|
32
|
+
was their sum and moved with however long the first read took; both reads now share one window,
|
|
33
|
+
which makes the bound the cutoff rather than the sum.
|
|
24
34
|
- CI runs the offline test suite on both supported interpreters (3.11 and 3.12) rather than
|
|
25
35
|
3.11 alone, and sets `HF_HUB_OFFLINE` / `TRANSFORMERS_OFFLINE` so a test that reaches the
|
|
26
36
|
network fails deterministically instead of depending on runner connectivity.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: freesolo-flash-dev
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.52
|
|
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
|
|
@@ -844,6 +844,15 @@ Pick SFT when you already have good answers and want the model to imitate them.
|
|
|
844
844
|
`max_context_tokens` that plausibly fits prompt + completion, and only raise it when you see
|
|
845
845
|
truncation (outputs cut off mid-thought, degraded loss). A bigger context just costs
|
|
846
846
|
more.
|
|
847
|
+
- **Multi-turn targets train on the assistant turns only.** When `sft_completion` returns a
|
|
848
|
+
full target transcript (assistant turns interleaved with the environment's tool/user
|
|
849
|
+
observations), Flash supervises the assistant turns and masks the observations out of the
|
|
850
|
+
loss — the model is trained to produce its own replies, not to predict the environment's.
|
|
851
|
+
For every ChatML target, including a single assistant turn, control strings `<|im_start|>` and
|
|
852
|
+
`<|im_end|>` are reserved in every message field the active template renders into the body,
|
|
853
|
+
including text content, reasoning, and tool-call serialization. They are indistinguishable from
|
|
854
|
+
structural turn delimiters after tokenization. The run logs role-aware masked rows and any
|
|
855
|
+
completion-only fallback rows separately.
|
|
847
856
|
- **For Qwen3.5 thinking multi-turn SFT, put reasoning only in the final assistant
|
|
848
857
|
turn.** Qwen3.5's chat template strips literal `<think>` blocks from prior assistant
|
|
849
858
|
history and pre-opens `<think>\n` in the next generation prompt. If every assistant
|
{freesolo_flash_dev-1.2.48 → freesolo_flash_dev-1.2.52}/flash/engine/profiling/sft_workload.py
RENAMED
|
@@ -50,6 +50,8 @@ class PreparedSftWorkload:
|
|
|
50
50
|
sampled_texts: list[str]
|
|
51
51
|
multiturn_targets: int
|
|
52
52
|
coerced_singleturn_targets: int
|
|
53
|
+
role_aware_multiturn_targets: int
|
|
54
|
+
fallback_multiturn_targets: int
|
|
53
55
|
authored_reasoning_turns: int
|
|
54
56
|
rendered_reasoning_spans: int
|
|
55
57
|
truncated_reasoning_spans: int
|
|
@@ -104,7 +106,8 @@ def _processor_tokenized_row(
|
|
|
104
106
|
*,
|
|
105
107
|
max_length: int,
|
|
106
108
|
thinking: bool,
|
|
107
|
-
) -> tuple[list[int], list[int], bytes, int]:
|
|
109
|
+
) -> tuple[list[int], list[int], bytes, int, bool]:
|
|
110
|
+
from flash.engine.worker.model.chatml_mask import assistant_only_mask
|
|
108
111
|
from flash.engine.worker.model.packing import completion_mask_from_ids
|
|
109
112
|
|
|
110
113
|
prepared_prompt = _multimodal_messages_with_images(prompt_messages, images)
|
|
@@ -143,9 +146,22 @@ def _processor_tokenized_row(
|
|
|
143
146
|
untruncated_length = len(untruncated_ids)
|
|
144
147
|
input_ids = untruncated_ids[:max_length]
|
|
145
148
|
prompt_ids = ids(prompt["input_ids"])[:max_length]
|
|
146
|
-
|
|
149
|
+
# the span reader needs the text tokenizer's vocabulary; a processor exposes it as .tokenizer.
|
|
150
|
+
mask, role_aware = assistant_only_mask(
|
|
151
|
+
completion_mask_from_ids(prompt_ids, input_ids),
|
|
152
|
+
input_ids,
|
|
153
|
+
getattr(processor, "tokenizer", processor),
|
|
154
|
+
completion_messages,
|
|
155
|
+
# this path appends nothing of its own, so there is no appended EOS to preserve.
|
|
156
|
+
appended_eos=False,
|
|
157
|
+
template_source=processor,
|
|
158
|
+
# the IMAGE-PREPARED messages, which is what the processor actually rendered: probing the
|
|
159
|
+
# unprepared list would validate a different transcript than the one being masked.
|
|
160
|
+
source_messages=full_messages,
|
|
161
|
+
template_kwargs={"enable_thinking": thinking},
|
|
162
|
+
)
|
|
147
163
|
full.pop("attention_mask", None)
|
|
148
|
-
return input_ids,
|
|
164
|
+
return input_ids, mask, _serialize_multimodal_inputs(full), untruncated_length, role_aware
|
|
149
165
|
|
|
150
166
|
|
|
151
167
|
def _materialize_verl_images(
|
|
@@ -269,6 +285,10 @@ class _TokenizedSftRows:
|
|
|
269
285
|
sampled_texts: list[str]
|
|
270
286
|
multiturn_targets: int
|
|
271
287
|
coerced_singleturn_targets: int
|
|
288
|
+
# multi-turn rows only: present means the row has a multi-turn target, and the value says whether
|
|
289
|
+
# its mask was role-aware or fell back to the contiguous span. one map rather than a set plus a
|
|
290
|
+
# parallel dict, so a row can never be counted as multi-turn while its mask status is missing.
|
|
291
|
+
multiturn_mask_applied: dict[int, bool]
|
|
272
292
|
reasoning_by_index: dict[int, _RowReasoning]
|
|
273
293
|
dropped: int
|
|
274
294
|
|
|
@@ -280,6 +300,8 @@ class _RetainedSftRows:
|
|
|
280
300
|
authored_reasoning_turns: int
|
|
281
301
|
rendered_reasoning_spans: int
|
|
282
302
|
truncated_reasoning_spans: int
|
|
303
|
+
role_aware_multiturn_targets: int
|
|
304
|
+
fallback_multiturn_targets: int
|
|
283
305
|
dropped: int
|
|
284
306
|
# kept PER ROW, in the retained order, so the warning can be bounded to the rows the optimizer
|
|
285
307
|
# actually consumes. the totals above describe the whole retained dataset, which is what the
|
|
@@ -386,6 +408,48 @@ def _row_reasoning(
|
|
|
386
408
|
return _RowReasoning(authored, rendered, truncated)
|
|
387
409
|
|
|
388
410
|
|
|
411
|
+
def _text_sft_row_spec(
|
|
412
|
+
spec,
|
|
413
|
+
prompt_messages: list[dict],
|
|
414
|
+
completion_messages: list[dict],
|
|
415
|
+
*,
|
|
416
|
+
tokenizer,
|
|
417
|
+
render_transcript: Callable[[list[dict]], str],
|
|
418
|
+
max_length: int,
|
|
419
|
+
row_index: int,
|
|
420
|
+
multiturn: bool,
|
|
421
|
+
) -> tuple[str, _RowReasoning, dict[str, Any]]:
|
|
422
|
+
text = render_transcript([*prompt_messages, *completion_messages])
|
|
423
|
+
prompt_text = tokenizer.apply_chat_template(
|
|
424
|
+
prompt_messages,
|
|
425
|
+
tokenize=False,
|
|
426
|
+
add_generation_prompt=True,
|
|
427
|
+
enable_thinking=spec.thinking,
|
|
428
|
+
)
|
|
429
|
+
reasoning = _row_reasoning(
|
|
430
|
+
prompt_messages,
|
|
431
|
+
completion_messages,
|
|
432
|
+
render=render_transcript,
|
|
433
|
+
tokenizer=tokenizer,
|
|
434
|
+
max_length=max_length,
|
|
435
|
+
)
|
|
436
|
+
return (
|
|
437
|
+
text,
|
|
438
|
+
reasoning,
|
|
439
|
+
{
|
|
440
|
+
"text": text,
|
|
441
|
+
"prompt_text": prompt_text,
|
|
442
|
+
"target_messages": completion_messages,
|
|
443
|
+
"source_messages": [*prompt_messages, *completion_messages],
|
|
444
|
+
"template_kwargs": {"enable_thinking": spec.thinking},
|
|
445
|
+
# measurement carried alongside the row rather than in it: the parquet row is built from
|
|
446
|
+
# an explicit key list below, so neither key reaches verl.
|
|
447
|
+
"row_index": row_index,
|
|
448
|
+
"multiturn": multiturn,
|
|
449
|
+
},
|
|
450
|
+
)
|
|
451
|
+
|
|
452
|
+
|
|
389
453
|
def _tokenize_prompt_rows(
|
|
390
454
|
spec,
|
|
391
455
|
prompt_rows: list[tuple[Any, list[dict], list[dict], bool]],
|
|
@@ -409,6 +473,7 @@ def _tokenize_prompt_rows(
|
|
|
409
473
|
sampled_texts: list[str] = []
|
|
410
474
|
multiturn_targets = 0
|
|
411
475
|
coerced_singleturn_targets = 0
|
|
476
|
+
multiturn_mask_applied: dict[int, bool] = {}
|
|
412
477
|
# kept per row rather than summed here, for the same reason as `untruncated_by_index`: rows that
|
|
413
478
|
# lose their whole completion to the cap are dropped below, and folding their reasoning into a
|
|
414
479
|
# running total would report loss from rows the run never trains on against a retained-row
|
|
@@ -430,7 +495,9 @@ def _tokenize_prompt_rows(
|
|
|
430
495
|
coerced_scalar_output,
|
|
431
496
|
) in enumerate(prompt_rows):
|
|
432
497
|
_reject_image_completion(completion_messages)
|
|
433
|
-
|
|
498
|
+
# read before the image branch rewrites `completion_messages` to its text-only form.
|
|
499
|
+
multiturn = len(completion_messages) > 1
|
|
500
|
+
if multiturn:
|
|
434
501
|
multiturn_targets += 1
|
|
435
502
|
elif (
|
|
436
503
|
coerced_scalar_output
|
|
@@ -444,7 +511,13 @@ def _tokenize_prompt_rows(
|
|
|
444
511
|
normalized = normalize_prompt_images(example, prompt_messages, package_root)
|
|
445
512
|
completion_messages = text_only_prompt_messages(completion_messages)
|
|
446
513
|
decoded_images = decode_image_descriptors(normalized.descriptors, package_root)
|
|
447
|
-
|
|
514
|
+
(
|
|
515
|
+
input_ids,
|
|
516
|
+
loss_mask,
|
|
517
|
+
multimodal_inputs,
|
|
518
|
+
untruncated_length,
|
|
519
|
+
assistant_mask_applied,
|
|
520
|
+
) = _processor_tokenized_row(
|
|
448
521
|
processor,
|
|
449
522
|
normalized.messages,
|
|
450
523
|
completion_messages,
|
|
@@ -453,6 +526,8 @@ def _tokenize_prompt_rows(
|
|
|
453
526
|
thinking=bool(spec.thinking),
|
|
454
527
|
)
|
|
455
528
|
untruncated_by_index[row_index] = untruncated_length
|
|
529
|
+
if multiturn:
|
|
530
|
+
multiturn_mask_applied[row_index] = assistant_mask_applied
|
|
456
531
|
row_by_index[row_index] = {
|
|
457
532
|
"input_ids": input_ids,
|
|
458
533
|
"loss_mask": loss_mask,
|
|
@@ -480,22 +555,19 @@ def _tokenize_prompt_rows(
|
|
|
480
555
|
max_length=max_length - visual_inflation,
|
|
481
556
|
)
|
|
482
557
|
else:
|
|
483
|
-
text =
|
|
484
|
-
|
|
485
|
-
prompt_messages,
|
|
486
|
-
tokenize=False,
|
|
487
|
-
add_generation_prompt=True,
|
|
488
|
-
enable_thinking=spec.thinking,
|
|
489
|
-
)
|
|
490
|
-
sampled_texts.append(text)
|
|
491
|
-
reasoning_by_index[row_index] = _row_reasoning(
|
|
558
|
+
text, reasoning, text_spec = _text_sft_row_spec(
|
|
559
|
+
spec,
|
|
492
560
|
prompt_messages,
|
|
493
561
|
completion_messages,
|
|
494
|
-
render=render_transcript,
|
|
495
562
|
tokenizer=tokenizer,
|
|
563
|
+
render_transcript=render_transcript,
|
|
496
564
|
max_length=max_length,
|
|
565
|
+
row_index=row_index,
|
|
566
|
+
multiturn=multiturn,
|
|
497
567
|
)
|
|
498
|
-
|
|
568
|
+
sampled_texts.append(text)
|
|
569
|
+
reasoning_by_index[row_index] = reasoning
|
|
570
|
+
text_specs.append(text_spec)
|
|
499
571
|
|
|
500
572
|
dropped = 0
|
|
501
573
|
if text_specs:
|
|
@@ -506,9 +578,12 @@ def _tokenize_prompt_rows(
|
|
|
506
578
|
)
|
|
507
579
|
dropped += text_dropped
|
|
508
580
|
for spec_row, tokenized in zip(kept_specs, tokenized_rows, strict=True):
|
|
581
|
+
row_index = spec_row["row_index"]
|
|
509
582
|
input_ids = tokenized["input_ids"]
|
|
510
|
-
untruncated_by_index[
|
|
511
|
-
|
|
583
|
+
untruncated_by_index[row_index] = tokenized["untruncated_length"]
|
|
584
|
+
if spec_row["multiturn"]:
|
|
585
|
+
multiturn_mask_applied[row_index] = tokenized["assistant_mask_applied"]
|
|
586
|
+
row_by_index[row_index] = {
|
|
512
587
|
"input_ids": input_ids,
|
|
513
588
|
"loss_mask": tokenized["completion_mask"],
|
|
514
589
|
"images": [],
|
|
@@ -520,6 +595,7 @@ def _tokenize_prompt_rows(
|
|
|
520
595
|
sampled_texts=sampled_texts,
|
|
521
596
|
multiturn_targets=multiturn_targets,
|
|
522
597
|
coerced_singleturn_targets=coerced_singleturn_targets,
|
|
598
|
+
multiturn_mask_applied=multiturn_mask_applied,
|
|
523
599
|
reasoning_by_index=reasoning_by_index,
|
|
524
600
|
dropped=dropped,
|
|
525
601
|
)
|
|
@@ -533,6 +609,8 @@ def _filter_retained_rows(tokenized: _TokenizedSftRows, tokenizer) -> _RetainedS
|
|
|
533
609
|
authored_reasoning = 0
|
|
534
610
|
rendered_reasoning = 0
|
|
535
611
|
truncated_reasoning = 0
|
|
612
|
+
role_aware_multiturn_targets = 0
|
|
613
|
+
fallback_multiturn_targets = 0
|
|
536
614
|
per_row: list[_RowReasoning] = []
|
|
537
615
|
dropped = tokenized.dropped
|
|
538
616
|
for row_index in sorted(tokenized.row_by_index):
|
|
@@ -542,6 +620,11 @@ def _filter_retained_rows(tokenized: _TokenizedSftRows, tokenizer) -> _RetainedS
|
|
|
542
620
|
# appended in lockstep with the row it measures, so the truncation counts below describe
|
|
543
621
|
# the rows that are actually trained on rather than the ones that were dropped.
|
|
544
622
|
retained_untruncated.append(tokenized.untruncated_by_index[row_index])
|
|
623
|
+
if row_index in tokenized.multiturn_mask_applied:
|
|
624
|
+
if tokenized.multiturn_mask_applied[row_index]:
|
|
625
|
+
role_aware_multiturn_targets += 1
|
|
626
|
+
else:
|
|
627
|
+
fallback_multiturn_targets += 1
|
|
545
628
|
# summed here for the same reason, so the reasoning-loss warning describes the rows the
|
|
546
629
|
# run trains on. a dropped row contributes neither its authored reasoning nor its
|
|
547
630
|
# survivors, which would otherwise be reported against a retained-row denominator.
|
|
@@ -566,6 +649,8 @@ def _filter_retained_rows(tokenized: _TokenizedSftRows, tokenizer) -> _RetainedS
|
|
|
566
649
|
authored_reasoning_turns=authored_reasoning,
|
|
567
650
|
rendered_reasoning_spans=rendered_reasoning,
|
|
568
651
|
truncated_reasoning_spans=truncated_reasoning,
|
|
652
|
+
role_aware_multiturn_targets=role_aware_multiturn_targets,
|
|
653
|
+
fallback_multiturn_targets=fallback_multiturn_targets,
|
|
569
654
|
dropped=dropped,
|
|
570
655
|
row_reasoning=per_row,
|
|
571
656
|
)
|
|
@@ -895,6 +980,8 @@ def prepare_sft_workload(
|
|
|
895
980
|
sampled_texts=tokenized.sampled_texts,
|
|
896
981
|
multiturn_targets=tokenized.multiturn_targets,
|
|
897
982
|
coerced_singleturn_targets=tokenized.coerced_singleturn_targets,
|
|
983
|
+
role_aware_multiturn_targets=retained.role_aware_multiturn_targets,
|
|
984
|
+
fallback_multiturn_targets=retained.fallback_multiturn_targets,
|
|
898
985
|
authored_reasoning_turns=retained.authored_reasoning_turns,
|
|
899
986
|
rendered_reasoning_spans=retained.rendered_reasoning_spans,
|
|
900
987
|
truncated_reasoning_spans=retained.truncated_reasoning_spans,
|
|
@@ -10,8 +10,10 @@ from __future__ import annotations
|
|
|
10
10
|
|
|
11
11
|
import random
|
|
12
12
|
|
|
13
|
+
from flash.engine.worker.model.chatml_mask import assistant_only_mask
|
|
13
14
|
from flash.engine.worker.model.packing import (
|
|
14
15
|
completion_mask_from_ids,
|
|
16
|
+
packing_appends_eos,
|
|
15
17
|
tokenize_for_packing,
|
|
16
18
|
untruncated_lengths_for_packing,
|
|
17
19
|
)
|
|
@@ -37,7 +39,8 @@ def _pretokenize_completion_only(texts, tokenizer, max_length):
|
|
|
37
39
|
|
|
38
40
|
Returns ``(kept_texts, pretok, n_dropped)``. Each pretok row also carries
|
|
39
41
|
``untruncated_length``: its token count BEFORE the cap. The post-slice length can never exceed
|
|
40
|
-
max_length, so it cannot say whether the cap actually bound; this can.
|
|
42
|
+
max_length, so it cannot say whether the cap actually bound; this can. It also carries
|
|
43
|
+
``assistant_mask_applied``: whether the render was readable enough to mask non-assistant turns.
|
|
41
44
|
"""
|
|
42
45
|
full_ids = tokenize_for_packing([t["text"] for t in texts], tokenizer, max_length)
|
|
43
46
|
# the same encode without the cap, so a truncated row reports its real size rather than the cap.
|
|
@@ -45,14 +48,27 @@ def _pretokenize_completion_only(texts, tokenizer, max_length):
|
|
|
45
48
|
prompt_ids = tokenizer(
|
|
46
49
|
[t["prompt_text"] for t in texts], truncation=True, max_length=max_length
|
|
47
50
|
)["input_ids"]
|
|
48
|
-
pretok = [
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
51
|
+
pretok = []
|
|
52
|
+
for text, ids, pids, length in zip(texts, full_ids, prompt_ids, untruncated, strict=True):
|
|
53
|
+
mask, role_aware = assistant_only_mask(
|
|
54
|
+
completion_mask_from_ids(pids, ids),
|
|
55
|
+
ids,
|
|
56
|
+
tokenizer,
|
|
57
|
+
text["target_messages"],
|
|
58
|
+
# the appended EOS counts only when it SURVIVED the cap: an equal-length row proves the
|
|
59
|
+
# token that terminates the example is still there to supervise.
|
|
60
|
+
appended_eos=packing_appends_eos(text["text"], tokenizer) and len(ids) == length,
|
|
61
|
+
source_messages=text["source_messages"],
|
|
62
|
+
template_kwargs=text["template_kwargs"],
|
|
63
|
+
)
|
|
64
|
+
pretok.append(
|
|
65
|
+
{
|
|
66
|
+
"input_ids": ids,
|
|
67
|
+
"completion_mask": mask,
|
|
68
|
+
"assistant_mask_applied": role_aware,
|
|
69
|
+
"untruncated_length": length,
|
|
70
|
+
}
|
|
71
|
+
)
|
|
56
72
|
special_ids = set(getattr(tokenizer, "all_special_ids", None) or [])
|
|
57
73
|
kept = [
|
|
58
74
|
(t, r)
|