Model sources
To name, store, and reuse a trained checkpoint as a deployable model, see Custom models.
A
huggingface deployment can also cache the model in your library (cache: true), and it automatically serves from a cached copy when you have one — faster starts, no hub download.
Deployment parameters
You set these at create time, whether from the SDK (client.deployments.create(...)), the CLI (veri deployments create), or a kind = "deploy" config.
A workspace can run at most 2 deployment replicas at a time by default. Every replica of a
queued, provisioning, serving, or waking deployment counts. A create that would go over the limit returns 429 with code ACTIVE_DEPLOYMENT_LIMIT; stop a deployment first, or contact us to raise the limit.
min_replicas, max_replicas, concurrency_target, scale_to_zero_window_seconds, idle_delete_after_days, and self_heal_attempts can also be changed later on a live deployment: see Scaling. Model, GPU, and provider are immutable: changing those means a new deployment. Send null for scale_to_zero_window_seconds or idle_delete_after_days to put it back to its default. Raising min_replicas to 1 or more on a parked (scaled_to_zero) deployment wakes it immediately, subject to the workspace active-replica limit (429 if it is full, and nothing changes). Scaling changes made during the first boot apply once the deployment is serving; a new self_heal_attempts applies immediately in every status. See what an update does in each status.
At call time, chat also accepts a session key for cache-warm routing across replicas.
The deployment lifecycle
Not drawn:stop moves a deployment in any status other than stopped or failed to stopped. Running out of credit, or the workspace losing its last member, moves a queued, provisioning, serving, or waking deployment to failed. stopped and failed are final.
Deployments consume GPU credit only while replicas are running: billing is metered per replica, from each GPU box’s launch (warmup included) to its termination. scaled_to_zero charges nothing. Once stopped, billing stops; the deployment row stays for history. stop is permanent, not a pause: a stopped deployment cannot be woken or resumed (bring it back by creating a new one). Scale to zero (min_replicas: 0) is the pause path.
Self-healing
When a deployment that has served loses its last GPU box (the box crashes, its host fails, or it stops reporting for about 3 minutes), Veri replaces the box automatically.self_heal_attempts (0 to 5, default 3) caps how many replacements Veri launches for one loss:
- While a replacement boots, the deployment shows
provisioningwithfailure_code: replica_lostand anerrorsuch asReplacing a lost GPU box (attempt 1 of 3).Chat requests get a503withRetry-Afteruntil it serves again. Each replacement box is billed from its launch, like any replica. - Replacements follow a fixed ladder: the first goes out at once, the next ones 10, 20, 40 and 80 seconds after the previous launch. A replacement that crashes, that does not become healthy within the boot deadline, or that the cloud rejects counts as one attempt.
- When a replacement reaches
serving,failure_codeanderrorclear and the full budget is available again for the next loss. Any PATCH to the deployment also restarts the budget. - When the attempts are used up, or with
self_heal_attempts: 0, a deployment withmin_replicasof 1 or more goesfailedwithfailure_code: replica_lost(billing ends; redeploy to bring it back), and amin_replicas: 0deployment parks (scaled_to_zero, also withreplica_lost) and wakes on the next request.
self_heal_attempts only governs losing the last box. A multi-replica fleet that loses some of its boxes keeps serving on the rest and replaces them on the same ladder whatever the setting, pausing after 5 replacements until you PATCH the deployment. A first boot that fails is not self-healed (it fails with watchdog_timeout or the box’s own failure_code), and a wake that fails re-parks with backoff instead (with min_replicas of 1 or more, Veri retries that wake itself once the backoff has passed, and stops after 3 failed wakes in a row).
Calling a deployment
Once a deployment isserving, it accepts OpenAI-shaped requests at https://api.veri.studio/v1/deployments/{dep.id}/chat/completions. Three equivalent ways to call:
base_url at https://api.veri.studio/v1/deployments/{id} (the OpenAI SDK appends /chat/completions for you).
The chat surface is a passthrough to vLLM: streaming (
stream=true, real SSE) works, and request parameters beyond temperature / max_tokens (top_p, stop, seed, response_format, tools, …) are forwarded to the engine untouched — vLLM is the schema authority. See OpenAI compatibility for details and caveats (tool calling needs vLLM tool parsing enabled via vllm_extra_args).Sizing the GPU
Pick a GPU large enough to hold the weights with headroom. Some rough starting points:
These are the shapes AWS (the default provider) sells:
L4-24GB and A10G-24GB come as 1 or 4 GPUs, and A100-80GB and H100-80GB only as whole 8-GPU nodes. Other GPU counts are rejected at create with a 400. See Serving providers. On a single 24 GB card, a 7-8B model with a long context window may need a smaller context length to fit its KV cache: pass vllm_extra_args: ["--max-model-len", "8192"], or use 4 GPUs.
Serving usually needs less GPU than training the same model. A 7B you trained on an 8×A100 node typically serves on 1 to 4 L4s.
Serving newer architectures
Deployments run vLLM 0.27.1 by default (the platform-managed serving image). A model architecture released after that version fails to start (vllm_failed_to_start) because vLLM doesn’t recognize it yet.
To serve one, pin the deployment to a newer official vLLM image:
- Only official upstream images are accepted:
vllm/vllm-openai:<tag>(NVIDIA) orvllm/vllm-openai-rocm:<tag>(AMD). Anything else is rejected at create. - The image runs via Docker on the deployment’s box, on every provider, and is used exactly as written: the platform never rewrites or substitutes it.
- The image is pulled from Docker Hub when the box boots, which adds to the cold start. The boot deadline is the same as for the platform image: 40 minutes plus 5 seconds per GB of the deployment’s total GPU memory (about 42 minutes on
L4-24GBx1, about 93 minutes onH100-80GBx8). The pull can still be too slow or rate limited to provision reliably: a first boot that passes the deadline fails withwatchdog_timeout, and a wake boot re-parks (a request after the backoff, orPOST /wake, wakes it again). Explicit images are supported as literal overrides; the supported route for a newer architecture is the platform’s next validated vLLM version. - Without
vllm_image, the deployment runs the platform-managed vLLM (0.27.1), which never pulls at boot. engine: vllmonly.- The image is set at create and immutable, like model and GPU.
A
vllm_image deployment keeps its Hugging Face download inside the serving container, so it can’t be combined with cache: true model-library uploads — the cache upload is skipped.Observability
Every deployment records request, token, latency, error, cost, and engine-health telemetry. The Deployment observability guide includes an end-to-end smoke test plus dashboard, SDK, REST, and MCP workflows. Lifetime counters and recent requests are available directly from the SDK:trace_bodies: true additionally capture full
request/response bodies as traces,
browsable from the dashboard, CLI, and API.
Billing
Running deployments consume GPU credit until you stop them (or, withmin_replicas: 0, until they park themselves). See Billing for states and cadence.
Where to go next
Quickstart: deploy a model
Spin up + chat + stop in ~10 minutes.
Train your own model
Then deploy it from a
training_job source.Monitor your deployment
Request metrics, GPU telemetry, and logs.
CLI deployment commands
veri deployments create / chat / stop.
