Pytorch 神经网络( out of memory )

本文讨论了Pytorch神经网络训练中出现内存不足(Out of Memory)的问题,包括在恢复训练时内存占用增加的情况。解决方法包括在加载检查点时注意设备分配,尽量将操作放在CPU上,以及使用torch.cuda.empty_cache()清理显存。测试阶段要记得设置no_grad以防止显存爆满。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、从头开始训练的时候正常,大概占了4/5的显存容量,然后中断了, 再resume 就会出现out of memory ?

因为你 load checkpoint 的时候把参数加载到 显存 里面了;而且大概率你的code是这么写的然后报的错:

model = Network().cuda()
# 这里如果你存下来的权重device在cuda上,那么将自动载入GPU; 此时 model在GPU,新载入的参数也在GPU,就很有可能放不下
# 而且就算不在,在内存上,你还是得 state_dict = state_dict.cuda() 还是会炸显存
state_dict =  torch.load('xxxxx.pth.tar') 
model.load_state_dict(state_dict)

改成这样就行了

model = Network()
model.load_state_dict(torch.load('xxxx.pth.tar',  map_location='cpu' ))
model.cuda()

存储方面,能在 device='cpu' 上面做的事情,就别在 device='cuda'上面做。

 

二、Pytorch 训练与测试时爆显存(out of memory)的一个解决方案

Pytorch 训练时有时候会因为加载的东西过多而爆显存,有些时候这种情况还可以使用cuda的清理技术进行修整,当然如果

### 处理 PyTorch 中 CUDA Out of Memory 错误 当遇到 `torch.OutOfMemoryError` 时,表明尝试分配的内存量超过了可用的 GPU 内存容量[^1]。对于这个问题,存在多种有效的解决方案。 #### 减少批处理大小 (Batch Size) 减少批量大小是一种最直接的方法来降低显存占用。随着批处理数量的下降,所需的总内存也随之减少。例如,将批处理大小从48降至1时,GPU使用的内存量可以从大约14.4GB显著降到约1.3GB[^4]。 ```python # 原始代码可能如下所示 train_loader = DataLoader(dataset, batch_size=48, shuffle=True) # 调整后的代码可以改为更小的批次尺寸 train_loader = DataLoader(dataset, batch_size=1, shuffle=True) ``` #### 使用 `torch.no_grad()` 上下文管理器 在验证阶段禁用梯度计算能够节省大量显存资源。通过使用 `with torch.no_grad():` 可以实现这一点,在此模式下的操作不会跟踪反向传播所需的信息,从而减少了不必要的内存消耗[^3]。 ```python model.eval() with torch.no_grad(): outputs = model(inputs) ``` #### 修改网络架构设计 优化神经网络的设计同样有助于缓解内存压力。具体措施包括但不限于: - **缩小全连接层中的节点数目** - **引入Dropout机制** 来防止过拟合并节约空间 - **应用池化(pooling)** 技术压缩特征图尺寸 - **审查循环结构内的嵌套层数** 这些调整不仅降低了每一步运算所占的空间需求,还促进了整体性能提升。 #### 清除无用变量与缓存清理 定期清除不再需要的对象以及调用 `.cuda().empty_cache()` 方法释放未被利用的临时存储区也是重要的实践之一。这可以帮助回收部分闲置资源供后续任务重用。 ```python import gc gc.collect() torch.cuda.empty_cache() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiangyong58

喝杯茶还能肝到天亮,共同进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值