[彻底解决]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. 总之以穷人的思维去写或者改代码就可以解决这个问题。因此,估计大显存的显卡一般不会遇到这类错。
补充:并不是所有人的情况都一致,尤其是实验条件好的,可以优先检查一下代码。