彻底搞清楚CUDA和cuDNN版本问题
1. 缘起
我的机器上以下三条指令输出的版本不相同。
nvcc -V # 这个输出11.7
nvidia-smi # 右上角显示12.3
import torch; torch.version.cuda # 这个输出12.1
我想以此为契机,彻底搞清楚CUDA、cuDNN和torch之间的关系。
环境:
Ubuntu 22.04
torch==2.1.2
2. CUDA
CUDA的版本傻傻分不清楚?请看电子包浆一图流:
Driver
是唯一能驱动GPU的,一般N卡都自带。它虽然也叫CUDA,但深度学习项目中所说的CUDA不是它。
Runtime
是Driver
的进一步封装,API更简洁。一般需要自己安装。它就是我们在深度学习项目中所说的CUDA,因为Runtime
是torch+cu
版本的必要依赖。
ps:其实这张图画得有问题。CUDA Application
不能同时用Runtime
和Driver
的API,两者是互斥的。
3. 各命令的区别
1. nvidia-smi
这个命令是CUDA Driver的组件,也就是说基本所有有N卡的机器都能使用这个命令。
注意,nvidia-smi
不可查询CUDA版本!!!这张图最上面的Driver Version
是实际的版本号,但CUDA Version
不是实际的版本号,而是当前Driver支持的最高CUDA版本。CUDA向下兼容,你的CUDA必须要小于等于这个版本号。
这里贴个nvidia-smi 命令的详细用法
2. nvcc -V
很简单,nvcc
是CUDA Runtime的编译器。输出的版本号就是机器上CUDA Runtime
的版本号。如下图第四行的末尾:
3. torch.version.cuda
它的输出不是当前CUDA的版本号!!!而是当前torch支持的最高CUDA版本!!!
上源码:
源码里的torch.version
都是用字符串写定的,根本没有去检查CUDA版本。
4. torch.backends.cudnn.version()
torch/cudnn/__init__.py
第八十行有源码(下图),但仅仅是一个封装了一个api,不知道输出究竟是什么逻辑。注意94行还有一个我们常用的is_available()
。
再找__cudnn.version
是怎么来的(下图)。第27行显示是_cudnn.getVersionInt()
,注意到第十行,找到torch._C
的目录(记得is_available()
吗,同样是这个目录)。
打开torch/_C
全部是python存根。__init__.pyi
里没有getVersionInt()
,有两个常量:_has_cuda
和_has_cudnn
,只规定了bool类型。torch/_C
中存在_cudnn.pyi
,如下图:
第5行所写的torch/csrc/cuda/shared/cudnn.cpp
是空的。到这线索就断了。
结论
虽然没有找到可读的源码,但我们已经可以得出一些有效的结论:
#####################################################
############ 以下的命令是反映机器上真实环境的 ############
#####################################################
$ nvcc -V # 查询CUDA Runtime版本
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Mon_Apr__3_17:16:06_PDT_2023
Cuda compilation tools, release 12.1, V12.1.105
Build cuda_12.1.r12.1/compiler.32688072_0
>>> torch.backends.cudnn.is_available() # 查询cuDNN是否可用
True
>>> torch.backends.cudnn.version() # cudnn的版本(输出代表8.9.02版本)
8902
#######################################################################
############ 以下命令输出只提示版本对应的关系,不代表机器上真实环境 ############
#######################################################################
$ nvidia-smi # 输出省略
>>> torch.version.cuda
'12.1'