Ubuntu16.04 安装nvidia-driver + cuda9.0 + cudnn7.5

Install nvidia-driver ,CUDA and cuDNN on Ubuntu16.04

Posted by Icep on March 18, 2019

运行环境: Ubuntu 16.04

踩坑记录

官网下载 https://developer.nvidia.com/cuda-90-download-archive 下载 cuda_9.0.176_384.81_linux.run 文件

关闭 X server

1
$ sudo service lightdm stop

之后用ctrl+alt+F1 ~ F6,打开tty1 ~ 6, 登陆后运行该文件

1
$ sudo sh cuda_9.0.176_384.81_linux.run

一直按enter后选择选项

之后可能会报错:

1
The driver installation is unable to locate the kernel source

一般出现这种问题的原因是与CUDA官方要求的版本不符

CUDA9.0 官方支持的Ubuntu16.04的内核版本是4.4.0系列

所以我们更换内核版本

使用以下命令可以查看和安装内核版本

1
$ sudo apt-cache search linux|grep linux-image

可以直接安装4.4.0系列的一款版本

1
$ sudo apt-get install linux-image-4.4.0.77-generic linux-headers-4.4.0.77-generic

之后需要更换系统内核

Ubuntu如何更换系统内核

首先,查询可更换的内核序号

1
$ cat /boot/grub/grub.cfg

查询已经安装的内核和内核的序号,找到文件的menuentry

仔细观察menuentry底下还有一个submenu, submenu下面包含带有缩进的menutery

以下是计数规则:

第一个menuentry的序号是0,第二个submenu的序号是1, 以此类推,这是前面的序号,之后在1的submenu中,第一个menuentry的序号是0,第二个是1,以此类推

记住这几个编号

修改grub更换内核

1
$ sudo vi /etc/default/grub

如果没有使用grub修改过内核,第一行是

1
GRUB_DEFAULT=0

0是默认kernel

我们要做的就是把GRUB_DEFAULT=0改成

1
GRUB_DEFAULT="1 >9"

其中第一个数字1表示前面的序列编号,因为submenu是1

其中中间的空格与大于号是不能省略的,第二个数字9表示在submenu中的序号是第9(从0开始数的)

之后更新内核,重启

1
2
$ sudo update-grub
$ sudo reboot

这里更换内核为4.4.0的时候可能会导致分辨率出现问题

查看内核是否更换

1
$ uname -r

之后再次用刚才的操作关闭图形界面去安装driver

会将nvidia-driver以及nvidia-cuda-tookit安装成功

将cuda相关路径加入到环境变量中

1
$ vi ~/.bashrc

添加下面的

1
2
export PATH=/usr/local/cuda-9.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64:$LD_LIBRARY_PATH

使环境变量生效

1
$ source ~/.bashrc

使用nvidia-smi 验证nvidia-driver是否安装成功

重启使用nvcc -V 验证nvidia-cuda-toolkit是否安装成功

上面这种安装完之后再把内核切换为原来的版本4.15.0系列,可能会导致nvidia-smi产生问题,所以其实是存在问题,需要安装最新的nvidia-driver的版本才行

而且这样的情况下会导致安装完成后,无法正常打开ubuntu图形界面

安装cuDNN

(一般可以手动看一下cuda-9.0相应目录里面有没有libcudnn相关的动态链接库,如果有,说明安装的时候可能有自带)

cuDNN是cuda用于加速神经网络计算的动态链接库

一般cuda9.0比较配cudnn7.5

去nvidia官网下载cudnn的源码包https://developer.nvidia.com/cudnn

注意选择的文件linux的源码压缩包

之后下载后解压该文件

1
$ tar -zxvf cudnn-9.0-linux-x64-v7.5.0.56.tgz

切换到刚刚解压出来的文件夹

1
$ cd cuda

复制文件,之后设置权限

1
2
3
4
$ sudo cp include/cudnn.h /usr/local/cuda/include/
$ sudo cp lib64/lib* /usr/local/cuda/lib64/
$ sudo chmod a+r /usr/local/cuda/include/cudnn.h
$ sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

更新软链接

1
2
3
4
5
$ cd /usr/local/cuda/lib64/
$ sudo rm -rf libcudnn.so libcudnn.so.7
$ sudo ln -s libcudnn.so.7.5.0 libcudnn.so.7
$ sudo ln -s libcudnn.so.7 libcudnn.so
$ sudo ldconfig -v  # 立即生效

重启后再输入nvcc -V验证原来的cuda还能不能用