Nvidia NVML驱动程序/库版本不匹配

531
当我运行nvidia-smi时,我收到以下消息:

Failed to initialize NVML: Driver/library version mismatch

一个小时之前我收到了同样的消息并卸载了我的CUDA库,然后我能够运行nvidia-smi,得到以下结果:

nvidia-smi-result

之后,我从官方NVIDIA页面下载了cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb,然后简单地:
sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb
sudo apt-get update
sudo apt-get install cuda
export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}
现在我已经安装了CUDA,但我得到了上述的不匹配错误。
一些可能有用的信息: 运行cat /proc/driver/nvidia/version 我得到:
NVRM version: NVIDIA UNIX x86_64 Kernel Module  378.13  Tue Feb  7 20:10:06 PST 2017
GCC version:  gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)

我正在使用Ubuntu 16.04.2 LTS (Xenial Xerus)操作系统。

内核版本是4.4.0-66-generic。


30
您可能将之前的运行文件安装和当前的软件包管理器安装(apt-get)混合在一起了。请按照cuda Linux安装指南中的说明删除所有先前的NVIDIA驱动程序和CUDA文件,然后在清理完毕后重新安装。在重新安装之前,您可能需要阅读我提供链接的整个Linux安装指南文档。冲突几乎肯定是由于您尝试在现有的378.13驱动程序安装上安装CUDA 8 GA2软件包引起的。 - Robert Crovella
30
如果不是在 Stackoverflow 上,那么哪里是一个好的地方来提出与 GPU 相关的问题? - bug_spray
2
我正在使用Ubuntu,我认为在Linux上更新Nvidia驱动程序后出现了错误。也许需要自动删除并重新启动更新Nvidia驱动程序。 - lechat
8
对我来说,运行sudo reboot解决了我的问题。 - mikey
7
又有一组过于热衷的“关闭”投票针对一个与成千上万其他问题相似但未被关闭的问题,这个问题直接关系到数千名程序员的生活,与“框架意见”无关,而与实际开发人员的问题有关。这些人可能并不花太多时间与NVidia或CUDA一起工作。再次强调,SO最大的失败之处在于没有随着关闭投票者数量的增加而提高关闭问题的难度。 - Dan Nissenbaum
显示剩余3条评论
19个回答

761

38
重启后我对这个能否正常运作持怀疑态度,但尽管如此,我还是试了一下,结果它成功了!谢谢! - Abhishek Potnis
44
如果你想知道为什么重新启动有效,可能是因为这个原因:在Ubuntu上检查 /var/log/apt/history.log ,发现系统已自动更新了 libcuda,这可能需要重新启动以继续正常运行。之后我已经禁用了这些更新,希望不会再出现此问题。 - ProgrammingLlama
3
约翰遇到了同样的问题,重新启动解决了问题,并验证了确实有一个自动更新,正如你提到的文件中所记录的那样。谢谢!你介意分享如何禁用这些更新吗?此外,将此信息添加到当前答案或新答案中可能是有意义的。 - Coffee_Table
3
很遗憾,这不是一个永久性的解决方案。问题可能会再次出现。解决方案是安装较新版本的Nvidia包(“nvidia-390”)。请参见我下面的答案。 - Stefan Horning
4
这对我也起作用了。有些指令包括 sudo reboot now,而有些则没有。 - rjurney
显示剩余19条评论

469

etal所说,重新启动可以解决此问题,但我认为不需要重新启动的过程会更有帮助。

如需中文版,请查看我的博客->中文版

错误信息

NVML:驱动程序/库版本不匹配

告诉我们Nvidia驱动核心模块(kmod)的版本错误,因此我们应该卸载该驱动程序,然后加载正确版本的kmod

我们该怎么做?

首先,我们应该知道哪些驱动程序已被加载。

lsmod | grep nvidia

您可能会获得

nvidia_uvm            634880  8
nvidia_drm             53248  0
nvidia_modeset        790528  1 nvidia_drm
nvidia              12312576  86 nvidia_modeset,nvidia_uvm

我们的最终目标是卸载nvidia模块,因此我们应该卸载依赖于nvidia的模块:

sudo rmmod nvidia_drm
sudo rmmod nvidia_modeset
sudo rmmod nvidia_uvm

然后,卸载 nvidia

sudo rmmod nvidia

故障排除

如果您遇到类似于rmmod: ERROR: Module nvidia is in use的错误,这表明内核模块正在使用中,您应该杀掉正在使用kmod的进程:

sudo lsof /dev/nvidia*

终止这些进程,然后继续卸载kmods。

测试

确认您已成功卸载这些kmods。

lsmod | grep nvidia

你应该什么都不会得到。然后确认你可以加载正确的驱动程序:

nvidia-smi

您应该获得正确的输出。


