ubuntu16.04安装CUDA 8.0(很详尽,包括一些坑的解决方法)
每次配置环境都头疼得要死,总是会遇到各种各样的问题,这次决心一劳永逸地解决这个问题,踩最多的坑,装最稳的环境。
先介绍用于测试的电脑:操作系统是在清华镜像上下载的ubuntu16.04LTS,内核版本是4.15.0-29-generic,电脑是联想Y430P,显卡我没记错的话是GTX850M,gcc版本是5.4.1。
本篇绝大部分操作需要管理员权限,即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私房菜