YOLOv5によるマルチGPUトレーニング#
このガイドでは、1台のマシンまたは複数のマシンにまたがって複数のGPUを使用し、YOLOv5をトレーニングする方法を説明します。
開始する前に#
リポジトリをクローンし、Python>=3.8.0環境(PyTorch>=1.8を含む)でrequirements.txtをインストールします。モデルとデータセットは、最新の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に均等に分割されます。上記の例では、1つのGPUあたり64 / 2 = 32です。
上記のコマンドではGPU 0...(N-1)を使用します。代わりに環境変数でデバイスの表示を制御するには、起動前にCUDA_VISIBLE_DEVICES=2,3(またはほかのリスト)を設定します。
特定のGPUを使用する(クリックして展開)
--deviceに続けて、特定のGPU IDを渡します。以下の例では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,3SyncBatchNormを使用する(クリックして展開)
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の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 ...
結果#
YOLOv5lでCOCOの1 エポックを実行した際の、8基のA100 SXM4-40GBを搭載したAWS EC2 P4dインスタンス上でのDDPプロファイリング結果。
コードのプロファイリング
# 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メモリ デバイス0(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の機能とパフォーマンスを厳密に確認します。これにより、macOS、Windows、Ubuntuで一貫して信頼性の高い動作が保証されます。テストは24時間ごと、および新しいコミットごとに実施されます。
謝辞#
多くの作業を担ってくださった@MagicFrogSJTUと、取り組みを導いてくださった@glenn-jocherに感謝いたします。
関連項目#
- トレーニングモード - UltralyticsでYOLOモデルをトレーニングする方法について説明します
- ハイパーパラメータチューニング - モデルのパフォーマンスを最適化します
- Dockerクイックスタートガイド - トレーニング用のDocker環境をセットアップします
よくある質問#
Issueを作成する前に、以下のチェックリストを確認してください。時間の節約につながることがよくあります。
チェックリスト(クリックして展開)
- このガイドを最初から最後まで読みましたか?
- コードベースを再クローンしましたか?コードは毎日変更されています。
- エラーメッセージを検索しましたか?同じ問題に遭遇し、修正方法を共有している人がすでにいるかもしれません。
- 正しいバージョンのPythonとPyTorchを含め、すべての要件をインストールしましたか?
- 上記に記載されているサポート対象環境のいずれかを試しましたか?
- 根本原因を切り分けるため、
coco128やcoco2017などの標準データセットを試しましたか?
上記をすべて確認できた場合は、テンプレートに従って、できるだけ詳しい情報を記載したIssueを作成してください。