出现 CUDA out of memory 的解决方法

目录

  • 1. 问题所示
  • 2. 原理分析
  • 3. 解决方法
    • 3.1 调batch_size大小
    • 3.2 不考虑梯度
    • 3.3 删除无用变量
    • 3.4 kill进程(暴力放弃)
    • 3.5 其他方法

1. 问题所示

运行这段程序的时候出现如下错误:

RuntimeError: CUDA out of memory. Tried to allocate 1.38 GiB (GPU 0; 7.80 
GiB total capacity; 5.94 GiB already allocated; 230.25 MiB free; 6.41 GiB
 reserved in total by PyTorch)

截图如下所示:
出现 CUDA out of memory 的解决方法_第1张图片

2. 原理分析

这是GPU显存不足引起,而不是cpu内存不足引起(无需查询 df -h命令)

  • 查询GPU显存: nvidia-smi
    出现 CUDA out of memory 的解决方法_第2张图片

3. 解决方法

3.1 调batch_size大小

(我的网络调整不可行,但是你们可试试这个方法排查),可能有些人可以调整 batch_size,但是会影响速度和准确度

既然网络过大,调整其batch_size,让其变小即可(需要是2的倍数)
类似以下代码,将其调整为64、32、16、8、4、2之类的

在这里插入图片描述

这个方法坏处是精度准确度可能会被影响,甚至减少后,反向传播期间会溢出

3.2 不考虑梯度

测试预训练过程中,不计算梯度训练,减少显存的使用
加入这一行代码:with torch.no_grad(),减少原本需要 requires_grad=True 的计算的内存消耗

def test(model,dataloader):
   model.eval()
   with torch.no_grad(): # 加入这一行代码
       for batch in xx(dataloader):
           # 省略

只进行验证而不是训练时,
不需要计算前向和后向阶段的梯度(不使用 GPU 内存)

with torch.no_grad():
    ...
    net=Net()
    pred_for_validation=net(input)
    ...

3.3 删除无用变量

反向传播之前删除一些无用的变量:torch.cuda.empty_cache ()

import torch

torch.cuda.empty_cache()

3.4 kill进程(暴力放弃)

  • kill 该进程:taskkill -PID 进程号 -F

成功释放后的显存如下:
出现 CUDA out of memory 的解决方法_第3张图片

3.5 其他方法

综合网上探讨的方法进行总结以及收集:

比如:(未试验过)

  • 使用dataparallel在两个GPU上训练模型
  • 使用 apex 包进行 float16 计算
  • 指定GPU加载
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '2, 3'
  • 升级pytorch版本
  • 选择用DistillGPT2减少网络参数量
  • 减少预处理阶段的令牌数量

如果你有更加合适的方法 或者 执行哪一步成功了,欢迎评论

你可能感兴趣的:(BUG,深度学习,python,人工智能)