Preemptible compute is in public preview for Kubernetes clusters (Slurm clusters are not supported yet). There is no minimum-lifetime guarantee for preemptible nodes during preview, so design workloads that can survive losing nodes at any time.
- Standard nodes (the default) are provisioned up front (synchronously) when you create or scale a cluster, and are never preempted.
- Preemptible nodes fill in over time (asynchronously). You set a target, and Together provisions toward it as spare capacity becomes available. The target is not guaranteed, and preemptible nodes can be preempted at any time.
num_gpus), and you cannot convert a node between standard and preemptible in place.
Preemptible nodes carry the label together.ai/compute-class=preemptible. Node names encode the compute type: gpu-dp is standard, gpu-preemptible-dp is preemptible.
How preemption works
When Together reclaims a preemptible node, the node receives a drain window of at most five minutes:- T+0: The node is cordoned, a
TogetherPreemptionNotifiedKubernetes event (type: Warning) is emitted on the node, and pods on the node receive SIGTERM. - Pods that set
terminationGracePeriodSeconds(capped at 300 seconds) get up to the full window to checkpoint and exit. The node is reclaimed as soon as your pods exit, so checkpoint and exit promptly instead of sleeping through the window. - T+5:00: The node is removed, regardless of pod status. Five minutes is a hard maximum, not a guarantee that pods finish.
Request preemptible capacity
Request a preemptible GPU target alongside the standard count, at cluster create or update, from the console, CLI, or API. See the cluster create API reference for the full schema.
Create a cluster with preemptible capacity. Preemptible capacity requires a project, so pass the global
--project flag (or set TOGETHER_PROJECT_ID):
Schedule workloads onto preemptible nodes
Target preemptible nodes explicitly for interruptible workers, and keep coordinators and serving replicas on standard nodes.Detect preemption
Preemption surfaces through three channels:-
In-pod (recommended): A SIGTERM handler or
preStophook reacts automatically, with no polling. See Handle preemption for examples. -
Kubernetes events: Watch for
TogetherPreemptionNotifiedevents: -
Together API (no kubeconfig needed): Reading a cluster returns a
node_lifecycle_eventsarray (72-hour retention, deduplicated by node and reason). Filter forreason == "TogetherPreemptionNotified". Related reasons includeTogetherNodeAddedandTogetherScaledDown.
Handle preemption
Pod-level: checkpoint on SIGTERM. This pattern is per-workload and requires no extra infrastructure. Claim the full grace window withterminationGracePeriodSeconds and checkpoint when the signal arrives:
The
preStop hook runs first, then SIGTERM, and both count against the same grace period. Use one or the other as the checkpoint trigger, not both doing duplicate work. The preStop variant matters for containers whose main process can’t trap signals, or where PID 1 swallows them.TogetherPreemptionNotified events and reacts, for example by draining a job queue, triggering a coordinated checkpoint, or removing the node from a Ray or torchrun worker pool:
When to use preemptible
Use preemptible compute for:- Checkpointed training, fine-tuning, evals, distillation, batch inference, and hyperparameter sweeps. Ray Train and PyTorch Lightning restart from checkpoints out of the box.
- Bursty research: raise the target for a sweep and drop it after. The cluster stays up.
- The only copy of a multi-day run with no checkpoints.
- User-facing serving replicas with no fallback capacity.
- Workloads with strict SLOs.