CUDA报错:Out of Memory

博客指出,当报错提示Pytorch reserved的内存远大于Already allocated的内存时,是因分配显存单位过大,产生大量内存碎片无法继续分配。可通过限制一次分配的最大单位来解决该问题,使代码正常运行。

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

如果报错里提示Pytorch reserved的内存远大于Already allocated的内存,那么就是因为分配显存时单位过大,导致出现大量内存碎片无法继续分配(与操作系统内存管理同理)。

我们可以限制一次分配的最大单位来解决这个问题。

vim ~/.bashrc
#然后在文件中加入下面这行
export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:32
#保存退出,然后运行下面的指令
source ~/.bashrc

随后代码便可正常运行了。

### 如何在CUDA中处理 'out of memory' 错误 当遇到 `CUDA out of memory` 的错误时,通常是因为显存不足无法满足当前操作的需求。以下是几种常见解决方案以及如何捕获和处理该异常的方法。 #### 显卡资源管理 为了有效应对 GPU 内存耗尽的问题,可以采取以下措施: 1. **监控 GPU 使用率** 需要定期检查 GPU 当前的内存占用情况,尤其是在多 GPU 环境下运行程序时。通过工具如 `nvidia-smi` 可以实时获取 GPU 的使用状态,并据此调整模型或数据集大小[^1]。 2. **减少批量尺寸(Batch Size)** 如果训练过程中使用的 batch size 过大,则可能导致超出可用显存量。适当降低批次规模能够缓解此问题。 3. **优化模型结构** 对于复杂的神经网络架构来说,可能需要重新设计更轻量级版本来适应硬件条件限制;或者采用混合精度训练技术,在不显著影响最终效果的前提下节省部分存储需求。 #### 增加堆栈容量设置 如果是在调用某些特定 API (例如 `cudaMalloc`, `cudaHostAlloc` 或者核函数内部动态分配内存)期间遇到了 OOM 问题,则可能是由于默认最大允许值较低所致。可以通过如下代码片段增加设备端全局 heap limit 来解决问题: ```cpp // 设置新的heap limits, 单位为字节(byte). size_t newHeapSize = ... ; // 自定义合适的数值 if(cudaSuccess != cudaDeviceSetLimit(cudaLimitMallocHeapSize, newHeapSize)){ fprintf(stderr,"Failed to set device malloc heap size\n"); } ``` 另外还需注意是否存在潜在未释放资源造成泄露现象发生,确保每次完成相应计算之后都正确执行清理工作(`free()`)以防累积消耗过多不必要的额外开销[^2]. #### 异常捕捉机制实现 虽然标准 CUDA 库本身并不直接支持 C++ STL 类型 try-catch 结构来进行 runtime errors 捕捉,但我们仍然可以通过自定义宏定义简化流程从而达到相似目的。下面给出一个简单例子展示如何构建这样一个框架用于检测可能出现的各种类型的错误状况并作出响应动作: ```c++ #define checkCudaErrors(err) __checkCudaErrors((err),__FILE__,__LINE__) inline void __checkCudaErrors(cudaError err,const char *file,int line){ if( cudaSuccess != err ){ printf("CUDA ERROR at %s:%d :%s \n", file,line,cudaGetErrorString(err)); throw std::runtime_error(std::string("CUDA Error ") + cudaGetErrorString(err)); } } try{ float* d_a; checkCudaErrors(cudaMalloc(&d_a,sizeof(float)*N*N));//假设 N 很大以至于触发OOM }catch(const std::exception& e){ cerr <<e.what()<<'\n'; }finally{ cudaFree(d_a); } ``` 上述示例展示了如何利用模板化的方式封装原始API调用来自动验证其成功与否的同时也提供了友好的报错信息输出功能。一旦发现任何非零返回码即刻终止后续逻辑分支转而进入except block做进一步分析诊断直至恢复正常运作为止[^3]. ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值