flash errors print one clean line; add the global --debug flag before
the subcommand (e.g. flash --debug train config.toml) for the full traceback.
Installation & CLI
flash: command not found
flash: command not found
flash command. Its install location must be
on your PATH.- If you installed with
uv tool install freesolo-flash, make sure uv’s tool bin directory is on yourPATH(runuv tool update-shell, then restart your shell). - Confirm the install with
flash version.
I installed `flash` but it's the wrong tool
I installed `flash` but it's the wrong tool
freesolo-flash. The bare flash name
belongs to an unrelated project. Reinstall the right one:Authentication
flash login fails or commands report 401 / invalid key
flash login fails or commands report 401 / invalid key
flash train --cost does not start paid training, but on
an SFT config it does authenticate.- Create a key in your dashboard at freesolo.co.
- Log in once:
flash login --api-key <your-key>(or setFREESOLO_API_KEYinstead of passing--api-key). - Confirm who the stored key resolves to:
flash whoami.
Pointing at a non-default Freesolo deployment
Pointing at a non-default Freesolo deployment
https://api.freesolo.co. To target a different
deployment, set --freesolo-url (or FREESOLO_BASE_URL) at login. See
Auth & identity.Environments
flash env push fails
flash env push fails
environment.py file with a
load_environment() function that returns a Freesolo environment. Then:your-org/your-project/math) to put in your config’s
[environment] id. The folder needs an environment.py at its root and a
--project UUID your org can reach. A bare --name is easiest; if you give
a qualified one it must be the full namespace/project/name, where the
namespace is your org and the project segment matches the --project you
passed. A two-segment your-org/math is no longer a valid name - see
Environments.A run fails with ModuleNotFoundError
A run fails with ModuleNotFoundError
flash train --dry-run checks your config at submit time but never imports
environment.py, so it cannot prove every worker import resolves. On SFT it
reads the packaged dataset and training contract statically; GRPO and OPD do
not execute environment code either. If flash runs log <run-id> shows your
environment.py failed while importing a package, that package is not
available on the worker.The worker installs one managed set - the freesolo SDK and the training
stack. To add to it, declare the package under [environment] pip, which is
appended to the managed set rather than replacing it, then submit again. See
Scorer dependencies for the
accepted form.If you would rather not add a dependency, rewrite the import against the
standard library - urllib.request and json instead of a vendor HTTP
client, for example - or move that logic out of the environment, then
republish. See
Dependencies are managed.Flash also does not install from a pyproject.toml, requirements.txt, or
lockfile bundled with the environment; those describe your local setup only.flash env pull says the archive is too large
flash env pull says the archive is too large
I republished an environment and want to verify the data
I republished an environment and want to verify the data
flash env pull to inspect the exact packaged file:SFT cost or dry-run says the packaged dataset is unreadable
SFT cost or dry-run says the packaged dataset is unreadable
environment.py, so a dataset available only through Python code cannot be
estimated.Package a non-empty object-row dataset at the selected split path, such as
dataset/train.jsonl, or point [environment.params] dataset_path at a file
inside the package. Fix malformed JSON, missing input fields, or paths that
escape the package. The control-plane limits are 32 MiB for the selected
dataset or inline records, and 256 KiB for contract_text, contract_path,
or TRAINING_CONTRACT.md. These failures stop before paid training starts or
a training GPU is allocated.Environment won't import / name collision
Environment won't import / name collision
What id do I reference in my config?
What id do I reference in my config?
- Freesolo’s managed service accepts only the published hub slug returned by
flash env push, for exampleyour-org/your-project/your-env. - A standalone plane accepts
github:references and supported GitHub repository, tree, or blob URLs that resolve toenvironment.py. It rejects managed hub slugs.
flash env pull your-org/your-project/your-env
only when you want a local copy of a managed environment to edit or inspect.Configuration
unsupported model '...'
unsupported model '...'
model must be one of the ids in the curated catalog. List the valid ids:Unknown config key or section rejected
Unknown config key or section rejected
[train] keys at parse time.
Check the key against the
configuration reference and validate the config:[train] keys your CLI version does not recognize, which
usually means an outdated CLI.unsupported algorithm
unsupported algorithm
algorithm must be sft (the default), grpo, or opd. Fix the value and
re-validate with --dry-run.Run rejected: training context exceeds serving context
Run rejected: training context exceeds serving context
train.max_context_tokens; GRPO and OPD check
the rollout prompt plus max_completion_tokens. Lower those to at or below
the cap - see context
window.max_context_tokens leaves no prompt budget
max_context_tokens leaves no prompt budget
max_completion_tokens out of
max_context_tokens, so a context that is not larger than the completion
budget leaves nothing for the prompt itself. That is rejected at parse time,
before a GPU worker is provisioned:max_context_tokens above max_completion_tokens, leaving enough room
for your longest prompt. Note that thinking = true raises the default
completion budget, so enabling it can trip this on a config that previously
parsed.Warm-start rank or alpha mismatch
Warm-start rank or alpha mismatch
train.lora_rank and
train.lora_alpha alongside init_from_adapter. --dry-run resolves the
source rank, alpha, and base-model identity automatically. See Warm-start
safely.Warm start itself is no longer restricted by algorithm: SFT, GRPO, and OPD can
each continue an adapter from any of the three. If an older config avoided a
warm-started SFT run because it was rejected, that restriction is gone.GRPO rejects group_size
GRPO rejects group_size
2, 4, or 8. Any other value - 1, 3, 6, or
anything larger - is rejected at submit, before a GPU is allocated. Flash never
rewrites the value you wrote, so pick one of the three.A step is also capped at 512 completions:The CLI rejected a flag you thought existed
The CLI rejected a flag you thought existed
flash <command> --help.The run used a different GPU or provider than expected
The run used a different GPU or provider than expected
[gpu] type is omitted. A string hard-pins
one class; a list names acceptable classes that Flash cost-ranks together.
Card count is auto-sized only when you omit type and count;
[gpu] count and --gpus N pin a ceiling that never escalates, and either
form of type without count stays a single-card constraint.[gpu] providers is an ordered soft preference, not an allowlist, so another
configured provider may still win when the preferred providers cannot place
the run. Use scalar [gpu] provider for a hard pin. provider and
providers cannot be combined. See GPU configuration.Run fit and resource use
GRPO costs or fits differently than SFT
GRPO costs or fits differently than SFT
max_completion_tokens or max_context_tokens, or start with SFT. Dropping
group_size from 8 to 4 or 2 reduces cost too, but it does not
make a run that does not fit fit - GRPO’s memory floor is effectively flat in
the group. The next entry below covers what to change when a run does not
fit.Pre-flight says the run is too large
Pre-flight says the run is too large
[gpu] count (or --gpus N), that ceiling is the usual cause:
the error names the smallest count that would fit, so raise it or drop the
pin and let Flash auto-size.When nothing fits even at eight cards, the error names the knobs that
actually shrink that algorithm. They are not the same across algorithms:- GRPO responds to
max_context_tokens,max_completion_tokens, andlora_rank. Required memory is effectively flat inprompts_per_step, so lowering it does not help here. - OPD rollout concurrency is
prompts_per_step x group_size, so lowering either shrinks the run, as domax_completion_tokensandmax_context_tokens. Distillation needs no group variance, sogroup_size = 1is fine. - SFT responds to
max_context_tokens,lora_rank, andbatch_size.
thinking = true, reasoning and the final answer share the
same token budget.Training runs
When am I charged for a run?
When am I charged for a run?
Setup is not billed, while Train
and required finalization contribute to Billable. Review
flash train config.toml --cost, reduce the run horizon or
save_at_steps cadence if needed, and see Charges and
cancellations.My run is warming up for many minutes
My run is warming up for many minutes
flash runs log <run-id> -f shows warming up (stage=...) while it progresses.
Check the quote’s Setup, Train, and Billable fields rather than assuming
all work before the first optimizer update is free. Once updates begin, the log
streams metrics such as reward, grad_norm, kl, entropy, and completion
length. If warmup stops advancing, keep following the log and use
flash runs cancel <run-id> if you do not want the run to continue billing.Run submit reports insufficient balance
Run submit reports insufficient balance
GRPO reward is stuck at 0
GRPO reward is stuck at 0
Reward is stuck at 1 (or never moves)
Reward is stuck at 1 (or never moves)
Reward collapses to ~0 with `thinking = true`
Reward collapses to ~0 with `thinking = true`
thinking = true, the model emits a reasoning trace before its answer,
and that trace counts against the same max_completion_tokens budget as
the answer. A max_completion_tokens tuned for a non-thinking run is usually
too small once reasoning is added: the reasoning eats the budget and the actual
answer is truncated or never emitted. If your reward parses the answer (e.g.
extracts a JSON object), it then sees nothing and scores ~0 across the board —
even though the model is “working”.Fixes:- Raise
max_completion_tokensso the reasoning and the answer both fit (e.g. a task that needs ~200 answer tokens may needmax_completion_tokens = 2048with thinking on), and make suremax_context_tokensis large enough to hold the prompt plus that budget. - Optionally set
thinking_length_penalty_coefto nudge the model toward shorter reasoning so the answer reliably lands inside the budget. - Score the answer text by default. In thinking mode
response_textremains string-compatible answer text and also exposesresponse_text.completion,response_text.thinking, andresponse_text.rawfor rewards that intentionally inspect reasoning.
max_tokens or it returns empty content and
the judge silently scores 0.OPD run underperforms SFT, or its rollouts never terminate
OPD run underperforms SFT, or its rollouts never terminate
max_completion_tokens without stopping:- Start from an SFT adapter with the desired stopping behavior.
- Give the teacher a hard answer or reasoning budget in the system prompt.
- Add
stop_sequenceswhen the task has reliable textual terminators. - Track
truncated_rolloutsto diagnose termination.
max_completion_tokens when you see that.Text-only OPD supports single- and multi-turn environments but not
tool-calling ones. Image-bearing OPD remains single-turn only. Statically
visible image-bearing multi-turn inputs fail before allocation; images added
later by environment execution are rejected by the worker guard.
kl_penalty_coef must be greater than 0.Did pressing Ctrl-C kill my run?
Did pressing Ctrl-C kill my run?
Ctrl-C during flash train detaches you; the run continues and can
accrue billable work.
Resume with flash runs log <run-id> -f, or stop it with
flash runs cancel <run-id>. For machine-readable status, see Run
management.flash runs cancel takes a long time to return
flash runs cancel takes a long time to return
cancelled when it completes.A capacity or resource-fit issue interrupted training
A capacity or resource-fit issue interrupted training
flash runs log <run-id> -f or poll status with
flash runs status <run-id> -f. If the same shape repeatedly fails before
useful metrics, see Run fit and resource
use for the knobs that shrink your algorithm.A checkpoint did not appear
A checkpoint did not appear
flash runs status <run-id> and
flash runs log <run-id> say why the save did not land. A later successful
upload of the same checkpoint clears the reported failure.Training continues through a failed periodic upload - save_every saves are
best-effort after bounded retries. Use save_at_steps when a specific checkpoint
must exist; those saves are mandatory. See Control the update horizon and
checkpoints.A run died out of memory on the GPU
A run died out of memory on the GPU
Serving
Deploy fails: run has no run-level adapter
Deploy fails: run has no run-level adapter
flash models deploy <run-id> cannot serve it. The error lists the run’s
saved checkpoint steps and the exact command to use — deploy one of them
instead:Deploy or the first request is slow
Deploy or the first request is slow
How is serving billed?
How is serving billed?
flash models undeploy <run-id> disables the alias and immutable revisions.Calling the endpoint from my own code is rejected
Calling the endpoint from my own code is rejected
openai_base_url from flash models deployments --json, set model to the run
alias or a full immutable revision, and pass your Freesolo API key.401: missing or invalid key.402: insufficient org balance.403: the key’s org does not own the adapter.503: temporarily unavailable; retry with backoff.
Getting help
Still stuck? Reach out through freesolo.co/contact with the run id (flash runs list),
the failing command, and its --debug traceback.