CUDA out of memory: 一种不常见bug的解决方法

CUDA out of memory: 一种不常见bug的解决方法

问题描述

博主在跑推荐系统代码的时候出现了OOM(Out Of Memeory)错误,于是把device改为torch.device(“cpu”),然而又出现了RuntimeError: CUDA out of memory. Tried to allocate 2.00 MiB (GPU 0; 10.91 GiB total capacity; 8.47 GiB already allocated; 1.75 MiB free; 10.22 GiB reserved in total by PyTorch)的报错,且报错定位在pickle.load()代码行处。。。

于是果断放弃使用cpu跑的想法,改用多卡并行加载数据,代码如下:

gpus = [0, 1]
os.environ["CUDA_VISIBLE_DEVICES"] = ','.join(str(gpu) for gpu in gpus)

结果同样的错误又出现了。。。

解决方案

既然错误出现在pickle.load()上,虽然不明白为什么报错,但也只能硬改了。用joblib.load()替换,还是不行,再用torch.save()torch.load()将全局的pickle.dump()pickle.load()替换,奇迹发生了!!!程序终于可以正常运行了!!

总结

造成爆显存的原因可能有多种,使用多张显卡对大多数这个问题来说都是一种较好的解决方法,博主所遇到的算是一个比较特殊的错误原因,希望可以给遇到类似问题的朋友一点参考。

### CUDA 内存分配失败解决方案 当遇到 `CUDA out of memory` 错误时,这通常意味着当前运行的任务所需的显存量超过了可用的显存量。即使物理上还有足够的显存空间,程序也可能因为某些原因无法正常获取所需资源。 一种常见的情况是在 PyTorch 中操作张量时恰当地处理 `.item()` 方法调用[^3]。如果使用 `.item()` 来提取单个数值的结果,则可能导致必要的显存占用增加,进而引发内存溢出错误。因此建议在只需要取得具体数值而非整个张量的情况下加上 `.item()` 函数来减少显存消耗。 对于更广泛的解决策略,可以考虑如下几种方法: - **优化数据批大小**:减小训练批次尺寸能够有效降低每轮迭代过程中对GPU 显存的需求。 - **调整模型参数规模**:精简网络结构或者采用量化技术压缩权重精度有助于减轻计算负担并节省更多显存空间。 - **启用混合精度训练**:通过利用 FP16 数据类型代替部分或全部 FP32 运算可以在保持性能的同时大幅削减显存开销。 - **卸载未使用的变量**:及时清理再需要的对象,并强制垃圾回收机制释放其占据的空间;另外还可以借助于 `torch.cuda.empty_cache()` 手动清空缓存中的闲置碎片区域以便重新调配给新的请求使用。 针对特定场景下如 LLaMA 模型跑分过程中的 `cudaMalloc failed out of memory` 报错现象,除了上述通用措施外,还需注意版本兼容性问题所引起的潜在隐患。例如,有报告指出旧版 Ollama 可能存在一些 bug 导致类似的终止异常 (exit status 0xc0000409),更新至最新稳定发行版往往可以帮助规避此类风险[^2]。 最后值得注意的是,在任何情况下都应密切监控系统的实时状态变化趋势,比如借助命令行工具 `nvidia-smi -l 1` 定期采样记录 GPU 资源利用率曲线图谱,从而更好地定位故障根源所在。 ```python import torch def load_model_to_device(model_path, device): pretrained_model = torch.load(model_path, map_location='cpu') pretrained_model = pretrained_model.to(device) return pretrained_model ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值