出现 CUDA out of memory 的解决方法
目录
- 问题所示
- 原理分析
- 解决方法
- 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)
截图如下所示:
2. 原理分析
这是GPU显存不足引起,而不是cpu内存不足引起(无需查询 df -h命令)
- 查询GPU显存:
nvidia-smi
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
成功释放后的显存如下:
3.5 其他方法
综合网上探讨的方法进行总结以及收集:
比如:(未试验过)
- 使用dataparallel在两个GPU上训练模型
- 使用 apex 包进行 float16 计算
指定GPU加载
import os
os.environ[‘CUDA_VISIBLE_DEVICES’] = ‘2, 3’升级pytorch版本
- 选择用
DistillGPT2
减少网络参数量 - 减少预处理阶段的令牌数量
如果你有更加合适的方法 或者 执行哪一步成功了,欢迎评论
还没有评论,来说两句吧...