解决RuntimeError: CUDA out of memory,reserved memory is >> allocated memory

解决RuntimeError: CUDA out of memory,reserved memory is >> allocated memory

报错信息: torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 1.59 GiB (GPU 0; 23.68 GiB total capacity; 3.86 GiB already allocated; 769.69 MiB free; 5.96 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF
在这里插入图片描述
解决方法:
这里要注意是你的reserved memory is >> allocated memory可以使用的,但也不是一定有用,最后最后如果还不行的话可以试试(参数128可以调整)

代码如下:

import os
os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "max_split_size_mb:128"

参考博客

https://zhuanlan.zhihu.com/p/581606031

### 解决 PyTorch CUDA Out of Memory 的方法 当遇到 `CUDA out of memory` 错误时,通常是因为 GPU 显存不足以支持当前模型或数据的大小。以下是几种常见的解决方案: #### 1. 减少批量大小 (Batch Size) 较大的批量会占用更多的显存资源。通过减少批量大小可以有效降低显存需求[^1]。 ```python batch_size = 8 # 将原始批量大小调整为更小的值 dataloader = torch.utils.data.DataLoader(dataset, batch_size=batch_size, shuffle=True) ``` #### 2. 使用梯度累积 (Gradient Accumulation) 如果减小批量大小会影响训练效果,可以通过梯度累积来模拟更大的批量大小,从而缓解显存压力[^2]。 ```python accumulation_steps = 4 # 假设我们希望模拟原来的批量大小 for i, data in enumerate(dataloader): outputs = model(data) loss = criterion(outputs, labels) / accumulation_steps loss.backward() if (i + 1) % accumulation_steps == 0: optimizer.step() optimizer.zero_grad() ``` #### 3. 启用混合精度训练 (Mixed Precision Training) 利用半精度浮点数 (`float16`) 可以显著节省显存并加速计算过程。PyTorch 提供了 `torch.cuda.amp` 来实现这一点[^3]。 ```python from torch.cuda.amp import autocast, GradScaler scaler = GradScaler() for data, target in dataloader: with autocast(): output = model(data) loss = criterion(output, target) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update() optimizer.zero_grad() ``` #### 4. 调整 `max_split_size_mb` 有时错误提示中会出现关于 `max_split_size_mb` 的分配问题。这通常是由于张量操作中的内部拆分逻辑引起的。可以通过设置环境变量来手动指定最大分割大小[^4]。 ```bash export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:100 ``` 或者在 Python 中动态设置: ```python import os os.environ['PYTORCH_CUDA_ALLOC_CONF'] = 'max_split_size_mb:100' ``` #### 5. 清理未使用的缓存 GPU 缓存可能会被无用的数据占据。定期清理这些缓存有助于释放额外的空间[^5]。 ```python import torch torch.cuda.empty_cache() # 手动清空缓存 ``` #### 6. 修改模型结构 对于非常复杂的模型,考虑简化网络架构或使用参数较少的预训练模型作为替代方案。例如,ResNet-18 替代 ResNet-50 或者 MobileNet 替代其他大型卷积神经网络[^6]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值