Ubuntu & Nvidia驱动修复

  好吧,我知道我很久没写博客了,我会改的。
  这篇博文记录一下解决 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日修复成功,这段时间确确实实踩了不少的坑,具体的一些修复失败的报错信息未能及时截图,所以这篇博文也是缺少了一些完整性。

药方一

  最开始参考了我当初配置的方法(点我)。简化版步骤如下:

  1. 添加源并更新:
    sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt-get update
  2. 安装 nvidia 驱动:
    sudo apt-get install nvidia-<version> sudo apt-get install mesa-common-dev sudo apt-get install freeglut3-dev
    版本自行选择合适的吧,截止今天最新版本的应该是 nvidia-396
  3. 重启系统让显卡驱动生效;

  之前我按照这个步骤是成功安装了驱动,检查方法可以通过终端输入 nvidia-smi 来查看显卡状态,如果报错,则说明驱动安装异常。但是这次按照这个方法失败了,而且尝试装了不同的版本多次。

药方二

  参考方法(点我),简化版步骤如下:

  1. 先卸载已有的 nvidia 驱动:
    sudo apt-get remove --purge nvidia-*
  2. 添加源并更新:
    sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt-get update
  3. 安装 nvidia 驱动:
    sudo apt-get install nvidia-370
  4. 重启系统让显卡驱动生效,通过
    lsmod | grep nvidia
    查看 nvidia 驱动模块是否已经加载
  5. 查看 nouveau 驱动模块是否启动
    lsmod | grep nouveau
    如果启动了,需要禁用,nouveau 是Ubuntu自带的驱动,在安装 nvidia 驱动时是需要禁用的,后面的方法有提到这个步骤。当然,我使用这个方法修复依然是失败了。

药方三

  这次不使用 apt-get 的方式安装,而是到 nvidia 官网下载 runfile 驱动(点我),选择你的显卡型号和系统参数,下载对应的驱动安装文件。简化版步骤如下:

  1. 将 nouveau 禁止启动命令写入文件 /etc/modprobe.d/blacklist-nouveau.conf
    blacklist nouveau options nouveau modeset=0
  2. 重新生成内核的 initramfs:
    sudo update-initramfs -u
  3. 重启系统后,ctrl+alt+F1 进入tty模式(没有桌面的终端模式),关闭 x server:
    sudo servie lightdm stop
  4. 安装下载的 .run 文件:
    sudo sh nvidia-xxx.run
    按照默认设置进行安装;

  按照这个方法安装后不需要重启,执行 nvidia-smi 可以成功看到驱动的基本使用情况,尴尬的是,重启后又失效了。

药方四

  参考官网步骤通过直接安装 cuda 的方法。阅读官方文档可以看到,安装 cuda 的时候可以附带把 nvidia 的驱动一起安装,当然也可以选择跳过不安装。
  cuda 可以通过 Package Manager 的方式安装,也可以选择 runfile 形式,具体可以参考上面的官网文档链接:

  1. 首先第一步,查看硬件和软件信息,可以点击参考预步骤
  2. 第二步,禁用 nouveau 驱动,可以点击参考禁用 nouveau
  3. 安装 cuda, 执行 sudo sh cuda_<version>_linux.run,这里我尝试了安装 cuda 自带的 nvidia 驱动,也尝试了先自行安装 nvidia 驱动(如 apt-get 方式和 runfile 方式),然后再单独安装 cuda;
  4. 重启系统;

  按这个方法安装重启后,依然看不到驱动生效。

对症下药

  真是把能尝试的方法都排列组合尝试了一遍,都行不通,笑容逐渐消失

  无意中,我看到了这篇帖子,难道是内核被升级了导致了与 nvidia 驱动的不兼容?输入命令 uname -u 可以查看到我目前 Ubuntu 的内核驱动版本是 4.4.0-128,这里可以看到所有的内核版本。只能尝试降级内核版本再试试了。

  1. 下载内核
    sudo aptitude install -y linux-image-<version>-generic linux-headers-<version>
  2. 修改 grub 启动文件 /etc/default/grub,将文件中 GRUB_DEFAULT=0 修改为 GRUB_DEFAULT=”Advanced options for Ubuntu>Ubuntu, with Linux <version>-generic”;
  3. 更新 grub,sudo update-grub,重启系统;
  4. 期间看到了这篇文章。拉到最下面可以看到考虑先安装 cuda,过程中选择不安装 nvidia 驱动。然后再安装 nvidia 驱动;
  5. 安装 cuda,sudo sh cuda_<version>_linux.run
  6. 安装最新的 nvidia 驱动,sudo apt-get install nvidia-396
  7. 重启进入降级的内核系统,输入 nvidia-smi 看到以下信息:

  成功了…情绪逐渐稳定。

结语

  这次修复确实走了不少的弯路,建议可以取消 Ubuntu 的自动更新,防止内核的自动升级。好啦,我要去训练我的智障机器人啦!

enjoy it!

0%