We run vLLM workers that get checkpointed with cuda-checkpoint + CRIU and
restored later (scale-to-zero with warm restores). The restores themselves are
fine - a restored process serves inference for as long as we leave it running.
The problem is killing it: terminate a live restored process and ~35 seconds
later the whole machine is gone. Nothing on the console, nothing in pstore, no
Xid or NVRM output beforehand, and the BMC (iDRAC) only logs an OS-side reset
with no hardware fault. SSH drops, the console freezes, and only a power cycle
brings it back. It takes an unrelated CUDA context on the second GPU down with
it. 4 out of 4 attempts so far, so it's deterministic for us.
The dump side never does this - after a checkpoint the process is left
suspended and you can kill it freely. It's specifically teardown of a live
restored CUDA context.
Workaround
Suspending the CUDA state again before the kill makes teardown completely safe:
cuda-checkpoint --action lock --pid <pid> --timeout 30000
cuda-checkpoint --action checkpoint --pid <pid>
# verify with nvidia-smi: the pid's device memory should drop to ~0
# (don't trust the exit code alone)
then SIGTERM/SIGKILL as normal. We've productionized this as a Kubernetes
preStop hook and haven't lost a node since - but it only covers orderly
terminations. A segfault or OOM-kill of a live restored process would
presumably still take the host, which is why we're reporting rather than just
living with the hook.
Environment
- Driver: open kernel modules 595.71.05 (Talos system extension
nvidia-open-gpu-kernel-modules-production 595.71.05-v1.13.3)
- Container toolkit: 595.71.05 / v1.19.0
- Kernel: 6.18.33 (Talos Linux v1.13.3; KSPP-hardened:
init_on_alloc=1, slab_nomerge, pti=on)
- GPUs: RTX A6000 (GA102, 48 GB) + RTX PRO 4000 (Blackwell) in one host; the restored process ran on the PRO 4000
- Host: Dell R740, bare metal (no hypervisor)
- Runtime: containerd 2.2.4 / Kubernetes v1.36.1; restored workload is a vLLM EngineCore process in a pod
- Checkpoint stack: CRIU +
cuda-checkpoint (build with --action lock|checkpoint|restore|unlock)
Repro
- Start a vLLM server (CUDA process) in a container; lock + checkpoint the
engine pid with cuda-checkpoint, CRIU-dump the tree.
- CRIU-restore on the same host, cuda-checkpoint restore + unlock. Process
resumes and serves normally.
- Leave it running, seconds or 10+ minutes, duration doesn't matter.
- Kill the restored process (SIGTERM via container teardown, or SIGKILL
directly).
- ~35 s later the host is frozen. Power cycle required.
Insert the lock + checkpoint between 3 and 4 and it's clean every time.
Why we don't think it's our setup
The identical checkpoint/restore/teardown flow ran for months on the same
physical cards under VFIO passthrough VMs on an earlier driver line without a
single hang but a guest never sees real PCIe reset/AER semantics, the VMM
virtualizes all of that away. Bare metal + open 595 + kernel 6.18 is the new
combination. The total silence of the failure (no oops, no MCE, not even an
AER line) looks like the restored context's cleanup path wedging the bus
rather than faulting cleanly.
Possibly relevant: all four repros had the restored process on the Blackwell
card (RTX PRO 4000). We haven't sacrificed a host to find out whether Ampere
does it too, but the signature lines up with NVIDIA/open-gpu-kernel-modules#1111 — silent GSP halt on a
Blackwell RTX Pro 6000, zero diagnostics, power-cycle only, where the reporter
also notes the same workload is stable on Ampere. Different trigger (sustained
inference, no checkpointing), same smell.
Closest existing reports we could find (nothing covers this trigger):
One caveat: we're on the open kernel modules and haven't tried the
proprietary 595 build on this box, so we can't yet say whether it's
open-module specific. Filing here rather than the kernel-modules tracker for
that reason.
Happy to grab nvidia-bug-report output from the healthy state (the freeze
itself logs nothing, so a post-incident report only shows a clean reboot),
share the exact CRIU/cuda-checkpoint invocations, or test instrumented
builds, the repro is quick and deterministic on our side.
We run vLLM workers that get checkpointed with cuda-checkpoint + CRIU and
restored later (scale-to-zero with warm restores). The restores themselves are
fine - a restored process serves inference for as long as we leave it running.
The problem is killing it: terminate a live restored process and ~35 seconds
later the whole machine is gone. Nothing on the console, nothing in pstore, no
Xid or NVRM output beforehand, and the BMC (iDRAC) only logs an OS-side reset
with no hardware fault. SSH drops, the console freezes, and only a power cycle
brings it back. It takes an unrelated CUDA context on the second GPU down with
it. 4 out of 4 attempts so far, so it's deterministic for us.
The dump side never does this - after a checkpoint the process is left
suspended and you can kill it freely. It's specifically teardown of a live
restored CUDA context.
Workaround
Suspending the CUDA state again before the kill makes teardown completely safe:
then SIGTERM/SIGKILL as normal. We've productionized this as a Kubernetes
preStop hook and haven't lost a node since - but it only covers orderly
terminations. A segfault or OOM-kill of a live restored process would
presumably still take the host, which is why we're reporting rather than just
living with the hook.
Environment
nvidia-open-gpu-kernel-modules-production 595.71.05-v1.13.3)init_on_alloc=1,slab_nomerge,pti=on)cuda-checkpoint(build with--action lock|checkpoint|restore|unlock)Repro
engine pid with cuda-checkpoint, CRIU-dump the tree.
resumes and serves normally.
directly).
Insert the lock + checkpoint between 3 and 4 and it's clean every time.
Why we don't think it's our setup
The identical checkpoint/restore/teardown flow ran for months on the same
physical cards under VFIO passthrough VMs on an earlier driver line without a
single hang but a guest never sees real PCIe reset/AER semantics, the VMM
virtualizes all of that away. Bare metal + open 595 + kernel 6.18 is the new
combination. The total silence of the failure (no oops, no MCE, not even an
AER line) looks like the restored context's cleanup path wedging the bus
rather than faulting cleanly.
Possibly relevant: all four repros had the restored process on the Blackwell
card (RTX PRO 4000). We haven't sacrificed a host to find out whether Ampere
does it too, but the signature lines up with NVIDIA/open-gpu-kernel-modules#1111 — silent GSP halt on a
Blackwell RTX Pro 6000, zero diagnostics, power-cycle only, where the reporter
also notes the same workload is stable on Ampere. Different trigger (sustained
inference, no checkpointing), same smell.
Closest existing reports we could find (nothing covers this trigger):
open modules; sustained inference, no checkpoint/restore involved
only; nothing takes the host down
One caveat: we're on the open kernel modules and haven't tried the
proprietary 595 build on this box, so we can't yet say whether it's
open-module specific. Filing here rather than the kernel-modules tracker for
that reason.
Happy to grab nvidia-bug-report output from the healthy state (the freeze
itself logs nothing, so a post-incident report only shows a clean reboot),
share the exact CRIU/cuda-checkpoint invocations, or test instrumented
builds, the repro is quick and deterministic on our side.