YOLO Vision 2026:

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
Dockerを使用する

すべてのマルチ GPU トレーニング実行には、Ultralytics Docker イメージを推奨します。Docker クイックスタートガイドを参照してください。Docker Pulls

PyTorch >= 1.9

torch.distributed.runは、PyTorch >= 1.9torch.distributed.launchに置き換わります。詳細はPyTorch分散処理ドキュメントを参照してください。

トレーニング#

トレーニングの開始に使用する事前トレーニング済みモデルを選択します。ここでは、小型で高速なモデルであるYOLOv5sを選択します。すべてのモデルの完全な比較については、READMEのを参照してください。このモデルをCOCOデータセットでマルチGPUトレーニングします。

YOLOv5 Models

シングル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,1

DataParallelは低速で、シングル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,3
Use 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-bn
Use Multiple machines (click to expand)

これはマルチGPU DistributedDataParallelトレーニングでのみ使用できます。

続行する前に、すべてのマシンでデータセット、コードベース、その他の依存関係が一致していることを確認し、マシン同士がネットワーク経由で接続できることを検証してください。

マスターマシン(他のマシンが接続するマシン)を選択し、そのアドレス(master_addr)を控えて、ポート(master_port)を選択します。以下の例では、master_addr = 192.168.1.1master_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はマシン数、R0...(N-1)におけるマシンのランクです。たとえば、2台のマシンでそれぞれ2個のGPUを使用する場合、2台目のマシンでG = 2N = 2R = 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
検証
1x1626GB20:390:55
2x3226GB11:430:57
4x6426GB5:570:55
8x12826GB3:090:57

結果に示されているように、複数のGPUでDistributedDataParallelを使用すると、トレーニング速度がほぼ線形にスケールします。8個のGPUを使用すると、デバイスあたりのメモリ使用量を同じに保ちながら、シングルGPUの場合より約6.5倍速くトレーニングが完了します。

サポート対象の環境#

Ultralyticsは、プロジェクトをすぐに開始できるよう、CUDACUDNNPythonPyTorchなどの主要な依存関係があらかじめインストールされた、すぐに使用できるさまざまな環境を提供しています。

プロジェクトのステータス#

YOLOv5 CI

このバッジは、すべてのYOLOv5 GitHub Actions継続的インテグレーション(CI)テストに正常に合格していることを示します。これらのCIテストでは、トレーニング検証推論エクスポートベンチマークなど、さまざまな主要領域におけるYOLOv5の機能とパフォーマンスを厳密に確認します。24時間ごとおよび新しいコミットごとにテストを実施し、macOS、Windows、Ubuntuで一貫した信頼性の高い動作を保証します。

クレジット#

多大な作業を担ってくださった@MagicFrogSJTUと、道中でご指導くださった@glenn-jocherに感謝します。

関連項目#

FAQ#

Issueを作成する前に、以下のチェックリストを確認してください。多くの場合、時間の節約になります。

Checklist (click to expand)
  • このガイドを最初から最後まで読みましたか?
  • コードベースを再度クローンしましたか?コードは毎日変更されます。
  • エラーメッセージを検索しましたか?同じ問題に遭遇し、解決策を共有している人がすでにいる可能性があります。
  • すべての要件(正しいPythonおよびPyTorchのバージョンを含む)をインストールしましたか?
  • 上記に記載されているサポート対象環境のいずれかを試しましたか?
  • 根本原因を切り分けるために、coco128coco2017のような、より小さいデータセットを試しましたか?

上記をすべて確認できた場合は、テンプレートに従い、可能な限り詳細な情報を添えてIssueを作成してください。

コメント