装新环境按CLRNet项目要求装了个1.8.0的 pytroch,训练的时候报错。
先是显示 RuntimeError: CUDA error: no kernel image is available for execution on the device
,网上查了一圈都说是当前显卡的算力太低,不支持高版本的 CUDA。
看了一眼显卡:3090;而且之前用 pytorch 也没出现这种问题。
往上翻了一下训练途中的 warning,看到一句:
GeForce RTX 3090 with CUDA capability sm_86 is not compatible with the current PyTorch installation
UserWarning:
NVIDIA GeForce RTX 3090 with CUDA capability sm_86 is not compatible with the current PyTorch installation.
The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_70.
If you want to use the NVIDIA GeForce RTX 3090 GPU with PyTorch, please check the instructions at https://pytorch.org/get-started/locally/
warnings.warn(incompatible_device_warn.format(device_name, capability, " ".join(arch_list), device_name))
错误描述:
CUDA capability sm_86 是说当前 GPU 3090 算力是 8.6,与安装的 PyTorch 版本不匹配。虽然错误描述里说的是 PyTorch,但实际上是说 PyTorch 依赖的 CUDA 版本
(因为我们安装的是 CUDA 版本的 PyTorch,如果使用 CPU 版的就不会有这个问题)。所以说,当前的 PyTorch CUDA 版本支持算力为只有 3.7、5.0、6.0、7.0,低于 GPU 3090 算力。
原因: 发现报错的原因是之前在搭环境时没有指定Cuda版本,默认下了10.2版本的cuda,因此不支持GPU3090的算力。需要安装11.2版本的Cuda才可支持。
关于 GPU 算力和 CUDA 算力的关系是:
- 算力 8.0 的显卡可以在最高支持算力 8.6 的 CUDA 下正常运行
- 但算力 8.6 的显卡不能在最高支持算力 8.0 的 CUDA下正常运行
- 也就是说 CUDA 支持的最高算力要大于等于GPU本身的算力
关于版本问题:
- CUDA 10.x 最高支持算力为 7.x,CUDA 11.x 最高支持算力为 8.x
报错环境:
- Linux:Ubuntu 18.04
- GPU:NVIDIA GeForce RTX 3090
- CUDA:10.2
- Pytorch:1.8.0
- Python:3.8
解决方法
升级CUDA版本,然后安装与CUDA版本相对应的Pytorch。
笔者直接安装了11.1版本的CUDA以及对应的pytorch,进入Pytorch官网,通过安装命令直接安装所需的pytorch版本和Cuda
pytorch各版本和cuda版本对应关系
使用方法: 注意低版本的 pytorch 是否支持更高版本的 cuda。(高版本的pytorch一般能兼容低版本cuda)例如:你需要 1.7.0 的 pytorch,那么 cuda 只能 11.0 及以下。官方推荐的cuda版本为10.2和11.3,这两种 cuda 支持大多数的 pytorch 版本。
(不过一般人都是根据cuda装pytorch,谁没事指定pytorch版本反装cuda啊,哦是复现baseline啊,那没事了
显卡的算力与CUDA的算力对应关系
显卡的算力要高于CUDA的算力,并且在一般情况下,两者的算力应该在同一个版本下。例如,RTX 2080 Ti显卡的算力为7.5,那么在装CUDA时,应该装算力为7.X的CUDA,且7.5≥7.X。以笔者的经验来看,RTX 2080 Ti的显卡装CUDA Toolkit 10.x就行,RTX 3090的显卡装CUDA 11系列的就可以。
GPU型号和计算能力的关系
CUDA版本(如10.4)是指CUDA软件平台的版本,而计算能力(如sm_86)是架构的版本号。
每个GPU及计算能力之间的关系是一对多的,这个信息可以在Nvidia官网中查到,下面是一张截图:
图中显示,RTX 3090的计算能力架构版本号是8.6,对应sm_86。其中8是主版本号,6是次版本号。
CUDA版本
在搜索“如何查CUDA版本”时,你会得到好几个答案:
通过which nvcc
查看运行API版本:
/usr/local/cuda-11.3/bin/nvcc
- 通过
ls -l /usr/local/cuda
查看/usr/local/cuda
这个软连接指向哪里:
lrwxrwxrwx 1 root root 21 Nov 17 2020 /usr/local/cuda -> /usr/local/cuda-11.1/
-
通过
nvidia-smi
看上面的CUDA Version
:驱动API版本 -
通过
python -c "import torch; print(torch.version.cuda)"
查看当前PyTorch使用的CUDA
上面四个版本可以各不相同。在使用PyTorch时,我们只需要关注4。
PyTorch内置对CUDA的支持,我们只需在安装PyTorch时选择正确的版本即可。