Multi-GPU-Training mit YOLOv5

Diese Anleitung erklärt, wie du YOLOv5 mit mehreren GPUs auf einem einzelnen Computer oder über mehrere Computer hinweg trainierst.

Bevor du beginnst

Klon das Repo und installiere requirements.txt in einer Python>=3.8.0-Umgebung, einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch vom neuesten YOLOv5-Release heruntergeladen.

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

Das Ultralytics Docker-Image wird für alle Multi-GPU-Trainingsläufe empfohlen. Siehe den Docker Quickstart Guide. Docker Pulls

PyTorch >= 1.9

torch.distributed.run ersetzt torch.distributed.launch in PyTorch >= 1.9. Siehe die PyTorch Distributed-Dokumentation für Details.

Training

Wähle ein vortrainiertes Modell, um das Training zu starten. Hier wählen wir YOLOv5s, das kleinste und schnellste verfügbare Modell. Siehe unsere README-Tabelle für einen vollständigen Vergleich aller Modelle. Wir werden dieses Modell mit Multi-GPU auf dem COCO-Datensatz trainieren.

YOLOv5 Models

Einzelne GPU

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

Multi-GPU DataParallel-Modus (⚠️ nicht empfohlen)

Gib mehrere GPU-IDs an --device weiter, um den DataParallel-Modus zu aktivieren:

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

DataParallel ist langsam und beschleunigt das Training im Vergleich zur Verwendung einer einzelnen GPU kaum.

Multi-GPU DistributedDataParallel-Modus (✅ empfohlen)

Stelle dem Trainingsbefehl python -m torch.distributed.run --nproc_per_node voran und gib dann die üblichen Argumente an:

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 ist die Anzahl der zu verwendenden GPUs. Im obigen Beispiel ist dies 2.
  • --batch ist die gesamte Batch-Größe, gleichmäßig verteilt auf jede GPU. Im obigen Beispiel sind das 64 / 2 = 32 pro GPU.

Der obige Befehl verwendet die GPUs 0...(N-1). Um die Gerätesichtbarkeit stattdessen über Umgebungsvariablen zu steuern, setze CUDA_VISIBLE_DEVICES=2,3 (oder eine andere Liste) vor dem Start.

Use specific GPUs (click to expand)

Gib --device gefolgt von den spezifischen GPU-IDs an. Das folgende Beispiel verwendet die GPUs 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 kann die Genauigkeit für Multi-GPU-Training erhöhen, verlangsamt das Training jedoch erheblich. Es ist nur für Multi-GPU DistributedDataParallel-Training verfügbar.

Am besten geeignet, wenn die Batch-Größe auf jeder GPU klein (<= 8) ist.

Um SyncBatchNorm zu aktivieren, gib --sync-bn an:

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)

Dies ist nur für Multi-GPU DistributedDataParallel-Training verfügbar.

Bevor du fortfährst, stelle sicher, dass Datensatz, Codebasis und alle anderen Abhängigkeiten auf allen Maschinen übereinstimmen, und verifiziere dann, dass die Maschinen sich im Netzwerk gegenseitig erreichen können.

Wähle eine Master-Maschine (diejenige, mit der sich die anderen verbinden werden), notiere ihre Adresse (master_addr) und wähle einen Port (master_port). Das folgende Beispiel verwendet master_addr = 192.168.1.1 und master_port = 1234.

Dann führe aus:

# 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 ''

wobei G die Anzahl der GPUs pro Maschine, N die Anzahl der Maschinen und R der Maschinenrang in 0...(N-1) ist. Setze zum Beispiel bei zwei Maschinen mit jeweils zwei GPUs G = 2, N = 2 und R = 1 auf der zweiten Maschine.

Das Training startet erst, wenn alle N Maschinen verbunden sind. Die Ausgabe wird nur auf der Master-Maschine angezeigt.

Hinweise

  • Windows-Unterstützung ist ungetestet; Linux wird empfohlen.

  • --batch muss ein Vielfaches der Anzahl der GPUs sein.

  • GPU 0 verbraucht etwas mehr Speicher als die anderen, da sie den EMA verwaltet und Checkpointing übernimmt.

  • Wenn du RuntimeError: Address already in use erhältst, bedeutet dies normalerweise, dass mehrere Trainingsläufe denselben Port verwenden. Gib einen anderen Port mit --master_port an:

    python -m torch.distributed.run --master_port 1234 --nproc_per_node 2 ...

Results

DDP-Profilierungsergebnisse auf einer AWS EC2 P4d-Instanz mit 8x A100 SXM4-40GB für YOLOv5l für 1 COCO-Epoche.

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
GPUs
A100
Batch-GrößeCUDA_mem
Gerät0 (G)
COCO
train
COCO
val
1x1626GB20:390:55
2x3226GB11:430:57
4x6426GB5:570:55
8x12826GB3:090:57

Wie in den Ergebnissen gezeigt, bietet die Verwendung von DistributedDataParallel mit mehreren GPUs eine nahezu lineare Skalierung der Trainingsgeschwindigkeit. Mit 8 GPUs ist das Training etwa 6,5-mal schneller abgeschlossen als mit einer einzelnen GPU, während die Speichernutzung pro Gerät gleich bleibt.

FAQ

Lies die untenstehende Checkliste, bevor du ein Issue eröffnest — das spart oft Zeit.

Checklist (click to expand)
  • Hast du diese Anleitung vollständig gelesen?
  • Hast du die Codebasis neu geklont? Der Code ändert sich täglich.
  • Hast du nach der Fehlermeldung gesucht? Vielleicht ist schon jemand auf das gleiche Problem gestoßen und hat eine Lösung geteilt.
  • Hast du alle Anforderungen (einschließlich der richtigen Python- und PyTorch-Versionen) installiert?
  • Hast du eine der unten aufgeführten unterstützten Umgebungen ausprobiert?
  • Hast du einen kleineren Datensatz wie coco128 oder coco2017 ausprobiert, um die Ursache einzugrenzen?

Wenn all das oben Genannte in Ordnung ist, eröffne ein Issue mit so vielen Details wie möglich, unter Verwendung der Vorlage.

Unterstützte Umgebungen

Ultralytics bietet eine Reihe von sofort einsatzbereiten Umgebungen, die jeweils mit wesentlichen Abhängigkeiten wie CUDA, CUDNN, Python und PyTorch vorkonfiguriert sind, um deine Projekte zu starten.

Projektstatus

YOLOv5 CI

Dieses Abzeichen zeigt an, dass alle Continuous Integration (CI)-Tests der YOLOv5 GitHub Actions erfolgreich durchlaufen. Diese CI-Tests prüfen rigoros die Funktionalität und Leistung von YOLOv5 über verschiedene wichtige Aspekte hinweg: Training, Validierung, Inferenz, Export und Benchmarks. Sie gewährleisten einen konsistenten und zuverlässigen Betrieb auf macOS, Windows und Ubuntu, wobei die Tests alle 24 Stunden und bei jedem neuen Commit durchgeführt werden.

Credits

Wir möchten uns bei @MagicFrogSJTU bedanken, der die ganze Schwerstarbeit geleistet hat, und bei @glenn-jocher, der uns auf dem Weg begleitet hat.

Siehe auch

Kommentare