深度学习三件套:Ubuntu 20.04 安装 NVIDIA 驱动/CUDA/cuDNN全流程

成功不是终点,失败也并非末日,最重要的是继续前进的勇气。

——英/温斯顿·丘吉尔

最近从Ubuntu 19.10升级到了20.04 LTS,感兴趣可以看Ubuntu 20.04 尝鲜记:从 19.10 升级和安装

系统升级之后需要重新安装深度学习三大件(NVIDIA Driver/CUDA/cuDNN),简单记录一下完整流程和一些BUG的解决方法,以备后用。

安装NVIDIA驱动

使用ubuntu-drivers devices命令查看显卡型号和推荐驱动版本:

1
2
3
4
5
6
7
8
9
ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00001C03sv00001B4Csd000011D7bc03sc00i00
vendor : NVIDIA Corporation
model : GP106 [GeForce GTX 1060 6GB]
driver : nvidia-driver-435 - distro non-free
driver : nvidia-driver-440 - distro non-free recommended
driver : nvidia-driver-390 - distro non-free
driver : xserver-xorg-video-nouveau - distro free builtin

自动安装推荐(recommended)的驱动:

1
sudo ubuntu-drivers autoinstall

或者也可以直接安装指定驱动:

1
sudo apt install nvidia-driver-440

安装成功后重启,确认能进入系统后使用nvidia-smi命令确认安装成功:

1
2
3
4
5
6
7
8
9
10
Sat May  2 12:31:52 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.64 Driver Version: 440.64 CUDA Version: 10.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 106... Off | 00000000:01:00.0 On | N/A |
| 27% 37C P0 28W / 120W | 445MiB / 6070MiB | 0% Default |
+-------------------------------+----------------------+----------------------+

P.S. 『循环登陆』

在Ubuntu 18.04和19.10上我遇到循环登陆的问题,但在20.04上还采用自动安装没有遇见这类问题。如果真的遇到循环登陆,开机后选择Ubuntu (Advanced)引导,在root权限下删除所有nvidia驱动相关软件后,禁用开源noueau驱动,下载并使用runfile进行local安装,附加以下参数。

1
sudo sh NVIDIA-Linux-x86_64-440.64.run -no-x-check -no-nouveau-check -no-opengl-files

安装CUDA

CUDA是NVIDIA推出的用于自家GPU的并行计算框架,也就是说CUDA只能在NVIDIA的GPU上运行,而且只有当要解决的计算问题是可以大量并行计算的时候才能发挥CUDA的作用。

TensorFlow的CUDA版本一直值得诟病,目前最新的消息是普遍支持CUDA 10.1,所以我们就安装 CUDA Toolkit 10.1 update2 Archive 好了。

打开CUDA Toolkit 10.1 页面按照18.04版本安装本地runfile:

1
2
3
4
# 先下载runfile到本地
wget http://developer.download.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda_10.1.243_418.87.00_linux.run
# 再运行runfile
sudo sh cuda_10.1.243_418.87.00_linux.run

如果按照上述流程安装了最新的NVIDIA Driver,runfile安装过程中会提醒是否继续(Existing package manager installation of the driver found. It is strongly recommended that you remove this before continuing.),选择继续continue,在后续选择安装内容时去除驱动选择。

查看NVIDIA官方User Guide可以知道,CUDA Toolkit 10.1支持的gcc编译器版本为7.3.0,Ubuntu 20.04自带的gcc版本为9.3.0,如果出现gcc版本问题我们可以添加override标识跳过gcc版本检查。

1
sudo sh cuda_10.1.243_418.87.00_linux.run --override

运行成功后看见输出Summary,根据提示需要进行环境变量的设置,在.bashrc(ZSH使用者对应.zshrc)末尾追加如下文字。

