YOLO Vision 2026:

使用 YOLOv5 进行多 GPU 训练#

本指南介绍了如何在单机或多机环境下使用 多个 GPU 训练 YOLOv5。

开始之前#

克隆仓库并在包含 PyTorch>=1.8Python>=3.8.0 环境中安装 requirements.txt模型数据集会从最新的 YOLOv5 发布版本中自动下载。

git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install
使用 Docker

推荐在所有多 GPU 训练运行中使用 Ultralytics Docker 镜像。请参阅Docker 快速入门指南Docker Pulls

PyTorch >= 1.9

PyTorch >= 1.9 中,torch.distributed.run 替换了 torch.distributed.launch。详情请参见 PyTorch 分布式文档

训练#

选择一个预训练模型来开始训练。这里我们选择 YOLOv5s,这是一个小型且快速的模型。有关所有模型的完整对比,请参阅我们的 README 表格。我们将在 COCO 数据集上使用多 GPU 训练这个模型。

YOLOv5 Models

单 GPU#

python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0

多 GPU DataParallel 模式(⚠️ 不推荐)#

将多个 GPU ID 传给 --device 以启用 DataParallel 模式:

python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1

DataParallel 速度较慢,与使用单 GPU 相比几乎无法加快训练速度。

多 GPU DistributedDataParallel 模式(✅ 推荐)#

在训练命令前加上 python -m torch.distributed.run --nproc_per_node,然后传入常规参数:

python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1
  • --nproc_per_node 是要使用的 GPU 数量。在上面的示例中,它是 2
  • --batch 是总批次大小,均匀分摊到每个 GPU 上。在上面的示例中,每个 GPU 为 64 / 2 = 32

上面的命令使用了 GPU 0...(N-1)。如果想改用环境变量来控制设备可见性,请在启动前设置 CUDA_VISIBLE_DEVICES=2,3(或任何其他列表)。

Use specific GPUs (click to expand)

传入 --device 并紧跟具体的 GPU ID。以下示例使用了 GPU 2,3

python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --device 2,3
Use SyncBatchNorm (click to expand)

SyncBatchNorm 可以提高多 GPU 训练的准确率,但它会显著减慢训练速度。它适用于多 GPU DistributedDataParallel 训练。

最适合在每个 GPU 上的批次大小较小 (<= 8) 时使用。

要启用 SyncBatchNorm,请传入 --sync-bn

python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --sync-bn
Use Multiple machines (click to expand)

此功能 可用于多 GPU DistributedDataParallel 训练。

在继续之前,请确保所有机器上的数据集、代码库和任何其他依赖项一致,然后验证机器之间网络互通。

选择一台主机(其他机器将连接到这台机器),记下其地址 (master_addr),并挑选一个端口 (master_port)。以下示例使用了 master_addr = 192.168.1.1master_port = 1234

然后运行:

# On master machine 0
python -m torch.distributed.run --nproc_per_node G --nnodes N --node_rank 0 --master_addr "192.168.1.1" --master_port 1234 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights ''
# On machine R
python -m torch.distributed.run --nproc_per_node G --nnodes N --node_rank R --master_addr "192.168.1.1" --master_port 1234 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights ''

其中 G 是每台机器的 GPU 数量,N 是机器数量,R 是机器在 0...(N-1) 中的排名。例如,对于两台机器且每台机器有两个 GPU,请在第二台机器上设置 G = 2N = 2R = 1

所有 N 机器连接之前,训练不会开始。输出仅显示在主机上。

注意事项#

  • Windows 支持未经测试;建议使用 Linux。

  • --batch 必须是 GPU 数量的倍数。

  • GPU 0 使用的内存略多于其他 GPU,因为它负责维护 EMA 并处理检查点。

  • 如果你遇到 RuntimeError: Address already in use,这通常意味着多个训练运行在使用同一个端口。请使用 --master_port 指定一个不同的端口:

    python -m torch.distributed.run --master_port 1234 --nproc_per_node 2 ...

结果#

在带有 8x A100 SXM4-40GB 的 AWS EC2 P4d 实例上对 YOLOv5l 进行 1 个 COCO 轮次的 DDP 性能分析结果。

Profiling code
# prepare
t=ultralytics/yolov5:latest && sudo docker pull $t && sudo docker run -it --ipc=host --device nvidia.com/gpu=all -v "$(pwd)"/coco:/usr/src/coco $t
pip3 install torch==1.9.0+cu111 torchvision==0.10.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html
cd .. && rm -rf app && git clone https://github.com/ultralytics/yolov5 -b master app && cd app
cp data/coco.yaml data/coco_profile.yaml

# profile
python train.py --batch-size 16 --data coco_profile.yaml --weights yolov5l.pt --epochs 1 --device 0
python -m torch.distributed.run --nproc_per_node 2 train.py --batch-size 32 --data coco_profile.yaml --weights yolov5l.pt --epochs 1 --device 0,1
python -m torch.distributed.run --nproc_per_node 4 train.py --batch-size 64 --data coco_profile.yaml --weights yolov5l.pt --epochs 1 --device 0,1,2,3
python -m torch.distributed.run --nproc_per_node 8 train.py --batch-size 128 --data coco_profile.yaml --weights yolov5l.pt --epochs 1 --device 0,1,2,3,4,5,6,7
GPUs
A100
batch-sizeCUDA_mem
device0 (G)
COCO
train
COCO
val
1x1626GB20:390:55
2x3226GB11:430:57
4x6426GB5:570:55
8x12826GB3:090:57

正如结果所示,在多个 GPU 上使用 DistributedDataParallel 可以提供接近线性的训练速度扩展。使用 8 个 GPU 时,训练完成的速度比单个 GPU 快大约 6.5 倍,同时保持每个设备的内存用量不变。

支持的环境#

Ultralytics 提供了各种开箱即用的环境,每个环境都预先安装了诸如 CUDACUDNNPythonPyTorch 等基本依赖项,以帮助你快速启动项目。

项目状态#

YOLOv5 CI

此徽章表示所有 YOLOv5 GitHub Actions 持续集成 (CI) 测试均已成功通过。这些 CI 测试严格检查了 YOLOv5 在各个核心方面的功能和性能:训练验证推理导出基准测试。它们确保在 macOS、Windows 和 Ubuntu 上保持一致且可靠的运行,测试每 24 小时以及每次新提交时进行。

致谢#

我们衷心感谢 @MagicFrogSJTU 完成了所有繁重的工作,并感谢 @glenn-jocher 在此过程中的指导。

另请参阅#

常见问题解答#

在提交 Issue 之前,请阅读以下检查清单——这通常能节省时间。

Checklist (click to expand)
  • 你是否已完整阅读本指南?
  • 你是否已重新克隆代码库?代码库会 每天 更新。
  • 你是否已搜索过错误信息?可能别人已经遇到过同样的问题并分享了解决方法。
  • 你是否已安装所有要求(包括正确的 Python 和 PyTorch 版本)?
  • 你试过上面列出的支持的环境之一吗?
  • 你是否尝试过更小的数据集(例如 coco128coco2017)来隔离根本原因?

如果以上检查均无误,请按照模板提交一个尽可能详细的 Issue。

评论