CUDA 版本与 NVIDIA 显卡驱动
最近很长一段时间都在折腾 Isaacgym(一个由 NVIDIA 开发的 GPU 加速的物理引擎。目前这个引擎在不断更新,对显卡驱动和 CUDA 版本的需求也在不断更新,如果版本太旧就会报错,所以需要安装新的驱动的 CUDA。在安装时遇到了一些关于 CUDA 版本的问题。
近期由于一个基于 Isaacgym 的项目完成了对环境的调试,需要在服务器上测试训练代码是否存在问题,所以将项目代码传到了服务器上,打算开始进行训练,但是训练还没开始就报了以下的错误:
1 | /buildAgent/work/45f70df4210b2e3e/source/cudamanager/src/CudaContextManager.cpp (635) : warning : CUDA driver version is 11020, expected at least 11040. |
从报错信息来看,应该是 GPU 驱动的版本和 Isaacgym Preview 3 所需要的不兼容,需要 411 以上的 GPU 驱动和 11040 以上的 CUDA 版本,所以第一件事就是检查驱动和 CUDA 版本。
驱动版本和 CUDA
版本可以分别用nvidia-smi
和nvcc -V
来确定,结果如下
1 | $ nvidia-smi |
可以看到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“的公司。