Ubuntu环境下NVIDIA GPU驱动问题笔记

在运维实验室GPU服务器的过程中,遇到的NVIDIA驱动问题。连续遇到后,结合网上的资料及与朋友的探讨来看,该问题比较常见,但有条理的、全的文档却没看到,因此我在此处记录踩坑和出坑的经验。

Ubuntu环境下NVIDIA GPU驱动问题笔记

1 问题描述

GPU服务器安装的是Ubuntu 16.04 LTS操作系统,每隔一段时间需要重启、重新开机后(因为停电、维护等),都会发现测试nvidia-smi命令时,提示NVIDIA-SMI无法与NVIDIA驱动通信的报错,具体报错如下:

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

重新安装驱动后,有时候正常,有时候会出现GUI工作不正常的循环登录问题,具体表现为:GUI界面用户登录,输入正确的密码大约3秒钟后,并未进入桌面,而是屏幕一黑,又回到登录界面。不论试多少次,都是反复、重复登录,始终无法进入GUI桌面。

2 原因分析

据查,该问题的原因大致是,Ubuntu会自动更新Linux内核,而且Ubuntu对Linux内核的更新还比较频繁,重启后就会换成升级的新版本的Linux内核。而NIVIDIA驱动安装时是针对安装时的内核版本,编译生成驱动的内核模块的。因此,当内核的版本升级时,此前安装的NVIDIA驱动因内核模块无法与新内核版本兼容,而导致NVIDIA驱动无法工作,于是在通过nvidia-smi检视GPU状态时出现无法与NVIDIA驱动正常通信,需要重新安装并运行最新版驱动的提示。

而GUI出现的循环登录问题,暂时还不理解具体的原因,应该是和GUI渲染与显卡的配置有关。服务器一般有一个显卡用于GUI渲染,和加速计算的GPU性能卡不同。具体原理存疑。

3 解决方案

首先,在NVIDIA官网下载最新版的GPU驱动;

随后,将驱动的*.run文件权限设置为可执行:

1
chomod 764 NVIDIA-Linux-x86_64-xxx.xx.run

接下来,临时关闭显示服务lightdm

1
sudo service lightdm stop

此时屏幕进入字符模式,但未出现Shell,键盘按键Ctrl+Alt+F1~6调出Shell(F1~6任选一个)

接下来需要输入登录的用户名、密码;

因为接下来装驱动需要以root身份运行,因此这里直接切换到root用户:

1
sudo su root

接下来卸载原驱动:

1
/usr/bin/nvidia-uninstall
  • 注意:如果此前是用官方*.run文件安装的,需要通过官方卸载程序卸载;

或:

1
sudo apt-get purge nvidia-*
  • 如果之前是通过apt安装的,则通过apt-get卸载干净;如果此前是通过*.run文件安装的,该命令无法有效卸载。

卸载完成后,重新安装新驱动:

1
./NVIDIA-Linux-x86_64-xxx.xx.run

一般按照默认选项即可;

注意:如果遇到循环登录问题,安装驱动时需要加上--no-opengl-files选项:

1
./NVIDIA-Linux-x86_64-xxx.xx.run --no-opengl-files

关于这个--no-opengl-files选项在该问题中的作用,暂时找不到可靠的、准确的解释。

以下解释摘自:Ubuntu16.04 CUDA与OpenGL分离的环境配置(侵删) 这样安装的驱动不包含OpenGL部分,也就是不使用NVIDIA的驱动去加速Ubuntu的GUI界面和其它3D应用。OpenGL这部分就有劳Intel的核显了。(你要是还要用Ubuntu玩游戏,那请忽略此文,何必呢,装个Windows双系统呗,或者KVM+GPU Pass through,至于KVM怎么弄,有时间再详细写)。

这样,用核显做显示,性能很够用了,而且驱动很稳定,GUI再也没死过了。AMD的显卡驱动也还不错,插一个低端AMD卡专门做显示也是可以的。NVIDIA的私有驱动就专注于CUDA吧。

安装完成后,启动显示服务即可:

1
service lightdm start

至此,屏幕回到GUI界面,应可正常操作。

4 相关链接

我在搜索该问题时,发现这两种问题还是比较常见的,但网上的资料要么是没有针对性,要么是梳理混乱,不全,可读性、可操作性差,以下列举提对要点的几个链接:

Ubuntu安装NVIDIA驱动后,无法登录,循环登录,登录界面进不去,回到登录界面

nvidia-smi报错(重装Nvidia驱动)

Ubuntu16.04 CUDA与OpenGL分离的环境配置