RuntimeError: CUDA out of memory在不减小batch_size的前提下的解决方案

解决方案一

sudo gedit ~/.bashrc
  • 在文件最末尾添加一行,其中max_split_size_mb可以根据报错提示设置的稍微大一些
export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:64
  • 之后激活环境变量
source ~/.bashrc
  • 最后重启程序或脚本

解决方案二

  • 参考文章:Gradient Accumulation in PyTorch | Nikita Kozodoi
  • 同样是为了能够使用较大的batch size:Gradient Accumulation
  • 引用原文的示例代码如下,主要思想就是将一个batch分成好几个小的batch,每个小的batch计算完梯度之后不更新参数,只是叠加在一起,当一个batch中的全部的小的batch计算完毕之后再更新网络参数,这样最终的batch size等于accum_iter * origin_batch_size。也就是说假入设置batch_size为64,会爆显存,但是设置为16就不会,那么就可以设置accum_iter为4,batch_size为16,达到一样的效果。
# batch accumulation parameter
accum_iter = 4  

# loop through enumaretad batches
for batch_idx, (inputs, labels) in enumerate(data_loader):

    # extract inputs and labels
    inputs = inputs.to(device)
    labels = labels.to(device)

    # passes and weights update
    with torch.set_grad_enabled(True):
        
        # forward pass 
        preds = model(inputs)
        loss  = criterion(preds, labels)

        # normalize loss to account for batch accumulation
        loss = loss / accum_iter 

        # backward pass
        loss.backward()

        # weights update
        if ((batch_idx + 1) % accum_iter == 0) or (batch_idx + 1 == len(data_loader)):
            optimizer.step()
            optimizer.zero_grad()

猜你喜欢

转载自blog.csdn.net/m0_46749624/article/details/127705998