训练模型,内存、显存Out of memory问题

1.背景

最近尝试训练模型时,出现内存不足的问题,此外还遇到了显存不足的问题。
尝试一些常用方法,发现没用或用不了:

  1. 混合精度运算
    即半浮点数精度训练,首先试了apex这个库,结果发现没用,别的博客说pascal构架的显卡用不了,结果笔记本1050ti好像就是此构架。手动设置所有float()为half()类型,也还是不行。
  2. 降低批次batch
    已经为1了,还怎么降,索性去掉BN层,然后还是提示显存不足。
2.解决: 老老实实加条内存条 O(∩_∩)O

训练时就注意到,其实显存并没用占满,提示还有多少显存 free,但是却没法申请,而内存已经占了快80%多,或许是内存限制了。
显存->内存->磁盘

ref
windows上有如上共享关系,显存

### 训练模型内存不足的解决方案 当遇到训练模型内存不足问题,可以考虑以下几个方面来优化资源利用并解决问题: #### 1. 减少批量大小(Batch Size) 减少批量大小是一种简单有效的方法。较大的批量会占用更多的显存空间,因此通过降低批量大小能够显著缓解内存压力[^1]。 #### 2. 使用梯度累积(Gradient Accumulation) 如果减小批量大小会影响模型收敛性能,则可以通过梯度累积技术,在多个较小批次上计算梯度并将它们累加起来再更新参数。这种方法可以在不改变实际有效批量大小的情况下节省显存[^3]。 ```python accumulation_steps = 4 # 假设我们将原始batch size分为4个小batch处理 optimizer.zero_grad() for i, (inputs, labels) in enumerate(dataloader): outputs = model(inputs) loss = criterion(outputs, labels) loss = loss / accumulation_steps # 平均每步损失值 loss.backward() # 反向传播 if (i + 1) % accumulation_steps == 0: optimizer.step() # 更新权重 optimizer.zero_grad() # 清零梯度 ``` #### 3. 启用混合精度训练(Mixed Precision Training) 采用半精度浮点数(FP16)代替单精度浮点数(FP32),不仅减少了存储需求还可能加速计算过程。现代深度学习框架如PyTorch和TensorFlow都支持自动混合精度训练功能。 ```python from torch.cuda.amp import autocast, GradScaler scaler = GradScaler() for inputs, targets in dataloader: with autocast(): outputs = model(inputs) loss = criterion(outputs, targets) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update() ``` #### 4. 数据采样策略改进 随机抽样可能会忽略硬件特性重要的数据样本。为了更有效地构建训练集,应该探索其他方法比如基于重要性的采样或者主动学习机制,从而提高单位时间内所获取信息的价值密度。 #### 5. 部署与集成考量 对于大规模语言模型而言,在人力资源管理系统中的部署也需要特别注意效率问题。合理规划推理阶段所需的资源配置以及缓存策略可以帮助进一步减轻运行期间的压力[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值