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

这篇博客探讨了在深度学习中遇到的GPU显存不足问题,提到了三种可能的原因:并行计算、数据分布不均和CUDNN版本不匹配。作者分享了自己的解决经验,强调了显存溢出并不总是表现为'outofmemory'错误,特别是在目标检测任务中,大量的bbox计算可能导致显存耗尽。解决方案包括减小batchsize、降低图片尺寸、减少bbox预测数、合理分配数据加载线程和避免在评估过程中生成额外模型。此外,作者建议使用更小的模型参数和穷人的思维来优化代码,以适应有限的显存资源。
部署运行你感兴趣的模型镜像

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

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

找找有没有 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.
总之以穷人的思维去写或者改代码就可以解决这个问题。因此,估计大显存的显卡一般不会遇到这类错。

补充

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

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.9

TensorFlow-v2.9

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值