1
2
3
4
5
# 还是使用.bashrc文件举例,zsh用户自行替换为.zshrc
echo '# CUDA Soft Link' >> ~/.bashrc
echo 'export PATH=/usr/local/cuda-10.1/bin${PATH:+:${PATH}}' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-10.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}' >> ~/.bashrc
source ~/.bashrc

最后测试以下CUDA是否成功安装,运行nvcc -V:

1
2
3
4
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Sun_Jul_28_19:07:16_PDT_2019
Cuda compilation tools, release 10.1, V10.1.243

或者也可以运行位于/usr/local/cuda-10.1/samples/中的测试用例,具体不说了,按照我前面的流程一步步走下来没毛病。

安装cuDNN

cuDNN(CUDA Deep Neural Network library):是NVIDIA打造的针对深度神经网络的加速库,是一个用于深层神经网络的GPU加速库。如果你要用GPU训练模型,cuDNN不是必须的,但是一般会采用这个加速库。

cuDNN Archive 页面挑选适合我们CUDA版本的cuDNN,我们选择cuDNN v7.6.4 (September 27, 2019), for CUDA 10.1 - cuDNN Library for Linux

cuDNN的下载需要注册,相信对于大家来说并不是什么问题。下载并解压之后运行如下命令将cuDNN压缩包中的文件拷贝到CUDA 10.1的文件夹中:

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

查看CUDA和cuDNN版本

1
2
3
4
# CUDA 版本
cat /usr/local/cuda/version.txt
# cuDNN 版本
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

通过软链接同时维护和使用多个版本的CUDA库

在安装完成CUDA和对应cuDNN的库之后,我们可以看到/usr/local/cuda指向了当前的CUDA文件夹:

1
lrwxrwxrwx  1 root root   20 May  3 16:38 cuda -> /usr/local/cuda-10.1

观察得知/usr/local/cuda是一个链接文件,在上述安装过程中被安装程式自动指向了当前安装版本的CUDA所在文件夹,于是我们可以通过更新链接指向,维护多个CUDA版本并动态的调用。

1
2
# ln -snf [源] [链接文件] 更新链接文件的指向
sudo ln -snf /usr/local/cuda-10.0 /usr/local/cuda

再次观察/usr/local/cuda指向了新的CUDA文件夹,由于我们上面过程中添加在.bashrc or .zshrc 中的路径是/usr/local/cuda/***,于是这一条命令就可以改变当前调用的CUDA及cuDNN版本了。

不过CUDA的文件夹不算小,同时维护CUDA10.0-TF1.15/CUDA10.1-TF2.X/CUDA10.2-PyTorch使得SSD上的空间岌岌可危,所以说,Linux的正确分区挂载习惯hh

TensorFlow及Pyorch安装 (顺手)

虚拟环境不说了,virtualenv还是conda自选。(我是用miniconda,用什么装什么。)

TensorFlow

TensorFlow目前最高支持Python 3.7 && CUDA 10.1。

旧版 TensorFlow(1.x),CPU 和 GPU 软件包是分开的:

1
2
pip install tensorflow==1.15      # CPU
pip install tensorflow-gpu==1.15 # GPU

对于TensorFlow 2.x CPU 和 GPU 软件包是统一的:

1
2
pip install tensorflow            # CPU 和 GPU 的最新稳定版
pip install tf-nightly # 预览 build(不稳定)

PyTorch

PyTorch最高支持CUDA 10.2,同时支持10.1和9.2版本。我们安装CUDA 10.1版本对应的PyTorch。

1
pip install torch==1.5.0+cu101 torchvision==0.6.0+cu101 -f https://download.PyTorch.org/whl/torch_stable.html

Reference

  1. https://www.tensorflow.org/install/gpu
  2. https://developer.nvidia.com/cuda-10.1-download-archive-update2?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1804&target_type=runfilelocal
  3. https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html
  4. https://blog.csdn.net/u014380165/java/article/details/77340765

History

  1. 2020-05-02: 创建
  2. 2020-05-03: 添加通过修改软链接维护和调用不同版本CUDA的方法