NVIDIA Container Toolkit 报错 Failed to initialize NVML: Unknown Error 的解决
解决容器突然丢失GPU连接问题的方法总结
问题描述
在特定条件下,容器可能会突然与它们最初连接的GPU分离,导致出现Failed to initialize NVML: Unknown Error
错误。此问题主要发生在使用systemd
管理cgroup的环境中。
问题根源
最新版本的runc
要求符号链接存在于/dev/char
下的任何设备节点中,但NVIDIA设备当前不提供这些符号链接。
受影响环境
- Docker环境使用
containerd/runc
并启用systemd
cgroup驱动 - K8s环境使用
containerd/runc
并设置SystemdCgroup = true
- K8s环境使用
cri-o/runc
并启用cgroup_manager = "systemd"
问题验证方法
Docker环境测试验证
$ sudo docker exec -it 90452cca0281 bash
root@90452cca0281:/# nvidia-smi
Thu Jun 12 05:58:56 2025
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.230.02 Driver Version: 535.230.02 CUDA Version: 12.4 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA A100-SXM4-40GB Off | 00000000:2B:00.0 Off | 0 |
| N/A 34C P0 34W / 400W | 423MiB / 40960MiB | 0% Default |
| | | Disabled |
+-----------------------------------------+----------------------+----------------------+
| 1 Tesla V100-PCIE-32GB Off | 00000000:84:00.0 Off | 0 |
| N/A 34C P0 36W / 250W | 310MiB / 32768MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------++---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
+---------------------------------------------------------------------------------------+
root@90452cca0281:/# exit
exit#执行systemctl daemon-reload 后出现Failed to initialize NVML: Unknown Error$ systemctl daemon-reload
$ docker exec -it 90452cca0281 bash
root@90452cca0281:/# nvidia-smi
Failed to initialize NVML: Unknown Error
解决方案
推荐解决方案
在containerd或cri-o中禁用systemd cgroup管理
编辑/etc/docker/daemon.json 修改Docker配置(本人最终采用的方案)
{"exec-opts": ["native.cgroupdriver=cgroupfs"]
}
其他解决方案
使用nvidia-ctk工具创建符号链接
sudo nvidia-ctk system create-dev-char-symlinks --create-all
创建udev规则(个人测试未成功)
cat /lib/udev/rules.d/71-nvidia-dev-char.rules
ACTION=="add", DEVPATH=="/bus/pci/drivers/nvidia", RUN+="/usr/bin/nvidia-ctk system create-dev-char-symlinks --create-all"
- 参考官方文档:https://github.com/NVIDIA/nvidia-container-toolkit/issues/48
降级NVIDIA Container Toolkit到特定版本
- 参考文档:https://blog.csdn.net/weixin_43408232/article/details/143955501
个人经验分享
我尝试了官方文档中推荐的udev规则方法,但未能成功解决问题。最终通过修改Docker的cgroup驱动为cgroupfs的方式解决了问题。
配置方法:
编辑/etc/docker/daemon.json
添加或修改为:
{"exec-opts": ["native.cgroupdriver=cgroupfs"]
}
重启Docker服务后问题解决