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

PyTorch >= 1.9 では、torch.distributed.runtorch.distributed.launch に置き換わります。詳細は PyTorch distributed documentation を参照してください。

トレーニング#

学習を開始する事前学習済みモデルを選択します。ここでは、小型で高速なモデルである YOLOv5s を選択します。すべてのモデルの詳細な比較については、README のをご覧ください。COCO データセットで、マルチ GPU を使用してこのモデルを学習します。

YOLOv5 Models

シングル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,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 に均等に分割されます。上記の例では、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,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 ...

結果#

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-sizeCUDA_mem
device0 (G)
COCO
train
COCO
val
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をオープンしてください。

コメント