コンテンツへスキップ

マルチGPUトレーニング

このガイドでは、YOLOv5 🚀で複数のGPUを適切に使用してデータセットを訓練する方法を説明します。

始める前に

レポをクローンし、requirements.txtをPython>=3.8.0環境にインストールする。 PyTorch>=1.8.モデルとデータセットは、最新のYOLOv5 リリースから自動的にダウンロードされます。

git clone https://github.com/ultralytics/yolov5  # clone
cd yolov5
pip install -r requirements.txt  # install

💡 プロヒント! ドッカーイメージ はすべてのMulti-GPUトレーニングで推奨されています。参照 Dockerクイックスタートガイド ドッカー・プル

💡 プロヒント! torch.distributed.run 代替 torch.distributed.launch で PyTorch>=1.9.参照 諸注意 詳細はこちら。

トレーニング

学習を開始する事前学習済みモデルを選択します。ここでは、最小かつ最速のモデルであるYOLOv5sを選択します。すべてのモデルの完全な比較はREADMEの表を参照してください。このモデルをCOCOデータセットのMulti-GPUでトレーニングします。

YOLOv5 モデル

シングルGPU

python train.py  --batch 64 --data coco.yaml --weights yolov5s.pt --device 0

を増やすことができます。 device 複数のGPUをDataParallelモードで使用する。

python train.py  --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1

この方法は時間がかかり、GPUを1つしか使わない場合に比べてトレーニングのスピードはほとんど上がらない。

合格しなければならない 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).

特定のGPUを使用する(クリックで拡大) そのためには、単に `--device` の後に特定の GPU を渡します。例えば、以下のコードでは `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
SyncBatchNormを使用する(クリックで展開) [SyncBatchNorm](https://pytorch.org/docs/master/generated/torch.nn.SyncBatchNorm.html) could increase accuracy for multiple gpu training, however, it will slow down training by a significant factor. It is **only** available for Multiple GPU DistributedDataParallel training. It is best used when the batch-size on **each** GPU is small (<= 8). To use SyncBatchNorm, simple pass `--sync-bn` to the command like below,
python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --sync-bn
複数のマシンを使用する(クリックで拡大) これは、Multiple 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)`からのマシン番号である。例えば、GPUを2基ずつ搭載したマシンが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 ...

結果

AWS EC2 P4dインスタンス、8x A100 SXM4-40GB、YOLOv5l、1COCOエポックでのDDPプロファイリング結果。

プロファイリング・コード
# prepare
t=ultralytics/yolov5:latest && sudo docker pull $t && sudo docker run -it --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_mem
device0 (G)
COCO
列車
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

よくあるご質問

エラーが発生した場合は、まず以下のチェックリストをお読みください!(時間を節約できます)

チェックリスト(クリックで拡大)
  • この記事をちゃんと読んだ?
  • コードベースをクローンし直してみましたか?コードは日々変化しています。
  • あなたのエラーを検索してみましたか?このレポや他のレポで誰かがすでに遭遇していて、解決策を持っているかもしれません。
  • 上部に記載されているすべての要件(正しいPython とPytorch のバージョンを含む)をインストールしましたか?
  • 以下の「環境」セクションに記載されている他の環境で試しましたか?
  • coco128やcoco2017のような別のデータセットで試しましたか?根本的な原因を見つけやすくなります。
上記をすべてお読みになった方は、テンプレートにしたがってできるだけ詳しく説明し、ご自由に問題を提起してください。

対応環境

Ultralytics は、CUDAや CUDNNといった必要不可欠な依存関係がプリインストールされた、すぐに使えるさまざまな環境を提供します、 Pythonそして PyTorchなどの不可欠な依存関係がプリインストールされています。

プロジェクト状況

YOLOv5 CI

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

クレジット

力仕事をしてくれた@MagicFrogSJTUと、道案内をしてくれた@glenn-jocherに感謝したい。



作成日:2023-11-12 更新日:2023-12-03
作成者:glenn-jocher(2)

コメント