每次配置环境都头疼得要死, 总是会遇到各种各样的问题, 这次决心一劳永逸地解决这个问题, 踩最多的坑, 装最稳的环境.
先介绍用于测试的电脑: 操作系统是在清华镜像上下载的 ubuntu16.04LTS, 内核版本是 4.15.0-29-generic, 电脑是联想 Y430P, 显卡我没记错的话是 GTX850M.
本篇绝大部分操作需要管理员权限, 即 sudo, 也许不把 cuda 安装到 / usr/lib 而是自己的 home 目录下可以不用 sudo 权限, 但我没有尝试, 有兴趣的可以自己尝试一下.
一, 更换内核
CUDA8.0 最高仅支持 4.4 版本内核, 因此第一步工作就是更换系统内核. 如你的内核不高于 4.4, 可以跳过整个该步骤.
先介绍两个命令, 一个是 sudo dpkg --get-selections|grep Linux-image, 该命令会检查 apt 下载的所有 Linux-image 开头的包, 也就是内核; 另外一个命令是 uname -r, 该命令返回结果是当前系统所用内核版本.
在我自己的电脑上, 命令行敲入 sudo dpkg --get-selections|grep Linux-image 并执行, 返回了四个结果, 分别为:
- Linux-image-4.15.0-29-generic
- Linux-image-4.4.0-148-generic
- Linux-image-generic
- Linux-image-generic-hwe-16.04
执行 uname -r 返回的结果是 Linux-image-4.15.0-29-generic, 说明我当前使用的内核版本是第一个.
关于内核操作的详细解释, 请参考附录 1, 为保证正文简洁, 只记录如何更换内核.
首先用 grep menuentry /boot/grub/grub.cfg 命令查看有哪些内核, 如没有需要的内核可以用 apt-get 下载 (这个我没有尝试, 因为系统自带了一个 4.4). 我执行这个命令后显式如下图.
我想要将 Linux-image-4.15.0-29-generic 修改为 Linux-image-4.4.0-148-generic, 执行 sudo VIM /etc/default/grub, 打开 grub 设置文件, 将 GRUB_DEFAULT=0 改为 GRUB_DEFAULT='Advanced options for Ubuntu>Ubuntu, with Linux 4.4.0-148-generic'. 随后执行 sudo update-grub, 如无错误提示, 即意味着 / boot/grub/grub.cfg 修改成功, 然后 sudo reboot 重启电脑. 注意, 重启电脑后, 本来光标默认位置应该在 Ubuntu, 现在光标位置默认在 Ubuntu 的下一行, 即 Advanced options for Ubuntu, 直接回车进入, 下一个界面光标的默认位置应该在 Ubuntu, with Linux 4.4.0-148-generic, 直接回车即可. 进入界面, uname -r 检查显示更改内核成功.
这里我本来是希望可以直接登入 Ubuntu 即是更改后的内核, 但尝试了很多方法, 最终都必须通过 Advanced options for Ubuntu 修改加载内核, 如果有高手搞定了, 还请不吝赐教.
此外, 如果你是强迫症患者, 但又不知道如何处理这种情况, 可以选择将 Kernel 4.15 直接删掉, 但我个人认为这个方法不够优雅, 因此不列出了.
二, 禁用 nouveau
简单介绍一下 nouveau, 简单来说它和 nvidia 系列有冲突, 不禁用的话可能会导致黑屏或循环登陆, 因此一定要禁掉.
这里提供一个不太一样的禁用方法, 这种方法不需要重启电脑.
分为四部: 1. 首先 ctrl+alt+f1 切换到命令行界面, 输入账号密码登录; 2. 然后 sudo service lightdm stop 关闭图形界面; 3.sudo modprobe -r nouveau 将 nouveau 彻底干掉; 4. 执行 lsmod | grep nouveau 返回空说明 nouveau 已经清理干净.
modeprobe 是内核模块管理一个很好用的工具, 这里不做具体介绍了, 详情请参考鸟哥的 Linux 私房菜 19 章.
三, 安装 CUDA
终于到了安装 CUDA 的步骤了, 在禁用 nouveau 后, 不要急着启用 lightdm, 转到 cuda 安装文件所在目录, 用 sudo 命令进行安装, 我的 cuda 安装文件名为 cuda_8.0.61_375.26_linux.run, 记得要禁用 opengl, 所以我的命令就是 sudo ./cuda_8.0.61_375.26_linux.run --no-opengl-lib, 禁用 opengl 据说是为了防止和系统原有的 opengl 冲突. 其余默认安装即可.
四, 测试 CUDA 是否安装成功
转到 sample 保存目录, 像我在安装过程中用的默认保存位置, 因此它们在我的~/NVIDIA_CUDA-8.0_Samples / 目录下, 在这个目录下, 进入./1_Utilities/deviceQuery/, 在这个目录下 make 然后执行./deviceQuery. 如果出现如下画面说明 CUDA 安装成功.
五, 其他坑
说点其他比较零碎的坑.
1. 首当其冲就是安装 CUDA 结束时, 安装程序提醒一切就绪, 但是测试不通过, nvidia-smi 也无法执行, 但是 nvcc -V 显示结果无误.
这个问题的解决方法是我误打误撞试出来的, 具体为什么我也不清楚, 搜了很久也没找到答案. 解决方法是这样的, 用 sudo apt-get install nvidia-375 安装显卡驱动, 然后重启两遍 (对的, 重启一遍没用, 绝望之下我又重启了一遍), 一切问题消失, 出现了测试结果中的截图, nvidia-smi 也能正确工作了.
2. 用 blacklist 方式禁用 nouveau 的时候, 禁用掉的是 4.15 核的 nouveau, 禁不掉 4.4 核的, 所以我一怒之下, 直接把 nouveau 干掉了, 问题解决.
至此 CUDA 已经顺利安装, 后续会尝试在另一台电脑上安装 CUDA, 并在这个帖子更新安装结果. 此外还会在下一篇文章尝试不用 sudo 安装 caffe 的其他依赖.
附录 1: 内核操作的详细解释 (由鸟哥的 Linux 私房菜 (基础篇)19 章部分内容总结)
先简单介绍一下系统启动流程: 1. 加载 BIOS 的硬件信息并进行自我检查, 并根据设置读取第一个可启动的设备; 2. 读取并执行第一个启动设备内 MBR 的启动引导程序 (Linux 的启动引导程序一般为 grub 或 grub2);3. 根据启动引导程序的设置加载 Kernel,Kernel 会开始检测硬件并加载驱动程序; 4. 余下部分主要是 systemd 部分, 暂且不提. 其中启动引导程序又被称为 boot loader, 主要提供三个功能: 1. 提供选项, 是多重引导的重要功能; 2. 加载内核文件; 3. 转交其他 loader, 是实现 Linux 和 win 双系统的重要功能.
借由 boot loader 读取内核文件, 内核开始从 BIOS 手中接管硬件, 一般来说内核文件保存在 / boot 目录下, 以 vmlinuz 开头, 比如我的内核文件绝对路径为 / boot/vmlinuz-4.15.0-29-generic. 除 kernel 以外, boot loader 还会读取 initrd(虚拟文件系统), 这里暂不表.
boot loader 分为两个阶段: 1. 执行 boot loader 主程序, 没有安装 loader 的相关配置文件; 2. 主程序加载配置文件, 一般都在 / boot/grub/(或 / boot/grub2/, 我的系统是 / boot/grub / 目录) 目录下. 其中最重要的就是配置文件 grub.cfg. 官方不建议手动修改 grub.cfg 文件, 而是通过 grub-mkconfig(grub2-mkconfig) 命令产生新的 grub.cfg 文件. 配置文件的内容简介详情见鸟哥的 Linux 私房菜 (基础篇)19 章.
参考文献:
https://www.linkedin.com/pulse/installing-nvidia-cuda-80-ubuntu-1604-linux-gpu-new-victor 这篇文章介绍了很多安装 CUDA 中常见的坑, 囿于自身水平, 其中部分方法在我这里是失效的, 但我不知道原因.
https://blog.csdn.net/yhaolpz/article/details/71375762 这是一篇特别详尽的介绍安装 caffe 的博客
鸟哥的 Linux 私房菜
来源: https://www.cnblogs.com/left4back/p/10952845.html