PyTorch报CUDA error: no kernel image is available for execution on the device问题解决

PyTorch 1.3版本,提高了对CUDA设备的Compute Capability等级的最低要求,导致在较为老旧的GPU型号上,部分计算操作无法执行。

PyTorch报CUDA error: no kernel image is available for execution on the device问题解决

1 问题描述

排查TensorBoard的问题时,我尝试了更新PyTorch版本,更新到了最新的1.3.1。

在运行使用了ResNet的代码时,此前一直正常,但这次却出现了CUDA error的报错:

1
RuntimeError: CUDA error: no kernel image is available for execution on the device

CUDA报错提示没有支持程序在当前设备上执行的内核镜像。

我写了段最小化测试用例来测试CUDA功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import torch
from torchvision import models
import numpy as np
import IPython

print(torch.cuda.is_available())

image = np.random.random(size=[2, 3, 224, 224])
image.dtype = 'float32'

image_tensor = torch.from_numpy(image).cuda()

model = models.resnet50(pretrained=True)
model = model.cuda()

out = model(image_tensor)
print(out)

# IPython.embed()

执行仍旧报错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(pytorch) D:\Codes\PyTorchTest>C:/Users/jyshen/Anaconda3/envs/pytorch/python.exe d:/Codes/PyTorchTest/resnet_test.py
True
Traceback (most recent call last):
File "d:/Codes/PyTorchTest/resnet_test.py", line 18, in <module>
out = model(image_tensor)
File "C:\Users\jyshen\Anaconda3\envs\pytorch\lib\site-packages\torch\nn\modules\module.py", line 541, in __call__
result = self.forward(*input, **kwargs)
File "C:\Users\jyshen\Anaconda3\envs\pytorch\lib\site-packages\torchvision\models\resnet.py", line 197, in forward
x = self.bn1(x)
File "C:\Users\jyshen\Anaconda3\envs\pytorch\lib\site-packages\torch\nn\modules\module.py", line 541, in __call__
result = self.forward(*input, **kwargs)
File "C:\Users\jyshen\Anaconda3\envs\pytorch\lib\site-packages\torch\nn\modules\batchnorm.py", line 72, in forward
self.num_batches_tracked += 1
RuntimeError: CUDA error: no kernel image is available for execution on the device

可以看出,在执行ResNet中用到的Batch Norm操作(torch\nn\modules\batchnorm.py)时出现了该 CUDA error: no kernel image is available for execution on the device 错误。

2 问题分析

从测试和报错内容可以看出,torch.cuda.is_available()可以正常给出True的结果,表明GPU驱动和Python包一切正常,而*.cuda()操作也是正常也佐证了这一点。

问题出在CUDA对部分计算操作无法支持,即no kernel image is available for execution on the device的问题。

经查,issues中存在类似的问题:

GT820M无法满足PyTorch:

cuda runtime error (48): no kernel image is available for execution on the device #6529

这个版本比较早(2018年4月),还是Python 2.7。

更加新一些的issue:

连专业卡Tesla K40m都无法完整支持PyTorch 1.3了:

Version 1.3 no longer supporting Tesla K40m? #30532

其中SsnL解释:K40m has a compute capability of 3.5, which I believe we have dropped support of.

PyTorch中不再支持3.5及其以下的compute capability。

这里就涉及到了NVIDIA GPU CUDA的compute capability,这是一个类似版本的概念。不同型号的GPU的compute capability不同。目前官方列出的清单(GPU Compute Capability)上,较低的为2.1,都是较早的GPU型号,如:GT430, GT630, GT730 DDR3 128bit;较高的可达7.5,都是较新的GPU型号,如:RTX 2080, RTX 2070等。

NVIDIA开发者网站上的CUDA GPU Compute Capability列表:

GPU Compute Capability

而实验室的台式机是老旧的GT730 (GDDR5)显卡,虽然平时只是调试代码用,性能差能接受,不过这Compute Capability还停留在3.5,已经无法支持今年的PyTorch版本。

目前来看,需要3.7及以上的GPU的CUDA才能完整地支持PyTorch的功能。

3 解决方案

因为是硬件层面的限制,那显然没有完美的解决方案,能做的就是软件层面降级,退到对CUDA要求较低的PyTorch的历史版本,例如:之前能够正常使用的1.1、1.2版本。

参考命令:

1
conda install pytorch=1.2

4 参考资料

NVIDIA开发者网站上的CUDA GPU Compute Capability列表:

GPU Compute Capability

相关issues:

cuda runtime error (48): no kernel image is available for execution on the device #6529

Version 1.3 no longer supporting Tesla K40m? #30532