解决RuntimeError: CUDA error: out of memory

文章描述了一位开发者遇到CUDA运行时内存不足的问题,尝试调整batchsize、检查CUDA使用、更改代码引用、卸载重装PyTorch及适配版本,最后发现是GPU未启动导致的问题,重启GPU后问题得到解决。

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

注意:报错内容只有这一行,RuntimeError: CUDA error: out of memory,没有后面的内存分析。
因为报错的时候忘记截图了,修改好了才来记录的。这里引用别的博主的图片。图片来源
在这里插入图片描述
1:刚开始我怀疑是batchsize设的太大了,将batchsize由8,改为6,改为4,都跑不了,最后改为1,仍然报错,因此可以判定是其他的原因,非gpu内存不够。

2:出现的位置在:怀疑是后面加了cuda的原因,删掉仍跑不了。
在这里插入图片描述
3:删除后报错的地方为:怀疑是cuda是单引号造成的,改为双引号仍然无法解决。
在这里插入图片描述
4:看了博主的方案,第一个kill掉pid,但是打开nvidia-smi没有显示正在运行的gpu,说明根本没占用。

5:第二个就是最不想面对解决方法,重装pytorch。说明pytorch版本和cuda版本不匹配,于是查看了自己的版本。
torch : 1.12.1 / python : 3.7.6 / cuda : 10.1 / torchvision : 0.13.1
查看版本对应:
在这里插入图片描述
发现pytorch版本太高了,因此需要降低版本,但是直接降级反复报错,因此只能将pytorch卸载掉,重新去官网下载。
pip uninstall torch
pip uninstall torchvision
然后去torch官网找到cuda10.1,torch 1.7.1,torchvision 0.8.2。一般torch和torchvison下载时候是一起的,但是如果前面高版本torch卸载时候没有卸载掉torchvision,那么查看torchvision 版本时候就会报错torch.fx。这时候再卸载掉高版本的torchvision 就可以了,低版本的torchvision 才会露出来,相当于被覆盖掉了。
重装完pytorch后,前面几个修改全部改回原来的代码,再重新运行。
在这里插入图片描述
成功运行!

2.23.2.10
今天在使用九天毕昇的jupter的时候又发生了RuntimeError: CUDA error: out of memory。报错代码定位到model.to(device),查看一下torch,cuda版本发现都是对应的,因此上一次都可以运行,这次为什么又不行了,不能继续重装torch吧。
最后在github上发现了类似的错误。github
是因为GPU没有启动导致的,解决办法就是关闭后重新启动。
在这里插入图片描述
重启之后,可以成功运行了。

### 解决 CUDA Out of Memory 的方法 当遇到 `RuntimeError: CUDA out of memory` 错误时,通常是因为 GPU 显存不足以支持当前模型或数据的计算需求。以下是几种常见的解决方案: #### 1. 减少批量大小(Batch Size) 较大的批量大小会占用更多的显存资源。可以通过降低批量大小来减少显存消耗[^1]。 ```python batch_size = 32 # 原始值可能为64或其他较大数值 dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True) ``` #### 2. 使用梯度累积(Gradient Accumulation) 如果减小批量大小会影响训练效果,可以采用梯度累积技术,在多个较小批次上累计梯度后再更新参数。 ```python accumulation_steps = 4 # 梯度累积步数 optimizer.zero_grad() for i, data in enumerate(dataloader): inputs, labels = data outputs = model(inputs) loss = criterion(outputs, labels) loss = loss / accumulation_steps loss.backward() if (i + 1) % accumulation_steps == 0: optimizer.step() optimizer.zero_grad() ``` #### 3. 清理未使用的张量变量 在某些情况下,PyTorch 中可能存在悬空的张量对象占据显存空间。通过手动清理这些对象并调用垃圾回收机制可以帮助释放部分显存。 ```python import torch import gc del variable_name # 删除不再需要的张量变量 torch.cuda.empty_cache() # 手动清空缓存 gc.collect() # 调用Python的垃圾收集器 ``` #### 4. 设置环境变量优化显存分配策略 调整 PyTorch 的显存管理配置能够有效缓解碎片化问题。例如设置 `PYTORCH_CUDA_ALLOC_CONF` 来控制最大分割尺寸。 ```bash export PYTORCH_CUDA_ALLOC_CONF="max_split_size_mb:128" ``` 或者直接在 Python 程序中实现: ```python import os os.environ['PYTORCH_CUDA_ALLOC_CONF'] = 'max_split_size_mb:128' ``` #### 5. 启用混合精度训练(Mixed Precision Training) 利用 NVIDIA 提供的 Apex 或者原生 PyTorch 功能启用 FP16 训练模式,从而显著降低显存使用率。 ```python from torch.cuda.amp import GradScaler, autocast 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() ``` 以上方法单独或组合应用均能有效地应对因显存不足引发的各种错误情况。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值