选中内容(绿色)时除了会搜索文章名,还会搜索文章内容
点击结果中的文章名进入文章界面后可以按Ctrl+F在页面内搜索
  • 版权:CC BY-SA 4.0
  • 创建:2020-03-10
  • 更新:2022-06-21
Linux 为 Tensorflow 安装 Nvidia 显卡驱动及常见问题解决方法


查看显卡是否检测到

  1. > lspci | grep -i nvidia
  2. 81:00.0 VGA compatible controller: NVIDIA Corporation GP102 [GeForce GTX 1080 Ti] (rev a1)
  3. 81:00.1 Audio device: NVIDIA Corporation GP102 HDMI Audio Controller (rev a1)

先试试以下命令看是否已经可以直接使用, 如果不报错就可以

  1. dpkg -l |grep nvidia
  2. nvidia-smi

安装

Manjaro

对于 Manjaro, 直接在 设置->硬件设定里面选择,右键选择合适的版本安装,然后重启即可。
或者使用mhwd 命令在终端安装卸载, 具体使用sudo mhwd -h 查看

manjaro_nvidia_driver

如果安装 Tensorflow 是使用 docker 的方式,安装的版本无所谓,尽量新一点的驱动就可以,或者比最新的老一个版本;

如果不是使用 docker 安装,则需要注意,不同版本的驱动带的cuda版本不同,这个需要去官网了解,比如这里 440 会安装 10.02 的驱动,而 tensorflow 现在(2020.5.1)最高只支持 10.01,所以如果装了这个驱动,自己还需要手动去安装一个 10.01 版本的 cuda,如果事 435 版本则直接是 10.01。 以后出新版了情况应该也类似

Ubuntu

其它(Ubuntu deepin)如下:

官网有很多文档: https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#runfile

  • 查看源里面的驱动版本
    1. sudo apt search "nvidia-driver"
    2. sudo apt search "nvidia-dkms"
  1. ~ sudo apt search "nvidia-driver"
  2. 正在排序... 完成
  3. 全文搜索... 完成
  4. nvidia-384/bionic-updates 390.116-0ubuntu0.18.04.3 amd64
  5. Transitional package for nvidia-driver-390
  6. nvidia-384-dev/bionic-updates 390.116-0ubuntu0.18.04.3 amd64
  7. Transitional package for nvidia-driver-390
  8. nvidia-driver-390/bionic-updates 390.116-0ubuntu0.18.04.3 amd64
  9. NVIDIA driver metapackage
  10. nvidia-driver-418/bionic-updates 430.50-0ubuntu0.18.04.2 amd64
  11. Transitional package for nvidia-driver-430
  12. nvidia-driver-430/bionic-updates 430.50-0ubuntu0.18.04.2 amd64
  13. NVIDIA driver metapackage
  14. nvidia-driver-435/bionic-updates,now 435.21-0ubuntu0.18.04.2 amd64 [已安装]
  15. NVIDIA driver metapackage
  16. nvidia-headless-390/bionic-updates 390.116-0ubuntu0.18.04.3 amd64
  17. NVIDIA headless metapackage
  18. nvidia-headless-430/bionic-updates 430.50-0ubuntu0.18.04.2 amd64
  19. NVIDIA headless metapackage
  20. nvidia-headless-435/bionic-updates 435.21-0ubuntu0.18.04.2 amd64
  21. NVIDIA headless metapackage
  22. nvidia-headless-no-dkms-390/bionic-updates 390.116-0ubuntu0.18.04.3 amd64
  23. NVIDIA headless metapackage - no DKMS
  24. nvidia-headless-no-dkms-430/bionic-updates 430.50-0ubuntu0.18.04.2 amd64
  25. NVIDIA headless metapackage - no DKMS
  26. nvidia-headless-no-dkms-435/bionic-updates 435.21-0ubuntu0.18.04.2 amd64
  27. NVIDIA headless metapackage - no DKMS
  28. xserver-xorg-video-nvidia-390/bionic-updates 390.116-0ubuntu0.18.04.3 amd64
  29. NVIDIA binary Xorg driver
  30. xserver-xorg-video-nvidia-430/bionic-updates 430.50-0ubuntu0.18.04.2 amd64
  31. NVIDIA binary Xorg driver
  32. xserver-xorg-video-nvidia-435/bionic-updates,now 435.21-0ubuntu0.18.04.2 amd64 [已安装,自动]
  33. NVIDIA binary Xorg driver

这里可以看到有435版本的驱动,符合自己的要求;如果版本太低了,可能是源的问题,可以检查一下源的设置,比如设置成官方的然后apt update后再查找,如果是debian系(比如Ubuntu也算)的,一定要在这一步确认有符合自己要求的驱动版本(驱动版本太低tensorflow会提示驱动版本过低,比如tensorflow2.1至少需要418版本,这个在tensorflow官方的安装页有说明)

