Skip to main content
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.
Together GPU clusters offer two compute types:
  • 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.
Preemptible nodes are discounted relative to on-demand at a flat rate (not a bid), and usage is metered and billed sub-hourly (every one to two minutes). See the GPU clusters overview for how compute types fit into the rest of the platform. There is no separate preemptible cluster type—you add preemptible capacity to a cluster, at create time or later. Each cluster has a standard node count and a preemptible node count, and preemptible nodes join the same Kubernetes cluster. Every cluster requires at least one standard node (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:
  1. T+0: The node is cordoned, a TogetherPreemptionNotified Kubernetes event (type: Warning) is emitted on the node, and pods on the node receive SIGTERM.
  2. 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.
  3. T+5:00: The node is removed, regardless of pod status. Five minutes is a hard maximum, not a guarantee that pods finish.
After it’s reclaimed, Together automatically provisions replacement preemptible nodes toward your target as capacity becomes available, so you don’t need to re-request capacity.

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):
Scale the preemptible target on an existing cluster:
Check the target against what is actually allocated:

Schedule workloads onto preemptible nodes

Target preemptible nodes explicitly for interruptible workers, and keep coordinators and serving replicas on standard nodes.
Pin stateful anchors to standard nodes by excluding the preemptible label:

Detect preemption

Preemption surfaces through three channels:
  1. In-pod (recommended): A SIGTERM handler or preStop hook reacts automatically, with no polling. See Handle preemption for examples.
  2. Kubernetes events: Watch for TogetherPreemptionNotified events:
  3. Together API (no kubeconfig needed): Reading a cluster returns a node_lifecycle_events array (72-hour retention, deduplicated by node and reason). Filter for reason == "TogetherPreemptionNotified". Related reasons include TogetherNodeAdded and TogetherScaledDown.
Preemption events also appear in the console under the cluster’s Event Timeline.

Handle preemption

Pod-level: checkpoint on SIGTERM. This pattern is per-workload and requires no extra infrastructure. Claim the full grace window with terminationGracePeriodSeconds 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.
Cluster-level: An operator watching preemption events. For a coordinated, cluster-wide response (multi-node training, custom schedulers), run a controller that watches for 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.
Don’t use preemptible compute for:
  • The only copy of a multi-day run with no checkpoints.
  • User-facing serving replicas with no fallback capacity.
  • Workloads with strict SLOs.
As a sizing reference, a checkpoint of a roughly 10B-parameter model completes in about 90 seconds, leaving comfortable headroom within the five-minute window. Checkpoint often, and treat preemptible nodes as ephemeral.