news 2026/9/30 2:30:16

工业视觉实战 + YOLO避坑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
工业视觉实战 + YOLO避坑

YOLOv11 四卡训练卡住不动,切换单卡却正常:一次多 GPU DDP 训练排查记录

一、问题现象

最近在云训练机上训练 YOLOv11 自定义工业缺陷数据集时,我原本准备使用四张 GPU 加快训练,训练指令大致如下:

yolo detect train data=./yaml/xxx.yaml model=yolo11m.pt epochs=200 patience=30 imgsz=2048 batch=32 device=0,1,2,3

但是启动训练后,程序一直停在多卡初始化阶段,训练没有正常进入第一个 epoch。等待一段时间后,日志也没有继续明显刷新,看起来像“卡住不动”。

后来把参数改为单卡:

device=0

训练就可以正常启动并进入 epoch。

也就是说,模型、数据集、标签和基本训练参数并没有完全失效;真正出问题的环节,大概率出现在多 GPU 训练额外触发的 DDP 分布式环境上。


二、为什么单卡正常,多卡却会卡住?

很多人会以为,多卡训练只是把:

device=0

改成:

device=0,1,2,3

实际上并不是这么简单。

单卡训练时,YOLO 只需要启动一个训练进程,直接调用一张显卡即可。

而多卡训练时,Ultralytics 会启动 DDP(Distributed Data Parallel,分布式数据并行)模式。简单理解,就是每张显卡都会对应一个训练进程,多个进程之间需要同步模型参数、梯度、数据和训练状态。

所以只要其中一张卡、一个子进程或某个通信环节出问题,其他进程就可能一直在等待,最终表现为:

  • 日志停在 DDP 初始化附近;

  • GPU 利用率不高,甚至一直为 0;

  • 显存看似占了一点,但训练不进入 epoch;

  • 单卡训练正常,多卡训练失败或卡住。

因此,单卡能跑通,并不代表四卡环境一定正常;它只能说明模型、数据和基础训练流程大概率没有致命问题。


三、多卡训练卡住时,先不要急着重装环境

遇到这种情况,我建议按下面顺序排查,而不是一上来就重装 CUDA、PyTorch 或系统。

1. 先确认单卡能否正常训练

先使用:

device=0

如果单卡可以正常进入训练,并且 loss、mAP 等指标正常变化,那么可以初步排除以下问题:

  • 数据集路径完全错误;

  • yaml 文件无法读取;

  • 标签格式整体异常;

  • 模型文件无法加载;

  • 当前训练参数完全不可用。

这一步很重要,因为它能把问题范围从“整个训练流程”缩小到“多卡 DDP 环境”。


2. 查看每张显卡是否都正常可用

在训练机终端执行:

nvidia-smi

重点看下面几项:

  • 四张显卡是否都能识别;

  • 是否有某张卡已经被其他训练任务占用;

  • 每张卡的显存是否差异很大;

  • 是否有残留 Python 进程没有退出;

  • GPU 利用率是否长期为 0。

如果其中一张 GPU 被其他任务占用、显存不足,或者状态异常,多卡训练就可能无法正常初始化。


3. 注意 batch 和显卡数量是否匹配

我这里使用四张 GPU,设置的是:

batch=32 device=0,1,2,3

理论上平均下来就是每张卡处理 8 张图,这种设置通常比较合理。

但如果总 batch 太小、不能被 GPU 数量整除,或者图片尺寸很大导致某张显卡显存先爆,也可能导致多卡训练异常。

例如,2048 分辨率下模型显存压力明显比 640 或 1024 大得多。即使总 batch 看起来不大,多卡训练时仍然需要结合显存情况逐步测试。

建议按下面顺序尝试:

# 先测试两张卡 device=0,1 batch=16

确认两张卡正常后,再测试四张卡:

device=0,1,2,3 batch=32

不要直接认为“有四张卡,就一定要四张卡全部开满”。


4. DataLoader 也可能导致看似“多卡卡住”

YOLO 训练除了 GPU 外,还会启动数据加载进程读取图片、标签并进行增强。

如果数据量很大、图片分辨率很高,或者数据中混有损坏图片、异常标签、路径问题,多卡下的 DataLoader 会比单卡更容易暴露问题。

排查时可以先降低 workers:

