[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
@rahulait is already working on this.
Since Aug 1, 2026.
- Dominant language
- Go
- Stars
- 2.9k
- Forks
- 552
- Avg merge
- 2d 4h
- Merged PRs (30d)
- 90
Description
Describe the bug
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-uvmmodule 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: trueand a precompiled driver image,
plus time-slicing device-plugin config. - Reboot the node (or delete the
nvidia-driver-daemonsetpod so theOnDeletestrategy
recreates it while the node keeps running). - Wait for
nvidia-operator-validatorto 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/ornvidia-uvm) is missing. - Schedule any CUDA pod (e.g.
nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0with
nvidia.com/gpu: 1): it fails to initialize CUDA/UVM, while the validator continues to report
the node as validated. - Delete the
nvidia-driver-daemonsetpod; 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-validatorshould 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 externalvectoraddsmoke test catches.- Validation should be re-triggered whenever the driver DaemonSet pod restarts/recreates, instead
of remaining green from a previous validation cycle. - Ideally the validation result would be exposed as a trustworthy node signal (label/taint/
condition, cf. #475) so cluster automation can gate GPU workloads on it without running a
parallel smoke-test pipeline.
Environment (please provide the following information):
- GPU Operator Version: v26.3.2 (Helm chart, NVIDIA registry)
- OS: Ubuntu 24.04 (immutable/A-B image-based edge OS, Kairos-derived)
- Kernel Version: 6.8.0-101-generic
- Container Runtime Version: containerd (embedded in RKE2)
- Kubernetes Distro and Version: RKE2 (edge cluster managed via Spectro Cloud Palette)
Additional configuration details:
- Driver: precompiled/signed driver container, version 580.126.09, built per kernel version, served
from a private registry mirror k8s-driver-manager: v0.11.0,container-toolkit: v1.19.1,device-plugin: v0.19.2- Device plugin time-slicing:
nvidia.com/gpureplicas: 5on 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-validator1/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 stuckInit:0/1waiting for/run/nvidia/driver/dev/nvidia-uvm-tools -
kubectl logsof validator containers — all validations report success -
nvidia-smifrom the driver container succeeds even whilenvidia-uvm-toolsis missing —
which is whynvidia-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:
apiVersion: batch/v1
kind: Job
metadata:
name: nvidia-gpu-smoke-test
namespace: gpu-operator
labels:
app: nvidia-gpu-smoke-test
spec:
parallelism: 1
completions: 1
backoffLimit: 50
template:
metadata:
labels:
app: nvidia-gpu-smoke-test
spec:
runtimeClassName: nvidia
restartPolicy: OnFailure
initContainers:
- name: wait-driver
image: busybox:1.36
command:
- sh
- -c
- |
echo "waiting for driver"
until [ -e /run/nvidia/driver/dev/nvidia-uvm-tools ]; do
sleep 2
done
volumeMounts:
- mountPath: /run/nvidia
name: nvidia-run
readOnly: true
containers:
- name: test
image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0
resources:
limits:
nvidia.com/gpu: 1
volumes:
- name: nvidia-run
hostPath:
path: /run/nvidia
Heal logic (pseudocode of the host watchdog):
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)
References:
- Driver upgrades /
OnDeletestrategy: https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/gpu-driver-upgrades.html - Time-slicing: https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/gpu-sharing.html
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.