大模型训练中CUDA out of memory的几种解决方法

常用:

1. 减小batch size

2. 如果需要较大的batch size来达到预期训练指标效果,则使用gradient accumulation来累积梯度,达到等价效果的同时,占用显存小;

2.5 使用gradient-checkpointing,以时间换空间;

3. 使用低精度做训练。(mixed precision training) FP16+FP32或BF16+FP32;8bit-Adam optimizer(存INT8的,计算的时候转成FP32);

4. 减小训练数据样本的长度

9. Model并行或者Pipeline并行,把模型拆分至多卡

不常用:

5. 释放闲置内存;torch.cuda.empty_cache()

6. 缓解PyTorch的显存碎片;PYTORCH_CUDA_ALLOC_CONF和max_split_size_mb

7.使用更小的模型

8. 增大GPU显存

10. 使用nvidia-smi看到该GPU上的其他进程;可杀则杀;

Perplexity 查询结果:

Here are several solutions to resolve the "

### 大模型运行时 CUDA 内存不足的解决方案 当处理大型语言模型(LLM)或其他复杂的深度学习任务时,CUDA 显存不足是一个常见的瓶颈问题。以下是几种可能有效的解决方法: #### 1. **梯度累积 (Gradient Accumulation)** 通过减少每一步训练所需的显存量来缓解内存压力。这种方法的核心思想是在多个批次上积累梯度后再执行参数更新操作。这可以显著降低单次前向传播和反向传播过程中使用的 GPU 显存量[^1]。 ```python import torch accumulation_steps = 4 # 假设我们希望将批大小扩大到原来的四倍 for batch_idx, data in enumerate(dataloader): outputs = model(data) loss = criterion(outputs, labels) / accumulation_steps loss.backward() if (batch_idx + 1) % accumulation_steps == 0: optimizer.step() optimizer.zero_grad() ``` #### 2. **混合精度训练 (Mixed Precision Training)** 利用半精度浮点数(FP16 或 BF16),可以在不牺牲太多计算精度的情况下大幅节省显存占用。PyTorch 和 TensorFlow 都支持自动混合精度功能[^3]。 ```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() ``` #### 3. **分片优化器状态 (Sharded Optimizer States)** DeepSpeed 是一种流行的分布式训练框架,它提供了零冗余优化器技术(ZeRO)。这种技术会将模型权重、梯度以及优化器的状态分布在不同的设备之间存储,从而有效减少单一 GPU 的显存需求。 ```bash pip install deepspeed ``` ```python # 使用 DeepSpeed ZeRO-Offload 进行训练 deepspeed_config = { "zero_optimization": {"stage": 3}, "fp16": {"enabled": True} } model_engine, optimizer, _, _ = deepspeed.initialize( args=args, model=model, model_parameters=parameters, config_params=deepspeed_config ) ``` #### 4. **激活重计算 (Activation Re-computation/Checkpointing)** 对于某些层或模块,在正向传递期间不会保存中间张量的结果;相反,在需要这些值用于反向传播之前重新计算它们。这样做的代价是以增加额外的时间复杂度换取空间上的节约。 ```python def forward(self, input_tensor): checkpointed_output = torch.utils.checkpoint.checkpoint(some_expensive_function, input_tensor) return self.final_layer(checkpointed_output) ``` #### 5. **调整批量大小 (Batch Size Adjustment)** 如果上述策略仍然无法解决问题,则考虑进一步减小输入数据集中的样本数量直到适合当前硬件条件为止。不过需要注意的是过低的 mini-batch size 可能会影响收敛速度甚至最终效果质量。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值