本指南解释了如何正确地 在一个或者多个机器上 使用 多gpu 在一个数据集上训练训练YOLOv5 。2022年4月6日更新。
https://github.com/ultralytics/yolov5/issues/475
克隆仓库并且在一个 Python>=3.7.0 环境下安装 requirements.txt ,包括 PyTorch>=1.7. Models 和 datasets 自动下载 从最新的 YOLOv5 release.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install
ProTip! Docker Image 被推荐使用对于所有的Multi-GPU训练. See Docker Quickstart Guide, Docker Hub
ProTip! torch.distributed.run
replaces torch.distributed.launch
in PyTorch>=1.9. See docs for details.
选择一个预训练模型开始训练。这里,我们选择 YOLOv5s,可用的最小和最快的模型。有关所有模型的完整比较,请参见我们的 README table 。我们将在 COCO 数据集上使用 Multi-GPU来训练这个模型。
$ python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0
你可以增加 device
来使用 Multiple GPUs 以 DataParallel 模式.
$ python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1
这种方法是慢的,与只使用 1 GPU相比,几乎不能加速训练。
你将不得不通过 python -m torch.distributed.launch --nproc_per_node
, 跟着常用的参数.
$ python -m torch.distributed.launch --nproc_per_node 2 train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1
--nproc_per_node
指定你想要使用多少 GPUs。上面例子中是2。 --batch
是总的 batch-size.
它将会被 平分到每个GPU. 上面的例子中,每个 GPU 是 64/2=32 。
上面的代码将使用 GPUs 0... (N-1)
。
使用特定 GPUs
您可以通过简单地传递 --device 后面跟随特定的 GPUs来实现这一点。例如,在下面的代码中,我们将使用 GPUs 2,3
。
$ python -m torch.distributed.launch --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --device 2,3
使用 SyncBatchNorm
SyncBatchNorm 可以提高多 gpu 训练的accuracy ,但是,多卡之间通信,会导致训练速度变慢。它只适用于 Multiple GPU DistributedDataParallel 训练。
最好在当每个 GPU 上的 batch-size 较小(< = 8)时使用它。
要使用 SyncBatchNorm,简单的传递 --sync-bn 到下面的命令,
$ python -m torch.distributed.launch --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --sync-bn
使用多台机器
这只适用于Multiple GPU DistributedDataParallel 训练。
在继续之前,请确保所有机器上的文件都是相同的、相同的数据集、代码库等。然后,确保机器可以相互通信。
你必须选择一台master 机器(其他机器将与之通信)。记下它的地址(master_addr)并选择一个端口(master_port)。对于下面的例子,我将使用 master_addr = 192.168.1.1 和 master_port = 1234。
要使用它,你可以这样做:
# On master machine 0
$ python -m torch.distributed.launch --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.launch --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) 开始的机器数量。
假设我有两台机器,每台都有两个 GPUs ,对于上面的情况,G = 2
, N = 2
, 和 R = 1
。
在所有 N 台机器连接之前,训练不会开始。输出将只在 master 机器上显示!
--batch
必须是 GPUs 数目的倍数。$ python -m torch.distributed.launch --master_port 1234 --nproc_per_node 2 ...
DDP profiling 结果在 AWS EC2 P4d instance 上,YOLOv5l 用于1 COCO epoch 的 8x A100 SXM4-40GB。
# 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 |
如果发生错误,请先阅读下面的检查表! (这可以节省您的时间)
您试过重新克隆代码库吗? 代码每天都在变化。
你有没有试着寻找你的错误?有些人可能已经在这个仓库或在另一个已经遇到了它,并有解决方案。
如果你已经完成了以上所有的步骤,请随意提出一个问题,按照模板给出尽可能多的细节。
YOLOv5 可以在以下任何一个经过最新验证的环境中运行(包括预先安装的 CUDA/CUDNN, Python and PyTorch 等所有依赖项) :
CI CPU testing - passing
如果这个徽章是绿色的,那么当前通过的所有 YOLOv5 GitHub Actions Continuous Integration (CI)测试都是绿色的。CI 测试每24小时并在每次提交时验证 MacOS、 Windows 和 Ubuntu 上的 YOLOv5 训练(train.py)、验证(val.py)、推断(detect.py)和导出(export.py)的正确操作。