4
@suraj,这不仅是关联的问题。答案写得很好。唯一的问题是他没有透露自己的从属关系,而你做了。 - Sagar V
6
错误的文件已经不在磁盘中了,但是仍然存在于内存中。我认为nvidia-smi只是触发了一个新的加载过程。 - Comzyh
3
太棒了!我从没想到这就是问题的原因。那么重新启动能起到同样的作用吗? - alys
4
工作正常,但重新启动后问题又出现了,而且我的分辨率也不正确。这不是完全干净的安装。 - Kevin He
16
对我没用。 sudo rmmod nvidia_drm sudo rmmod nvidia_modeset sudo rmmod nvidia_uvm sudo rmmod nvidialsmod | grep nvidia 输出为空。但是仍然出现相同的错误:nvidia-smi Failed to initialize NVML: Driver/library version mismatch出现错误后,lsmod | grep nvidia 的输出与开始时相同。 - mrgloom
显示剩余23条评论

45
为什么会出现版本不匹配的问题,我们该如何防止再次发生?
您可能会发现这些位置的nvidia-*版本不同:
  1. dpkg -l | grep nvidia(查看nvidia-utils-xxx软件包的版本),以及
  2. cat /proc/driver/nvidia/version(查看内核模块的版本,例如460.56)。
重启应该可以解决问题,但是您可能想要禁止此软件包的自动更新,方法是修改/etc/apt/sources.list.d/文件,或者通过执行命令apt-mark hold nvidia-utils-version_number hold 该软件包。
附注:部分内容参考了this(原始指导文档为中文,因此我参考了翻译版)。

2
谢谢您的解释。但我仍然不明白为什么会发生这种情况。我从一切正常的状态开始,没有更新任何软件包,但在似乎随机的时间后仍然出现错误。您是否知道是什么原因导致了这种不匹配的情况? - ClonedOne
1
@Antonio,这是一个正确的做法,请确保标记您想要使用的版本,以避免自动更新,并在必要时将其取消标记。非常感谢提供如此有价值的参考,我学到了一些东西! - Long
1
@Long 我刚意识到我在评论中忘记了一个“不”字,所以我在这里重新发布它: 谢谢你,对我来说有效的方法是运行 dpkg -l | grep nvidia 并清除所有不是来自新版本驱动程序的软件包。一些有用的链接 askubuntu.com/questions/18804/… askubuntu.com/questions/151941/…) - Antonio
1
@Long 是的,我在复制粘贴时误删了链接:/ https://askubuntu.com/questions/151941/how-can-you-completely-remove-a-package https://askubuntu.com/questions/18804/what-do-the-various-dpkg-flags-like-ii-rc-mean - Antonio
1
非常感谢,我已经解决了。我不小心安装了不同版本的nvidia-utils-xxx。这帮助我解决了我的问题。 - user1953366
显示剩余2条评论

39

我遇到了这个问题,其他方法都没有起作用。错误信息很模糊,但检查 dmesg 的输出是关键:

[   10.118255] NVRM: API mismatch: the client has the version 410.79, but
           NVRM: this kernel module has the version 384.130.  Please
           NVRM: make sure that this kernel module and all NVIDIA driver
           NVRM: components have the same version.

然而,我已彻底删除了384版本,并删除了任何剩余的内核驱动程序 nvidia-384*。但是,即使重启后,我仍然遇到这个问题。看到这意味着内核仍然编译为引用384,但只能找到410。因此,我重新编译了我的内核:

uname -a # Find the kernel it's using

Linux blah 4.13.0-43-generic #48~16.04.1-Ubuntu SMP Thu May 17 12:56:46 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux


update-initramfs -c -k 4.13.0-43-generic # Recompile it
reboot

然后它起作用了。

在删除了384之后,在以下目录中仍然有384个文件: /var/lib/dkms/nvidia-XXX/XXX.YY/4.13.0-43-generic/x86_64/module /lib/modules/4.13.0-43-generic/kernel/drivers

我建议使用locate命令(默认未安装)来代替每次搜索文件系统。


非常感谢!使用locate nvidia-smi是个好主意。我使用这个命令找出另一个驱动程序已安装。 - hao
sudo update-initramfs -c -k uname -r 对我没有帮助。 - mrgloom
dmesg output: NVRM: API mismatch: the client has the version 418.67, but NVRM: this kernel module has the version 430.26. Please NVRM: make sure that this kernel module and all NVIDIA driver NVRM: components have the same version. - mrgloom
如果nvidia-smi显示Failed to initialize NVML,尽管已成功安装了nvidia驱动程序和CUDA工具包,则问题可能是在重新启动时加载了旧的(压缩的)内核和旧的Nvidia模块,而不是加载了更新的nvidia模块的内核。https://dev59.com/NcLra4cB1Zd3GeqPV_zX#71672261对此问题有更清晰的解释,并为我解决了问题(Cent OS 7,nvidia/460.32.03,3.10.0-957.21.3.el7.x86_64与CUDA 11.2)。 - Samir
还值得一看的是Andrew Laidlaw在这篇文章中关于正确构建特定内核的nvidia模块的疑难解答。 - Samir

36

前两个答案不能解决我的问题。我在Nvidia官方论坛找到了一种解决方法,解决了我的问题。

