2021年12月9日更新:可查看本人最新的CUDA环境配置博客:https://zhuanlan.zhihu.com/p/443114377,系对本文的提炼、归纳与总结
经过许久的沉淀,对于驱动+CUDA Toolkit+cuDNN+pytorch+cudatoolkit这套环境的配置流程,现总结如下:
显卡型号
适配的CUDA版本
,并选择其中一个CUDA版本
适配的驱动版本
,并选择其中一个软链接
、~/.bashrc
,详见正文(Windows用户可参考这篇博客配置环境变量
)CUDA版本
支持的cuDNN版本
下载并安装pytorch
+cudatoolkit
,需注意cudatoolkit
与CUDA Toolkit
一样要选择与显卡型号
和驱动版本
适配的版本,pytorch版本则按需选择版本的确定流程为:显卡型号
>> CUDA
>> 驱动
&cuDNN
CUDA是一个并行计算平台和编程模型,简单来说,它使得你能够用NVIDIA GPU进行通用计算。使用CUDA前,显卡一定要安装好驱动(事实上,没装驱动的显卡什么都干不了)。
CUDA有两种API,分别是:随驱动
安装的driver API(nvidia-smi
显示的CUDA版本就是driver API的版本);随CUDA Toolkit
安装的runtime API(可以用nvcc -V
查看runtime API的版本)。两者版本不需要一致。 driver API的CUDA不能完成runtime API的CUDA的工作,所以仅安装驱动而不安装CUDA Toolkit
或cudatoolkit
是没法在开发中使用CUDA的。
CUDA Toolkit
由NVIDIA官方发行,不仅包含了CUDA的runtime API,还包含了CUDA代码的编译器nvcc
(CUDA也有自己的语言,代码需要编译才能执行)和debug工具等。
cudatoolkit
为pytorch提供的、编译好的、用以支持pytorch运行的CUDA部件(动态链接库DLL等),在运行pytorch时,调用的CUDA都是cudatoolkit
;仅当需要编译依赖CUDA的torch拓展模块时,会调用CUDA Toolkit
(可以参考这个帖子)。
综上述3、4条,cudatoolkit
与CUDA Toolkit
没有关系,版本也不需要一致。且在使用pytorch时,如果不需要编译CUDA代码,则不会调用CUDA Toolkit
,也不需要安装CUDA Toolkit
;仅在pytorch中使用CUDA的话,cudatoolkit
就足够了。 经测试,仅安装pytorch
+cudatoolkit
,而没有安装CUDA Toolkit
时,也是可以在pytorch中使用CUDA的。
无论是CUDA Toolkit
还是cudatoolkit
,在安装时都必须选择与显卡型号
和驱动版本
适配的版本。
cuDNN(CUDA 深度神经网络库)是经GPU加速的深度神经网络基元库,可大幅优化标准例程(例如用于前向传播和反向传播的卷积层、池化层、归一化层和激活层)的实施。可以简单地将cuDNN
理解为CUDA的拓展和加速模块。CUDA Toolkit
的cuDNN需要专门安装;而cudatoolkit
中包含了cuDNN的相关部件。
注:与pytorch不同,TensorFlow
的运行必须依赖CUDA Toolkit
等,详见TensorFlow官方的安装指南
当前时间2021年6月10日,服务器的配置是Ubuntu 18.04.4 LTS (GNU/Linux 5.3.0-28-generic x86_64)
+RTX3090
,采用conda管理环境,选择的版本号如下
环境名称 | 最新版本号 | 所用版本号 |
---|---|---|
显卡驱动 | 460.84 | 455.23 |
CUDA Toolkit | 11.3 | 11.1 |
cuDNN | 8.2.1 | 8.0.5 |
pytorch | 1.8.1 | 1.8.0 |
cudatoolkit | 11.1 | 11.1 |
python | 3.9.2 | 3.9.1 |
只讲重点
首先搞清楚显卡型号、CUDA版本、显卡驱动版本之间的关系,并依此确定安装什么版本的CUDA
和驱动
:
①确定CUDA版本:NVIDIA不同型号显卡的计算能力不同,而不同的CUDA版本能支持的最大计算能力不同,详见CUDA的维基百科,截图如下:
可见,由于RTX3090的计算力为8.6,11.1以下版本的CUDA都无法支持,所以最低需要安装CUDA 11.1
(不管是这里的CUDA Toolkit
还是下文的cudatoolkit
)。
②确定显卡驱动版本:CUDA官方文档显示了显卡驱动版本和CUDA版本之间的关系,截图如下:
可见,CUDA 11.1
最少需要455.23
版本的显卡驱动(Linux 64-bit系统)。
综上,我们首先确定RTX3090最少需要CUDA 11.1
,并选择安装CUDA 11.1
,然后确定CUDA 11.1
最少需要455.23
版本的驱动,最终确定安装CUDA 11.1
+ 455.23驱动
。
接下来进行安装:
①在NVIDIA驱动下载页面搜索显卡支持的驱动并下载安装,这个很简单,截图如下:
②下载CUDA Toolkit并安装:
按照NVIDIA官方的说明下载和运行安装程序:
wget https://developer.download.nvidia.com/compute/cuda/11.1.0/local_installers/cuda_11.1.0_455.23.05_linux.run
sudo sh cuda_11.1.0_455.23.05_linux.run
由于已经安装了驱动,这里取消驱动的选项,再Install
需要注意:/usr/local/
目录下可以同时存在(安装)多个不同版本的CUDA Toolkit(例如cuda-11.1
、cuda-11.2
),而默认使用的那个是名为cuda
的软链接,如果你的系统里没有安装过其他版本的CUDA Toolkit,安装程序会自动创建软链接到你刚刚安装的CUDA Toolkit上,否则会进行询问,如下图所示
这里取决于你是否要将刚刚安装的这个CUDA Toolkit设为默认,之后也可以手动进行软链接,例如下述命令就是删除了原本的软链接,再将cuda-11.1设为默认:
sudo rm -rf /usr/local/cuda
sudo ln -s /usr/local/cuda-11.1 /usr/local/cuda
安装程序结束后会弹出一个Summary
(配图是11.0版本,仅用以辅助说明)
根据Summary的指示,需要保证~/.bashrc
的PATH
中包含/usr/local/cuda-11.1/bin
、LD_LIBRARY_PATH
中包含/usr/local/cuda-11.1/lib64
,打开~/.bashrc
,在文件末添加:
export PATH="/usr/local/cuda-11.1/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-11.1/lib64:$LD_LIBRARY_PATH"
最后重启终端或执行指令source ~/.bashrc
(以应用~/.bashrc
的修改),完成CUDA Toolkit的安装
Windows用户可参考这篇博客配置环境变量
注意:软链接
和~/.bashrc
的改动都会影响到当前用户所使用的CUDA Toolkit版本,这里面的细节我还没有搞清楚,但这两者最好设置为同一版本的CUDA Toolkit
下载cuDNN并解压、复制文件到CUDA Toolkit目录。cuDNN版本与CUDA版本之间的关系在下载页面有显示,选择适配的安装即可。
打开浏览器,打开Anaconda官网,选择如图所示的版本,右击,复制链接地址(本人于2021.06.10通过复制得到的下载地址为:https://repo.anaconda.com/archive/Anaconda3-2021.05-Linux-x86_64.sh)。
然后进入终端,输入如下指令进行下载:
wget https://repo.anaconda.com/archive/Anaconda3-2021.05-Linux-x86_64.sh
下载完成后,使用指令
sudo sh Anaconda3-2021.05-Linux-x86_64.sh
进行安装,一路yes
安装完成后,替换Anaconda源为清华大学开源软件镜像站(请查看使用帮助)
conda具体的用法在此不赘述,直接
conda create -n py python=3.9
创建一个名为py,python版本号为3.9的conda环境,中途会提示是否继续(proceed),当然yes
注意: 若指令为conda create -n py python==3.9
,则python版本强制为3.9.0;仅使用一个等号时,conda会自动安装最新的python 3.9.x
注意:务必看文章开头的“重要概念”
cudatoolkit
为pytorch提供的、编译好的、用以支持pytorch运行的CUDA部件(动态链接库DLL等)。
cudatoolkit
与CUDA Toolkit
没有关系,版本也不需要一致。但都必须选择与显卡型号
和驱动版本
适配的版本,因此这里也选择11.1版本进行安装。
在运行pytorch时,调用的CUDA都是cudatoolkit
;仅当需要编译依赖CUDA的torch拓展模块时,会调用CUDA Toolkit
(可以参考这个帖子)。
所以假如我们安装CUDA Toolkit 11.2
和pytorch 1.8.0
+ cudatoolkit 11.1
,实际运行的仍是pytorch 1.8.0
+ CUDA 11.1
这里不折腾pytorch preview(nightly)
测试版了,直接按照pytorch官方的教程安装稳定版
首先激活conda环境
conda activate py
然后安装pytorch + cudatoolkit
conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cudatoolkit=11.1 -c pytorch -c conda-forge
完成
依旧是在上文创建的conda环境里输入指令,首先激活conda环境
conda activate py
具体的测试指令和对应的结果如下
(py) usr1@ubuntu:~$ python -c "import torch; print(torch.__version__)"
1.8.0
(py) usr1@ubuntu:~$ python -c "import torch; print(torch.version.cuda)"
11.1
(py) usr1@ubuntu:~$ python -c "import torch; print(torch.backends.cudnn.version())"
8005
(py) usr1@ubuntu:~$ python -c "import torch; print(torch.cuda.current_device())"
0
依次代表pytorch版本,cuda版本,cudnn版本,当前显卡设备号(0
表示当前所用显卡的序号为0,若显卡无法使用会报错)
还可以使用以下指令测试显卡
(py) usr1@ubuntu:~$ python -c "import torch; print(torch.cuda.is_available())"
True
(py) usr1@ubuntu:~$ python -c "import torch; print(torch.cuda.device_count())"
8
此外,使用nvcc -V
指令可以测试CUDA Toolkit是否正确安装,以及所使用的版本:
(py) usr1@ubuntu:~$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2020 NVIDIA Corporation
Built on Tue_Sep_15_19:10:02_PDT_2020
Cuda compilation tools, release 11.1, V11.1.74
Build cuda_11.1.TC455_06.29069683_0
若上述测试没有报错,则确定CUDA可以正常使用
注1:本人之后在系统里安装了8.1.1的cuDNN,但torch.backends.cudnn.version()的返回值仍为8005,因此cudatoolkit中应该包含了cuDNN相关的部件)
注2:头文件/usr/local/cuda/include/cudnn_version.h
内有cuDNN版本的计算方法,8005 = 8x1000 + 0x100 + 5
注3:可以使用conda list
指令查看pytorch
、torchvision
、torchaudio
、cudatoolkit
等是否正确安装,有时候会因为安装发生了错误而导致代码运行时报错