freesolo-flash-dev 0.2.27__tar.gz → 0.2.29__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-0.2.27 → freesolo_flash_dev-0.2.29}/Dockerfile.worker +20 -4
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/PKG-INFO +1 -1
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/docs/cli-style/generate.py +3 -16
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/docs/cli-style/index.html +79 -131
- freesolo_flash_dev-0.2.29/docs/cli-style/themed-errors.png +0 -0
- freesolo_flash_dev-0.2.29/flash/__init__.py +13 -0
- freesolo_flash_dev-0.2.29/flash/_channel.py +11 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/_fileio.py +4 -9
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/_logging.py +4 -16
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/_update_check.py +14 -82
- freesolo_flash_dev-0.2.29/flash/catalog.py +264 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/cli/__init__.py +105 -23
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/cli/commands.py +9 -58
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/cli/envpush.py +136 -26
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/cli/render.py +35 -75
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/cli/training_doc.py +7 -17
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/client/config.py +3 -11
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/client/http.py +82 -133
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/client/runtime_secrets.py +3 -19
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/client/specs.py +1 -5
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/cost/__init__.py +1 -2
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/cost/analytical.py +8 -13
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/cost/facts.py +9 -32
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/cost/spec.py +5 -7
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/cost/types.py +1 -13
- freesolo_flash_dev-0.2.29/flash/engine/__init__.py +1 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/engine/accounting.py +4 -8
- freesolo_flash_dev-0.2.29/flash/engine/chalk_kernels.py +65 -0
- freesolo_flash_dev-0.2.29/flash/engine/multiturn_rollout.py +598 -0
- freesolo_flash_dev-0.2.29/flash/engine/recipe.py +53 -0
- freesolo_flash_dev-0.2.29/flash/engine/vram.py +571 -0
- freesolo_flash_dev-0.2.29/flash/engine/worker/__init__.py +417 -0
- freesolo_flash_dev-0.2.29/flash/engine/worker/_pkg.py +24 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/engine/worker/adapter.py +72 -104
- freesolo_flash_dev-0.2.29/flash/engine/worker/decoding.py +69 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/engine/worker/finalize.py +1 -12
- freesolo_flash_dev-0.2.29/flash/engine/worker/gpu_setup.py +158 -0
- freesolo_flash_dev-0.2.29/flash/engine/worker/grpo.py +225 -0
- freesolo_flash_dev-0.2.29/flash/engine/worker/heartbeat.py +240 -0
- freesolo_flash_dev-0.2.29/flash/engine/worker/hf.py +477 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/engine/worker/kernel_warmup.py +104 -66
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/engine/worker/lora.py +36 -250
- freesolo_flash_dev-0.2.29/flash/engine/worker/packing.py +313 -0
- freesolo_flash_dev-0.2.29/flash/engine/worker/perf/__init__.py +363 -0
- freesolo_flash_dev-0.2.29/flash/engine/worker/perf/attn.py +107 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/engine/worker/perf/diagnostics.py +6 -20
- freesolo_flash_dev-0.2.29/flash/engine/worker/perf/lifecycle.py +240 -0
- freesolo_flash_dev-0.2.29/flash/engine/worker/perf/liger.py +49 -0
- freesolo_flash_dev-0.2.29/flash/engine/worker/perf/loraplus.py +18 -0
- freesolo_flash_dev-0.2.29/flash/engine/worker/perf/memory.py +128 -0
- freesolo_flash_dev-0.2.29/flash/engine/worker/rl.py +767 -0
- freesolo_flash_dev-0.2.29/flash/engine/worker/sft.py +532 -0
- freesolo_flash_dev-0.2.29/flash/engine/worker/wandb_log.py +110 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/envs/adapter.py +244 -238
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/envs/base.py +2 -7
- freesolo_flash_dev-0.2.29/flash/envs/pull.py +215 -0
- freesolo_flash_dev-0.2.29/flash/envs/registry.py +26 -0
- freesolo_flash_dev-0.2.29/flash/providers/__init__.py +37 -0
- freesolo_flash_dev-0.2.29/flash/providers/_auth.py +10 -0
- freesolo_flash_dev-0.2.29/flash/providers/_http.py +166 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/providers/_instance.py +24 -162
- freesolo_flash_dev-0.2.29/flash/providers/_instance_bootstrap.py +384 -0
- freesolo_flash_dev-0.2.29/flash/providers/_poll.py +309 -0
- freesolo_flash_dev-0.2.29/flash/providers/allocator.py +112 -0
- freesolo_flash_dev-0.2.29/flash/providers/base.py +341 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/providers/lambdalabs/__init__.py +5 -36
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/providers/lambdalabs/api.py +12 -73
- freesolo_flash_dev-0.2.29/flash/providers/lambdalabs/auth.py +15 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/providers/lambdalabs/gpus.py +1 -6
- freesolo_flash_dev-0.2.29/flash/providers/lambdalabs/jobs/__init__.py +617 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/providers/lambdalabs/jobs/builders.py +7 -25
- freesolo_flash_dev-0.2.29/flash/providers/lambdalabs/preflight.py +15 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/providers/lambdalabs/pricing.py +2 -9
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/providers/lambdalabs/train.py +1 -8
- freesolo_flash_dev-0.2.29/flash/providers/preflight.py +65 -0
- freesolo_flash_dev-0.2.29/flash/providers/realized.py +56 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/providers/runpod/__init__.py +12 -32
- freesolo_flash_dev-0.2.29/flash/providers/runpod/api.py +212 -0
- freesolo_flash_dev-0.2.29/flash/providers/runpod/auth.py +23 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/providers/runpod/cost.py +1 -6
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/providers/runpod/gpus.py +1 -9
- freesolo_flash_dev-0.2.29/flash/providers/runpod/jobs.py +801 -0
- freesolo_flash_dev-0.2.29/flash/providers/runpod/keys.py +97 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/providers/runpod/preflight.py +1 -7
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/providers/runpod/preload.py +38 -266
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/providers/runpod/slots.py +2 -11
- freesolo_flash_dev-0.2.29/flash/providers/runpod/train/__init__.py +62 -0
- freesolo_flash_dev-0.2.29/flash/providers/runpod/train/deps.py +239 -0
- freesolo_flash_dev-0.2.29/flash/providers/runpod/train/endpoints.py +616 -0
- freesolo_flash_dev-0.2.29/flash/runner/__init__.py +525 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/runner/checkpoints.py +6 -6
- freesolo_flash_dev-0.2.29/flash/runner/deploy.py +220 -0
- freesolo_flash_dev-0.2.29/flash/runner/lifecycle.py +591 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/schema/__init__.py +21 -81
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/schema/fields.py +11 -126
- freesolo_flash_dev-0.2.29/flash/serve/deploy.py +309 -0
- freesolo_flash_dev-0.2.29/flash/serve/export.py +107 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/serve/pricing.py +2 -7
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/server/_deps.py +12 -12
- freesolo_flash_dev-0.2.29/flash/server/_internal_client.py +58 -0
- freesolo_flash_dev-0.2.29/flash/server/_locks.py +55 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/server/_runtime.py +75 -9
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/server/app.py +15 -5
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/server/auth.py +18 -85
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/server/billing.py +11 -39
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/server/billing_retry.py +10 -9
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/server/checkpoints.py +14 -49
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/server/db.py +5 -31
- freesolo_flash_dev-0.2.29/flash/server/environment_registry.py +104 -0
- freesolo_flash_dev-0.2.29/flash/server/envs.py +608 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/server/reconcile.py +3 -4
- freesolo_flash_dev-0.2.29/flash/server/repo_cleanup.py +296 -0
- freesolo_flash_dev-0.2.29/flash/server/routes/__init__.py +1 -0
- freesolo_flash_dev-0.2.29/flash/server/routes/envs.py +67 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/server/routes/runs.py +6 -38
- freesolo_flash_dev-0.2.29/flash/server/routes/serving.py +332 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/server/run_registry.py +9 -22
- freesolo_flash_dev-0.2.29/flash/spec.py +246 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/pyproject.toml +2 -2
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/conftest.py +11 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_agent_flash_cli_contract.py +2 -10
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_algorithms.py +1 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_allocator.py +34 -2
- freesolo_flash_dev-0.2.29/tests/test_b200_rollout_opt.py +144 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_backend_jobspec_contract.py +0 -2
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_billing_retry.py +7 -58
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_cancel_remote.py +102 -25
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_catalog_consistency.py +9 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_checkpoints.py +60 -15
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_cli_errors.py +4 -4
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_cli_estimate.py +2 -10
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_cli_managed.py +1 -1
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_cli_render_theme.py +101 -1
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_client.py +52 -2
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_client_server_integration.py +1 -1
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_config_overrides.py +5 -3
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_cost_analytical.py +10 -16
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_disk_gb.py +1 -0
- freesolo_flash_dev-0.2.29/tests/test_env_delete.py +116 -0
- freesolo_flash_dev-0.2.29/tests/test_env_no_install.py +59 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_env_publish.py +415 -5
- freesolo_flash_dev-0.2.29/tests/test_env_pull.py +625 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_env_push.py +29 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_env_rate_limit_resolve.py +1 -1
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_flash_mvp.py +1 -4
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_flash_worker.py +55 -11
- freesolo_flash_dev-0.2.29/tests/test_flashinfer_cache_dirs.py +54 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_github_urlopen_retry.py +75 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_gpus.py +3 -3
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_grpo_params.py +122 -23
- freesolo_flash_dev-0.2.29/tests/test_grpo_sleep_gate.py +223 -0
- freesolo_flash_dev-0.2.29/tests/test_internal_client.py +30 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_jobs.py +276 -87
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_kernel_cache.py +8 -14
- freesolo_flash_dev-0.2.29/tests/test_kv_util.py +153 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_lambda_runner.py +93 -13
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_login_perms.py +15 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_mig_guard.py +9 -68
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_multiturn_rollout.py +50 -0
- freesolo_flash_dev-0.2.29/tests/test_oom_escalate_gpu.py +121 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_orchestrator_flash.py +5 -5
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_poll_helpers.py +4 -8
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_provider_routing.py +83 -3
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_provider_teardown_robustness.py +0 -18
- freesolo_flash_dev-0.2.29/tests/test_repo_cleanup.py +513 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_resolve_params_b.py +8 -6
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_resume_on_retry.py +24 -8
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_runmgmt.py +69 -4
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_runpod_key_waterfall.py +32 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_serve.py +87 -25
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_server_api.py +312 -21
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_server_billing.py +3 -2
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_serving_contract.py +14 -6
- freesolo_flash_dev-0.2.29/tests/test_sft_gc_off.py +158 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_spec_and_validation.py +57 -19
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_thinking_config.py +3 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_verifiers.py +85 -39
- freesolo_flash_dev-0.2.29/tests/test_vl_warmstart_adapter_keys.py +296 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_vl_warmstart_recombine.py +63 -21
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_wandb_naming.py +2 -3
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_warmstart_cross_repo.py +4 -4
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_weight_cache.py +4 -4
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_worker_hardexit.py +42 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_worker_stack.py +51 -16
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/uv.lock +1 -1
- freesolo_flash_dev-0.2.27/flash/__init__.py +0 -29
- freesolo_flash_dev-0.2.27/flash/_channel.py +0 -28
- freesolo_flash_dev-0.2.27/flash/catalog.py +0 -324
- freesolo_flash_dev-0.2.27/flash/engine/__init__.py +0 -6
- freesolo_flash_dev-0.2.27/flash/engine/chalk_kernels.py +0 -111
- freesolo_flash_dev-0.2.27/flash/engine/multiturn_rollout.py +0 -780
- freesolo_flash_dev-0.2.27/flash/engine/recipe.py +0 -74
- freesolo_flash_dev-0.2.27/flash/engine/vram.py +0 -636
- freesolo_flash_dev-0.2.27/flash/engine/worker/__init__.py +0 -599
- freesolo_flash_dev-0.2.27/flash/engine/worker/_pkg.py +0 -30
- freesolo_flash_dev-0.2.27/flash/engine/worker/decoding.py +0 -144
- freesolo_flash_dev-0.2.27/flash/engine/worker/gpu_setup.py +0 -101
- freesolo_flash_dev-0.2.27/flash/engine/worker/grpo.py +0 -297
- freesolo_flash_dev-0.2.27/flash/engine/worker/heartbeat.py +0 -322
- freesolo_flash_dev-0.2.27/flash/engine/worker/hf.py +0 -563
- freesolo_flash_dev-0.2.27/flash/engine/worker/packing.py +0 -486
- freesolo_flash_dev-0.2.27/flash/engine/worker/perf/__init__.py +0 -495
- freesolo_flash_dev-0.2.27/flash/engine/worker/perf/attn.py +0 -176
- freesolo_flash_dev-0.2.27/flash/engine/worker/perf/lifecycle.py +0 -274
- freesolo_flash_dev-0.2.27/flash/engine/worker/perf/liger.py +0 -73
- freesolo_flash_dev-0.2.27/flash/engine/worker/perf/loraplus.py +0 -40
- freesolo_flash_dev-0.2.27/flash/engine/worker/perf/memory.py +0 -84
- freesolo_flash_dev-0.2.27/flash/engine/worker/rl.py +0 -930
- freesolo_flash_dev-0.2.27/flash/engine/worker/sft.py +0 -683
- freesolo_flash_dev-0.2.27/flash/engine/worker/wandb_log.py +0 -145
- freesolo_flash_dev-0.2.27/flash/envs/registry.py +0 -62
- freesolo_flash_dev-0.2.27/flash/providers/__init__.py +0 -54
- freesolo_flash_dev-0.2.27/flash/providers/_auth.py +0 -16
- freesolo_flash_dev-0.2.27/flash/providers/_http.py +0 -230
- freesolo_flash_dev-0.2.27/flash/providers/_instance_bootstrap.py +0 -515
- freesolo_flash_dev-0.2.27/flash/providers/_poll.py +0 -444
- freesolo_flash_dev-0.2.27/flash/providers/allocator.py +0 -165
- freesolo_flash_dev-0.2.27/flash/providers/base.py +0 -442
- freesolo_flash_dev-0.2.27/flash/providers/lambdalabs/auth.py +0 -18
- freesolo_flash_dev-0.2.27/flash/providers/lambdalabs/jobs/__init__.py +0 -831
- freesolo_flash_dev-0.2.27/flash/providers/lambdalabs/preflight.py +0 -27
- freesolo_flash_dev-0.2.27/flash/providers/preflight.py +0 -92
- freesolo_flash_dev-0.2.27/flash/providers/realized.py +0 -80
- freesolo_flash_dev-0.2.27/flash/providers/runpod/api.py +0 -278
- freesolo_flash_dev-0.2.27/flash/providers/runpod/auth.py +0 -37
- freesolo_flash_dev-0.2.27/flash/providers/runpod/jobs.py +0 -1064
- freesolo_flash_dev-0.2.27/flash/providers/runpod/keys.py +0 -145
- freesolo_flash_dev-0.2.27/flash/providers/runpod/train/__init__.py +0 -101
- freesolo_flash_dev-0.2.27/flash/providers/runpod/train/deps.py +0 -461
- freesolo_flash_dev-0.2.27/flash/providers/runpod/train/endpoints.py +0 -830
- freesolo_flash_dev-0.2.27/flash/runner/__init__.py +0 -811
- freesolo_flash_dev-0.2.27/flash/runner/deploy.py +0 -422
- freesolo_flash_dev-0.2.27/flash/runner/lifecycle.py +0 -682
- freesolo_flash_dev-0.2.27/flash/serve/deploy.py +0 -332
- freesolo_flash_dev-0.2.27/flash/serve/export.py +0 -176
- freesolo_flash_dev-0.2.27/flash/server/_locks.py +0 -54
- freesolo_flash_dev-0.2.27/flash/server/environment_registry.py +0 -102
- freesolo_flash_dev-0.2.27/flash/server/envs.py +0 -350
- freesolo_flash_dev-0.2.27/flash/server/routes/__init__.py +0 -6
- freesolo_flash_dev-0.2.27/flash/server/routes/envs.py +0 -48
- freesolo_flash_dev-0.2.27/flash/server/routes/serving.py +0 -427
- freesolo_flash_dev-0.2.27/flash/spec.py +0 -334
- freesolo_flash_dev-0.2.27/tests/test_env_install.py +0 -43
- freesolo_flash_dev-0.2.27/tests/test_grpo_sleep_gate.py +0 -97
- freesolo_flash_dev-0.2.27/tests/test_kv_util.py +0 -75
- freesolo_flash_dev-0.2.27/tests/test_vl_warmstart_adapter_keys.py +0 -581
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/.dockerignore +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/.env.example +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/.github/workflows/auto-rebake.yml +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/.github/workflows/bake-kernel-cache.yml +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/.github/workflows/ci.yml +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/.github/workflows/main-source-guard.yml +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/.github/workflows/publish-dev.yml +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/.github/workflows/publish-image.yml +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/.github/workflows/publish.yml +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/.github/workflows/version-parity.yml +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/.github/workflows/worker-image.yml +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/.gitignore +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/Dockerfile +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/LICENSE +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/README.md +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/build/kernel_cache/.gitignore +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/build/kernel_cache/.keep +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/docker/Dockerfile.kernelcache +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/docker/Dockerfile.kernelcache.relayer +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/docker/bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/docker/bake_pod_entry.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/docker/kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/docker/make_rp_handler.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/docs/cli-style/README.md +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/docs/cli-style/preview.png +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/docs/cli-theme/README.md +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/docs/cli-theme/before-after-dark.png +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/docs/cli-theme/before-after-light.png +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/docs/cli-theme/gallery-dark.png +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/docs/cli-theme/gallery-light.png +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/docs/cli-theme/help-dark.png +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/docs/cli-theme/help-light.png +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/docs/kernel-cache.md +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/cli/__main__.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/client/__init__.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/engine/worker/__main__.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/envs/__init__.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/providers/runpod/pricing.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/py.typed +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/serve/__init__.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/server/__init__.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/server/__main__.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/flash/server/routes/meta.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/infisical-entrypoint.sh +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/scripts/build_dev_dist.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/__init__.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/_helpers/__init__.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/_helpers/runner.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/_helpers/specs.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/fixtures/math_eval.jsonl +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/fixtures/math_train.jsonl +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/live/__init__.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/live/conftest.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/live/test_lambda_live.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/live/test_runpod_live.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_chalk_kernels.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_cli_commands.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_cli_help.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_cost_equation.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_cost_estimate.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_cost_hardware.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_cost_models.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_cost_rewards.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_dev_channel.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_endpoint_name.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_envs_coverage.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_export.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_grpo_mask_aware.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_idle_endpoint_reaper.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_logging.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_managed_hf_repo.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_metrics_schema_agent_contract.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_open_model_policy.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_packing.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_preflight.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_providers_symmetry.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_realized_cost.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_runpod_api_delete.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_runpod_key_fingerprint.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_runpod_slots.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_server_db.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_update_check.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_version.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_vl_weight_sync.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_worker_dryrun.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_worker_image.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_worker_init_heartbeat.py +0 -0
- {freesolo_flash_dev-0.2.27 → freesolo_flash_dev-0.2.29}/tests/test_worker_thinking.py +0 -0
|
@@ -25,9 +25,22 @@ ENV DEBIAN_FRONTEND=noninteractive \
|
|
|
25
25
|
# JIT on a cold worker writes here too. These ENVs are always set (cheap); whether the dir is
|
|
26
26
|
# pre-populated is what the opt-in bake controls. engine.worker._load_kernel_cache_if_present reads
|
|
27
27
|
# /opt/flash/kernelcache at boot.
|
|
28
|
+
# FLASHINFER_CUBIN_DIR / FLASHINFER_CACHE_DIR / FLASHINFER_WORKSPACE_BASE: FlashInfer's attention-backend
|
|
29
|
+
# cubins (the Blackwell sm120 / B200 rollout attention backend) are NOT bundled in the wheel — flashinfer
|
|
30
|
+
# downloads them from NVIDIA Artifactory on first use. Bake the cubin store + JIT cache into the same
|
|
31
|
+
# persistent kernelcache tree so
|
|
32
|
+
# a baked/volume cache serves them and a cold worker never re-fetches from Artifactory (kernel_warmup
|
|
33
|
+
# also sets these). FLASHINFER_WORKSPACE_BASE is the var flashinfer 0.6.x actually reads to relocate the
|
|
34
|
+
# JIT host-wrapper cache (FLASHINFER_CACHE_DIR is a DERIVED constant there, not an env knob), so set it
|
|
35
|
+
# too — otherwise a B200 path that touches flashinfer before kernel_warmup runs lands the wrapper under
|
|
36
|
+
# the default home workspace and re-JITs instead of using the baked cache.
|
|
28
37
|
ENV TRITON_CACHE_DIR=/opt/flash/kernelcache/triton \
|
|
29
|
-
TORCHINDUCTOR_CACHE_DIR=/opt/flash/kernelcache/inductor
|
|
30
|
-
|
|
38
|
+
TORCHINDUCTOR_CACHE_DIR=/opt/flash/kernelcache/inductor \
|
|
39
|
+
FLASHINFER_CUBIN_DIR=/opt/flash/kernelcache/flashinfer_cubin \
|
|
40
|
+
FLASHINFER_CACHE_DIR=/opt/flash/kernelcache/flashinfer \
|
|
41
|
+
FLASHINFER_WORKSPACE_BASE=/opt/flash/kernelcache/flashinfer
|
|
42
|
+
RUN mkdir -p /opt/flash/kernelcache/triton /opt/flash/kernelcache/inductor \
|
|
43
|
+
/opt/flash/kernelcache/flashinfer_cubin /opt/flash/kernelcache/flashinfer
|
|
31
44
|
|
|
32
45
|
# build-essential for Triton/Inductor (Liger) + any source builds; git for pip VCS installs.
|
|
33
46
|
RUN apt-get update && apt-get install -y --no-install-recommends build-essential git curl \
|
|
@@ -39,6 +52,7 @@ RUN pip install --no-cache-dir \
|
|
|
39
52
|
"trl>=1.6,<1.7" \
|
|
40
53
|
"peft>=0.19" \
|
|
41
54
|
"vllm==0.19.1" \
|
|
55
|
+
"flashinfer-python==0.6.6" \
|
|
42
56
|
"bitsandbytes>=0.49" \
|
|
43
57
|
"datasets>=4.7,<6" \
|
|
44
58
|
"huggingface_hub>=0.25" \
|
|
@@ -187,10 +201,12 @@ fa_ok = False; \
|
|
|
187
201
|
exec('try:\n import flash_attn\n fa_ok = True\nexcept Exception:\n fa_ok = False'); \
|
|
188
202
|
fa3_ok = False; \
|
|
189
203
|
exec('try:\n import flash_attn_interface\n fa3_ok = True\nexcept Exception:\n fa3_ok = False'); \
|
|
204
|
+
fi_ok = False; \
|
|
205
|
+
exec('try:\n import flashinfer\n fi_ok = True\nexcept Exception:\n fi_ok = False'); \
|
|
190
206
|
cudnn = torch.backends.cudnn.version(); assert cudnn, 'cuDNN not compiled into torch'; \
|
|
191
207
|
ver = lambda n: M.version(n); \
|
|
192
|
-
print('worker stack OK | torch', torch.__version__, '| cudnn', cudnn, '| triton', triton.__version__, '| flash_attn', 'present' if fa_ok else 'ABSENT (SDPA fallback)', '| flash_attn_3', 'present (Hopper FA3)' if fa3_ok else 'ABSENT (SDPA on Hopper)'); \
|
|
193
|
-
[print(' ', d, ver(d)) for d in ['transformers','trl','peft','vllm','datasets','huggingface-hub', \
|
|
208
|
+
print('worker stack OK | torch', torch.__version__, '| cudnn', cudnn, '| triton', triton.__version__, '| flash_attn', 'present' if fa_ok else 'ABSENT (SDPA fallback)', '| flash_attn_3', 'present (Hopper FA3)' if fa3_ok else 'ABSENT (SDPA on Hopper)', '| flashinfer', 'present (B200 MoE/attn)' if fi_ok else 'ABSENT (Triton fused-MoE fallback)'); \
|
|
209
|
+
[print(' ', d, ver(d)) for d in ['transformers','trl','peft','vllm','flashinfer-python','datasets','huggingface-hub', \
|
|
194
210
|
'accelerate','wandb','liger-kernel','flash-linear-attention','bitsandbytes', \
|
|
195
211
|
'hf-transfer','freesolo','runpod']]"
|
|
196
212
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: freesolo-flash-dev
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.29
|
|
4
4
|
Summary: Flash — managed LoRA post-training (SFT/GRPO) 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
|
|
@@ -300,20 +300,16 @@ def build_cases(tmp: Path):
|
|
|
300
300
|
cost_cfg.write_text(
|
|
301
301
|
'model = "Qwen/Qwen3.5-4B"\nalgorithm = "grpo"\n'
|
|
302
302
|
'[environment]\nid = "acme/math-grader"\n'
|
|
303
|
-
|
|
303
|
+
"[train]\nsteps = 150\nseeds = [0]\n"
|
|
304
304
|
'[gpu]\ntype = "RTX 5090"\n'
|
|
305
305
|
)
|
|
306
306
|
dry_cfg = tmp / "sft.toml"
|
|
307
307
|
dry_cfg.write_text(
|
|
308
308
|
'model = "Qwen/Qwen3.5-4B"\nalgorithm = "sft"\n'
|
|
309
309
|
'[environment]\nid = "acme/math-grader"\n'
|
|
310
|
-
|
|
310
|
+
"[train]\nepochs = 1\nseeds = [0]\n"
|
|
311
311
|
)
|
|
312
312
|
|
|
313
|
-
install_plain = (
|
|
314
|
-
"installed acme/math-grader; recorded in /Users/you/.flash/environments.json\n"
|
|
315
|
-
'use it via: [environment]\\nid = "acme/math-grader"'
|
|
316
|
-
)
|
|
317
313
|
push_plain = (
|
|
318
314
|
"published acme/math-grader\nreference it in your config:\n\n"
|
|
319
315
|
' [environment]\n id = "acme/math-grader"'
|
|
@@ -355,13 +351,7 @@ def build_cases(tmp: Path):
|
|
|
355
351
|
add_argv("flash models", "supported base models", ["models"])
|
|
356
352
|
add_argv("flash gpus", "managed GPU classes + $/hr", ["gpus"])
|
|
357
353
|
add_argv("flash env setup", "scaffold a starter environment", ["env", "setup"], cwd=setup_dir)
|
|
358
|
-
add_argv("flash env list", "
|
|
359
|
-
add_text(
|
|
360
|
-
"flash env install acme/math-grader",
|
|
361
|
-
"record a published environment",
|
|
362
|
-
lambda: render.env_installed("acme/math-grader", "/Users/you/.flash/environments.json"),
|
|
363
|
-
install_plain,
|
|
364
|
-
)
|
|
354
|
+
add_argv("flash env list", "local environment sources", ["env", "list"], cwd=list_dir)
|
|
365
355
|
add_text(
|
|
366
356
|
"flash env push --name math-grader .",
|
|
367
357
|
"package + upload a local environment",
|
|
@@ -478,9 +468,6 @@ def main():
|
|
|
478
468
|
# committed gallery doesn't churn on every regeneration.
|
|
479
469
|
sys.modules["flash.cli.commands"].new_run_id = lambda: "flash-1718900000-d0cf00ed"
|
|
480
470
|
with tempfile.TemporaryDirectory() as td:
|
|
481
|
-
# Point the installed-env registry at an empty temp manifest so `flash env list` never
|
|
482
|
-
# leaks a developer's real installed env slugs (~/.flash/envs.json) into the preview.
|
|
483
|
-
os.environ["FLASH_ENVS_MANIFEST"] = str(Path(td) / "empty-envs.json")
|
|
484
471
|
cases = build_cases(Path(td))
|
|
485
472
|
blocks = [HEAD]
|
|
486
473
|
for title, sub, plain, dark, light in cases:
|
|
@@ -58,7 +58,7 @@ footer code{color:var(--accent2)}
|
|
|
58
58
|
<span><i class="sw" style="background:#4d5470"></i>structure</span>
|
|
59
59
|
</div>
|
|
60
60
|
</header>
|
|
61
|
-
<section class="card"><div class="head"><code>flash version</code><span class="sub">package version</span></div><div class="cols"><div class="col before"><div class="tag"><span class="pill"></span>before</div><pre>flash 0
|
|
61
|
+
<section class="card"><div class="head"><code>flash version</code><span class="sub">package version</span></div><div class="cols"><div class="col before"><div class="tag"><span class="pill"></span>before</div><pre>flash 0+unknown</pre></div><div class="col after"><div class="tag"><span class="pill"></span>after · dark</div><pre><span style="color:#5f72ff;font-weight:700">flash</span> <span style="opacity:.62">v0+unknown</span></pre></div><div class="col after light"><div class="tag"><span class="pill"></span>after · light</div><pre><span style="color:#5f72ff;font-weight:700">flash</span> <span style="opacity:.62">v0+unknown</span></pre></div></div></section><section class="card"><div class="head"><code>flash login</code><span class="sub">verify + store your freesolo key</span></div><div class="cols"><div class="col before"><div class="tag"><span class="pill"></span>before</div><pre>✓ logged in to flash
|
|
62
62
|
|
|
63
63
|
account ml-team@acme.ai
|
|
64
64
|
org org_acme
|
|
@@ -92,13 +92,15 @@ footer code{color:var(--accent2)}
|
|
|
92
92
|
openbmb/MiniCPM5-1B
|
|
93
93
|
Qwen/Qwen3.5-2B
|
|
94
94
|
Qwen/Qwen3.5-4B
|
|
95
|
-
Qwen/Qwen3.5-9B
|
|
95
|
+
Qwen/Qwen3.5-9B
|
|
96
|
+
Qwen/Qwen3.6-35B-A3B</pre></div><div class="col after"><div class="tag"><span class="pill"></span>after · dark</div><pre><span style="color:#5f72ff;font-weight:700">flash</span> <span style="color:#4d5470">›</span> <span style="font-weight:700">models</span> <span style="color:#8a93a8">supported base models</span>
|
|
96
97
|
<span style="color:#4d5470">────────────────────────────────────────────────────────────────────────────</span>
|
|
97
98
|
<span style="color:#4d5470">•</span> <span style="color:#97a3ff">Qwen/Qwen3.5-0.8B</span>
|
|
98
99
|
<span style="color:#4d5470">•</span> <span style="color:#97a3ff">openbmb/MiniCPM5-1B</span>
|
|
99
100
|
<span style="color:#4d5470">•</span> <span style="color:#97a3ff">Qwen/Qwen3.5-2B</span>
|
|
100
101
|
<span style="color:#4d5470">•</span> <span style="color:#97a3ff">Qwen/Qwen3.5-4B</span>
|
|
101
102
|
<span style="color:#4d5470">•</span> <span style="color:#97a3ff">Qwen/Qwen3.5-9B</span>
|
|
103
|
+
<span style="color:#4d5470">•</span> <span style="color:#97a3ff">Qwen/Qwen3.6-35B-A3B</span>
|
|
102
104
|
|
|
103
105
|
<span style="color:#97a3ff">→</span> <span style="opacity:.62">train one with: flash train configs/rl.toml</span></pre></div><div class="col after light"><div class="tag"><span class="pill"></span>after · light</div><pre><span style="color:#5f72ff;font-weight:700">flash</span> <span style="color:#9aa1b5">›</span> <span style="font-weight:700">models</span> <span style="color:#5b6472">supported base models</span>
|
|
104
106
|
<span style="color:#9aa1b5">────────────────────────────────────────────────────────────────────────────</span>
|
|
@@ -107,56 +109,51 @@ Qwen/Qwen3.5-9B</pre></div><div class="col after"><div class="tag"><span class="
|
|
|
107
109
|
<span style="color:#9aa1b5">•</span> <span style="color:#3a46c8">Qwen/Qwen3.5-2B</span>
|
|
108
110
|
<span style="color:#9aa1b5">•</span> <span style="color:#3a46c8">Qwen/Qwen3.5-4B</span>
|
|
109
111
|
<span style="color:#9aa1b5">•</span> <span style="color:#3a46c8">Qwen/Qwen3.5-9B</span>
|
|
112
|
+
<span style="color:#9aa1b5">•</span> <span style="color:#3a46c8">Qwen/Qwen3.6-35B-A3B</span>
|
|
110
113
|
|
|
111
114
|
<span style="color:#3a46c8">→</span> <span style="opacity:.62">train one with: flash train configs/rl.toml</span></pre></div></div></section><section class="card"><div class="head"><code>flash gpus</code><span class="sub">managed GPU classes + $/hr</span></div><div class="cols"><div class="col before"><div class="tag"><span class="pill"></span>before</div><pre>gpu vram runpod$/hr
|
|
112
|
-
L4 24G 0.39
|
|
113
|
-
A40 48G 0.44
|
|
114
|
-
RTX 3090 24G 0.46
|
|
115
115
|
RTX A6000 48G 0.49
|
|
116
116
|
RTX 4090 24G 0.69
|
|
117
|
-
RTX 6000 Ada 48G 0.77
|
|
118
117
|
RTX 5090 32G 0.99
|
|
119
118
|
A100 PCIe 80G 1.39
|
|
120
119
|
A100 SXM 80G 1.49
|
|
121
120
|
RTX Pro 6000 96G 2.09
|
|
122
121
|
H100 80G 3.29
|
|
122
|
+
H200 141G 4.39
|
|
123
|
+
B200 180G 5.89
|
|
123
124
|
|
|
124
125
|
Tip: GPU class selection is fully automatic — the submit-time allocator always picks the
|
|
125
126
|
cheapest validated RunPod class that fits the model, so you don't pin a GPU type.</pre></div><div class="col after"><div class="tag"><span class="pill"></span>after · dark</div><pre><span style="color:#5f72ff;font-weight:700">flash</span> <span style="color:#4d5470">›</span> <span style="font-weight:700">gpus</span> <span style="color:#8a93a8">managed GPU classes</span>
|
|
126
127
|
<span style="color:#4d5470">────────────────────────────────────────────────────────────────────────────</span>
|
|
127
|
-
<span style="color:#8a93a8;font-weight:700">GPU </span> <span style="color:#8a93a8;font-weight:700">
|
|
128
|
-
<span style="color:#4d5470">────────────
|
|
129
|
-
<span style="color:#97a3ff">
|
|
130
|
-
<span style="color:#97a3ff">
|
|
131
|
-
<span style="color:#97a3ff">RTX
|
|
132
|
-
<span style="color:#97a3ff">
|
|
133
|
-
<span style="color:#97a3ff">
|
|
134
|
-
<span style="color:#97a3ff">RTX 6000
|
|
135
|
-
<span style="color:#97a3ff">
|
|
136
|
-
<span style="color:#97a3ff">
|
|
137
|
-
<span style="color:#97a3ff">
|
|
138
|
-
<span style="color:#97a3ff">RTX Pro 6000</span> <span style="color:#8a93a8">96 GB</span> <span style="color:#24c2a8">$2.09</span>
|
|
139
|
-
<span style="color:#97a3ff">H100 </span> <span style="color:#8a93a8">80 GB</span> <span style="color:#24c2a8">$3.29</span>
|
|
128
|
+
<span style="color:#8a93a8;font-weight:700">GPU </span> <span style="color:#8a93a8;font-weight:700"> VRAM</span> <span style="color:#8a93a8;font-weight:700"> $/HR</span>
|
|
129
|
+
<span style="color:#4d5470">──────────── ────── ─────</span>
|
|
130
|
+
<span style="color:#97a3ff">RTX A6000 </span> <span style="color:#8a93a8"> 48 GB</span> <span style="color:#24c2a8">$0.49</span>
|
|
131
|
+
<span style="color:#97a3ff">RTX 4090 </span> <span style="color:#8a93a8"> 24 GB</span> <span style="color:#24c2a8">$0.69</span>
|
|
132
|
+
<span style="color:#97a3ff">RTX 5090 </span> <span style="color:#8a93a8"> 32 GB</span> <span style="color:#24c2a8">$0.99</span>
|
|
133
|
+
<span style="color:#97a3ff">A100 PCIe </span> <span style="color:#8a93a8"> 80 GB</span> <span style="color:#24c2a8">$1.39</span>
|
|
134
|
+
<span style="color:#97a3ff">A100 SXM </span> <span style="color:#8a93a8"> 80 GB</span> <span style="color:#24c2a8">$1.49</span>
|
|
135
|
+
<span style="color:#97a3ff">RTX Pro 6000</span> <span style="color:#8a93a8"> 96 GB</span> <span style="color:#24c2a8">$2.09</span>
|
|
136
|
+
<span style="color:#97a3ff">H100 </span> <span style="color:#8a93a8"> 80 GB</span> <span style="color:#24c2a8">$3.29</span>
|
|
137
|
+
<span style="color:#97a3ff">H200 </span> <span style="color:#8a93a8">141 GB</span> <span style="color:#24c2a8">$4.39</span>
|
|
138
|
+
<span style="color:#97a3ff">B200 </span> <span style="color:#8a93a8">180 GB</span> <span style="color:#24c2a8">$5.89</span>
|
|
140
139
|
|
|
141
140
|
<span style="opacity:.62">Tip: GPU class selection is fully automatic — the submit-time allocator always picks the
|
|
142
141
|
cheapest validated RunPod class that fits the model, so you don't pin a GPU type.</span></pre></div><div class="col after light"><div class="tag"><span class="pill"></span>after · light</div><pre><span style="color:#5f72ff;font-weight:700">flash</span> <span style="color:#9aa1b5">›</span> <span style="font-weight:700">gpus</span> <span style="color:#5b6472">managed GPU classes</span>
|
|
143
142
|
<span style="color:#9aa1b5">────────────────────────────────────────────────────────────────────────────</span>
|
|
144
|
-
<span style="color:#5b6472;font-weight:700">GPU </span> <span style="color:#5b6472;font-weight:700">
|
|
145
|
-
<span style="color:#9aa1b5">────────────
|
|
146
|
-
<span style="color:#3a46c8">
|
|
147
|
-
<span style="color:#3a46c8">
|
|
148
|
-
<span style="color:#3a46c8">RTX
|
|
149
|
-
<span style="color:#3a46c8">
|
|
150
|
-
<span style="color:#3a46c8">
|
|
151
|
-
<span style="color:#3a46c8">RTX 6000
|
|
152
|
-
<span style="color:#3a46c8">
|
|
153
|
-
<span style="color:#3a46c8">
|
|
154
|
-
<span style="color:#3a46c8">
|
|
155
|
-
<span style="color:#3a46c8">RTX Pro 6000</span> <span style="color:#5b6472">96 GB</span> <span style="color:#0e7490">$2.09</span>
|
|
156
|
-
<span style="color:#3a46c8">H100 </span> <span style="color:#5b6472">80 GB</span> <span style="color:#0e7490">$3.29</span>
|
|
143
|
+
<span style="color:#5b6472;font-weight:700">GPU </span> <span style="color:#5b6472;font-weight:700"> VRAM</span> <span style="color:#5b6472;font-weight:700"> $/HR</span>
|
|
144
|
+
<span style="color:#9aa1b5">──────────── ────── ─────</span>
|
|
145
|
+
<span style="color:#3a46c8">RTX A6000 </span> <span style="color:#5b6472"> 48 GB</span> <span style="color:#0e7490">$0.49</span>
|
|
146
|
+
<span style="color:#3a46c8">RTX 4090 </span> <span style="color:#5b6472"> 24 GB</span> <span style="color:#0e7490">$0.69</span>
|
|
147
|
+
<span style="color:#3a46c8">RTX 5090 </span> <span style="color:#5b6472"> 32 GB</span> <span style="color:#0e7490">$0.99</span>
|
|
148
|
+
<span style="color:#3a46c8">A100 PCIe </span> <span style="color:#5b6472"> 80 GB</span> <span style="color:#0e7490">$1.39</span>
|
|
149
|
+
<span style="color:#3a46c8">A100 SXM </span> <span style="color:#5b6472"> 80 GB</span> <span style="color:#0e7490">$1.49</span>
|
|
150
|
+
<span style="color:#3a46c8">RTX Pro 6000</span> <span style="color:#5b6472"> 96 GB</span> <span style="color:#0e7490">$2.09</span>
|
|
151
|
+
<span style="color:#3a46c8">H100 </span> <span style="color:#5b6472"> 80 GB</span> <span style="color:#0e7490">$3.29</span>
|
|
152
|
+
<span style="color:#3a46c8">H200 </span> <span style="color:#5b6472">141 GB</span> <span style="color:#0e7490">$4.39</span>
|
|
153
|
+
<span style="color:#3a46c8">B200 </span> <span style="color:#5b6472">180 GB</span> <span style="color:#0e7490">$5.89</span>
|
|
157
154
|
|
|
158
155
|
<span style="opacity:.62">Tip: GPU class selection is fully automatic — the submit-time allocator always picks the
|
|
159
|
-
cheapest validated RunPod class that fits the model, so you don't pin a GPU type.</span></pre></div></div></section><section class="card"><div class="head"><code>flash env setup</code><span class="sub">scaffold a starter environment</span></div><div class="cols"><div class="col before"><div class="tag"><span class="pill"></span>before</div><pre>ensured environment.py, datasets/train.jsonl, configs
|
|
156
|
+
cheapest validated RunPod class that fits the model, so you don't pin a GPU type.</span></pre></div></div></section><section class="card"><div class="head"><code>flash env setup</code><span class="sub">scaffold a starter environment</span></div><div class="cols"><div class="col before"><div class="tag"><span class="pill"></span>before</div><pre>ensured environment.py, datasets/train.jsonl, configs/rl.toml, configs/sft.toml, TRAINING.md</pre></div><div class="col after"><div class="tag"><span class="pill"></span>after · dark</div><pre><span style="color:#5f72ff;font-weight:700">flash</span> <span style="color:#4d5470">›</span> <span style="font-weight:700">env setup</span> <span style="color:#8a93a8">starter Freesolo environment</span>
|
|
160
157
|
<span style="color:#4d5470">────────────────────────────────────────────────────────────────────────────</span>
|
|
161
158
|
<span style="color:#57ff8f;font-weight:700">✓</span> scaffold ready
|
|
162
159
|
|
|
@@ -164,6 +161,7 @@ cheapest validated RunPod class that fits the model, so you don't pin a GPU
|
|
|
164
161
|
<span style="color:#97a3ff">datasets/train.jsonl</span> <span style="opacity:.62">starter training rows</span>
|
|
165
162
|
<span style="color:#97a3ff">configs/rl.toml </span> <span style="opacity:.62">GRPO run config</span>
|
|
166
163
|
<span style="color:#97a3ff">configs/sft.toml </span> <span style="opacity:.62">SFT run config</span>
|
|
164
|
+
<span style="color:#97a3ff">TRAINING.md </span> <span style="opacity:.62">how to train well — read this first</span>
|
|
167
165
|
|
|
168
166
|
<span style="color:#97a3ff">→</span> <span style="opacity:.62">publish it: flash env push --name my-env .</span></pre></div><div class="col after light"><div class="tag"><span class="pill"></span>after · light</div><pre><span style="color:#5f72ff;font-weight:700">flash</span> <span style="color:#9aa1b5">›</span> <span style="font-weight:700">env setup</span> <span style="color:#5b6472">starter Freesolo environment</span>
|
|
169
167
|
<span style="color:#9aa1b5">────────────────────────────────────────────────────────────────────────────</span>
|
|
@@ -173,29 +171,19 @@ cheapest validated RunPod class that fits the model, so you don't pin a GPU
|
|
|
173
171
|
<span style="color:#3a46c8">datasets/train.jsonl</span> <span style="opacity:.62">starter training rows</span>
|
|
174
172
|
<span style="color:#3a46c8">configs/rl.toml </span> <span style="opacity:.62">GRPO run config</span>
|
|
175
173
|
<span style="color:#3a46c8">configs/sft.toml </span> <span style="opacity:.62">SFT run config</span>
|
|
174
|
+
<span style="color:#3a46c8">TRAINING.md </span> <span style="opacity:.62">how to train well — read this first</span>
|
|
176
175
|
|
|
177
|
-
<span style="color:#3a46c8">→</span> <span style="opacity:.62">publish it: flash env push --name my-env .</span></pre></div></div></section><section class="card"><div class="head"><code>flash env list</code><span class="sub">
|
|
176
|
+
<span style="color:#3a46c8">→</span> <span style="opacity:.62">publish it: flash env push --name my-env .</span></pre></div></div></section><section class="card"><div class="head"><code>flash env list</code><span class="sub">local environment sources</span></div><div class="cols"><div class="col before"><div class="tag"><span class="pill"></span>before</div><pre>local env sources (publish with `flash env push --name <name> <path>`):
|
|
178
177
|
.
|
|
179
|
-
environments/math-grader</pre></div><div class="col after"><div class="tag"><span class="pill"></span>after · dark</div><pre><span style="color:#5f72ff;font-weight:700">flash</span> <span style="color:#4d5470">›</span> <span style="font-weight:700">env list</span> <span style="color:#8a93a8">
|
|
178
|
+
environments/math-grader</pre></div><div class="col after"><div class="tag"><span class="pill"></span>after · dark</div><pre><span style="color:#5f72ff;font-weight:700">flash</span> <span style="color:#4d5470">›</span> <span style="font-weight:700">env list</span> <span style="color:#8a93a8">local environments</span>
|
|
180
179
|
<span style="color:#4d5470">────────────────────────────────────────────────────────────────────────────</span>
|
|
181
180
|
<span style="color:#8a93a8;font-weight:700">local sources</span><span style="opacity:.62"> (publish with flash env push --name <name> <path>)</span>
|
|
182
181
|
<span style="color:#4d5470">·</span> <span style="color:#97a3ff">.</span>
|
|
183
|
-
<span style="color:#4d5470">·</span> <span style="color:#97a3ff">environments/math-grader</span></pre></div><div class="col after light"><div class="tag"><span class="pill"></span>after · light</div><pre><span style="color:#5f72ff;font-weight:700">flash</span> <span style="color:#9aa1b5">›</span> <span style="font-weight:700">env list</span> <span style="color:#5b6472">
|
|
182
|
+
<span style="color:#4d5470">·</span> <span style="color:#97a3ff">environments/math-grader</span></pre></div><div class="col after light"><div class="tag"><span class="pill"></span>after · light</div><pre><span style="color:#5f72ff;font-weight:700">flash</span> <span style="color:#9aa1b5">›</span> <span style="font-weight:700">env list</span> <span style="color:#5b6472">local environments</span>
|
|
184
183
|
<span style="color:#9aa1b5">────────────────────────────────────────────────────────────────────────────</span>
|
|
185
184
|
<span style="color:#5b6472;font-weight:700">local sources</span><span style="opacity:.62"> (publish with flash env push --name <name> <path>)</span>
|
|
186
185
|
<span style="color:#9aa1b5">·</span> <span style="color:#3a46c8">.</span>
|
|
187
|
-
<span style="color:#9aa1b5">·</span> <span style="color:#3a46c8">environments/math-grader</span></pre></div></div></section><section class="card"><div class="head"><code>flash env
|
|
188
|
-
use it via: [environment]\nid = "acme/math-grader"</pre></div><div class="col after"><div class="tag"><span class="pill"></span>after · dark</div><pre><span style="color:#57ff8f;font-weight:700">✓</span> recorded <span style="font-weight:700">acme/math-grader</span>
|
|
189
|
-
<span style="opacity:.62"> manifest: /Users/you/.flash/environments.json</span>
|
|
190
|
-
|
|
191
|
-
<span style="opacity:.62">use it in your config:</span>
|
|
192
|
-
<span style="color:#97a3ff">[environment]</span>
|
|
193
|
-
<span style="color:#97a3ff">id = "acme/math-grader"</span></pre></div><div class="col after light"><div class="tag"><span class="pill"></span>after · light</div><pre><span style="color:#00695c;font-weight:700">✓</span> recorded <span style="font-weight:700">acme/math-grader</span>
|
|
194
|
-
<span style="opacity:.62"> manifest: /Users/you/.flash/environments.json</span>
|
|
195
|
-
|
|
196
|
-
<span style="opacity:.62">use it in your config:</span>
|
|
197
|
-
<span style="color:#3a46c8">[environment]</span>
|
|
198
|
-
<span style="color:#3a46c8">id = "acme/math-grader"</span></pre></div></div></section><section class="card"><div class="head"><code>flash env push --name math-grader .</code><span class="sub">package + upload a local environment</span></div><div class="cols"><div class="col before"><div class="tag"><span class="pill"></span>before</div><pre>published acme/math-grader
|
|
186
|
+
<span style="color:#9aa1b5">·</span> <span style="color:#3a46c8">environments/math-grader</span></pre></div></div></section><section class="card"><div class="head"><code>flash env push --name math-grader .</code><span class="sub">package + upload a local environment</span></div><div class="cols"><div class="col before"><div class="tag"><span class="pill"></span>before</div><pre>published acme/math-grader
|
|
199
187
|
reference it in your config:
|
|
200
188
|
|
|
201
189
|
[environment]
|
|
@@ -318,37 +306,37 @@ worker: pushing adapter -> acme/qwen3.5-4b-grpo-runs
|
|
|
318
306
|
<span style="color:#3a46c8">"error"</span><span style="color:#9aa1b5">:</span> <span style="color:#6d28d9">null</span>,
|
|
319
307
|
<span style="color:#3a46c8">"artifacts_dir"</span><span style="color:#9aa1b5">:</span> <span style="color:#00695c">"acme/qwen3.5-4b-grpo-runs"</span>
|
|
320
308
|
}</pre></div></div></section><section class="card"><div class="head"><code>flash train --cost rl.toml</code><span class="sub">pre-flight cost estimate</span></div><div class="cols"><div class="col before"><div class="tag"><span class="pill"></span>before</div><pre>Run : Qwen/Qwen3.5-4B [GRPO, 150 steps]
|
|
321
|
-
GPU :
|
|
309
|
+
GPU : RTX A6000 on auto (48 GB; run needs >= 35 GB) @ $0.49/hr
|
|
322
310
|
Setup : 9.8 min (cold start: boot + deps + model load + vLLM init)
|
|
323
|
-
Per step :
|
|
324
|
-
Train :
|
|
325
|
-
Wall clock : 9.
|
|
326
|
-
TOTAL : $4.
|
|
311
|
+
Per step : 228.36 s
|
|
312
|
+
Train : 570.9 min
|
|
313
|
+
Wall clock : 9.68 h
|
|
314
|
+
TOTAL : $4.74
|
|
327
315
|
Notes :
|
|
328
316
|
- GRPO step = vLLM rollout of 64x8=512 completions @ 320 tok + reward (1.00s/completion, env acme/math-grader) + policy+reference update
|
|
329
317
|
- GPU sized with 10% VRAM headroom; static GPU $/hr</pre></div><div class="col after"><div class="tag"><span class="pill"></span>after · dark</div><pre><span style="color:#5f72ff;font-weight:700">flash</span> <span style="color:#4d5470">›</span> <span style="font-weight:700">train</span> <span style="color:#8a93a8">pre-flight cost estimate</span>
|
|
330
318
|
<span style="color:#4d5470">────────────────────────────────────────────────────────────────────────────</span>
|
|
331
319
|
<span style="color:#8a93a8">run </span> <span style="color:#4d5470">·</span> <span style="color:#97a3ff">Qwen/Qwen3.5-4B</span> <span style="opacity:.62">[GRPO, 150 steps]</span>
|
|
332
|
-
<span style="color:#8a93a8">gpu </span> <span style="color:#4d5470">·</span>
|
|
320
|
+
<span style="color:#8a93a8">gpu </span> <span style="color:#4d5470">·</span> RTX A6000 on auto <span style="opacity:.62">(48 GB; needs >= 35 GB)</span> @ <span style="color:#24c2a8">$0.49</span>/hr
|
|
333
321
|
<span style="color:#8a93a8">setup </span> <span style="color:#4d5470">·</span> 9.8 min <span style="opacity:.62">(cold start: boot + deps + model load + vLLM init)</span>
|
|
334
|
-
<span style="color:#8a93a8">per step </span> <span style="color:#4d5470">·</span>
|
|
335
|
-
<span style="color:#8a93a8">train </span> <span style="color:#4d5470">·</span>
|
|
336
|
-
<span style="color:#8a93a8">wall clock</span> <span style="color:#4d5470">·</span> 9.
|
|
322
|
+
<span style="color:#8a93a8">per step </span> <span style="color:#4d5470">·</span> 228.36 s
|
|
323
|
+
<span style="color:#8a93a8">train </span> <span style="color:#4d5470">·</span> 570.9 min
|
|
324
|
+
<span style="color:#8a93a8">wall clock</span> <span style="color:#4d5470">·</span> 9.68 h
|
|
337
325
|
<span style="color:#4d5470">────────────────────────────────────────────────────────────────────────────</span>
|
|
338
|
-
<span style="color:#8a93a8;font-weight:700">TOTAL </span> <span style="color:#4d5470">·</span> <span style="color:#24c2a8;font-weight:700">$4.
|
|
326
|
+
<span style="color:#8a93a8;font-weight:700">TOTAL </span> <span style="color:#4d5470">·</span> <span style="color:#24c2a8;font-weight:700">$4.74</span>
|
|
339
327
|
|
|
340
328
|
<span style="opacity:.62">notes</span>
|
|
341
329
|
<span style="color:#4d5470">·</span> <span style="opacity:.62">GRPO step = vLLM rollout of 64x8=512 completions @ 320 tok + reward (1.00s/completion, env acme/math-grader) + policy+reference update</span>
|
|
342
330
|
<span style="color:#4d5470">·</span> <span style="opacity:.62">GPU sized with 10% VRAM headroom; static GPU $/hr</span></pre></div><div class="col after light"><div class="tag"><span class="pill"></span>after · light</div><pre><span style="color:#5f72ff;font-weight:700">flash</span> <span style="color:#9aa1b5">›</span> <span style="font-weight:700">train</span> <span style="color:#5b6472">pre-flight cost estimate</span>
|
|
343
331
|
<span style="color:#9aa1b5">────────────────────────────────────────────────────────────────────────────</span>
|
|
344
332
|
<span style="color:#5b6472">run </span> <span style="color:#9aa1b5">·</span> <span style="color:#3a46c8">Qwen/Qwen3.5-4B</span> <span style="opacity:.62">[GRPO, 150 steps]</span>
|
|
345
|
-
<span style="color:#5b6472">gpu </span> <span style="color:#9aa1b5">·</span>
|
|
333
|
+
<span style="color:#5b6472">gpu </span> <span style="color:#9aa1b5">·</span> RTX A6000 on auto <span style="opacity:.62">(48 GB; needs >= 35 GB)</span> @ <span style="color:#0e7490">$0.49</span>/hr
|
|
346
334
|
<span style="color:#5b6472">setup </span> <span style="color:#9aa1b5">·</span> 9.8 min <span style="opacity:.62">(cold start: boot + deps + model load + vLLM init)</span>
|
|
347
|
-
<span style="color:#5b6472">per step </span> <span style="color:#9aa1b5">·</span>
|
|
348
|
-
<span style="color:#5b6472">train </span> <span style="color:#9aa1b5">·</span>
|
|
349
|
-
<span style="color:#5b6472">wall clock</span> <span style="color:#9aa1b5">·</span> 9.
|
|
335
|
+
<span style="color:#5b6472">per step </span> <span style="color:#9aa1b5">·</span> 228.36 s
|
|
336
|
+
<span style="color:#5b6472">train </span> <span style="color:#9aa1b5">·</span> 570.9 min
|
|
337
|
+
<span style="color:#5b6472">wall clock</span> <span style="color:#9aa1b5">·</span> 9.68 h
|
|
350
338
|
<span style="color:#9aa1b5">────────────────────────────────────────────────────────────────────────────</span>
|
|
351
|
-
<span style="color:#5b6472;font-weight:700">TOTAL </span> <span style="color:#9aa1b5">·</span> <span style="color:#0e7490;font-weight:700">$4.
|
|
339
|
+
<span style="color:#5b6472;font-weight:700">TOTAL </span> <span style="color:#9aa1b5">·</span> <span style="color:#0e7490;font-weight:700">$4.74</span>
|
|
352
340
|
|
|
353
341
|
<span style="opacity:.62">notes</span>
|
|
354
342
|
<span style="color:#9aa1b5">·</span> <span style="opacity:.62">GRPO step = vLLM rollout of 64x8=512 completions @ 320 tok + reward (1.00s/completion, env acme/math-grader) + policy+reference update</span>
|
|
@@ -362,7 +350,8 @@ Notes :
|
|
|
362
350
|
"id": "acme/math-grader",
|
|
363
351
|
"params": {},
|
|
364
352
|
"pip": [],
|
|
365
|
-
"secrets": []
|
|
353
|
+
"secrets": [],
|
|
354
|
+
"resolved_sha": ""
|
|
366
355
|
},
|
|
367
356
|
"train": {
|
|
368
357
|
"steps": null,
|
|
@@ -389,13 +378,12 @@ Notes :
|
|
|
389
378
|
"stop_sequences": []
|
|
390
379
|
},
|
|
391
380
|
"gpu": {
|
|
392
|
-
"type": "RTX
|
|
381
|
+
"type": "RTX A6000",
|
|
393
382
|
"disk_gb": 60,
|
|
394
383
|
"max_wall_seconds": 86400,
|
|
395
|
-
"max_retries":
|
|
384
|
+
"max_retries": 5,
|
|
396
385
|
"network_volume": null,
|
|
397
|
-
"network_volume_gb": 100
|
|
398
|
-
"datacenter": null
|
|
386
|
+
"network_volume_gb": 100
|
|
399
387
|
},
|
|
400
388
|
"run_id": "flash-1718900000-d0cf00ed",
|
|
401
389
|
"worker_env": {},
|
|
@@ -420,7 +408,8 @@ Notes :
|
|
|
420
408
|
<span style="color:#97a3ff">"id"</span><span style="color:#4d5470">:</span> <span style="color:#57ff8f">"acme/math-grader"</span>,
|
|
421
409
|
<span style="color:#97a3ff">"params"</span><span style="color:#4d5470">:</span> {},
|
|
422
410
|
<span style="color:#97a3ff">"pip"</span><span style="color:#4d5470">:</span> <span style="color:#57ff8f">[]</span>,
|
|
423
|
-
<span style="color:#97a3ff">"secrets"</span><span style="color:#4d5470">:</span> <span style="color:#57ff8f">[]</span
|
|
411
|
+
<span style="color:#97a3ff">"secrets"</span><span style="color:#4d5470">:</span> <span style="color:#57ff8f">[]</span>,
|
|
412
|
+
<span style="color:#97a3ff">"resolved_sha"</span><span style="color:#4d5470">:</span> <span style="color:#57ff8f">""</span>
|
|
424
413
|
},
|
|
425
414
|
<span style="color:#97a3ff">"train"</span><span style="color:#4d5470">:</span> {
|
|
426
415
|
<span style="color:#97a3ff">"steps"</span><span style="color:#4d5470">:</span> <span style="color:#9a8cff">null</span>,
|
|
@@ -445,13 +434,12 @@ Notes :
|
|
|
445
434
|
<span style="color:#97a3ff">"stop_sequences"</span><span style="color:#4d5470">:</span> <span style="color:#57ff8f">[]</span>
|
|
446
435
|
},
|
|
447
436
|
<span style="color:#97a3ff">"gpu"</span><span style="color:#4d5470">:</span> {
|
|
448
|
-
<span style="color:#97a3ff">"type"</span><span style="color:#4d5470">:</span> <span style="color:#57ff8f">"RTX
|
|
437
|
+
<span style="color:#97a3ff">"type"</span><span style="color:#4d5470">:</span> <span style="color:#57ff8f">"RTX A6000"</span>,
|
|
449
438
|
<span style="color:#97a3ff">"disk_gb"</span><span style="color:#4d5470">:</span> <span style="color:#24c2a8">60</span>,
|
|
450
439
|
<span style="color:#97a3ff">"max_wall_seconds"</span><span style="color:#4d5470">:</span> <span style="color:#24c2a8">86400</span>,
|
|
451
|
-
<span style="color:#97a3ff">"max_retries"</span><span style="color:#4d5470">:</span> <span style="color:#24c2a8">
|
|
440
|
+
<span style="color:#97a3ff">"max_retries"</span><span style="color:#4d5470">:</span> <span style="color:#24c2a8">5</span>,
|
|
452
441
|
<span style="color:#97a3ff">"network_volume"</span><span style="color:#4d5470">:</span> <span style="color:#9a8cff">null</span>,
|
|
453
|
-
<span style="color:#97a3ff">"network_volume_gb"</span><span style="color:#4d5470">:</span> <span style="color:#24c2a8">100</span
|
|
454
|
-
<span style="color:#97a3ff">"datacenter"</span><span style="color:#4d5470">:</span> <span style="color:#9a8cff">null</span>
|
|
442
|
+
<span style="color:#97a3ff">"network_volume_gb"</span><span style="color:#4d5470">:</span> <span style="color:#24c2a8">100</span>
|
|
455
443
|
},
|
|
456
444
|
<span style="color:#97a3ff">"run_id"</span><span style="color:#4d5470">:</span> <span style="color:#57ff8f">"flash-1718900000-d0cf00ed"</span>,
|
|
457
445
|
<span style="color:#97a3ff">"worker_env"</span><span style="color:#4d5470">:</span> {},
|
|
@@ -476,7 +464,8 @@ Notes :
|
|
|
476
464
|
<span style="color:#3a46c8">"id"</span><span style="color:#9aa1b5">:</span> <span style="color:#00695c">"acme/math-grader"</span>,
|
|
477
465
|
<span style="color:#3a46c8">"params"</span><span style="color:#9aa1b5">:</span> {},
|
|
478
466
|
<span style="color:#3a46c8">"pip"</span><span style="color:#9aa1b5">:</span> <span style="color:#00695c">[]</span>,
|
|
479
|
-
<span style="color:#3a46c8">"secrets"</span><span style="color:#9aa1b5">:</span> <span style="color:#00695c">[]</span
|
|
467
|
+
<span style="color:#3a46c8">"secrets"</span><span style="color:#9aa1b5">:</span> <span style="color:#00695c">[]</span>,
|
|
468
|
+
<span style="color:#3a46c8">"resolved_sha"</span><span style="color:#9aa1b5">:</span> <span style="color:#00695c">""</span>
|
|
480
469
|
},
|
|
481
470
|
<span style="color:#3a46c8">"train"</span><span style="color:#9aa1b5">:</span> {
|
|
482
471
|
<span style="color:#3a46c8">"steps"</span><span style="color:#9aa1b5">:</span> <span style="color:#6d28d9">null</span>,
|
|
@@ -501,13 +490,12 @@ Notes :
|
|
|
501
490
|
<span style="color:#3a46c8">"stop_sequences"</span><span style="color:#9aa1b5">:</span> <span style="color:#00695c">[]</span>
|
|
502
491
|
},
|
|
503
492
|
<span style="color:#3a46c8">"gpu"</span><span style="color:#9aa1b5">:</span> {
|
|
504
|
-
<span style="color:#3a46c8">"type"</span><span style="color:#9aa1b5">:</span> <span style="color:#00695c">"RTX
|
|
493
|
+
<span style="color:#3a46c8">"type"</span><span style="color:#9aa1b5">:</span> <span style="color:#00695c">"RTX A6000"</span>,
|
|
505
494
|
<span style="color:#3a46c8">"disk_gb"</span><span style="color:#9aa1b5">:</span> <span style="color:#0e7490">60</span>,
|
|
506
495
|
<span style="color:#3a46c8">"max_wall_seconds"</span><span style="color:#9aa1b5">:</span> <span style="color:#0e7490">86400</span>,
|
|
507
|
-
<span style="color:#3a46c8">"max_retries"</span><span style="color:#9aa1b5">:</span> <span style="color:#0e7490">
|
|
496
|
+
<span style="color:#3a46c8">"max_retries"</span><span style="color:#9aa1b5">:</span> <span style="color:#0e7490">5</span>,
|
|
508
497
|
<span style="color:#3a46c8">"network_volume"</span><span style="color:#9aa1b5">:</span> <span style="color:#6d28d9">null</span>,
|
|
509
|
-
<span style="color:#3a46c8">"network_volume_gb"</span><span style="color:#9aa1b5">:</span> <span style="color:#0e7490">100</span
|
|
510
|
-
<span style="color:#3a46c8">"datacenter"</span><span style="color:#9aa1b5">:</span> <span style="color:#6d28d9">null</span>
|
|
498
|
+
<span style="color:#3a46c8">"network_volume_gb"</span><span style="color:#9aa1b5">:</span> <span style="color:#0e7490">100</span>
|
|
511
499
|
},
|
|
512
500
|
<span style="color:#3a46c8">"run_id"</span><span style="color:#9aa1b5">:</span> <span style="color:#00695c">"flash-1718900000-d0cf00ed"</span>,
|
|
513
501
|
<span style="color:#3a46c8">"worker_env"</span><span style="color:#9aa1b5">:</span> {},
|
|
@@ -629,69 +617,29 @@ flash-1718700000-12ab34cd queued SFT 0.0000
|
|
|
629
617
|
<span style="color:#3a46c8">flash-1718700000-12ab34cd</span> <span style="color:#5b6472">○ queued </span> <span style="color:#5b6472">SFT </span> <span style="color:#0e7490">$0.0000</span> <span style="color:#5b6472"> </span> openbmb/MiniCPM5-1B</pre></div></div></section><section class="card"><div class="head"><code>flash cancel <run></code><span class="sub">cancel a run</span></div><div class="cols"><div class="col before"><div class="tag"><span class="pill"></span>before</div><pre>{
|
|
630
618
|
"run_id": "flash-1718903000-e5f6a7b8",
|
|
631
619
|
"state": "cancelled"
|
|
632
|
-
}</pre></div><div class="col after"><div class="tag"><span class="pill"></span>after · dark</div><pre><span style="color:#
|
|
633
|
-
<span style="color:#
|
|
634
|
-
<span style="color:#
|
|
635
|
-
|
|
636
|
-
{
|
|
637
|
-
<span style="color:#97a3ff">"run_id"</span><span style="color:#4d5470">:</span> <span style="color:#57ff8f">"flash-1718903000-e5f6a7b8"</span>,
|
|
638
|
-
<span style="color:#97a3ff">"state"</span><span style="color:#4d5470">:</span> <span style="color:#57ff8f">"cancelled"</span>
|
|
639
|
-
}</pre></div><div class="col after light"><div class="tag"><span class="pill"></span>after · light</div><pre><span style="color:#5f72ff;font-weight:700">flash</span> <span style="color:#9aa1b5">›</span> <span style="font-weight:700">cancel</span>
|
|
640
|
-
<span style="color:#9aa1b5">────────────────────────────────────────────────────────────────────────────</span>
|
|
641
|
-
<span style="color:#5b6472">● cancelled</span> <span style="color:#3a46c8">flash-1718903000-e5f6a7b8</span>
|
|
642
|
-
|
|
643
|
-
{
|
|
644
|
-
<span style="color:#3a46c8">"run_id"</span><span style="color:#9aa1b5">:</span> <span style="color:#00695c">"flash-1718903000-e5f6a7b8"</span>,
|
|
645
|
-
<span style="color:#3a46c8">"state"</span><span style="color:#9aa1b5">:</span> <span style="color:#00695c">"cancelled"</span>
|
|
646
|
-
}</pre></div></div></section><section class="card"><div class="head"><code>flash deploy <run></code><span class="sub">serve a trained adapter</span></div><div class="cols"><div class="col before"><div class="tag"><span class="pill"></span>before</div><pre>{
|
|
620
|
+
}</pre></div><div class="col after"><div class="tag"><span class="pill"></span>after · dark</div><pre><span style="color:#57ff8f;font-weight:700">✓</span> cancel requested for <span style="color:#97a3ff">flash-1718903000-e5f6a7b8</span>
|
|
621
|
+
<span style="color:#8a93a8">● cancelled</span></pre></div><div class="col after light"><div class="tag"><span class="pill"></span>after · light</div><pre><span style="color:#00695c;font-weight:700">✓</span> cancel requested for <span style="color:#3a46c8">flash-1718903000-e5f6a7b8</span>
|
|
622
|
+
<span style="color:#5b6472">● cancelled</span></pre></div></div></section><section class="card"><div class="head"><code>flash deploy <run></code><span class="sub">serve a trained adapter</span></div><div class="cols"><div class="col before"><div class="tag"><span class="pill"></span>before</div><pre>{
|
|
647
623
|
"run_id": "flash-1718900000-a1b2c3d4",
|
|
648
624
|
"state": "deployed",
|
|
649
625
|
"mode": "dev",
|
|
650
626
|
"openai_model": "flash-1718900000-a1b2c3d4",
|
|
651
627
|
"endpoint_name": "https://api.freesolo.co/v1",
|
|
652
628
|
"gpu": "RTX 4090"
|
|
653
|
-
}</pre></div><div class="col after"><div class="tag"><span class="pill"></span>after · dark</div><pre><span style="color:#
|
|
654
|
-
<span style="color:#4d5470"
|
|
655
|
-
<span style="color:#
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
<span style="color:#
|
|
659
|
-
<span style="color:#
|
|
660
|
-
<span style="color:#97a3ff">"mode"</span><span style="color:#4d5470">:</span> <span style="color:#57ff8f">"dev"</span>,
|
|
661
|
-
<span style="color:#97a3ff">"openai_model"</span><span style="color:#4d5470">:</span> <span style="color:#57ff8f">"flash-1718900000-a1b2c3d4"</span>,
|
|
662
|
-
<span style="color:#97a3ff">"endpoint_name"</span><span style="color:#4d5470">:</span> <span style="color:#57ff8f">"https://api.freesolo.co/v1"</span>,
|
|
663
|
-
<span style="color:#97a3ff">"gpu"</span><span style="color:#4d5470">:</span> <span style="color:#57ff8f">"RTX 4090"</span>
|
|
664
|
-
}</pre></div><div class="col after light"><div class="tag"><span class="pill"></span>after · light</div><pre><span style="color:#5f72ff;font-weight:700">flash</span> <span style="color:#9aa1b5">›</span> <span style="font-weight:700">deploy</span>
|
|
665
|
-
<span style="color:#9aa1b5">────────────────────────────────────────────────────────────────────────────</span>
|
|
666
|
-
<span style="color:#6d28d9">● deployed</span> <span style="color:#3a46c8">flash-1718900000-a1b2c3d4</span>
|
|
667
|
-
|
|
668
|
-
{
|
|
669
|
-
<span style="color:#3a46c8">"run_id"</span><span style="color:#9aa1b5">:</span> <span style="color:#00695c">"flash-1718900000-a1b2c3d4"</span>,
|
|
670
|
-
<span style="color:#3a46c8">"state"</span><span style="color:#9aa1b5">:</span> <span style="color:#00695c">"deployed"</span>,
|
|
671
|
-
<span style="color:#3a46c8">"mode"</span><span style="color:#9aa1b5">:</span> <span style="color:#00695c">"dev"</span>,
|
|
672
|
-
<span style="color:#3a46c8">"openai_model"</span><span style="color:#9aa1b5">:</span> <span style="color:#00695c">"flash-1718900000-a1b2c3d4"</span>,
|
|
673
|
-
<span style="color:#3a46c8">"endpoint_name"</span><span style="color:#9aa1b5">:</span> <span style="color:#00695c">"https://api.freesolo.co/v1"</span>,
|
|
674
|
-
<span style="color:#3a46c8">"gpu"</span><span style="color:#9aa1b5">:</span> <span style="color:#00695c">"RTX 4090"</span>
|
|
675
|
-
}</pre></div></div></section><section class="card"><div class="head"><code>flash undeploy <run></code><span class="sub">tear down a serving endpoint</span></div><div class="cols"><div class="col before"><div class="tag"><span class="pill"></span>before</div><pre>{
|
|
629
|
+
}</pre></div><div class="col after"><div class="tag"><span class="pill"></span>after · dark</div><pre><span style="color:#57ff8f;font-weight:700">✓</span> deployed
|
|
630
|
+
<span style="color:#8a93a8">run </span> <span style="color:#4d5470">·</span> <span style="color:#97a3ff">flash-1718900000-a1b2c3d4</span>
|
|
631
|
+
<span style="color:#8a93a8">endpoint</span> <span style="color:#4d5470">·</span> <span style="color:#57ff8f">https://api.freesolo.co/v1</span>
|
|
632
|
+
<span style="color:#8a93a8">gpu </span> <span style="color:#4d5470">·</span> RTX 4090</pre></div><div class="col after light"><div class="tag"><span class="pill"></span>after · light</div><pre><span style="color:#00695c;font-weight:700">✓</span> deployed
|
|
633
|
+
<span style="color:#5b6472">run </span> <span style="color:#9aa1b5">·</span> <span style="color:#3a46c8">flash-1718900000-a1b2c3d4</span>
|
|
634
|
+
<span style="color:#5b6472">endpoint</span> <span style="color:#9aa1b5">·</span> <span style="color:#00695c">https://api.freesolo.co/v1</span>
|
|
635
|
+
<span style="color:#5b6472">gpu </span> <span style="color:#9aa1b5">·</span> RTX 4090</pre></div></div></section><section class="card"><div class="head"><code>flash undeploy <run></code><span class="sub">tear down a serving endpoint</span></div><div class="cols"><div class="col before"><div class="tag"><span class="pill"></span>before</div><pre>{
|
|
676
636
|
"run_id": "flash-1718900000-a1b2c3d4",
|
|
677
637
|
"deleted_endpoints": [
|
|
678
638
|
"flash-a1b2c3d4-serve"
|
|
679
639
|
]
|
|
680
|
-
}</pre></div><div class="col after"><div class="tag"><span class="pill"></span>after · dark</div><pre><span style="color:#
|
|
681
|
-
<span style="color:#
|
|
682
|
-
|
|
683
|
-
<span style="color:#97a3ff">"run_id"</span><span style="color:#4d5470">:</span> <span style="color:#57ff8f">"flash-1718900000-a1b2c3d4"</span>,
|
|
684
|
-
<span style="color:#97a3ff">"deleted_endpoints"</span><span style="color:#4d5470">:</span> [
|
|
685
|
-
<span style="color:#57ff8f">"flash-a1b2c3d4-serve"</span>
|
|
686
|
-
]
|
|
687
|
-
}</pre></div><div class="col after light"><div class="tag"><span class="pill"></span>after · light</div><pre><span style="color:#5f72ff;font-weight:700">flash</span> <span style="color:#9aa1b5">›</span> <span style="font-weight:700">undeploy</span>
|
|
688
|
-
<span style="color:#9aa1b5">────────────────────────────────────────────────────────────────────────────</span>
|
|
689
|
-
{
|
|
690
|
-
<span style="color:#3a46c8">"run_id"</span><span style="color:#9aa1b5">:</span> <span style="color:#00695c">"flash-1718900000-a1b2c3d4"</span>,
|
|
691
|
-
<span style="color:#3a46c8">"deleted_endpoints"</span><span style="color:#9aa1b5">:</span> [
|
|
692
|
-
<span style="color:#00695c">"flash-a1b2c3d4-serve"</span>
|
|
693
|
-
]
|
|
694
|
-
}</pre></div></div></section><section class="card"><div class="head"><code>flash deployments</code><span class="sub">active serving deployments</span></div><div class="cols"><div class="col before"><div class="tag"><span class="pill"></span>before</div><pre>RUN_ID GPU ENDPOINT
|
|
640
|
+
}</pre></div><div class="col after"><div class="tag"><span class="pill"></span>after · dark</div><pre><span style="color:#57ff8f;font-weight:700">✓</span> torn down <span style="color:#97a3ff">flash-1718900000-a1b2c3d4</span>
|
|
641
|
+
<span style="opacity:.62"> deregistered flash-a1b2c3d4-serve</span></pre></div><div class="col after light"><div class="tag"><span class="pill"></span>after · light</div><pre><span style="color:#00695c;font-weight:700">✓</span> torn down <span style="color:#3a46c8">flash-1718900000-a1b2c3d4</span>
|
|
642
|
+
<span style="opacity:.62"> deregistered flash-a1b2c3d4-serve</span></pre></div></div></section><section class="card"><div class="head"><code>flash deployments</code><span class="sub">active serving deployments</span></div><div class="cols"><div class="col before"><div class="tag"><span class="pill"></span>before</div><pre>RUN_ID GPU ENDPOINT
|
|
695
643
|
flash-1718900000-a1b2c3d4 RTX 4090 https://api.freesolo.co/v1</pre></div><div class="col after"><div class="tag"><span class="pill"></span>after · dark</div><pre><span style="color:#5f72ff;font-weight:700">flash</span> <span style="color:#4d5470">›</span> <span style="font-weight:700">deployments</span> <span style="color:#8a93a8">1 active</span>
|
|
696
644
|
<span style="color:#4d5470">────────────────────────────────────────────────────────────────────────────</span>
|
|
697
645
|
<span style="color:#8a93a8;font-weight:700">RUN ID </span> <span style="color:#8a93a8;font-weight:700">GPU </span> <span style="color:#8a93a8;font-weight:700">ENDPOINT </span>
|
|
Binary file
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"""Flash — managed LoRA post-training: log in with your freesolo key, train."""
|
|
2
|
+
|
|
3
|
+
from importlib.metadata import version as _dist_version
|
|
4
|
+
|
|
5
|
+
from flash._channel import DIST_NAME as _DIST_NAME
|
|
6
|
+
|
|
7
|
+
__all__ = ["__version__"]
|
|
8
|
+
|
|
9
|
+
# Read from dist metadata so version literal doesn't drift from pyproject (caused a nag loop in 0.2.20).
|
|
10
|
+
try:
|
|
11
|
+
__version__ = _dist_version(_DIST_NAME)
|
|
12
|
+
except Exception:
|
|
13
|
+
__version__ = "0+unknown"
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Single switch between prod and dev channels; ``scripts/build_dev_dist.py`` rewrites CHANNEL to "dev"."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
CHANNEL = "dev"
|
|
6
|
+
|
|
7
|
+
# Must stay in lockstep with [project.scripts] in pyproject.toml.
|
|
8
|
+
CLI_NAME = "flash-dev" if CHANNEL == "dev" else "flash"
|
|
9
|
+
|
|
10
|
+
# Must stay in lockstep with [project].name in pyproject.toml.
|
|
11
|
+
DIST_NAME = "freesolo-flash-dev" if CHANNEL == "dev" else "freesolo-flash"
|