下面的错误信息可能是由于使用不同方法安装了两个不同版本的驱动程序引起的。例如,通过APT和官方安装程序安装Nvidia驱动程序。

无法初始化NVML:驱动程序/库版本不匹配

要解决此问题,只需执行以下两个命令中的一个即可。

sudo apt-get --purge remove "*nvidia*"
sudo /usr/bin/nvidia-uninstall

3
bash: /usr/bin/nvidia-uninstall: 没有那个文件或目录 - Stepan Yakovenko
1
它可以工作。有时卸载文件不存在。 - Qinsheng Zhang
3
我已经这样做了,现在我的电脑上没有安装任何 NVIDIA 驱动程序。 必须重新安装。 - noone
2
好的,那接下来呢?我们需要安装什么吗? - Charlie Parker
2
你能在这之后添加安装命令吗? - Arnold Roa
显示剩余2条评论

20

我也遇到了这个问题(我正在运行Ubuntu 18.04(Bionic Beaver))。

我的解决方法:

dpkg -l | grep -i nvidia

然后执行sudo apt-get remove --purge nvidia-381(和每个重复的版本,在我的情况下,我有381、384和387)

然后sudo ubuntu-drivers devices列出可用的内容。

接着我选择sudo apt install nvidia-driver-430

之后,nvidia-smi会给出正确的输出(无需重新启动计算机)。但是如果不确定,可以重新启动计算机。

我还按照此安装说明重新安装了cuda+cudnn。


2
我不知道为什么这被标记为负一(-1)。我将它增加到了0。命令"dpkg -l | grep -i nvidia"是有效的,并显示了未删除的内容。 - gerardg
我特别喜欢选择性清除,然后列出可用驱动程序的功能。 - mirekphd

15

重新启动。

如果问题仍然存在:

sudo rmmod nvidia_drm
sudo rmmod nvidia_modeset
sudo rmmod nvidia
nvidia-smi

对于CentOSRed Hat Enterprise Linux(RHEL):

cd /boot
mv initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
dracut -vf initramfs-$(uname -r).img $(uname -r)

那么

reboot

对于Debian/Ubuntu

update-initramfs -u

如果问题仍然存在:
apt install -y dkms && dkms install -m nvidia -v 440.82

将440.82更改为您的实际版本。

提示:获取Nvidia驱动程序版本:

ls /usr/src

你会找到Nvidia驱动程序目录,例如nvidia-440.82

此外,您可以删除所有 Nvidia 包并重新安装驱动程序:

apt purge nvidia*
apt purge *cuda*

# Check
apt list -i |grep nvidia
apt list -i |grep cuda

1
这在Centos上对我有效。我知道为什么吗?不知道。 - Janosch

6

通常重启Ubuntu 18.04(Bionic Beaver)会解决问题。

“Failed to initialize NVML: Driver/library version mismatch?”错误通常意味着CUDA驱动程序仍在运行旧版本,与当前使用的CUDA工具包版本不兼容。重新启动计算节点通常可以解决此问题。


它可以在安装了NVIDIA驱动程序470的Ubuntu 20.0.4上运行。 - amerw
1
重启对我有用。奇怪的是Linux需要重新启动,我以为这只是“Windows”的事情。 - Nathan B
@NathanB 有时候,即使是人类也需要重新启动。 - undefined

5

我在使用 nvidia-348 包 (Ubuntu 16.04 上的最新 Nvidia 版本) 时也遇到了类似的问题。

但是,我通过在 Proprietary GPU Drivers PPA 中安装 nvidia-390 解决了这个问题。

因此,在 Ubuntu 16.04 上解决上述问题的方法是:

  • sudo add-apt-repository ppa:graphics-drivers/ppa
  • sudo apt-get update
  • sudo apt-get install nvidia-390

注意: 本指南假定您的 Ubuntu 安装干净。如果您之前安装了驱动程序,则可能需要重新启动以重新加载所有内核模块。


1
这个操作和重启就解决了我的问题! - SaiBot

5

以下这些回答对我没有用:

dmesg

NVRM: API mismatch: the client has the version 418.67, but
NVRM: this kernel module has the version 430.26.  Please
NVRM: make sure that this kernel module and all NVIDIA driver
NVRM: components have the same version.

卸载旧的驱动程序418.67并安装新的驱动程序430.26(下载NVIDIA-Linux-x86_64-430.26.run):

sudo apt-get --purge remove "*nvidia*"
sudo /usr/bin/nvidia-uninstall
chmod +x NVIDIA-Linux-x86_64-430.26.run
sudo ./NVIDIA-Linux-x86_64-430.26.run
[ignore abort]

cat /proc/driver/nvidia/version

NVRM version: NVIDIA UNIX x86_64 Kernel Module  430.26  Tue Jun  4 17:40:52 CDT 2019
GCC version:  gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)

sudo /usr/bin/nvidia-uninstall 这部分对我来说非常关键。其他什么都不起作用! - ShayPal5
曾经遇到过类似的问题,重启后运行这些命令帮助解决了问题,无需重新安装。 - Oussama Boumaad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接