You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[Bug]: nvidia-operator-validator reports Ready while driver device nodes (nvidia-uvm/nvidia-uvm-tools) are missing — false positive forces users to run their own CUDA smoke test #2685
nvidia-operator-validator can become Ready (all init validations pass) while the driver is not
actually usable on the host: after a node reboot or a recreation of the nvidia-driver-daemonset
pod (the driver DaemonSet uses a hard-coded OnDelete update strategy, so pod recreation is a
routine lifecycle event), the device nodes under the driver root — notably /run/nvidia/driver/dev/nvidia-uvm and /run/nvidia/driver/dev/nvidia-uvm-tools — are sometimes
missing or stale. The validator still reports success, nvidia.com/gpu capacity is advertised, and
pods get scheduled, but any real CUDA workload fails to initialize (NVML/UVM errors, or the pod
hangs waiting on the device node).
In other words, the validator checks that the driver container came up and nvidia-smi works, but
it does not verify that the full set of device nodes required by CUDA workloads exists and works,
and it does not re-validate when the driver pod is recreated while the node keeps running.
Because of this false positive we cannot trust nvidia-operator-validator as the readiness signal
for our fleet of unattended edge devices. We had to build our own validation for the self-healing
process: a CUDA vectoradd smoke-test Job whose init container waits for /run/nvidia/driver/dev/nvidia-uvm-tools, plus a boot-time watchdog that deletes/recreates the nvidia-driver-daemonset pod whenever the smoke test stalls (recreating the driver pod is the
action that reliably refreshes the device nodes and unblocks the workload). This works, but it
duplicates what the operator-validator is supposed to provide.
Related reports that touch parts of this gap:
#475 — validation completes after workloads already scheduled; no reliable "validated" signal
#2166 — driver pod restart breaks running GPU workloads
#539 — validator fails to create host device symlinks
#1923 — nvidia-uvm module load failure surfaced only indirectly
To Reproduce
Environment: unattended edge node (immutable Ubuntu 24.04 image), RKE2, GPU Operator with a
precompiled/signed driver container keyed to the host kernel, single NVIDIA RTX GPU shared via
time-slicing (replicas: 5).
Install the GPU Operator (Helm) with driver.enabled: true and a precompiled driver image,
plus time-slicing device-plugin config.
Reboot the node (or delete the nvidia-driver-daemonset pod so the OnDelete strategy
recreates it while the node keeps running).
Wait for nvidia-operator-validator to become Ready — all validator init containers
(driver-validation, toolkit-validation, cuda-validation, plugin-validation) succeed.
Check the driver root on the host: ls /run/nvidia/driver/dev/ | grep uvm — intermittently nvidia-uvm-tools (and/or nvidia-uvm) is missing.
Schedule any CUDA pod (e.g. nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0 with nvidia.com/gpu: 1): it fails to initialize CUDA/UVM, while the validator continues to report
the node as validated.
Delete the nvidia-driver-daemonset pod; after it is recreated, the device nodes appear and the
same workload succeeds — confirming the validator signaled Ready on a non-working driver state.
The race is intermittent (boot-ordering dependent); across a fleet of hundreds of devices it occurs
on a meaningful fraction of boots.
Expected behavior
nvidia-operator-validator should only report Ready when the driver is actually usable by a
workload: all required device nodes present under the driver root (nvidia, nvidiactl, nvidia-modeset, nvidia-uvm, nvidia-uvm-tools, ...) and a real CUDA context can be created —
i.e. the validation should catch the state that our external vectoradd smoke test catches.
Validation should be re-triggered whenever the driver DaemonSet pod restarts/recreates, instead
of remaining green from a previous validation cycle.
Device plugin time-slicing: nvidia.com/gpureplicas: 5 on a single RTX GPU
Single-node clusters, unattended operation (no operator at the keyboard — self-healing must be
automatic)
Information to attach (optional if deemed irrelevant)
kubernetes pods status: kubectl get pods -n gpu-operator — all pods Running/Completed, nvidia-operator-validator 1/1 Ready in the failing state
kubernetes daemonset status: kubectl get ds -n gpu-operator — desired == ready for all
daemonsets in the failing state
kubectl describe pod — the validator is not in an error state (that is the bug); our
smoke-test pod is stuck Init:0/1 waiting for /run/nvidia/driver/dev/nvidia-uvm-tools
kubectl logs of validator containers — all validations report success
nvidia-smi from the driver container succeeds even while nvidia-uvm-tools is missing —
which is why nvidia-smi-based validation does not catch this
containerd logs — no runtime-level errors; failure only surfaces at CUDA/UVM init inside the
workload
Workaround we currently run (what the validator should make unnecessary) — smoke-test Job deployed
next to the operator, watched by a host-side heal daemon that recreates the driver pod if the job
stalls:
wait for kube-apiserver, then for deploy/gpu-operator Available
loop until job/nvidia-gpu-smoke-test is Complete:
recreate smoke-test job + delete driver pods (graceful)
wait driver DS Ready (on stall: force-delete driver pods on ImagePull/CrashLoop)
wait operator-validator Ready (on stall: delete validator pods)
wait smoke test Complete (if its init container reports the uvm-tools device is missing:
delete the driver pod → device nodes are refreshed → test passes)
Describe the bug
nvidia-operator-validatorcan become Ready (all init validations pass) while the driver is notactually usable on the host: after a node reboot or a recreation of the
nvidia-driver-daemonsetpod (the driver DaemonSet uses a hard-coded
OnDeleteupdate strategy, so pod recreation is aroutine lifecycle event), the device nodes under the driver root — notably
/run/nvidia/driver/dev/nvidia-uvmand/run/nvidia/driver/dev/nvidia-uvm-tools— are sometimesmissing or stale. The validator still reports success,
nvidia.com/gpucapacity is advertised, andpods get scheduled, but any real CUDA workload fails to initialize (NVML/UVM errors, or the pod
hangs waiting on the device node).
In other words, the validator checks that the driver container came up and
nvidia-smiworks, butit does not verify that the full set of device nodes required by CUDA workloads exists and works,
and it does not re-validate when the driver pod is recreated while the node keeps running.
Because of this false positive we cannot trust
nvidia-operator-validatoras the readiness signalfor our fleet of unattended edge devices. We had to build our own validation for the self-healing
process: a CUDA
vectoraddsmoke-test Job whose init container waits for/run/nvidia/driver/dev/nvidia-uvm-tools, plus a boot-time watchdog that deletes/recreates thenvidia-driver-daemonsetpod whenever the smoke test stalls (recreating the driver pod is theaction that reliably refreshes the device nodes and unblocks the workload). This works, but it
duplicates what the operator-validator is supposed to provide.
Related reports that touch parts of this gap:
nvidia-uvmmodule load failure surfaced only indirectlyTo Reproduce
Environment: unattended edge node (immutable Ubuntu 24.04 image), RKE2, GPU Operator with a
precompiled/signed driver container keyed to the host kernel, single NVIDIA RTX GPU shared via
time-slicing (
replicas: 5).driver.enabled: trueand a precompiled driver image,plus time-slicing device-plugin config.
nvidia-driver-daemonsetpod so theOnDeletestrategyrecreates it while the node keeps running).
nvidia-operator-validatorto become Ready — all validator init containers(
driver-validation,toolkit-validation,cuda-validation,plugin-validation) succeed.ls /run/nvidia/driver/dev/ | grep uvm— intermittentlynvidia-uvm-tools(and/ornvidia-uvm) is missing.nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0withnvidia.com/gpu: 1): it fails to initialize CUDA/UVM, while the validator continues to reportthe node as validated.
nvidia-driver-daemonsetpod; after it is recreated, the device nodes appear and thesame workload succeeds — confirming the validator signaled Ready on a non-working driver state.
The race is intermittent (boot-ordering dependent); across a fleet of hundreds of devices it occurs
on a meaningful fraction of boots.
Expected behavior
nvidia-operator-validatorshould only report Ready when the driver is actually usable by aworkload: all required device nodes present under the driver root (
nvidia,nvidiactl,nvidia-modeset,nvidia-uvm,nvidia-uvm-tools, ...) and a real CUDA context can be created —i.e. the validation should catch the state that our external
vectoraddsmoke test catches.of remaining green from a previous validation cycle.
condition, cf. [Feature Request] Make nvidia-operator-validator add a validation successful label or taint on the node #475) so cluster automation can gate GPU workloads on it without running a
parallel smoke-test pipeline.
Environment (please provide the following information):
Additional configuration details:
from a private registry mirror
k8s-driver-manager: v0.11.0,container-toolkit: v1.19.1,device-plugin: v0.19.2nvidia.com/gpureplicas: 5on a single RTX GPUautomatic)
Information to attach (optional if deemed irrelevant)
kubectl get pods -n gpu-operator— all pods Running/Completed,nvidia-operator-validator1/1 Ready in the failing statekubectl get ds -n gpu-operator— desired == ready for alldaemonsets in the failing state
kubectl describe pod— the validator is not in an error state (that is the bug); oursmoke-test pod is stuck
Init:0/1waiting for/run/nvidia/driver/dev/nvidia-uvm-toolskubectl logsof validator containers — all validations report successnvidia-smifrom the driver container succeeds even whilenvidia-uvm-toolsis missing —which is why
nvidia-smi-based validation does not catch thisworkload
Workaround we currently run (what the validator should make unnecessary) — smoke-test Job deployed
next to the operator, watched by a host-side heal daemon that recreates the driver pod if the job
stalls:
Heal logic (pseudocode of the host watchdog):
References:
OnDeletestrategy: https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/gpu-driver-upgrades.html