问题描述:
在跑编译正常通过,CPU上也正常运行的某项目时,在运行到某个epoch时,程序突然出现以下错误:
RuntimeError: CUDA error: an illegal memory access was encountered
CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
如下图所示
原因分析:
网络上有很多解决方案,但是实测都不太适用(因为出现这种bug的原因是多种的):
- [彻底解决]CUDA error: an illegal memory access was encountered(CUDA错误 非法访问内存)
- 【debug】报错RuntimeError: CUDA error: an illegal memory access was encountered
- 如何解决一个诡异的pytorch的illegal memory access报错? - 知乎
- pytorch报错:CUDA error: an illegal memory access was encountered
有一个博客评论指出:这种错误会出现在自己编写的一些loss或指标函数上面,由于转化为了cpu运行numpy所出现的错误
。这种情况与笔者遇到的问题是类似的,其在里面加time.sleep(1)可以解决;
另一篇博客指出:在外网的评论说可能是GPU硬件问题导致的错误
。
综合起来并实测来看,可能是GPU负载过大访问冲突/越界导致的,并且受多种因素影响。
解决方案:
首先,一定要在CPU模式下,完全编译通过!很多情况是代码本身写错了,出现访问越界之类的情况。
在.cpu().numpy()
处出现报错
- 在模型训练代码相关位置里面添加延时函数
Thread.sleep(毫秒数)
或者time.sleep(1)
,以延缓GPU压力; - 减小dataloader里的 num_worker 数量,