修复 nvidia-smi 报错:Failed to initialize NVML: Driver/library version mismatch
1.报错
Failed to initialize NVML: Driver/library version mismatch
NVML library version: 595.58
同时 nvcc --version 显示 CUDA Toolkit 版本为 11.5,一切正常,只有 nvidia-smi 无法工作。
2.根本原因
这个报错的本质是内核态驱动 和用户态库版本不一致。
NVIDIA 驱动在 Linux 上分为两层:
| 层级 | 文件 | 更新方式 |
|---|---|---|
| 内核模块(内核态) | nvidia.ko |
必须重启才能生效 |
| 用户态库 | libnvidia-ml.so / nvidia-smi 等 |
apt 安装后即生效 |
当系统升级了用户态库(例如升到了 595.58),但内核里仍然加载着旧版本的 nvidia.ko 时,两者版本不匹配,NVML 初始化就会失败。
通过 dmesg 可以清晰看到报错内核日志:
NVRM: API mismatch: the client 'nvidia-smi' (pid 4820)
NVRM: kernel module and all NVIDIA driver components
这说明系统中很可能同时装了两个版本的驱动,内核启动时加载的是旧版本的模块。重启也无法解决,因为旧版内核模块依然优先被加载。
3.解决方案:彻底清理旧驱动,重新安装
第一步:完整卸载所有 NVIDIA 驱动
bash
sudo apt purge 'nvidia-*' 'libnvidia-*' 'cuda-drivers*' 'nvidia-settings*'
sudo apt autoremove -y
第二步:清理残留配置
bash
sudo rm -f /etc/modprobe.d/nvidia*.conf
sudo rm -f /etc/modprobe.d/blacklist-nouveau.conf
第三步:更新 initramfs
确保旧的内核模块不会被重新打包进启动镜像:
bash
sudo update-initramfs -u
第四步:安装指定版本驱动
安装 595 版本驱动(与 NVML 库版本匹配):
bash
sudo apt install nvidia-driver-595
这一步会同时安装好内核模块、用户态库、nvidia-smi 等所有配套组件,保证版本完全一致。
第五步:重启
bash
sudo reboot
重启后运行 nvidia-smi,应当恢复正常。
4.安装后的版本情况说明
修复完成后,两个工具显示的版本号是不同的,这是正常的:
bash
$ nvcc --version
# Cuda compilation tools, release 11.5
$ nvidia-smi
# CUDA Version: 13.2
这两个版本号代表不同的东西,并不冲突:
| 工具 | 显示内容 | 含义 |
|---|---|---|
nvcc --version |
CUDA Toolkit 版本(11.5) | 编译工具链的版本,独立安装,可以与驱动版本不同 |
nvidia-smi 中的 CUDA Version |
驱动支持的最高 CUDA 版本(13.2) | 表示当前驱动最高能支持到 CUDA 13.2 |
驱动 595.x 原生支持 CUDA 13.2,但由于驱动向下兼容,用 11.5 的 Toolkit 编译的程序依然可以在这个驱动上正常运行。
如果日常使用 PyTorch、TensorFlow 等框架,可以考虑将 CUDA Toolkit 升级到 12.x,以获得更好的框架支持:
bash
sudo apt install cuda-toolkit-12-4
但这不是必须的,现有环境已经可以正常工作。
5.总结
| 步骤 | 命令 |
|---|---|
| 完整卸载旧驱动 | sudo apt purge 'nvidia-*' 'libnvidia-*' |
| 清理残留配置 | sudo rm -f /etc/modprobe.d/nvidia*.conf |
| 更新启动镜像 | sudo update-initramfs -u |
| 安装新驱动 | sudo apt install nvidia-driver-595 |
| 重启 | sudo reboot |
关键教训:NVIDIA 驱动混装是大忌,出现版本冲突时不要试图打补丁,彻底清理重装是最可靠的方案。