简介:ubuntu16.04系统下 CUDA9.0+cuDNN7.4+tensorflow-gpu的环境部署是一个还比较麻烦的过程。对于安装了nvidia独立显卡的电脑想要部署深度学习环境,nvidia驱动,cuda,cudnn以及tensorflow的安装是一个绕不过去的流程。现在完整地介绍如何在nvidia独显的电脑上进行tensorflow深度学习环境的部署。
硬件配置:Intel7-8750,显卡gtx1070。
1. 安装ubuntu16.04系统
首先你要安装ubuntu操作系统,我建议用ubuntu16.04(ubuntu操作系统的安装过程这里不赘述)。装好ubuntu系统后相信你可能会遇到开机无法进入图形界面的问题。最常见的就是开机之后出现 “The system is running in low-graphics mode”,无论你选择哪一个选项都不起作用(硬是没办法进系统)
解决办法:开机在ubuntu选择界面时,按e键进入编辑界面,找到"... ro quiet splash" 。在quiet splash后添加nomodeset ,如下: "... ro quiet splash nomodeset",接着按F10启动系统,便可进入ubuntu16.04系统。这时候进入系统,会发现图标都很大,图形界面的分辨率很低,这是因为nvidia驱动还没有安装,接下来要做的就是安装nvidia驱动。不过有人可能会遇到循环进入ubuntu密码登陆界面的问题(依旧无法进入系统),这种情况呢一般都是重装nvidia驱动会发生,这个问题后面再说。先说说进入了ubuntu系统后的安装流程。
2. 卸载旧的nvidia驱动
这一步是针对要重新安装nvidia驱动所要进行的操作,为什么要重装呢?一般nvidia驱动和cuda版本最好要对应,另外tensorflow和cuda版本也是有对应关系的(这一点很重要),如果装错了tensorflow就没法用。建议不要安装太高版本的cuda,比如cuda10对应的tensorflow版本高于1.12。我推荐使用nvidia-384驱动+cuda-9.0+cudnn7.4+tensorflow_gpu-1.12,因为cuda-9.0的默认nvidia版本是nvidia-384(安装cuda-9.0的时候会默认安装nvidia-384.81),但是你去nvidia官网下载驱动会推荐使用nvidia-418.56(当然安装高版本也可以使用,只要装好了,不然还是要重装)。卸载旧的nvidia驱动命令如下:
sudo dpkg --list | grep nvidia-*
sudo apt remove --purge nvidia-\*
sudo apt-get remove --purge nvidia*
sudo apt autoremove
至此,nvidia驱动已经完全卸载啦。
3. 禁用nouveau
要使用nvidia驱动,禁用nouveau是必须的。编辑/etc/modprobe.d/blacklist.conf ,在末尾添加禁用nouveau配置,输入命令sudo gedit /etc/modprobe.d/blacklist.conf ,添加以下行对nouveau进行禁用:
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off
保存关闭后输入命令:
echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf
sudo mv /lib/modules/4.15.0-45-generic/kernel/drivers/gpu/drm/nouveau/nouveau.ko /home/nouveau.ko
sudo update-initramfs -u
lsmod |grep nouveau
4. 卸载旧的内核文件
如果存在旧的内核文件建议把它卸载掉。输入命令 查看内核文件:dpkg --list | grep linux-image 。然后将旧版本的内核文件purge掉,比如用以下命令: (4.10.0-28 为老的内核版本号)
sudo apt-get purge linux-image-4.10.0-28
sudo apt-get autoremove
sudo update-grub
5. 安装nvidia独显驱动
走到这一步又是关键啦,这里提供两种方法安装nvidia驱动。
第一种是去官网下载nvidia驱动安装执行文件(https://www.nvidia.com/Download/Find.aspx),例如下载驱动NVIDIA-Linux-x86_64-390.87.run (官方似乎已经下不到384版本的啦) 到本地,然后按ctr+alt+F1进入纯命令行界面(安装nvidia驱动是要关掉屏幕显示的,所以要记住下载驱动的存放位置)。在纯命令行界面输入用户名和密码后进入下载驱动文件目录(如: cd ~/Downloads),然后输入以下命令进行安装
sudo chmod a+x NVIDIA-Linux-x86_64-390.87.run
sudo ./NVIDIA-Linux-x86_64-390.87.run --no-x-check --no-nouveau-check --no-opengl-files
第二种方式就是在线安装啦,保证网络不中断用apt命令安装(当然也是要切换到纯命令行界面),直接输入:
sudo apt-get install nvidia-384 (这个看起来要简单一些,前提是要保证网络稳定)
安装完nvidia驱动后,按ctr+alt+F7切换回桌面(切记不要关机或重启),需要进行一些设置以便重启时系统能够使用上安装好的nvidia驱动,输入命令:sudo gedit /etc/default/grub ,找到 ... quiet splash... 那一行(是不是有点眼熟),将这一行quiet splash后面改为 acpi_osi=linux , 改完后大概是 GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi_osi=linux" , 保存关闭输入命令:sudo update-grub
至此,nvidia驱动配置好啦,可以输入命令查看版本:cat /proc/driver/nvidia/version 。 输入命令 nvidia-smi 也应该能看到显卡和驱动的信息。
6. 安装cuda
建议装完nvidia驱动后立即安装cuda,到cuda官网下载cuda文件(cuda官网:https://developer.nvidia.com/cuda-toolkit-archive)。输入如下命令进行cuda配置和安装:
sudo dpkg -i cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64.deb
sudo apt-key add /var/cuda-repo-9-0-local/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda-9.0
其实运行 sudo apt-get install cuda-9.0 时,在cuda安装的同时系统也会给你装上对应的nvidia驱动(这样不久省去安装手动安装nvidia驱动了吗?我觉得是这样的,所以建议这一步也在纯命令行界面进行安装)。完了之后输入下面两行命令。
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
接着进行环境变量的配置,编辑bashrc文件,输入命令:sudo gedit ~/.bashrc, 添加下面两行保存设置(要根据实际安装路径来)
export PATH=/usr/local/cuda-9.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64\${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
然后安装下nvidia-cuda-toolkit,输入命令:
sudo apt install nvidia-cuda-toolkit
完成后,输入命令:nvcc -V 即可发现cuda安装成功。至此,nvidia驱动和cuda都配置完成,可以重启电脑试试,可顺利进入ubuntu说明配置成功,此时屏幕分辨率也得到改善,说明nvidia独显驱动正在起作用。测试一下cuda
cd /usr/local/cuda-9.0/samples/1_Utilities/deviceQuery
sudo make
sudo ./deviceQuery
另外,可以通过命令查看cuda版本:cat /usr/local/cuda/version.txt
可以通过命令卸载安装的cuda:sudo /usr/local/cuda-9.0/bin/uninstall_cuda-9.0.pl
可以通过命令卸载NVIDIA Driver : sudo /usr/bin/nvidia-uninstall
7. 安装cudnn
去cudnn官网下载cudnn文件:https://developer.nvidia.com/rdp/cudnn-download(需注册),用dpkg命令安装即可。
sudo dpkg -i libcudnn7_7.4.2.24-1+cuda9.0_amd64.deb
sudo dpkg -i libcudnn7-dev_7.4.2.24-1+cuda9.0_amd64.deb
sudo dpkg -i libcudnn7-doc_7.4.2.24-1+cuda9.0_amd64.deb
复制文件到cuda9.0下面
cd /usr/local/cuda
sudo cp lib64/* /usr/local/cuda-9.0/lib64/
sudo cp include/cudnn.h /usr/local/cuda-9.0/include/
给文件赋予权限
sudo chmod a+r /usr/local/cuda-9.0/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
执行命令:sudo ldconfig
接着测试一下cudnn代码,将cudnn_samples_v7拷贝到家目录进行编译(里面有三个例子)
cp -r /usr/src/cudnn_samples_v7/ $HOME
cd ~/cudnn_samples_v7/mnistCUDNN
make
./mnistCUDNN #这个例子有可能会报错,但好像不影响使用
查看cudnn版本号
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2 #不一定对
cat /usr/include/cudnn.h | grep CUDNN_MAJOR -A 2 #试试这个
卸载旧版本cudnn
sudo rm -rf /usr/local/cuda/include/cudnn.h
sudo rm -rf /usr/local/cuda/lib64/libcudnn
8. 安装tensorflow-gpu
可以直接使用 sudo pip install tensorflow-gpu 命令安装tensorflow-gpu(前提是已安装了pip),这时候你会发现安装的是最新版本(比如1.13.1),与我们的cuda版本不匹配,import tensorflow也会报错,因此pip安装最好指定版本号sudo pip install tensorflow-gpu=1.12.0。也可以去下载一个gpu版本的tensorflow,在本地使用pip安装,注意要下载1.12版本(下载地址:https://pypi.org/project/tensorflow-gpu/1.12.0/#files )
sudo pip install tensorflow_gpu-1.12.0-cp35-cp35m-manylinux1_x86_64.whl
完成后启动一个python3脚本,输入 import tensorflow as tf, 看是否顺利通过。
测试一下tensorflow对gpu的支持,输入下面代码
import tensorflow as tf
from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())
print(tf.test.gpu_device_name())
9. 其他问题
问题1:输入nvidia-smi命令出现 failed to initialize nvml driver/library version mismatch
输入 sudo dpkg --list | grep nvidia-* 和 cat /proc/driver/nvidia/version 发现版本是不一致的。这时候需要reload一下kernel mod 。命令行执行:
sudo rmmod nvidia
sudo nvidia-smi
如果第一步出错,显示
rmmod: ERROR: Module nvidia is in use by: nvidia_modeset nvidia_uvm 。那就把依赖于 nvidia的两个mod先卸载掉(nvidia_modeset 和 nvidia_uvm), 执行:
sudo rmmod nvidia_uvm
sudo rmmod nvidia_modeset
然后再重复上一步命令。
问题2:重装nvidia驱动或者cuda后开机循环进入ubuntu密码登陆界面的问题
一般是nvidia驱动或者cuda未配置好导致的。这时按ctr+alt+F1 进入纯命令行界面进行nvidia驱动卸载操作,卸载nvidia驱动命令前面已经给出,卸载完成后可以立即进行重装(注意版本要装对)。建议将nvidia驱动和cuda先完全卸载,然后从前面的第6步开始,如果实在不行那就卸载nvidia驱动和cuda完成后重启系统按照最开始的流程一步步往下走。总之卸载干净重装一遍就对啦!