コンテンツにスキップ

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クイックスタートガイド Dockerプル数

プロのヒント!

torch.distributed.run 置き換える torch.distributed.launchPyTorch>=1.9。以下を参照してください: PyTorch の分散ドキュメント 詳細について。

学習

トレーニングを開始するために、事前トレーニング済みのモデルを選択します。ここでは、利用可能な最小かつ最速のモデルであるYOLOv5sを選択します。すべてのモデルの完全な比較については、READMEのをご覧ください。このモデルをCOCOデータセットでMulti-GPUを使用してトレーニングします。

YOLOv5 モデル

シングルGPU

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

増加させることができます。 device DataParallelモードで複数のGPUを使用するには、次のようにします。

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 に均等に分割されます。上記の例では、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 ''
`G`はマシンあたりのGPU数、`N`はマシンの数、`R`は`0...(N-1)`からのマシン番号です。たとえば、それぞれ2つのGPUを搭載した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 ...
    

結果

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は、CUDACUDNNPythonPyTorchなどの必須依存関係がプリインストールされた、すぐに使用できるさまざまな環境を提供し、プロジェクトをすぐに開始できます。

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

YOLOv5 CI

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

クレジット

多大な貢献をしてくれた @MagicFrogSJTU と、私たちを導いてくれた @glenn-jocher に感謝します。

参照



📅 1年前に作成 ✏️ 2か月前に更新

コメント