YOLOv5を使用したマルチ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
プロのヒント!
Dockerイメージ は、すべてのマルチGPUトレーニングに推奨されます。以下を参照してください。 Dockerクイックスタートガイド
プロのヒント!
torch.distributed.run
置き換える torch.distributed.launch
で PyTorch>=1.9。以下を参照してください: PyTorch の分散ドキュメント 詳細について。
学習
トレーニングを開始するために、事前トレーニング済みのモデルを選択します。ここでは、利用可能な最小かつ最速のモデルであるYOLOv5sを選択します。すべてのモデルの完全な比較については、READMEの表をご覧ください。このモデルをCOCOデータセットでMulti-GPUを使用してトレーニングします。
シングルGPU
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0
Multi-GPU DataParallel モード(⚠️ 推奨されません)
増加させることができます。 device
DataParallelモードで複数のGPUを使用するには、次のようにします。
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1
この方法は低速であり、GPU を 1 つだけ使用する場合と比較して、トレーニングの高速化はほとんど期待できません。
Multi-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 に均等に分割されます。上記の例では、64/2=32 が GPU ごとに割り当てられます。
上記のコードはGPUを使用します 0... (N-1)
.
特定のGPUを使用する(クリックで展開)
`--device`の後に特定のGPUを指定することで、これを行うことができます。たとえば、以下のコードでは、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
SyncBatchNormを使用する(クリックで展開)
[SyncBatchNorm](https://docs.pytorch.org/docs/master/generated/torch.nn.SyncBatchNorm.html) could increase [accuracy](https://www.ultralytics.com/glossary/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, simply 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
複数マシンを使用 (クリックして展開)
これは、複数のGPUを使用した分散データ並列トレーニングでのみ利用可能です。 続行する前に、すべてのマシン上のファイル(データセット、コードベースなど)が同じであることを確認してください。その後、マシンが互いに通信できることを確認してください。 マスターマシン(他のマシンが通信するマシン)を選択する必要があります。そのアドレス(`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 ''
注記
- 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 ...
結果
YOLOv5lの1 COCO epochに対して、8x A100 SXM4-40GBを搭載したAWS EC2 P4dインスタンスでの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 |
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倍速く完了します。
よくある質問
エラーが発生した場合は、まず以下のチェックリストをお読みください!(時間の節約になります)
チェックリスト(クリックして展開)
- この投稿をきちんと読みましたか? - コードベースを再度クローンしましたか?コードは**毎日**変更されます。 - エラーを検索しましたか?誰かがすでにこのリポジトリまたは別のリポジトリでエラーに遭遇し、解決策を持っている可能性があります。 - 上記にリストされているすべての要件(正しいpythonおよびPyTorchバージョンを含む)をインストールしましたか? - 下記の「環境」セクションにリストされている他の環境で試しましたか? - coco128やcoco2017のような別のデータセットで試しましたか?根本原因を見つけやすくなります。 上記をすべて試した場合は、テンプレートに従ってできるだけ詳細に記述して、遠慮なくIssueを提起してください。サポートされている環境
Ultralyticsは、CUDA、CUDNN、Python、PyTorchなどの必須依存関係がプリインストールされた、すぐに使用できるさまざまな環境を提供し、プロジェクトをすぐに開始できます。
- 無料の GPU Notebooks:
- Google Cloud:GCPクイックスタートガイド
- Amazon: AWS クイックスタートガイド
- Azure: AzureML クイックスタートガイド
- Docker: Dockerクイックスタートガイド
プロジェクトのステータス
このバッジは、すべてのYOLOv5 GitHub Actions継続的インテグレーション(CI)テストが正常に合格していることを示します。これらのCIテストでは、トレーニング、検証、推論、エクスポート、ベンチマークなど、さまざまな重要な側面についてYOLOv5の機能と性能を厳密にチェックします。これらのテストは、macOS、Windows、Ubuntuでの一貫した信頼性の高い動作を保証し、24時間ごと、および新しいコミットごとに行われます。
クレジット
多大な貢献をしてくれた @MagicFrogSJTU と、私たちを導いてくれた @glenn-jocher に感謝します。
参照
- トレーニングモード - UltralyticsでYOLOモデルをトレーニングする方法について学びます
- ハイパーパラメータ調整-モデルのパフォーマンスを最適化します
- Dockerクイックスタートガイド - トレーニング用にDocker環境をセットアップします