CUDA 版本与 NVIDIA 显卡驱动

最近很长一段时间都在折腾 Isaacgym(一个由 NVIDIA 开发的 GPU 加速的物理引擎。目前这个引擎在不断更新,对显卡驱动和 CUDA 版本的需求也在不断更新,如果版本太旧就会报错,所以需要安装新的驱动的 CUDA。在安装时遇到了一些关于 CUDA 版本的问题。

近期由于一个基于 Isaacgym 的项目完成了对环境的调试,需要在服务器上测试训练代码是否存在问题,所以将项目代码传到了服务器上,打算开始进行训练,但是训练还没开始就报了以下的错误:

1
2
3
/buildAgent/work/45f70df4210b2e3e/source/cudamanager/src/CudaContextManager.cpp (635) : warning : CUDA driver version is 11020, expected at least 11040.

/buildAgent/work/45f70df4210b2e3e/source/cudamanager/src/CudaContextManager.cpp (370) : info : NVIDIA Release 411 graphics driver and above is required for GPU acceleration.

从报错信息来看,应该是 GPU 驱动的版本和 Isaacgym Preview 3 所需要的不兼容,需要 411 以上的 GPU 驱动和 11040 以上的 CUDA 版本,所以第一件事就是检查驱动和 CUDA 版本。

驱动版本和 CUDA 版本可以分别用nvidia-sminvcc -V来确定,结果如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.32.03 Driver Version: 460.32.03 CUDA Version: 11.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 GeForce RTX 3090 Off | 00000000:65:00.0 Off | N/A |
| 0% 46C P8 34W / 370W | 50MiB / 24265MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 1 GeForce RTX 3090 Off | 00000000:B3:00.0 Off | N/A |
| 0% 33C P8 17W / 370W | 1MiB / 24268MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 607207 G /usr/lib/xorg/Xorg 35MiB |
| 0 N/A N/A 607414 G /usr/bin/gnome-shell 12MiB |
+-----------------------------------------------------------------------------+

$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Thu_Nov_18_09:45:30_PST_2021
Cuda compilation tools, release 11.5, V11.5.119
Build cuda_11.5.r11.5/compiler.30672275_0

可以看到nvidia-smi的信息显示显卡驱动为 460,满足需求,但是 CUDA 版本为 11.2,版本过于陈旧,这个版本和 Isaacgym 报的错也是一致的。但是nvcc -V显示的 CUDA 版本却是 11.5,说明我安装过新的 CUDA,但是似乎 Isaacgym 并不认识这个版本的 CUDA。

关于这件事,在 stackoverflow 上已经有了详细的解答。CUDA 版本的不一致是由于 CUDA 本身有两套 API,一套 runtime API 和一套 driver API,nvidia-smi显示的是 driver API,指的是当前驱动最新能够支持的 CUDA 版本,这个版本甚至与本机是否安装了 CUDA 无关;而nvcc -V显示的是 runtime API,是用于安装的,并在环境变量中定义的 CUDA 的版本。从这里可以看到,Isaacgym 需要调用的是 driver API。那接下来需要解决的就是升级 CUDA 版本了,由于在服务器上开着 VNC 服务,所以如果需要升级显卡驱动就需要关闭所有的 VNC 才行,相当麻烦,那么一个想法就很自然地出现了:是否能够单纯升级 CUDA 版本?

NVIDIA 确实提供了这么一个功能,这个功能的名字叫做forward compatibility,用于在不升级显卡驱动的情况下兼容新的 CUDA。但是很遗憾的是, 该功能只对面向数据中心的 Tesla 型显卡和特定工作站提供 ——即使是在架构上 RTX 30 series 完全可以实现这个功能。

Forward Compatibility is applicable only for systems with NVIDIA Data Center GPUs or select NGC Server Ready SKUs of RTX cards. It’s mainly intended to support applications built on newer CUDA Toolkits to run on systems installed with an older NVIDIA Linux GPU driver from different major release families. This new forward-compatible upgrade path requires the use of a special package called “CUDA compat package”.

所以现在看来,唯一的升级 CUDA driver API 版本的方法还是直接升级显卡驱动,又需要一通操作,不愧是被 Linus 吐槽成”one of the worst trouble spots we've had with hardware manufacturers“的公司。