Ubuntu20.04LTS 深度学习环境配置 CUDA11 + cuDNN8 + Tensorflow + Pytorch

本文最后更新于:1 年前

Introduction

Ubuntu的最新LTS版本也更新到了20.04,在给新机器配置深度学习环境的时候发现比以前容易了许多,特此写一篇Tutorial。这里的安装方法只针对Ubuntu20.04LTS,对于其他版本的系统可能不太适用。

Install GPU Drivers

这里假设安装系统之后已经做好了必要的配置(安装常用软件依赖、修改国内源等)。Ubuntu20.04中GPU驱动可以直接通过GUI界面安装,十分方便,方法是找到软件与更新 (Software & Updates),在附加驱动 (additional drivers) 选项卡中选择驱动版本,一般是选择“专有,tested” (proprietary, tested) 那个,之后点Apply Changes,重启。

如果是服务器的话,也可以采用命令行的安装方法。在命令行输入:

1
ubuntu-drivers devices

会列出驱动信息:

image-20201219103330645

可以看到推荐驱动版本是455,直接使用命令ubuntu-drivers autoinstall就可以自动安装推荐版本的驱动了。

Install CUDA & cuDNN

最常用的方式是按照官网的指导来安装CUDA,之后需要设置环境变量,在~/.bashrc中添加下列指令:

1
2
3
export PATH=/usr/local/cuda-11.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.0/lib64\
${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

还可以选择简单的方式,直接使用apt-get来安装CUDA:

1
sudo apt-get install nvidia-cuda-toolkit

不过这样会直接安装最新的CUDA版本,而PyTorch等深度学习框架不一定对最新的CUDA版本都有很好的支持,所以不推荐这种方式。

安装完CUDA之后输入nvcc --version可以测试是否安装成功,输入nvidia-smi可以看到GPU信息和CUDA版本。

之后安装cuDNN,进入官网,选择Download cuDNN:

会要求登录,如果没有账号的注册一个即可。在这里根据CUDA版本选择适合的cuDNN,我这里是CUDA10.2。我们选择deb包的方式安装,下载下图中圈出来的三个deb包,依次用sudo dpkg -i xxx.deb命令安装。

Configure Python

为了更好地管理Python包和虚拟环境,我们需要安装Anaconda。使用Anaconda之后,我们可以创建虚拟环境,虚拟环境之间互不干扰。做科学实验我们一般需要安装大量的Python包,有的包之间甚至还有冲突,如果我们把他们都安装在同一个环境下就会难以管理,甚至出冲突。而有了虚拟环境之后,我们可以把不同需求放在不同虚拟环境中,比如深度学习开发放在一个虚拟环境中(安装Tensorflow等),网站开发放在一个虚拟环境中(安装Flask等)。Anaconda默认自带大量的包,不过我们一般会创建新的虚拟环境去安装新的包,所以这里我们选用Miniconda。Miniconda和Anaconda唯一的区别是不会自带大量Python包,这里大家自行选择。Anaconda国内镜像下载地址为:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/,Miniconda国内镜像下载地址为:https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/。

比如说我们下载的是Miniconda3-py38_4.8.2-Linux-x86_64.sh,执行bash Miniconda3-py38_4.8.2-Linux-x86_64.sh即可安装。显示一大屏用户协议哪儿按q可以直接跳过,其他选项的默认的输入yes即可。在提示是否需要conda init的时候记得输入yes

安装成功之后,重开一个终端,可以看到现在处于base环境中:

我们先配置一下国内镜像,执行

1
vim ~/.condarc

然后粘贴下列文本使用清华源:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
channels:
- defaults
show_channel_urls: true
channel_alias: https://mirrors.tuna.tsinghua.edu.cn/anaconda
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

之后我们输入conda create -n <your_name>创建一个新的虚拟环境,如果需要指定Python版本,则conda create --n <your_name> python=<python_version>。之后输入conda activate <your_name>进入虚拟环境,如果需要退出,则使用conda deactivate

安装常用包:

1
conda install --yes numpy scipy pandas matplotlib tqdm pip jupyter

--yes的作用是手动输入y来确认是否安装,这里列出的是一些最常用的Python包,大家可以根据自己的需求自行调整。conda install为Anaconda中安装Python包的方式。

Install PyTorch

这里来安装PyTorch环境,推荐使用conda create -n pytorch创建一个专有虚拟环境,然后使用conda install安装常用包。对于安装PyTorch,我们可以使用conda也可以使用pip安装。pip是另外一个安装Python包的工具,由于不检查依赖所以比conda安装速度快,而且包的数量比conda多,使用也更广泛。同样pip也可以使用国内镜像加速下载,详见https://mirrors.tuna.tsinghua.edu.cn/help/pypi/。

对于CUDA11.0,官方给出的用conda安装PyTorch的命令(CUDA11.1也是这个)是:

1
conda install pytorch torchvision torchaudio cudatoolkit=11.0 -c pytorch

pip安装PyTorch的命令是:

1
pip install torch==1.7.1+cu110 torchvision==0.8.2+cu110 torchaudio===0.7.2 -f https://download.pytorch.org/whl/torch_stable.html

对于其他版本的CUDA安装命令可能不一样,可以去官网查看。

可以使用以下命令来测试GPU版本的PyTorch是否正常工作:

1
python -c "import torch; print(torch.cuda.is_available())"

Install Tensorflow

安装Tensorflow环境同样推荐创建一个专有虚拟环境。对于Tensorflow2的安装,使用pip十分方便,使用

1
pip install tensorflow tensorflow-gpu

即可。要安装其他版本的Tensorflow可以使用pip install tensorflow==<tf_version> tensorflow-gpu==<tf_version>来指定版本。不过不同版本的Tensorflow要求的CUDA版本都有所不同,可以参考官网的说明。

可以使用以下命令来测试GPU版本的Tensorflow是否正常工作:

1
python -c "import tensorflow as tf; tf.config.list_physical_devices('GPU')"