Pytorch解决 RuntimeError: CUDA out of memory.

GPU内存不足引起RuntimeError: CUDA out of memory.

怎么看:
nvidia-smi
gpustat
watch -n 0.1 nvidia-smi# 实时监控gpu与显存

解决

方法一:调整batch_size 一般为2的n次方,一般为4,如果不行,则pass

方法二:清除pytorch无用缓存,加入如下代码

import torch, gc

gc.collect()
torch.cuda.empty_cache()

方法三:添加两行下面的代码:

torch.backends.cudnn.enabled = True
torch.backends.cudnn.benchmark = True

方法四:查看自己的forward函数是否存在泄露,常需要在forward函数里调用其他子函数,这时候要特别注意:

  • input尽量不要写在for循环里面!!!
  • 子函数里如果有append()等函数,一定少用,能不用就不用!!!
  • 子函数list一定少用,能不用就不用!!!

总之,子函数一般也不会太复杂,直接写出来,别各种for,嵌套,变量。!!!

方法五:在测试阶段和验证阶段前插入代码 with torch.no_grad()

def test(model,dataloader):
   model.eval()
   with torch.no_grad(): #插在此处
       for batch in tqdm(dataloader):

方法六: 使用别人代码时

如果怎么修改,都会出现题中bug,甚至跑了几轮之后突然出现 cuda out of
memory,查看代码中是否存在一下代码(通常出现在main.py 或者数据加载的py文件中:

kwargs = {'num_workers': 6, 'pin_memory': True} if torch.cuda.is_available() else {}

将"pin_memory": True改为False,具体原因查看 原博主:

方法七:重新核对原模型代码,打印模型中所有parameters和register_buffer的require_grad,终于发现是因为模型中的某个register_buffer在训练过程中,它的require_grad本应该为False,然而迁移到我代码上的实际训练过程中变成了True,而这个buffer的占用数据空间也不大,可能是因为变为True之后,导致在显存中一直被保留,从而最终导致显存溢出。再将那个buffer在forward函数里的操作放在torch.no_grad()上下文中,问题解决!

总结:如果训练时显存占用持续增加,需要谨慎的检查forward函数中的操作,尤其是在编写复杂代码的时候,更需要更细致的检查!

你可能感兴趣的:(问题处理记录,pytorch,深度学习,人工智能)