RuntimeError: CUDA out of memory in pytorch

作者在尝试使用Transformer时,遇到validate若干次后爆显存的问题。起初认为是参数或batch size过大所致,但未解决。经谷歌搜索,发现需添加特定内容停止自动反向计算梯度,否则积累的梯度会占显存。

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

今天尝试了一下Transformer,一直遇到当validate若干次之后爆显存,一开始以为参数过多,batch size过大,但是无济于事。谷歌了相关内容,发现原来是需要加

with torch.no_grad():

否则,积累的梯度应该是会一直放在显存里的...用了这一行就会停止自动反向计算梯度

emmmmm,记录下又一个踩过的坑。。。。

### CUDA Out of Memory 的解决方案 当遇到 `RuntimeError: CUDA out of memory` 时,可能的原因包括模型过大、批量大小设置过高、显存碎片化或其他资源占用问题。以下是几种常见的解决方法: #### 1. 减少批量大小(Batch Size) 较大的批量大小会显著增加显存需求。通过降低批量大小可以减少每次迭代所需的显存量: ```python batch_size = 32 # 原始值 new_batch_size = batch_size // 2 # 尝试减半 ``` 这种方法简单易行,但可能会稍微影响训练速度和收敛性能[^1]^。 #### 2. 使用梯度累积(Gradient Accumulation) 如果减少批量大小会影响模型效果,可以选择保持较小的批次并通过多次前向传播积累梯度后再更新权重: ```python accumulation_steps = 4 for i, data in enumerate(dataloader): outputs = model(data) loss = criterion(outputs, labels) loss /= accumulation_steps loss.backward() if (i + 1) % accumulation_steps == 0: optimizer.step() optimizer.zero_grad() ``` 这种方式可以在不改变学习率的情况下模拟更大的批处理效果[^2]^。 #### 3. 调整显存分配策略 有时显存碎片化可能导致可用空间不足以满足新请求。可以通过设置环境变量优化显存管理: ```bash export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128 ``` 此配置允许更细粒度地分割显存块,从而缓解因碎片化引发的问题[^3]^。 #### 4. 清理不必要的张量 确保释放不再使用的张量以及关闭自动求导机制以节省额外开销: ```python del some_tensor_variable torch.cuda.empty_cache() # 手动清理缓存中的无用数据 with torch.no_grad(): inference_operations_here() ``` #### 5. 利用混合精度训练(Mixed Precision Training) 借助 NVIDIA Apex 或者 PyTorch 自带的支持实现 FP16 计算模式能够大幅削减所需显存量: ```python from torch.cuda.amp import GradScaler, autocast scaler = GradScaler() for input, target in dataloader: optimizer.zero_grad() with autocast(): # 启用自动混合同步浮点运算 output = model(input) loss = loss_fn(output, target) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update() ``` 相比传统全精度方案,该技术不仅节约了约一半存储容量还加快了整体流程效率[^4]^。 #### 6. 更改可见设备范围 对于拥有多个 GPU 的机器而言,合理规划哪些卡参与作业有助于平衡负载并规避单一硬件负担过重的情况发生。利用 `CUDA_VISIBLE_DEVICES` 环境变量限定目标计算单元集合即可达成目的[^5]^。 --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值