Skip to main content
Managed training on Veri is dataset + base model → trained checkpoint. You submit a training job; Veri provisions the GPU, runs the loop, streams metrics, and uploads the result. You either download the checkpoint or deploy it directly. The training method you pick decides how outputs are scored. GRPO takes a reward function; SFT and DPO learn directly from examples or preference pairs. For the smallest end-to-end run, see the Managed GRPO quickstart — one decorated reward and one command.

Methods

GRPO is the default. All methods support LoRA and QLoRA.
grpo_agentic is being rebuilt and is not currently runnable as a managed method. To run multi-turn, environment-based RL today, use a custom script with your own framework (for example verl) and environment.

The training loop

What happens at each transition:
  • queued — job row written, balance pre-checked (HTTP 402 if insufficient credit). No spend yet.
  • provisioning — Veri leases a GPU and the instance boots and self-configures the worker. started_at is still null. Once the instance boots, the GPU is rented and cost accrues from this point, even before the first training step. A job that never secures a GPU (for example CAPACITY_UNAVAILABLE) rents nothing and is not billed.
  • running — worker reports its first step. started_at populates. Metrics start streaming.
  • completed | failed | cancelled — pod auto-terminates. Cost is attributed (cost_attributed_at). Stripe credit is deducted (billing_deducted_at). The full stdout is uploaded to S3 and available via GET /v1/training_jobs/{id}/logs/full.
Cancellation is immediate: the instance is terminated as soon as the request is accepted. The worker does not get a chance to flush anything, so whatever checkpoints already reached storage are what you keep — see Checkpoints.

Failure modes

When a job ends in failed, error.code carries one of: The last 200 log lines from the worker are surfaced in error.log_tail for fast triage; the full stdout is uploaded to S3 and accessible via GET /v1/training_jobs/{id}/logs/full.

Checkpoints

Every managed job writes a final artifact when training finishes. It also saves intermediate checkpoints while training runs, so a job that fails at hour 19 of 20 still leaves usable weights behind.
Intermediate checkpoints are rolling out behind a feature flag. Until it is enabled for your workspace, jobs write only the final artifact and the veri checkpoints commands report the feature as unavailable.
Two hyperparameters control them:

Working with checkpoints

Anywhere a checkpoint ID is accepted, <job_id>@<step> works too, so you can act on a step number you read off a loss curve. download fetches the model and tokenizer files by default — enough to load with from_pretrained. Optimizer state is roughly two thirds of a checkpoint’s size and from_pretrained never reads it, so pass --artifact when you need more:

Checkpoints from a custom script

Custom script jobs get a directory instead of a hyperparameter. Write a checkpoint-<step> subdirectory into $VERI_CHECKPOINT_DIR and Veri uploads it:
Veri uploads a checkpoint directory once it stops changing, and sweeps for any remaining ones after your script exits. The variable is unset when the feature is not enabled, so guard on it as shown above.
A checkpoint that was still being written when a script crashed cannot be told apart from a complete one, so Veri uploads it rather than discard it. Checkpoints from a custom script are reported as weights and are not guaranteed to be resumable.

Submitting a job

wait() streams the job’s logs to your terminal while it polls: provisioning, installs, and training steps appear live with no extra flags. Streaming is best-effort: if the log stream drops, wait() keeps polling silently and still returns the finished job. Pass stream=False for quiet polling only. You can also tail any job from another terminal:
download() fetches the complete Hugging Face checkpoint — weights plus adapter config and tokenizer files — into ./checkpoints/<job_id>/, a directory you can load directly with from_pretrained(...) or push to the Hugging Face Hub.

Choosing a launch region

Capacity is per-region. If your job fails with CAPACITY_UNAVAILABLE, another region may have the GPU you need right now:
Pass region="us-west-2" to client.training_jobs.create, the @veri.train decorator, or veri train --region us-west-2. Omit it to launch in the default region. Unknown or not-yet-available regions are rejected at submit with the list of valid options.

Choosing a GPU provider

Veri supports multiple GPU providers — AWS (NVIDIA, default), Hot Aisle (AMD MI300X), and Vast.ai (NVIDIA marketplace). Pass provider at submit time to choose where your job runs:
See GPU providers for the full provider list, GPU types, pricing, and availability checks.
This snippet uses the low-level client and assumes you have already uploaded a dataset (the dataset it references) and have a reward file on disk; the reward source is attached to the job inline. For a runnable end-to-end version with @training_job + veri train, see the Managed GRPO quickstart.
Same shape from the CLI:
with kind = "train" in the TOML config. See the CLI training reference for the full schema.

Where to go next

Managed GRPO quickstart

End-to-end on a small model: one decorator, one command.

Deploy your checkpoint

Skip downloading — serve from Veri with an OpenAI-compatible API.

Track it with W&B

Live loss and reward charts for your run.

CLI training commands

veri run, veri jobs, reward files.