yolo detect train data=./yaml/xxx.yaml model=yolo11m.pt epochs=200 imgsz=2048 batch=16 device=0,1 workers=2

如果降低workers后可以正常启动,说明问题可能和数据读取、多进程加载或服务器 CPU 资源有关。

同时建议检查:

  • 是否有损坏图片;

  • 图片和标签是否一一对应;

  • 标签中是否存在空行、类别编号越界;

  • 数据路径是否包含特殊字符;

  • 网络盘或挂载磁盘读取是否稳定。


5. 自定义模块和 DDP 兼容性也要注意

如果使用的是官方原版 YOLO,一般 DDP 兼容性会相对好一些。

但如果项目里加入了自定义网络模块、自定义数据增强、自定义 Trainer、改过数据集读取逻辑,多卡训练时就可能出现问题。

原因是多卡 DDP 需要启动多个子进程,而部分自定义对象无法被正常传递到子进程中。单卡不需要处理这个问题,所以可能单卡正常、多卡异常。

因此,如果项目加入过自定义模块,建议先用官方模型和最基础参数测试多卡环境:

yolo detect train data=./yaml/xxx.yaml model=yolo11n.pt epochs=2 imgsz=640 batch=16 device=0,1

如果这个最小测试能跑通,再逐步恢复自己的模型、分辨率和训练参数。


四、我这次的处理方式

这次训练时,多卡模式没有正常进入训练流程,但切换成单卡后可以正常运行。

因此我没有继续在当下任务里反复消耗时间排查四卡,而是先使用单卡完成当前训练,保证模型迭代不被卡住。

后续如果确实需要提升训练速度,再单独安排时间排查多卡环境,建议顺序如下:

  1. 单卡确认模型和数据正常;

  2. 两卡、小 batch、低分辨率进行最小测试;

  3. 检查nvidia-smi中每张 GPU 的状态;

  4. 降低workers;

  5. 检查 PyTorch、CUDA、驱动版本是否匹配;

  6. 最后再恢复四卡、2048 分辨率和正式 batch。

这样排查效率会比“直接四卡硬跑”高很多。


五、结论

YOLOv11 多卡训练卡住、单卡却正常,通常不是模型本身突然坏了,而是多卡 DDP 训练比单卡多了一层进程通信、显卡同步和数据加载的问题。

对于实际项目来说,优先级应该是:

先让模型稳定训练,再追求多卡加速。

尤其是工业缺陷检测项目,数据分辨率大、训练周期长、客户现场问题多。与其为了开满显卡浪费半天时间,不如先用单卡把模型跑出来、验证效果,再单独处理多卡环境问题。


六、快速排查清单

  • 单卡device=0是否能正常训练

  • nvidia-smi是否识别到所有 GPU

  • 是否有其他进程占用显卡

  • batch 是否适合当前显卡数量和显存

  • 是否尝试过先用两张卡测试

  • 是否降低过workers

  • 数据集中是否有损坏图片、空标签或异常标签

  • 是否使用了自定义模块、Trainer 或数据增强

  • PyTorch、CUDA、驱动版本是否匹配

  • 是否先用最小模型、低分辨率跑通 DDP

参考资料

  • Ultralytics YOLO 训练文档:Model Training with Ultralytics YOLO | Ultralytics

  • PyTorch Distributed 文档:Redirecting…

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 2:30:11

企业财税合规如何规避风险?专业税务师服务为企业保驾护航

在企业经营过程中,财税管理是贯穿发展全程的核心环节,也是最容易产生风险的关键板块。很多中小企业普遍存在财税认知不足、账务梳理不规范、涉税事项处理不专业等问题,看似细微的财税疏漏,可能引发税务异常、合规处罚、资金损耗等…

作者头像 李华
网站建设 2026/9/30 2:27:08

《SpringBoot 3:入门与应用实战》第 3 章 IOC 容器中的 Bean 阅读笔记 2

《SpringBoot 3:入门与应用实战》第 3 章 IOC 容器中的 Bean 阅读笔记 2 3.2 Bean 的作用域 作用域是一个很关键的概念,理解这个概念对学习 Spring Framework 中 Bean 的作用域很有帮助。 3.2.1 理解作用域 Java 语言的基础概念:成员变量、方…

作者头像 李华