如果源里面没有,可以添加源sudo add-apt-repository ppa:graphics-drivers/ppa

  • 在官网下载显卡驱动(注意不需要下载和安装cuda)

注意: 这里下载官方驱动只是为了留存备份,下载了先不要进行安装,不一定用得到这个,如果是Dedian 系,不到万不得已,一定不能使用这个安装,使用官方源里面的驱动, 不然可能出现一些问题 (NVIDIA官网下载 ), 所以也可以先不下载,后面需要的时候再下载

  • 禁用nouveau, 并安装驱动

Ubuntu默认内置了Nvidia的第三方jiuhaole开源驱动nouveau,在安装nvidia驱动的时候,会和nouveau驱动冲突,所以需要讲该驱动禁用

  1. $ sudo gedit /etc/modprobe.d/blacklist.conf

在blacklist.conf中添加:

  1. blacklist nouveau
  2. options nouveau modeset=0

然后

  1. sudo update-initramfs -u

或者

  1. sudo reboot
  • 确认系统里面没有其它版本的驱动了
    如果之前是安装包(.run)安装的,可以使用安装包sudo ./NVIDIA_....run --uninstall来卸载,或者sudo /usr/bin/nvidia-uninstall; 如果dkms status有驱动,则使用dkms remove nvidia/418.102.04 --all卸载,注意这里版本号要与dkms staus中的一样
    可以通过这些命令查看,应该都提示找不到或者没有 nvidia 就算卸载好了(cuda这里没有提,有或没有不影响,可以一起卸载了,反正docker的方式 不会用到)

    1. cat /proc/driver/nvidia/version
    2. nvidia-smi
    3. dkms status
    4. lsmod | grep nvidia

    如果卸载了所有驱动proc/driver目录下还是有nvidia的东西,可以尝试重启就会没有了

  • 重启后可能就没有图形界面了,按ctrl+alt+F2 进入终端进行操作;ubuntu需要在grun进入recover模式,选择root用户操作

  • 如果还能进图形界面说明之前就是使用的专有驱动,打开终端输入sudo init 3进入到命令行模式

  • 前面我们确认了源里面有的驱动版本,选择最新的下载,比如我这里选择了435版本

    1. apt install nvidia-driver-435
    2. apt install nvidia-dkms-435
    3. apt list -i|grep nvidia-driver
    4. # 看下具体的驱动版本,比如 nvidia-driver-450/bionic-updates,bionic-security,now 450.102.04-0ubuntu0.18.04.2 amd64 [installed] 就是 450.102.04
    5. dkms install nvidia/450.102.04

    这里在安装的时候,如果要安装老版本的驱动需要注意,使用apt search nvidia-driver可能会出现比如418版本驱动后面的介绍实际上指向了430版本,430又指向了440440又指向了450,所以导致执行安装418版本最后实际安装的是450版本!!!

    1. nvidia-driver-418/bionic-updates 430.50-0ubuntu0.18.04.2 amd64
    2. Transitional package for nvidia-driver-430

    解决办法暂时没有深究,仔细看一下你需要的版本和它实际的版本,如果实在不能找到你需要的版本,也许需要使用安装包安装了

  • 安装完成后确认安装是否正确,输入

    1. nvidia-smi
    2. dkms status

    能看到显卡信息和NVIDIA内核模块信息,而且两者版本一致,如果提示错误,可以在下面找找错误解决方法

  • 如果不是用官方源安装,使用安装包安装,也是在这一步执行,可能会遇到一些问题。。。

可能会出现一些问题

有时候装驱动遇到问题,重启也许是个不错的选择, 重启了进不了图形界面也不要慌, 进入安全模式, 或者如 Manjaro 能进入开机处按ctrl+alt+F3

ERROR: NVIDIA driver is not loaded

NVIDIA-SMI has failed because it couldn’t communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.

先尝试:

  1. nvidia-modprobe

如果还不行, 可以尝试重启
如果仍然有问题:

  1. sudo apt install nvidia-prime
  2. sudo prime-select nvidia
  1. ls /lib/modprobe.d
  2. cat blacklist-nvidia.conf

或者

  1. ls /etc/modprobe.d
  2. cat blacklist-nvidia.conf
  3. cat blacklist.conf

blacklist-nvidia.conf文件:

  1. # Do not modify
  2. # This file was generated by nvidia-prime
  3. blacklist nvidia
  4. blacklist nvidia-drm
  5. blacklist nvidia-modeset
  6. alias nvidia off
  7. alias nvidia-drm off
  8. alias nvidia-modeset off

可以看到这里被加入黑名单了,屏蔽或者删掉即可。如果没有就不用管

然后

  1. sudo update-initramfs -u
  2. sudo modprobe nvidia # nvidia-modprobe

如果 sudo modprobe nvidia 提示找不到这个 模块, 说明驱动没装好或者不够新, 重新装一下, 比如ubuntu sudo apt install nvidia-driver-440 就会有了

