📚 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.run 被 torch.distributed.launch 替代。PyTorch>=1.9。有关详细信息请参阅文档docs。
训练
选择要开始训练的预训练模型。在这里,我们选择了YOLOv5s,这是选用的最小和最快的模型。有关所有模型的完整比较,请参阅 README table 。这些是我们在COCO数据集上使用多GPU训练的模型。
单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 A100 | batch-size | CUDA_mem device0 (G) | COCO train | COCO val |
---|---|---|---|---|
1x | 16 | 26GB | 20:39 | 0:55 |
2x | 32 | 26GB | 11:43 | 0:57 |
4x | 64 | 26GB | 5:57 | 0:55 |
8x | 128 | 26GB | 3:09 | 0:57 |
FAQ
如果出现错误,请先阅读下面的检查表!(这可以节省您的时间。)
-
你读过这篇文章了吗
-
你有没有尝试重新锁定代码库?代码每天都在变化。
-
您是否尝试搜索错误?有人可能已经在这个仓库或其他仓库中遇到了它,并找到了解决方案。
-
您是否安装了上面列出的所有需求(包括正确的Python和Pytorch版本)?
-
您是否尝试过下面"环境"部分中列出的其他环境?
-
您是否尝试过其他数据集,如coco128或coco2017 ?这将更容易找到根本原因。
如果您完成了以上所有内容,请按照模板提供尽可能多的细节,提出问题。