> 文档中心 > 我的AI之路(33)--解决CUDA10.1和NVIDIA GPU新版驱动430.xx序列造成黑屏或循环登录问题

我的AI之路(33)--解决CUDA10.1和NVIDIA GPU新版驱动430.xx序列造成黑屏或循环登录问题

    到目前为止,CUDA最新版仍然是10.1版,只是出了update2 https://developer.nvidia.com/cuda-downloads,自CUDA10.1开始,使用run文件安装过程中有了较大的变化,步骤进行了简化,也不再包含opengl文件所以无需--no-opengl-files参数,但是对于装有集成显卡+N卡的双显卡的环境,安装CUDA10.1有可能会造成问题。

    训练用的AI服务器使用的OS是Ubuntu16.04,桌面使用的Unity(注意:如果使用GNOME,在使用 sudo apt install nvidia-430安装驱动后据说可以登录进入桌面,没有下面说的Unity的循环登录问题),安装集成显卡(ASPEED)和另外有几张RTX2080TI卡,根据某模型的需要,安装CUDA10.1后(没有选择GPU Driver 418.xx,只安装了CUDA Tookit),重启后服务器黑屏了桌面始终出不来,于是用最新的430.50的run文件安装GPU驱动,然后桌面是可以出来了,但是输入用户和密码后又退回登录状态,也就是循环登录,进不去桌面,把以前对付低版本CUDA (<=10.0)和低版本NVIDIA GPU驱动(<400)造成黑屏或循环登录的多种办法都试尽了,还是循环登录进不去。

     后来把430版驱动卸掉又用CUDA10.1内自带的418版的驱动安装了一下,还是不行,折腾了一天第二天想既然run文件安装的不行,那用二进制驱动文件安装驱动效果会怎么样呢,于是查了下网上的ppa源按照下面的步骤添加ppa源:

   

     sudo add-apt-repository ppa:xorg-edgers/ppa

     sudo add-apt-repository ppa:graphics-drivers/ppa

     sudo apt-get update

然后执行下面的命令查看可安装的驱动版本列表发现只有430.26版,没有430.50:

     ubuntu-drivers devices

那就安装这个430.26吧,执行下面的命令:

     sudo apt-get install nvidia-430

     这个命令会安装NVIDIA GPU卡的430.26版驱动到/usr/lib/nvidia-430/下,而且同时生成一个/usr/lib/nvidia-430-prime目录,这个nvidia-430-prime下面有ld.so.conf文件,是用于指定主显卡的驱动的加载路径的,可以用于加载N卡自己的也可以是集成显卡的驱动,默认值是/usr/lib/nvidia-430-prime,也就是指向这个目录自己,所以,可以建立链接把你打算做为主显卡的显卡的驱动文件链接到这个目录下,也可以修改ld.so.conf内容,把路径改为要加载的驱动所在的路径。

安装完后,执行下面的命令生成NVIDIA卡的xorg.conf配置文件:

     sudo nvidia-xconfig

再reboot,结果这时会循环登录,不理它,按CTRL+ALT+F1进入console并登录进去,如果打算把集成显卡作为主显卡,以让xorg等进程不占用N卡的内存,确认下面这些给集成显卡用的intel相关驱动包是否存在,不存在则安装:

      sudo apt-get install –reinstall xserver-xorg-video-intel libgl1-mesa-glx libgl1-mesa-dri

然后,为了使intel卡和NVIDIA卡同时可用(驱动在系统启动时都需加载),必须修改/usr/lib/nvidia-430-prime/ld.so.conf内容(这是指向自己所在的这个目录,这是错误的,需要修改!因为/usr/lib/nvidia-430-prime/下面并没有显卡驱动文件),把

/usr/lib/nvidia-430-prime

修改为(红色为必须,黑色为可选):

/usr/lib/i386-linux-gnu/mesa
/usr/lib/i386-linux-gnu/mesa-egl

/usr/lib/x86_64-linux-gnu/mesa

/usr/lib/x86_64-linux-gnu/mesa-egl

/usr/lib/nvidia-430

/usr/lib32/nvidia-430

然后有两种办法让上面的配置生效,一是执行下面的切换主卡的命令触发配置生效

sudo prime-select intel

注意:如果主卡已经是Intel卡,那么需要先执行

sudo prime-select nvidia

再执行:

sudo prime-select intel

第二种办法就是直接执行sudo ldconfig命令。这样,上面的配置才会生效到/etc/ld.so.cache文件里,系统重启时才会加载指定的驱动文件。

最后,以二进制文件方式安装驱动后,需要把/usr/lib/nvidia-430/bin路径加入到PATH中,不然执行nvidia-smi之类的命令会报错说找不到这个文件,如果还报错说某些so文件找不到之类,则需要把/usr/lib/nvidia-430路径加入到LD_LIBRARY_PATH中。

修改 ~/.bashrc,增加:

export PATH=$PATH:/usr/lib/nvidia-430/bin

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/nvidia-430

安装完nvidia-430,nvidia-smi和nvidia-persistenced都安装在/usr/lib/nvidia-430/bin/下,执行

     sudo nvidia-persistenced --persistence-mode

可以执行缓存模式,当有多张N卡时让nvidia-smi命令很快有结果输出,也可以顺便检验一下各个NVIDIA GPU卡是否确实可以了。

然后

reboot

登录可以进入桌面了,进入桌面后,执行nvidia-smi可以看到Nvidia显卡信息列出来了。

但是有个奇怪问题是 系统重启后再执行

    sudo nvidia-persistenced --persistence-mode

总是说 command not found,哪怕你再手工再执行一遍

    export PATH=/usr/lib/nvidia-430/bin:$PATH

