YOLO Vision 2026:

Training mit mehreren GPUs und YOLOv5#

Dieser Leitfaden erklärt, wie du YOLOv5 mit mehreren GPUs auf einer einzelnen Maschine oder verteilt über mehrere Maschinen trainierst.

Bevor du beginnst#

Klone das Repository und installiere requirements.txt in einer Python>=3.8.0-Umgebung einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch aus der neuesten YOLOv5-Version 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 Trainingsläufe mit mehreren GPUs empfohlen. Siehe den Schnellstartleitfaden für Docker. Docker Pulls

PyTorch >= 1.9

torch.distributed.run ersetzt torch.distributed.launch in PyTorch >= 1.9. Weitere Informationen findest du in der PyTorch-Dokumentation zu verteiltem Training.

Training#

Wähle ein vortrainiertes Modell aus, mit dem du das Training starten möchtest. Hier wählen wir YOLOv5s, ein kleines und schnelles Modell. Eine vollständige Gegenüberstellung aller Modelle findest du in der Tabelle unserer README. Wir trainieren dieses Modell mit mehreren GPUs auf dem COCO-Datensatz.

YOLOv5 Models

Eine GPU#

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

Modus mit mehreren GPUs und DataParallel (⚠️ nicht empfohlen)#

Übergib --device mehrere GPU-IDs, 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.

Modus mit mehreren GPUs und DistributedDataParallel (✅ empfohlen)#

Setze python -m torch.distributed.run --nproc_per_node vor den Trainingsbefehl und übergib anschließend die üblichen Argumente:

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 Batchgröße, die gleichmäßig auf die einzelnen GPUs verteilt wird. Im obigen Beispiel sind das 64 / 2 = 32 pro GPU.

Der obige Befehl verwendet die GPUs 0...(N-1). Um die Sichtbarkeit der Geräte stattdessen über Umgebungsvariablen zu steuern, setze CUDA_VISIBLE_DEVICES=2,3 (oder eine andere Liste), bevor du den Befehl startest.

Use specific GPUs (click to expand)

Übergib --device, gefolgt von den spezifischen GPU-IDs. 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 beim Training mit mehreren GPUs erhöhen, verlangsamt das Training jedoch erheblich. Es ist nur für das Training mit mehreren GPUs und DistributedDataParallel verfügbar.

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

Um SyncBatchNorm zu aktivieren, übergib --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)

Dies ist nur für das Training mit mehreren GPUs und DistributedDataParallel verfügbar.

Stelle vor dem Fortfahren sicher, dass Datensatz, Codebasis und alle anderen Abhängigkeiten auf allen Maschinen übereinstimmen. Überprüfe anschließend, ob die Maschinen einander über das Netzwerk erreichen können.

Wähle eine Mastermaschine aus (mit der sich die anderen verbinden), 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.

Führe anschließend Folgendes 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 ''

Dabei ist G die Anzahl der GPUs pro Maschine, N die Anzahl der Maschinen und R der Rang der Maschine in 0...(N-1). Bei zwei Maschinen mit jeweils zwei GPUs setzt du beispielsweise 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 Mastermaschine angezeigt.

Hinweise#

  • Die Unterstützung für Windows wurde nicht getestet; Linux wird empfohlen.

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

  • GPU 0 verwendet etwas mehr Speicher als die anderen, da sie die EMA verwaltet und Checkpoints verarbeitet.

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

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

Ergebnisse#

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

Profiling code
# prepare
t=ultralytics/yolov5:latest && sudo docker pull $t && sudo docker run -it --ipc=host --device nvidia.com/gpu=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
BatchgrößeCUDA_Speicher
Gerät0 (G)
COCO
Training
COCO
Validierung
1x1626GB20:390:55
2x3226GB11:430:57
4x6426GB5:570:55
8x12826GB3:090:57

Wie die Ergebnisse zeigen, ermöglicht 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 der Speicherverbrauch pro Gerät gleich bleibt.

Unterstützte Umgebungen#

Ultralytics stellt eine Reihe sofort einsatzbereiter Umgebungen bereit, in denen wichtige Abhängigkeiten wie CUDA, CUDNN, Python und PyTorch bereits installiert sind, damit du deine Projekte schnell starten kannst.

Projektstatus#

YOLOv5 CI

Dieses Abzeichen zeigt an, dass alle GitHub-Actions für YOLOv5-Tests zur kontinuierlichen Integration (CI) erfolgreich durchlaufen. Diese CI-Tests prüfen die Funktionalität und Leistung von YOLOv5 in verschiedenen wichtigen Bereichen: Training, Validierung, Inferenz, Export und Benchmarks. Sie gewährleisten einen konsistenten und zuverlässigen Betrieb unter macOS, Windows und Ubuntu. Die Tests werden alle 24 Stunden sowie bei jedem neuen Commit durchgeführt.

Danksagungen#

Wir danken @MagicFrogSJTU, der den größten Teil der Arbeit übernommen hat, und @glenn-jocher für die Unterstützung auf diesem Weg.

Siehe auch#

FAQ#

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

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

Wenn alles oben Genannte passt, eröffne ein Issue mit möglichst vielen Details und befolge dabei die Vorlage.

Kommentare