报错解决:RuntimeError: CUDA error: out of memory CUDA kernel errors

报错现象

在device为CUDA的情况下,运行多个程序的时候,可能会遇到如下报错

RuntimeError: CUDA error: out of memory CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect. For debugging consider passing CUDA_LAUNCH_BLOCKING=1.

分析原因

程序默认都在同一个卡上跑,所以会出现内存不足的情况

解决

在代码开头加上如下代码,为该代码的运行指定一个可用的卡

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '1'
### 解决 CUDA 内存不足错误 当遇到 `RuntimeError: CUDA error: out of memory` 错误时,这通常意味着 GPU 显存不足以支持当前的任务需求。为了有效处理这一问题并确保程序稳定运行,可以采取多种策略。 #### 调试方法 传递环境变量 `CUDA_LAUNCH_BLOCKING=1` 可以帮助定位异步报告的 CUDA 内核错误位置[^1]。此设置使得每个 CUDA 操作同步执行,从而简化了调试过程中的堆栈跟踪分析。通过这种方式,开发者能够更精确地找到引发内存溢出的具体操作。 #### 减少显存占用的方法 - **降低批量大小**:减少输入数据批次的数量可以直接减小模型所需的临时存储空间。 - **优化模型结构**:精简网络层数量或参数规模有助于缓解资源紧张状况;考虑采用轻量化架构替代复杂模型。 - **启用混合精度训练 (Mixed Precision Training)**:利用 FP16 数据类型代替部分计算中的 FP32 类型,在不影响最终效果的前提下节省大量显存开销[^2]。 ```python from torch.cuda import amp scaler = amp.GradScaler() for data, target in train_loader: optimizer.zero_grad() with amp.autocast(): output = model(data) loss = criterion(output, target) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update() ``` - **清理未使用的张量对象**:及时释放不再需要的 PyTorch Tensor 对象,并调用 `torch.cuda.empty_cache()` 来手动清除缓存,以便回收可用显存。 ```python del tensor_variable # 删除不必要的tensor import gc; gc.collect() # 执行垃圾收集 torch.cuda.empty_cache() # 清除GPU上的缓存分配器 ``` #### 设置特定设备 如果多块 GPU 卡共存,则应指定确切的目标卡号来避免默认选择带来的不确定性。例如: ```python device = torch.device('cuda:6' if torch.cuda.is_available() else 'cpu') model.to(device=device) # 将模型迁移到目标设备上 state_dict = torch.load(args.weights, map_location=device) model.load_state_dict(state_dict, strict=False) ``` 上述代码片段展示了如何强制加载权重文件至预定义编号为 6 的 GPU 上工作,而不是依赖于系统自动分配的结果[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值