还是没用,但其实文件是存在的,执行

    sudo /usr/lib/nvidia-430/bin/nvidia-persistenced --persistence-mode

是可以的。

reboot后执行nvidia-persistenced报错找不到nvidia-persistenced时,不要安装它(它其实是存在的,只是要使用全路径执行,不知道为何),注意单独安装nvidia-persistenced会触发先删除nvidia-430驱动:

sudo apt-get install nvidia-persistenced
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  bbswitch-dkms dkms lib32gcc1 libc6-i386 libjansson4 libvdpau1 libxnvctrl0
  mesa-vdpau-drivers nvidia-prime nvidia-settings screen-resolution-extra
  vdpau-driver-all xserver-xorg-legacy
Use 'sudo apt autoremove' to remove them.
The following packages will be REMOVED:
  libcuda1-430 nvidia-430 nvidia-opencl-icd-430

The following NEW packages will be installed:
  nvidia-persistenced
0 upgraded, 1 newly installed, 3 to remove and 56 not upgraded.

这时需要再安装nvidia-430,安装nvidia-430时默认会卸载掉已安装的nvidia-persistenced:

sudo apt-get install nvidia-430
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  libcuda1-430 nvidia-opencl-icd-430
The following packages will be REMOVED:
  nvidia-persistenced

The following NEW packages will be installed:
  libcuda1-430 nvidia-430 nvidia-opencl-icd-430
0 upgraded, 3 newly installed, 1 to remove and 56 not upgraded.

 

使用primse-select可能出现的问题以及解决办法:

apt-get install nvidia-prime
prime-select query
# required python2,not python3
root@gpu-tesla-v100:/data/AI# prime-select query
Traceback (most recent call last):
  File "/usr/bin/prime-select", line 401, in
    if not switcher.print_current_alternative():
  File "/usr/bin/prime-select", line 259, in print_current_alternative
    gl_alternatives = self._get_current_gl_alternative()
  File "/usr/bin/prime-select", line 216, in _get_current_gl_alternative
    return self._get_current_alternative(self._gl_switcher, self._gl_switcher_other)
  File "/usr/bin/prime-select", line 203, in _get_current_alternative
    raw_alternative = switcher.get_current_alternative()
  File "/usr/bin/prime-select", line 83, in get_current_alternative
    c = p.split('\n')
TypeError: a bytes-like object is required, not 'str'
update-alternatives --config python
#切换成 python2.7, 然后执行
prime-select intel
#然后再执行
update-alternatives --config python
#切换成默认python3.0,不然云服务器重启后在浏览器内会远程登录连接不了!

一个延伸问题:

dockerr容器启动时报错:

   Error response from daemon: Cannot restart container f7c7d50d1e5a: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"process_linux.go:432: running prestart hook 0 caused \\\"error running hook: exit status 1, stdout: , stderr: nvidia-container-cli: initialization error: driver error: failed to process request\\\\n\\\"\"": unknown

   可能原因有两个: 

     1. CUDA被误删了,解决办法(以CUDA10.0为例): 

         apt-get update
         apt-get install cuda-toolkit-9.0

     2.服务器同时有Nvidia显卡和Intel集成显卡,当前主卡被误切换为Intel卡了,导致Nvidia卡驱动没有加载,执行prime-select nvidia

如果仍然报错:

   NVIDIA-SMI couldn't find libnvidia-ml.so library in your system. Please make sure that the NVIDIA Display Driver is properly installed and present in your system.Please also try adding directory that contains libnvidia-ml.so to your system PATH.

这是NVIDIA卡驱动没安装好,重新安装430或440:

     apt install nvidia-driver-440

并在~/.bashrc里设置路径

     export PATH=/usr/local/bin:/usr/local/cuda/bin:$PATH
     export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib/nvidia-440:/usr/local/cuda/lib64:$LD_LIBRARY_PATH

仍然报错: nvidia-container-cli: initialization error: driver error: failed to process request

如果是nvidia-container-toolkit被误删了,再安装它:

   sudo apt-get update && sudo apt-get install -y --reinstall nvidia-container-toolkit

如果仍然报上面的错, 用update-alternatives --config python把默认python版本切换成 python2.7, 然后执行:

    prime-select nvida

然后记得用 update-alternatives --config python把默认python版本切换回python3。

另外,上面其实还有几个疑问尚未查清:

     一是 如果把N卡设置为主卡的话,为何Unity桌面能出来但是仍旧是循环登录;

     二是 为何用CUDA10.1的run文件安装即使没有选择安装它内部自带的418版GPU driver也会把系统搞黑屏(这意味着把主显卡(集成显卡或者N卡)的驱动的加载都搞没了),CUDA10.1相对于以前的CUDA版本有较大变化,怀疑它有bug,在安装过程中可能修改了库文件的加载配置还是怎么的,不清楚;

     三是 NVIDIA 4xx序列的GPU驱动相对于以前3xx序列的驱动似乎有了大的改动,用4xx驱动的run文件安装后会导致Unity桌面循环登录总进不去的问题,用以前解决旧版CUDA和3xx序列驱动时期解决问题的办法去试图解决都没用,这是为什么不知道;

     四是 服务器使用的集成显卡是知名度不高的ASPEED,不是英特尔HD 530/620/630之类的显卡,是不是ASPEED本身有什么兼容性不好的地方,换成英特尔的显卡就没这问题?不知道。

     因为服务器要急用,没多少时间让我折腾,这些问题只能等我后面双11时自己买了机器后(我中意的居然国庆节一分钱都没降价,t...d )再逐一弄明白,反正现在对显卡驱动的路径和加载、主副显卡的切换的控制弄得比较明白了,后面查找到问题原因和予以解决应该可以,以后再回头补充。