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 | import torch |
执行仍旧报错:
1 | (pytorch) D:\Codes\PyTorchTest>C:/Users/jyshen/Anaconda3/envs/pytorch/python.exe d:/Codes/PyTorchTest/resnet_test.py |
可以看出,在执行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列表:
而实验室的台式机是老旧的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列表:
相关issues:
cuda runtime error (48): no kernel image is available for execution on the device #6529