Skip to main content
A deployment is a model running on a GPU you control, exposed at an HTTPS endpoint that speaks the OpenAI Chat Completions API.
Deployments are in early access. GPU capacity for serving is limited, so creates can hit capacity errors and larger shapes may not be orderable — check veri gpu list for what’s live before planning around a specific GPU. Training is fully supported and is the platform’s primary focus today.
The smallest viable example is in the Deploy a HF model quickstart. This page is the mental model and the surface map.

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.
A deployment with min_replicas of 1 or more (the default) never stops billing on its own — you asked for an always-warm floor. Either call stop when you’re done, or create with min_replicas: 0 so it parks itself after the idle window and wakes on the next request.

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 provisioning with failure_code: replica_lost and an error such as Replacing a lost GPU box (attempt 1 of 3). Chat requests get a 503 with Retry-After until 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_code and error clear 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 with min_replicas of 1 or more goes failed with failure_code: replica_lost (billing ends; redeploy to bring it back), and a min_replicas: 0 deployment parks (scaled_to_zero, also with replica_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 is serving, it accepts OpenAI-shaped requests at https://api.veri.studio/v1/deployments/{dep.id}/chat/completions. Three equivalent ways to call:
Anything that already talks OpenAI works without changes — point 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:
Or in a deploy config:
How it behaves:
  • Only official upstream images are accepted: vllm/vllm-openai:<tag> (NVIDIA) or vllm/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-24GB x1, about 93 minutes on H100-80GB x8). The pull can still be too slow or rate limited to provision reliably: a first boot that passes the deadline fails with watchdog_timeout, and a wake boot re-parks (a request after the backoff, or POST /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: vllm only.
  • The image is set at create and immutable, like model and GPU.
Check the vLLM release notes for the minimum version your architecture needs.
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:
Or via CLI:
Deployments created with 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, with min_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.