修复NVIDIA驱动版本与CUDA版本不对应问题
执行nvidia-smi发现运行不了:
(test) root@f51184cd4831:~/tmp/peach/GAN_separate# nvidia-smi Failed
to initialize NVML: Driver/library version mismatch NVML library
version: 545.23
运行一个torch(gpu版本)程序训练神经网络时会发出这个警告:
/root/miniconda3/envs/d2l/lib/python3.8/site-packages/torch/cuda/init.py:141:
UserWarning: CUDA initialization: Unexpected error from
cudaGetDeviceCount(). Did you run some cuda functions before calling
NumCudaDevices() that might have already set an error? Error 804:
forward compatibility was attempted on non supported HW (Triggered
internally at …/c10/cuda/CUDAFunctions.cpp:108.) return
torch._C._cuda_getDeviceCount() > 0
运行Torch测试程序:
import torch
print(torch.version.cuda)
torch.cuda.is_available()
输出:
12.1
False
分析
这个错误信息是关于CUDA(NVIDIA的并行计算平台)初始化时遇到的问题。
错误的关键部分是:“Error 804: forward compatibility was attempted on non supported HW”
CUDA版本和Torch版本不对应
步骤1
将符号链接更改为指向 libnvidia-ml.so.535.161.08
版本(这个版本是我之前没出问题的版本),按照以下步骤进行:
1. 检查当前 NVML 库的文件和链接
首先查找 NVML 库的位置和现有的符号链接:
find /usr -name "libnvidia-ml.so*"
通常输出会包含类似以下内容:
/usr/lib/x86_64-linux-gnu/libnvidia-ml.so
/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1
/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.450.102
符号链接的正确关系应该是:
libnvidia-ml.so
->libnvidia-ml.so.1
libnvidia-ml.so.1
->libnvidia-ml.so.<具体版本号>
我这的结果下面图片,535.161.08是原来的版本,535.183.01是不对付的版本
2. 删除旧的符号链接(如果不正确)
如果符号链接指向了错误的文件或版本,先删除旧的链接:
sudo rm /usr/lib/x86_64-linux-gnu/libnvidia-ml.so
sudo rm /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1
3. 创建正确的符号链接
假设实际的库文件是 /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.450.102
,执行以下命令:
sudo ln -sf /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.450.102 /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1
sudo ln -sf /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1 /usr/lib/x86_64-linux-gnu/libnvidia-ml.so
这会确保:
libnvidia-ml.so
->libnvidia-ml.so.1
libnvidia-ml.so.1
->libnvidia-ml.so.450.102
我这里要指向指向 libnvidia-ml.so.535.161.08
,所以是创建新的符号链接,将 libnvidia-ml.so
和 libnvidia-ml.so.1
指向 libnvidia-ml.so.535.161.08
:
sudo ln -sf /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.535.161.08 /usr/lib/x86_64-linux-gnu/libnvidia-ml.so
sudo ln -sf /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.535.161.08 /usr/lib/x86_64-linux-gnu/libnvi
4. 刷新动态链接器缓存
更新系统动态链接器的缓存以反映新的库链接:
sudo ldconfig
5. 验证修复
运行以下命令验证修复是否成功:
ls -l /usr/lib/x86_64-linux-gnu/libnvidia-ml.so*
输出应该类似:
lrwxrwxrwx 1 root root 18 Jan 15 10:00 /usr/lib/x86_64-linux-gnu/libnvidia-ml.so -> libnvidia-ml.so.1 lrwxrwxrwx 1 root root 25 Jan 15 10:00 /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1 -> libnvidia-ml.so.450.102
-rw-r--r-- 1 root root 104857 Jan 15 10:00 /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.450.102
再运行 nvidia-smi
,确保它能够正常工作。
步骤2
我要驱动版本与 libnvidia-ml.so.535.161.08
一致(即 535.161.08
),需要重新安装对应版本的 NVIDIA 驱动。
1. 卸载当前 NVIDIA 驱动
sudo apt-get purge nvidia-*
2. 安装指定版本的 NVIDIA 驱动
安装 535.161.08
版本(我要装的版本)的 NVIDIA 驱动。
-
如果通过包管理器安装:(选择这个)
sudo apt-get install nvidia-driver-535=535.161.08
-
或者通过 NVIDIA 官方运行文件安装: 下载
535.161.08
的驱动程序 NVIDIA 官方驱动下载页面,然后按照以下步骤安装:sudo chmod +x NVIDIA-Linux-x86_64-535.161.08.run sudo ./NVIDIA-Linux-x86_64-535.161.08.run
3. 重启系统
完成驱动安装后,重启系统以确保新的驱动加载。
sudo reboot
4. 验证驱动版本
重启后,运行以下命令确认驱动版本是否正确:
nvidia-smi
输出应显示:
NVIDIA-SMI 535.161.08 Driver Version: 535.161.08 CUDA Version: X.X
但是我在安装驱动的时候的过程中出现了这个错误:
Reading package lists… Done Building dependency tree Reading
state information… Done Some packages could not be installed. This
may mean that you have requested an impossible situation or if you are
using the unstable distribution that some required packages have not
yet been created or been moved out of Incoming. The following
information may help to resolve the situation:The following packages have unmet dependencies: libnvidia-gl-535 :
Depends: libnvidia-common-535 (= 535.161.08-0ubuntu1) but
535.216.03-0ubuntu1 is to be installed nvidia-dkms-535 : Depends: nvidia-kernel-common-535 (= 535.161.08-0ubuntu1) but
535.216.03-0ubuntu1 is to be installed E: Unable to correct problems, you have held broken packages.
如果出现这个错误,说明系统中某些 NVIDIA 相关的依赖包版本(如 libnvidia-common-535
和 nvidia-kernel-common-535
)与要安装的 535.161.08-0ubuntu1
不匹配,当前安装的是更高版本 535.216.03-0ubuntu1
。
于是我用这个办法:
(1). 强制安装指定版本及其所有依赖
尝试显式安装依赖包的正确版本:
sudo apt-get install libnvidia-common-535=535.161.08-0ubuntu1 \
nvidia-kernel-common-535=535.161.08-0ubuntu1 \
nvidia-dkms-535=535.161.08-0ubuntu1 \
libnvidia-gl-535=535.161.08-0ubuntu1 \
nvidia-driver-535=535.161.08-0ubuntu1 --allow-downgrades
但是发现不太行,于是试试下面的方法
(2). 清理不匹配的依赖
先卸载系统中已安装的较新版本依赖包,避免版本冲突:
sudo apt-get remove --purge '^nvidia-.*' '^libnvidia-.*'
sudo apt-get autoremove
sudo apt-get autoclean
然后重新尝试安装指定版本的驱动和依赖包:
sudo apt-get install nvidia-driver-535=535.161.08-0ubuntu1 --allow-downgrades
(3). 锁定特定版本的软件包
为了避免系统自动升级相关软件包,可以锁定这些软件包的版本:
sudo apt-mark hold nvidia-driver-535 libnvidia-common-535 nvidia-kernel-common-535 libnvidia-gl-535
完成这一列操作之后,一定要重启python虚拟环境!!!!!!:
nvidia-smi:
运行测试Torch程序:
安装的Torch版本:
我的设备环境情况:
显卡:NVIDIA RTX4090
python:3.9
包管理:Anaconda
服务器连接方式:SSH
参考资料:
查看Nvidia 驱动网站
nvidia-smi返回错误信息‘Failed to initialize NVML: Driver/library version mismatch’
Ubantu显卡驱动和内核的坑之——NVIDIA-SMI couldn’t find libnvidia-ml.so library in your system.