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

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

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

补充

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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