【目标检测-YOLO】YOLOv5 Multi-GPU 训练

 本指南解释了如何正确地 在一个或者多个机器上 使用 多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来训练这个模型。

【目标检测-YOLO】YOLOv5 Multi-GPU 训练_第1张图片

 单GPU

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

 Multi-GPU DataParallel Mode (⚠️ 不推荐使用)

你可以增加  device 来使用 Multiple GPUs 以 DataParallel 模式.

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

 这种方法是慢的,与只使用 1 GPU相比,几乎不能加速训练。

Multi-GPU DistributedDataParallel Mode (✅ Faster than DP,  推荐)

你将不得不通过 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 机器上显示!


注意

  • Windows 支持未经测试,推荐使用 Linux。
  • --batch 必须是 GPUs 数目的倍数。
  • 由于 GPU 0 维护 EMA 并负责 checkpointing 等,它将比其他 GPU 占用略微多点的内存。
  • 如果您得到 RuntimeError: Address already in use 错误,这可能是因为在同一时间您正在运行多个训练。为了解决这个问题,只需使用一个不同的端口号,如下所示,添加 --master_port

$ 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

常见问题

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

  • 你读过这篇文章吗?
  • 您试过重新克隆代码库吗? 代码每天都在变化。

  • 你有没有试着寻找你的错误?有些人可能已经在这个仓库或在另一个已经遇到了它,并有解决方案。

  • 您是否已经安装了上面列出的所有需求(包括正确的 Python 和 Pytorch 版本) ?
  • 您在下面“Environments”部分中列出的其他环境中试过吗?
  • 你有没有试过用另一个数据集,比如 coco128或 coco2017? 这会让你更容易找到根本原因。

如果你已经完成了以上所有的步骤,请随意提出一个问题,按照模板给出尽可能多的细节。


Environments

YOLOv5  可以在以下任何一个经过最新验证的环境中运行(包括预先安装的  CUDA/CUDNN, Python and PyTorch 等所有依赖项) :

  • Google Colab and Kaggle notebooks with free GPU: colab ,YOLOv5 | Kaggle
  • Google Cloud Deep Learning VM. See GCP Quickstart Guide
  • Amazon Deep Learning AMI. See AWS Quickstart Guide
  • Docker Image. See Docker Quickstart Guide Docker Hub 

状态

CI CPU testing - passing

如果这个徽章是绿色的,那么当前通过的所有 YOLOv5 GitHub Actions Continuous Integration (CI)测试都是绿色的。CI 测试每24小时并在每次提交时验证 MacOS、 Windows 和 Ubuntu 上的 YOLOv5 训练(train.py)、验证(val.py)、推断(detect.py)和导出(export.py)的正确操作。


 

你可能感兴趣的:(YOLO,视觉,YOLOv5)