[彻底解决]CUDA error: an illegal memory access was encountered(CUDA错误 非法访问内存)

转自:

先说一下在网上看到的问题:

第一种可能你的程序涉及到并行计算,但你只有一张卡,因此只要将程序涉及到并行计算的部分改成单卡即可

找找有没有 torch.nn.DataParallel()

第二种一部分数据或者模型在cpu上,另外一部分在gpu上。

PS:第二种和第一种可以强行 os.environ["CUDA_VISIBLE_DEVICES"]为指定ID

第三种CUDNN版本不对?感觉这种可能比较小


然后说一下我是怎么解决的:

最关键的,也是我遇到的问题,这个错误没有表明和显存溢出存在着联系,因为显存溢出会报 out of memory, 所以没有往那一方面去想。 后来发现的确是显存的问题,因为在一些任务中尤其是目标检测任务中,会生成很多bbox这些bbox需要map到GPU上才能计算!(如果你使用CPU并且内存很大可能就没有这些顾虑),所以即便一开始你的显存没有超,但是后续生成的许多bbox都需要占用大量显存!

解决方案:

1. batchsize减小

2. dataloader的num_work数改成0?(似乎只和CPU有关系,并且数据量大于10000时需要多线程)

3. bbox的预测数目改小

4. 使用更好的设备

5. 不要在eval过程中另外生成eval_model,直接使用model.eval(),另外不要忘记在训练开始时调整至model.train()

6. 减少imagesize

其中

减小batchsize和imagesize以及bbox的预测数是最有效的解决方式。

原因很简单,假设在eval过过程中,每个piece相对于原有过程多了m显存,那么显存增量需求同batchsize呈正比。

而imgsize是同框的数目成正比,因此也和显存增量需求成正比。

targets是需要占据显存的,减少预测框的数目也可以节约不少显存。


综上所述 ,imagesize设置为更小的数,num_box设置为更小的数,删除额外的模型,能用一个就用一个,在training process结束后,删除最后一个batch,同时validation的batch设置为1. 总之以穷人的思维去写或者改代码就可以解决这个问题。因此,估计大显存的显卡一般不会遇到这类错。

补充:并不是所有人的情况都一致,尤其是实验条件好的,可以优先检查一下代码。

编辑于 2021-06-24 12:07