好吧,我知道我很久没写博客了,我会改的。
这篇博文记录一下解决 Ubuntu 下 Nvidia 驱动和 cuda 失效问题的解决过程。
环境
- win10 和 Ubuntu16.04 双系统;
- gpu 为 nvidia 的 gtx1080;
起因和前言
5月27日晚上 win10 自动更新的时候貌似把boot启动文件搞没了,导致重启开机的时候找不到启动目录,这个时候其实可以在 windows 下通过工具对启动文件进行修复,但是由于对 win10 长期的不满(好像不能取消自动更新,吃个鸡也经常蓝屏),干脆直接重装了 win7,并且修复了 grub 启动,至此可以顺利进入双系统。
进入Ubuntu后,愉快的打开了 PyCharm 开始用 pyTorch 训练我的智障中文对话机器人(目前仍是智障状态),发现训练异常慢,debug 后发现居然使用 cpu 训练样本,感觉非常意外,终端输入 nvidia-smi
查看显卡使用状态时发现报错了,具体报错信息忘了,大概就是说驱动有问题无法使用,所以也无法使用 cuda 进行训练。
先把主要的原因写在前面,可能是由于 Ubuntu 自动更新了我的内核到 4.4.128 版本,导致这个内核与 nvidia 的驱动出现不兼容的情况,类似这里和这里出现的情况,如果读者也遇到了这种情况,直接跳过下一节参考第四节的对症下药步骤,如果不是的话,可以参考病急乱投医踩的坑中的几个方法。
病急乱投医踩的坑
从5月30日开始进行修复到6月3日修复成功,这段时间确确实实踩了不少的坑,具体的一些修复失败的报错信息未能及时截图,所以这篇博文也是缺少了一些完整性。
药方一
最开始参考了我当初配置的方法(点我)。简化版步骤如下:
- 添加源并更新:
sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt-get update
- 安装 nvidia 驱动:
sudo apt-get install nvidia-<version> sudo apt-get install mesa-common-dev sudo apt-get install freeglut3-dev
版本自行选择合适的吧,截止今天最新版本的应该是nvidia-396
- 重启系统让显卡驱动生效;
之前我按照这个步骤是成功安装了驱动,检查方法可以通过终端输入 nvidia-smi
来查看显卡状态,如果报错,则说明驱动安装异常。但是这次按照这个方法失败了,而且尝试装了不同的版本多次。
药方二
参考方法(点我),简化版步骤如下:
- 先卸载已有的 nvidia 驱动:
sudo apt-get remove --purge nvidia-*
- 添加源并更新:
sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt-get update
- 安装 nvidia 驱动:
sudo apt-get install nvidia-370
- 重启系统让显卡驱动生效,通过
lsmod | grep nvidia
查看 nvidia 驱动模块是否已经加载 - 查看 nouveau 驱动模块是否启动
lsmod | grep nouveau
如果启动了,需要禁用,nouveau 是Ubuntu自带的驱动,在安装 nvidia 驱动时是需要禁用的,后面的方法有提到这个步骤。当然,我使用这个方法修复依然是失败了。
药方三
这次不使用 apt-get
的方式安装,而是到 nvidia 官网下载 runfile 驱动(点我),选择你的显卡型号和系统参数,下载对应的驱动安装文件。简化版步骤如下:
- 将 nouveau 禁止启动命令写入文件
/etc/modprobe.d/blacklist-nouveau.conf
:blacklist nouveau options nouveau modeset=0
- 重新生成内核的 initramfs:
sudo update-initramfs -u
- 重启系统后,
ctrl+alt+F1
进入tty模式(没有桌面的终端模式),关闭 x server:sudo servie lightdm stop
- 安装下载的 .run 文件:
sudo sh nvidia-xxx.run
按照默认设置进行安装;
按照这个方法安装后不需要重启,执行 nvidia-smi
可以成功看到驱动的基本使用情况,尴尬的是,重启后又失效了。
药方四
参考官网步骤通过直接安装 cuda 的方法。阅读官方文档可以看到,安装 cuda 的时候可以附带把 nvidia 的驱动一起安装,当然也可以选择跳过不安装。
cuda 可以通过 Package Manager 的方式安装,也可以选择 runfile 形式,具体可以参考上面的官网文档链接:
- 首先第一步,查看硬件和软件信息,可以点击参考预步骤;
- 第二步,禁用 nouveau 驱动,可以点击参考禁用 nouveau;
- 安装 cuda, 执行
sudo sh cuda_<version>_linux.run
,这里我尝试了安装 cuda 自带的 nvidia 驱动,也尝试了先自行安装 nvidia 驱动(如apt-get
方式和 runfile 方式),然后再单独安装 cuda; - 重启系统;
按这个方法安装重启后,依然看不到驱动生效。
对症下药
真是把能尝试的方法都排列组合尝试了一遍,都行不通,笑容逐渐消失。
无意中,我看到了这篇帖子,难道是内核被升级了导致了与 nvidia 驱动的不兼容?输入命令 uname -u
可以查看到我目前 Ubuntu 的内核驱动版本是 4.4.0-128,这里可以看到所有的内核版本。只能尝试降级内核版本再试试了。
- 下载内核
sudo aptitude install -y linux-image-<version>-generic linux-headers-<version>
- 修改 grub 启动文件
/etc/default/grub
,将文件中GRUB_DEFAULT=0
修改为GRUB_DEFAULT=”Advanced options for Ubuntu>Ubuntu, with Linux <version>-generic”
; - 更新 grub,
sudo update-grub
,重启系统; - 期间看到了这篇文章。拉到最下面可以看到考虑先安装 cuda,过程中选择不安装 nvidia 驱动。然后再安装 nvidia 驱动;
- 安装 cuda,
sudo sh cuda_<version>_linux.run
; - 安装最新的 nvidia 驱动,
sudo apt-get install nvidia-396
; - 重启进入降级的内核系统,输入
nvidia-smi
看到以下信息:
成功了…情绪逐渐稳定。
结语
这次修复确实走了不少的弯路,建议可以取消 Ubuntu 的自动更新,防止内核的自动升级。好啦,我要去训练我的智障机器人啦!