YOLOv5によるマルチGPUトレーニング#
このガイドでは、単一マシン上または複数マシン間で複数のGPUを使用してYOLOv5をトレーニングする方法を説明します。
開始する前に#
リポジトリをクローンし、Python>=3.8.0環境にrequirements.txtをインストールします。これにはPyTorch>=1.8も含まれます。モデルとデータセットは、最新のYOLOv5 リリースから自動的にダウンロードされます。
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # installすべてのマルチ GPU トレーニング実行には、Ultralytics Docker イメージを推奨します。Docker クイックスタートガイドを参照してください。
torch.distributed.runは、PyTorch >= 1.9でtorch.distributed.launchに置き換わります。詳細はPyTorch分散処理ドキュメントを参照してください。
トレーニング#
トレーニングの開始に使用する事前トレーニング済みモデルを選択します。ここでは、小型で高速なモデルであるYOLOv5sを選択します。すべてのモデルの完全な比較については、READMEの表を参照してください。このモデルをCOCOデータセットでマルチGPUトレーニングします。

シングル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,1DataParallelは低速で、シングル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です。
上記のコマンドでは0...(N-1)のGPUを使用します。代わりに環境変数でデバイスの可視性を制御するには、起動前にCUDA_VISIBLE_DEVICES=2,3(またはその他のリスト)を設定します。
Use specific GPUs (click to expand)
--deviceに続けて、特定のGPU IDを渡します。以下の例では2,3のGPUを使用します。
python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --device 2,3Use 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-bnUse Multiple machines (click to expand)
これはマルチGPU DistributedDataParallelトレーニングでのみ使用できます。
続行する前に、すべてのマシンでデータセット、コードベース、その他の依存関係が一致していることを確認し、マシン同士がネットワーク経由で接続できることを検証してください。
マスターマシン(他のマシンが接続するマシン)を選択し、そのアドレス(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)におけるマシンのランクです。たとえば、2台のマシンでそれぞれ2個のGPUを使用する場合、2台目のマシンでG = 2、N = 2、R = 1を設定します。
すべてのN台のマシンが接続されるまで、トレーニングは開始されません。出力はマスターマシンにのみ表示されます。
注記#
-
Windowsのサポートは未検証です。Linuxを推奨します。
-
--batchはGPU数の倍数である必要があります。 -
GPU 0はEMAを維持し、チェックポイント処理を行うため、他のGPUよりわずかに多くのメモリを使用します。
-
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| GPU A100 | バッチサイズ | CUDA_mem device0 (G) | COCO トレーニング | COCO 検証 |
|---|---|---|---|---|
| 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 |
結果に示されているように、複数のGPUでDistributedDataParallelを使用すると、トレーニング速度がほぼ線形にスケールします。8個のGPUを使用すると、デバイスあたりのメモリ使用量を同じに保ちながら、シングルGPUの場合より約6.5倍速くトレーニングが完了します。
サポート対象の環境#
Ultralyticsは、プロジェクトをすぐに開始できるよう、CUDA、CUDNN、Python、PyTorchなどの主要な依存関係があらかじめインストールされた、すぐに使用できるさまざまな環境を提供しています。
- 無料のGPUノートブック:
- Google Cloud: GCPクイックスタートガイド
- Amazon: AWSクイックスタートガイド
- Azure: AzureMLクイックスタートガイド
- Docker: Docker クイックスタートガイド
プロジェクトのステータス#
このバッジは、すべてのYOLOv5 GitHub Actions継続的インテグレーション(CI)テストに正常に合格していることを示します。これらのCIテストでは、トレーニング、検証、推論、エクスポート、ベンチマークなど、さまざまな主要領域におけるYOLOv5の機能とパフォーマンスを厳密に確認します。24時間ごとおよび新しいコミットごとにテストを実施し、macOS、Windows、Ubuntuで一貫した信頼性の高い動作を保証します。
クレジット#
多大な作業を担ってくださった@MagicFrogSJTUと、道中でご指導くださった@glenn-jocherに感謝します。
関連項目#
- トレーニングモード - UltralyticsでYOLOモデルをトレーニングする方法を説明します
- ハイパーパラメータチューニング - モデルのパフォーマンスを最適化します
- Dockerクイックスタートガイド - トレーニング用のDocker環境をセットアップします
FAQ#
Issueを作成する前に、以下のチェックリストを確認してください。多くの場合、時間の節約になります。
Checklist (click to expand)
- このガイドを最初から最後まで読みましたか?
- コードベースを再度クローンしましたか?コードは毎日変更されます。
- エラーメッセージを検索しましたか?同じ問題に遭遇し、解決策を共有している人がすでにいる可能性があります。
- すべての要件(正しいPythonおよびPyTorchのバージョンを含む)をインストールしましたか?
- 上記に記載されているサポート対象環境のいずれかを試しましたか?
- 根本原因を切り分けるために、
coco128やcoco2017のような、より小さいデータセットを試しましたか?
上記をすべて確認できた場合は、テンプレートに従い、可能な限り詳細な情報を添えてIssueを作成してください。