另外如果要使用系统附加系统推荐的驱动时, ubuntu 附加驱动变成了手动选择的驱动,其它选项是灰色的

  1. ubuntu-drivers devices
  2. sudo ubuntu-drivers autoinstall

其实附加驱动里面的驱动版本比较低,普通使用可以用,但是给 tensorflow 就不太行,版本太久了跟新的 cuda 的版本不兼容,最后使用cuda时还是会提示需要更新驱动,所以装官网下载的最新驱动才是最好的

NVIDIA DKMS 版本不正确 (NVRM: API mismatch)

  1. NVRM: API mismatch: the client has the version 418.113, but
  2. NVRM: this kernel module has the version 390.116. Please
  3. NVRM: make sure that this kernel module and all NVIDIA driver
  4. NVRM: components have the same version.

如果使用官网下载的二进制包安装,可能会提示错误,如果忽略错误继续使用可能会提示这个,我的解决办法是使用源里面的而不是NVIDIA官方的就好了,安装源里面的版本相同的nvidia-driver 和 nvidia-dkms 即可

Failed to initialize NVML: Driver/library version mismatch

看系统已经加载了的驱动版本

  1. cat /proc/driver/nvidia/version

再看最新装的驱动版本

  1. apt list -i |grep -i nvidia-driver
  2. # cat /var/log/dpkg.log|grep nvidia

不一样就卸载装成一样的就好了,或者保证所有的驱动卸载干净再装; 也有可能是旧的文件没有清理干净,比如之前430然后卸载了,这些文件还在,安装了新的就会提示版本冲突了,可以重启解决,重启了旧的文件也会被自动清理掉

另外一种情况就是 驱动自动更新了, 使用dkms statusapt list --installed|grep -i nvidia查看显卡版本可能一致为新版本,但是cat /proc/driver/nvidia/version版本依然是旧版本,最简单的方法直接重启机器就好了,如果不能重启机器,可以尝试重载驱动即可, 首先按ctrl+alt+f2切换到终端,然后

  1. sudo systemctl isolate multi-user.target
  2. lsmod | grep nvidia

杀死所有相关进程

  1. sudo lsof /dev/nvidia* | grep -v PID | grep -v lsof | awk '{print $2}' | xargs sudo kill -9

然后

  1. sudo rmmod nvidia_drm
  2. sudo rmmod nvidia_modeset
  3. sudo rmmod nvidia_uvm
  4. sudo rmmod nvidia
  5. sudo lsof /dev/nvidia*
  6. lsmod | grep nvidia

就没有相关进程了

然后运行

  1. nvidia-smi

就会自动装载驱动了

如果需要启动图形界面:

  1. sudo systemctl start graphical.target

也可以设置关闭驱动自动更新,这样就不会遇到这种烦恼了:

  1. sudo apt-mark hold nvidia-driver-415

/usr/bin/nvidia-modprobe: unrecognized option: “-s”

nvidia-modprobe 版本太低, apt update然后再装一遍,如果源里面没有新的可以手动下载和驱动版本一样的 nvidia-modprobe 安装

然后

  1. sudo rmmod nvidia_drm
  2. sudo rmmod nvidia_modeset
  3. sudo rmmod nvidia_uvm
  4. sudo rmmod nvidia
  5. sudo lsof /dev/nvidia*
  6. lsmod | grep nvidia

就没有相关进程了

然后运行

  1. nvidia-smi

如果重启了 docker 还是用不了 stderr: nvidia-container-cli: mount error: mount operation failed: /var/lib/docker/overlay2/7f807def5df421ec07411cb10db4c5cd3edcc7271e96669807bff18ef4a9db14/merged/proc/driver/nvidia/params/version/registry: no such file or directory\\\\n\\\"\"": unknown

重启 docker 可以解决

  1. sudo systemctl restart docker

Unable to determine the device handle for GPU 0000:05:00.0: Unknown Error

nvidia-container-cli: detection error: nvml error: unknown error: unknown.

可以先按照前面的错误解决方法

  1. cat /proc/driver/nvidia/version
  2. apt list -i |grep -i nvidia-driver
  3. # cat /var/log/dpkg.log|grep nvidia
  4. sudo systemctl isolate multi-user.target
  5. lsmod | grep nvidia
  6. sudo lsof /dev/nvidia* | grep -v PID | grep -v lsof | awk '{print $2}' | xargs sudo kill -9
  7. sudo rmmod nvidia_drm
  8. sudo rmmod nvidia_modeset
  9. sudo rmmod nvidia_uvm
  10. sudo rmmod nvidia
  11. sudo lsof /dev/nvidia*
  12. lsmod | grep nvidia
  13. nvidia-smi

再不行就重启试试

文章有误?有想法想讨论?查看或者发起勘误/讨论 主题
(发起评论需要先登录 github)

/wallpaper/wallhaven-j5lk95.jpg