Multi-GPU Training 🌟

417 阅读3分钟

翻译自:github.com/ultralytics…

📚 This guide explains how to properly use multiple GPUs to train a dataset with YOLOv5 🚀 on single or multiple machine(s). UPDATED 28 April 2022.

开始之前

克隆存储库和安装要求 requirements.txt 在Python>=3.7.0 环境中,包括PyTorch>=1.7。模型数据集从最新的YOLOv5版本自动下载

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

💡 ProTip!Docker镜像 推荐用于多GPU训练。请参阅Docker快速入门指南

💡 ProTip!torch.distributed.runtorch.distributed.launch 替代。PyTorch>=1.9。有关详细信息请参阅文档docs

训练

选择要开始训练的预训练模型。在这里,我们选择了YOLOv5s,这是选用的最小和最快的模型。有关所有模型的完整比较,请参阅 README table 。这些是我们在COCO数据集上使用多GPU训练的模型。

imgs

单GPU

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

多卡dp模式(⚠️ 不被推荐)

您可以增加设备以在数据并行模式下使用多个GPU。

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

与仅使用1个GPU相比,这种方法速度慢和几乎无法加快训练速度。

多卡ddp模式(✅ 推荐)

您必须传递 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)。

使用特定的GPU

你可以通过简单地传递 --device后跟特定的GPU来实现。例如,在下面的代码中,我们将使用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

使用SyncBatchNorm

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

最好在每个GPU上的批处理大小较小(<=8)时使用。

要使用SyncBatchNorm,只需将--sync bn传递给如下命令,

使用多机训练

这仅适用于多GPU分布式数据并行训练。

在训练之前,确保所有机器上的文件都相同,数据集、代码库等。之后,确保机器可以相互通信。

您必须选择一台主机器(其他机器将与之对话)。记下它的地址(master_addr)并选择一个端口(master-port)。对于下面的示例,将使用master_addr=192.168.1.1和master_ 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=2,N=2,R=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 ...

结果

DDP 分析结果在AWS EC2 P4d instance with 8x A100 SXM4-40GB for YOLOv5l for 1 COCO epoch.

分析代码

# prepare
t=ultralytics/yolov5:latest && sudo docker pull $t && sudo docker run -it --ipc=host --gpus 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 A100batch-sizeCUDA_mem device0 (G)COCO trainCOCO val
1x1626GB20:390:55
2x3226GB11:430:57
4x6426GB5:570:55
8x12826GB3:090:57

FAQ

如果出现错误,请先阅读下面的检查表!(这可以节省您的时间。)

  • 你读过这篇文章了吗

  • 你有没有尝试重新锁定代码库?代码每天都在变化。

  • 您是否尝试搜索错误?有人可能已经在这个仓库或其他仓库中遇到了它,并找到了解决方案。

  • 您是否安装了上面列出的所有需求(包括正确的Python和Pytorch版本)?

  • 您是否尝试过下面"环境"部分中列出的其他环境?

  • 您是否尝试过其他数据集,如coco128或coco2017 ?这将更容易找到根本原因。

如果您完成了以上所有内容,请按照模板提供尽可能多的细节,提出问题。