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 クイックスタートガイドをご覧ください。
PyTorch >= 1.9 では、torch.distributed.run が torch.distributed.launch に置き換わります。詳細は PyTorch distributed documentation を参照してください。
トレーニング#
学習を開始する事前学習済みモデルを選択します。ここでは、小型で高速なモデルである YOLOv5s を選択します。すべてのモデルの詳細な比較については、README の表をご覧ください。COCO データセットで、マルチ GPU を使用してこのモデルを学習します。

シングルGPU#
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0マルチ GPU DataParallel モード(⚠️ 非推奨)#
DataParallel モードを有効にするには、複数の GPU ID を --device に渡します。
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(またはその他のリスト)を設定します。
Use specific GPUs (click to expand)
--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,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 ...
結果#
8基の 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| 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 |
結果に示されているように、複数の GPU で DistributedDataParallel を使用すると、学習速度がほぼ線形にスケーリングします。8 基の GPU を使用すると、単一の GPU と比較して約 6.5 倍高速に学習が完了し、デバイスあたりのメモリ使用量は同じに維持されます。
サポートされている環境#
Ultralytics は、プロジェクトを迅速に開始できるように、CUDA、CUDNN、Python、PyTorch などの必須依存関係が事前にインストールされた、すぐに使用できるさまざまな環境を提供しています。
- 無料GPUノートブック:
- Google Cloud: GCPクイックスタートガイド
- Amazon: AWS Quickstart Guide
- Azure: AzureML Quickstart Guide
- 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をオープンしてください。