YOLOv5によるマルチGPUトレーニング

このガイドでは、単一のマシンまたは複数のマシンで複数のGPUを使用してYOLOv5をトレーニングする方法を説明します。

始める前に

Clone repo and install requirements.txt in a Python>=3.8.0 environment, including PyTorch>=1.8. Models and datasets download automatically from the latest YOLOv5 release.

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 replaces torch.distributed.launch in PyTorch >= 1.9. See the PyTorch distributed documentation for details.

学習

トレーニングを開始するために、学習済みモデルを選択します。ここでは、入手可能なモデルの中で最も小さく高速な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に均等に分割されます。上記の例では、各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 ...

Results

YOLOv5lを用いた、AWS EC2 P4dインスタンス(8x A100 SXM4-40GB)におけるCOCO エポック 1回分のDDPプロファイリング結果。

Profiling code
# prepare
t=ultralytics/yolov5:latest && sudo docker pull $t && sudo docker run -it --runtime=nvidia --ipc=host --gpus 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メモリ
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倍速くトレーニングが完了します。

FAQ

Issueを報告する前に以下のチェックリストを確認してください。時間を節約できる場合があります。

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

上記をすべて確認しても解決しない場合は、テンプレートに従い、可能な限り詳細を記述してIssueを開いてください。

サポートされている環境

Ultralyticsは、プロジェクトを迅速に開始できるように、CUDACUDNNPythonPyTorchなどの必須依存関係がプリインストールされた、すぐに使えるさまざまな環境を提供しています。

プロジェクトステータス

YOLOv5 CI

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

クレジット

%>大変な作業を引き受けてくださった @MagicFrogSJTU と、過程で導いてくださった @glenn-jocher に感謝いたします。

参照

コメント