YOLO 训练输出日志解读
我们在进行训练时,在控制台会输出如下图所示的 YOLO 训练输出日志:
我们逐一来分析,从左到右每列通常代表以下信息:
- Epoch:当前训练已进行的轮数和总轮数。例:
83/150
即第 83 个 Epoch,共计要训练 150 个 Epoch。 - GPU_mem:显示当前使用的显存大小(如
3.66G
),方便监控显存占用情况。 - box_loss / cls_loss / dfl_loss:这仨就是不同类型的损失项(我们可以调整三个损失项的权重,YOLO11默认box: 7.5,cls: 0.5,dfl: 1.5)这些数值越低通常代表模型在该部分的预测越准确。
- box_loss:边界框回归的损失,衡量预测框和真实框的差异。
- cls_loss:分类损失,用于判断目标种类是否预测正确。
- dfl_loss:如果使用了 DFL (Distribution Focal Loss) 分布焦点损失,在这里显示分布回归带来的损失。
-
Instances:表示该 batch (或该 Epoch 累计)中所包含的目标实例数量,比如 209 个目标框。
- Size:显示训练使用的图像分辨率(如
512: 100%
),以及进度条(“118/118” 表示当前 epoch 一共有 118 个 batch 已经完成)。 - 旁边的时间
[00:10<00:00, 10]
等表示已用时、估计剩余时间、以及处理速度(约多少张图片/秒或 batch/秒)。 - Class / Images / Instances / Box(P) / R / mAP50 / mAP50-95(表格下方汇总行):
- Class: “all” 表示对所有类别做总体统计。
- Images: 476 → 验证/测试集里有 476 张图像。
- Instances: 10762 → 这 476 张图像中共包含 10762 个目标实例。
- Box(P): 0.563 → 模型框预测的精确率 (Precision);
- R: 0.475 → 模型框预测的召回率 (Recall);
- mAP50: 0.486 → 平均准确率 (AP) 在 IoU=0.5 时对各类取平均后再对所有类取平均;
- mAP50-95: 0.258 → 在 IoU 从 0.5 到 0.95(步长 0.05)对 AP 做平均后再对所有类别做平均,衡量更严格的检测效果。
综合起来,这些指标用来评估模型的检测效果和训练状况:
- loss 趋势:随着训练进行,应当整体下降。
- 精度与召回 (P / R):查询预测是否准确,以及是否漏检。
- mAP:衡量检测整体准确率和召回率的综合指标,越高越好。
OutOfMemoryError错误解决
OOM错误背景
今天我在训练YOLO模型时,刚开始的几轮都能正常运行,本来已经放下心来,但是到第10轮的时候突然报错,顿时汗流浃背,看到错误如下:
torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 6.55 GiB. GPU 0 has a total capacty of 23.55 GiB of which 2.90 GiB is free. Including non-PyTorch memory, this process has 0 bytes memory in use. Of the allocated memory 16.77 GiB is allocated by PyTorch, and 3.24 GiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF
直译过来就是,torch.cuda.OutOfMemoryError: CUDA 内存不足。尝试分配 6.55 GiB。GPU 0 的总容量为 23.55 GiB,其中 2.90 GiB 可用。包含非 PyTorch 内存后,该进程目前使用了 0 字节的内存。在已分配的内存中,有 16.77 GiB 被 PyTorch 分配,另外 3.24 GiB 被 PyTorch 保留但未实际使用。如果保留但未使用的内存较大,请尝试设置 max_split_size_mb 来避免碎片化。有关内存管理和 PYTORCH_CUDA_ALLOC_CONF 的更多信息,请参阅文档(感觉是很礼貌很有深意的高情商发言,需要琢磨琢磨...)
翻译成大白话就是,这个报错表示在 GPU 上分配显存时出现了不足,应该是因为训练过程需要的显存超过了当前可用显存(PyTorch 会报告需要的显存量、已分配的显存和剩余显存等信息)。简单来说,就是咱们设置的训练配置(模型大小、Batch Size 等)太大了导致 GPU 显存不够用了。
可能的原因
- 训练批大小过大:每个 batch 中的图像数量太多,导致一次前向/反向传播需要分配过多的显存。(我就是把batch设置为了-1,理想的情况应该是自动调整批次大小,到显卡能够容纳的最多图像数量,但是实际情况就是前几轮训练的很快,后面就开始报错...)
- 模型结构或输入分辨率过大:如果模型非常大或者输入图像分辨率很高,对显存需求也会增加。
- 显存碎片化:显存中已有分配与释放导致碎片化,剩余空间(3.24 GiB)并不能一次性满足新请求(6.55 GiB)。PyTorch 提示可以调整
max_split_size_mb
来改善碎片化问题。 - 其他进程占用显存:你的系统上是否同时运行了其他占用 GPU 的进程,也会导致可用显存降低。
可能的解决方案
- 减小 Batch Size:这应该是最常见也最有效的做法了,用更小的 batch 大小来减少一次性分配的显存量。
- 降低图像分辨率:如果训练允许,可以把输入图像分辨率调低一些(但是或许对精度有点影响,对炼丹者不太友好)...
- 使用梯度累加(gradient accumulation):将大的 batch 划分成多个更小的 batch,累加梯度后再更新模型参数,减少单次前向/反向传播的显存需求。
- max_split_size_mb:根据报错提示,设置环境变量
PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:<value>
(如 128 或 64)可能会缓解碎片化问题。 - 清理其他 GPU 进程:看看有没有其他程序占用了大量 GPU 资源,在启动训练前关了就OK,或者使用 nvidia-smi 来查看/释放 GPU。
- 混合精度训练:使用自动混合精度(AMP),在部分层用16位浮点数训练,可以显著减少显存占用(炼丹慎用)。
总的来看,当出现OOM报错时,可以先尝试把 Batch Size 调小或分辨率降一点,看看是否能正常运行。如仍出现 OOM 报错,可结合上述其他方法进一步优化...祝大家好运,炼丹顺利哈哈哈
最后
YOLOv11小白的进击之路系列持续更新中...欢迎一起交流探讨 ~ 砥砺奋进,共赴山海!