YOLOX训练:显存足够,但依旧CUDA out of memory(Tried to allocate 5.58 GiB,8.00 GiB total capacity,6.40 GiB free)

博主在尝试训练YOLOX_S模型时遇到了CUDA内存溢出问题,无论调整batch_size大小都无法避免。已尝试加载预训练权重和不加载权重,但都报相同的错误。检查显示GPU显存未被其他进程占用。尝试了关闭优化选项(-o)和运行CUDA测试代码,但问题依旧。目前怀疑需要深入修改训练配置或检查环境设置。

问题已经解决,请参考以下博文:
https://blog.youkuaiyun.com/ELSA001/article/details/120918082?spm=1001.2014.3001.5501

刚刚我尝试训练自己的yolox_s模型,但我batch_size不管改成多少,甚至改成1,都直接报CUDA out of memory,我很苦恼,这里明明显示我的显存是足够的,但是依旧OOM。
训练命令如下:

(mypytorch) E:\YOLOX>python tools/train.py -f exps/example/yolox_voc/yolox_voc_s_bm.py -d 1 -b 2 --fp16 -o -c weights/yolox_s.pth

我在这里加载了GitHub的预训练权重文件:yolox_s.pth

报错图片如下:
在这里插入图片描述

RuntimeError: CUDA out of memory. 
Tried to allocate 5.58 GiB (GPU 0; 8.00 GiB total capacity; 
43.62 MiB already allocated; 6.40 GiB free;
8.00 GiB allowed; 64.00 MiB reserved in total by PyTorch)

如果不加载预训练权重文件:
训练命令如下:

(mypytorch) E:
在使用 CUDA 进行 GPU 计算时,遇到 `CUDA out of memory` 错误是较为常见的问题。该错误通常表明程序试图分配的显存超出了 GPU 的可用内存容量。以下是几种解决此类问题的方法: ### 1. 减小批量大小(Batch Size) 最常见的解决方案之一是减小训练或推理时的批量大小[^1]。较大的批量大小会显著增加显存需求,特别是在深度学习模型中。通过逐步减少批量大小,可以找到一个既能满足性能要求又不会导致显存溢出的值。 ```python # 示例:调整 PyTorch 中的数据加载器批量大小 from torch.utils.data import DataLoader data_loader = DataLoader(dataset, batch_size=32, shuffle=True) # 尝试将 batch_size 调整为更小的值 ``` ### 2. 检查并优化模型结构 某些模型结构可能会占用大量显存,尤其是在包含大量参数或复杂层的情况下。可以通过简化模型、移除不必要的层或使用更高效的网络架构来降低显存消耗[^1]。 ### 3. 使用混合精度训练 启用混合精度训练可以有效减少显存占用,并加速计算过程。NVIDIA 提供了 `apex` 库来支持这一功能,适用于 PyTorch 等框架。 ```python from apex import amp model, optimizer = amp.initialize(model, optimizer, opt_level="O1") # 启用混合精度 ``` ### 4. 清理缓存和释放无用内存 PyTorch 和 TensorFlow 等框架提供了清理缓存的功能。如果程序中存在未释放的中间变量,可以尝试手动调用垃圾回收机制或清除缓存。 ```python import torch torch.cuda.empty_cache() # 清空缓存中的未使用显存 ``` ### 5. 升级硬件或切换设备 如果当前 GPU 显存不足以支持任务,可以考虑升级到具有更大显存的 GPU 或者在 CPU 上运行部分任务。虽然 CPU 性能可能不如 GPU,但在调试或低负载场景下是一个可行的选择[^1]。 ### 6. 检查驱动和 CUDA 安装 确保 NVIDIA 驱动和 CUDA 工具包已正确安装,并且版本兼容。不正确的安装可能导致资源管理异常,进而引发显存不足的问题。如引用[3]所述,选择合适的驱动版本并避免重复安装冲突版本非常重要。 ### 7. 使用 `nvidia-smi` 监控显存使用情况 通过命令行工具 `nvidia-smi` 可以实时查看各个进程对 GPU 显存的占用情况,帮助定位是否存在其他占用显存的进程。 ```bash nvidia-smi -q -d MEMORY ``` ### 8. 分布式训练或多 GPU 并行 对于大规模模型,可以采用分布式训练或多 GPU 并行的方式,将模型或数据分片处理,从而降低单个 GPU 的显存压力。例如,在 PyTorch 中可以使用 `DataParallel` 或 `DistributedDataParallel` 实现多卡并行。 ```python model = torch.nn.DataParallel(model).cuda() # 多 GPU 并行 ``` ### 9. 使用内存分析工具排查泄漏 某些情况下,显存不足可能是由于显存泄漏引起的。可以使用 CUDA 自带的内存检查工具(如 `cuda-memcheck`)进行诊断,识别潜在的内存访问错误或泄漏点。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值