Linux在CUDA11.5+RTX3090+pytorch构建深度学习环境时CUDA版本冲突导致的no kernel image is available for execution问题

pytorch是非常优秀的深度学习包,面向GPU部分封装的非常好,可以便利的将模型传入GPU中,利用GPU进行深度学习。但是笔者在用pytorch进行环境配置时撞了大坑,最终解决发现是之前下载了CUDA10.2版本的pytorch,和系统实际使用的CUDA版本11.5不匹配。以此文记录最终解决和过程中所学到的知识。

首先是笔者GPU的驱动版本,根据下面链接可以选定匹配的CUDA Version,笔者所使用的的笔记本已经为GPU配置好了CUDA和CuDNN驱动,版本为11.5,输入nvidia-smi即可显示具体信息。还没有安装驱动可以自行查找安装对应版本的驱动。

~$ nvidia-smi
Thu Jul 14 21:07:08 2022       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 495.29.05    Driver Version: 495.29.05    CUDA Version: 11.5     |

对显卡安装完CUDA驱动之后,一定要按照链接中所说的下载对应CUDA版本的pytorch。笔者显卡的CUDA版本为11.5,虽然没有直接对应,但是实测CUDA为11.3版本,即1.12.0+cu113的torch即可配置成功。相关的安装命令详见PyTorch官网和下图。如果为10.2CUDA版本,则出现no kernel image is available for execution的报错。

Linux下PyTorch、CUDA Toolkit 及显卡驱动版本对应关系(附详细安装步骤) - 知乎

Linux在CUDA11.5+RTX3090+pytorch构建深度学习环境时CUDA版本冲突导致的no kernel image is available for execution问题_第1张图片

说完问题的解决,笔者也尝试记录一下产生这一问题的原理,和CUDA的部分知识。

首先,官网中给出的这个pytorch Compute Platform 对应的CUDA版本,笔者认为是根据cudatoolkit这一附加包来实现的。而这里的cudatoolkit(官网中说的CUDA10.2,11.3和11.6)版本并不等于实际使用中的CUDA版本,实际使用中的CUDA版本是刚才提到的显卡的实际驱动11.5。

这部分的内容是最让人迷惑的部分,关于这部分知识可以参考下面链接,这篇是目前在国内看过对pytorch和cuda等等讲述的比较详细的一篇博客。

Pytorch 使用不同版本的 cuda - yhjoker - 博客园

笔者在这里也提一下自己的理解。

Nvidia显卡实际使用的CUDA(有自己的CUDA Toolkit)和pytorch为你安装的cudatoolkit是两个不同的东西。torch安装的cudatoolkit主要负责torch包的一些初始构建,并且需要和Nvidia的CUDA版本兼容。这里原文没有提到兼容的原则,但是之前笔者尝试了10.2和CUDA11.5是不能兼容的,11.3可以。当然,直接安装和实际驱动对应的pytorch cudatoolkit是最好的,但是笔者的情况是驱动已经是11.5了,找遍全网也没有找到这种情况下的对应关系,只能自己摸索

换句不规范但是好理解的话说,官网图片里提到的CUDA10.2,CUDA11.3和CUDA11.6的实际上是为你安装了一个11.3版本的cudatoolkit来模拟对应版本的CUDA,对torch包中的一些内容进行构建。用 torch.version.cuda 输出的版本其实就是这个Toolkit的版本。

但是,这个版本和pytorch运行时调用的系统CUDA版本是没有关系的。实际调用时的CUDA可以用torch.utils.cpp_extension.CUDA_HOME 命令进行查看,如下方代码所示:

print(torch.__version__)
print(torch.version.cuda)
print(torch.cuda.is_available())
print(torch.utils.cpp_extension.CUDA_HOME)

1.12.0+cu113
cu113
True
/usr/local/cuda

这里的cuda是一个软连接,指向的是系统已经安装好的cuda-11.5的驱动,可以通过更改它来用不同的驱动运行脚本。(前提是要和torch的版本兼容)

~$ cd /usr/local
/usr/local$ ls -al
xxxxxxxxxxxxxxxxx cuda -> /usr/local/cuda-11.5/

除此之外,上文还比较好的阐述了pytorch在构建和实际调用可能为不同CUDA这一点,并提供了诸多非常实用的调试命令。

PS:pip和conda

如果已有pytorch且不确定目前pytorch的配置情况,可以用

$ conda list
# packages in environment at /home/nslab/miniconda3/envs/pytorch:
#
# Name                    Version                   Build  Channel
torch                     1.12.0+cu113             pypi_0    pypi

$ pip list
pip list
Package                           Version
--------------------------------- ------------
torch                             1.12.0+cu113

查看当前conda虚拟环境下已有的pytorch环境(conda list也会显示目前环境下用pip安装的包,Channel一列会显示pypi)如果发现Version的版本不对,可以pip uninstall或conda uninstall删除torch再按照官网给出的命令重新安装新的。

一定注意规避安装多个pytorch等问题。关于conda和pip安装的区别和路径,部分可以用于自验是否安装了多个pytorch导致环境混乱:请问大神们,pip install 和conda install有什么区别吗? - 知乎

PPS:conda虚拟环境

本文中所有环境和命令都是在conda虚拟环境中实现的,如果不会配置虚拟环境请先学习conda虚拟环境的设置和配置。

conda创建虚拟环境_墨夜之枫的博客-CSDN博客_conda创建虚拟环境

你可能感兴趣的:(pytorch)