YOLO Vision 2026:

Multi-GPU-Training mit YOLOv5#

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

Bevor du beginnst#

Koniere das Repo und installiere requirements.txt in einer Python>=3.8.0-Umgebung, einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch aus dem 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-Trainingseinheiten 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 documentation für Details.

Training#

Wähle ein vortrainiertes Modell, um das Training zu starten. Hier wählen wir YOLOv5s, ein kleines und schnelles 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

Einzel-GPU#

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

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

Übergebe mehrere GPU-IDs an --device, 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 übergebe dann 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 es 2.
  • --batch ist die Gesamtbatchgröße, gleichmäßig auf jede GPU aufgeteilt. 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)

Übergebe --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 für das Multi-GPU-Training erhöhen, verlangsamt das Training jedoch erheblich. Es ist nur für das Multi-GPU-DistributedDataParallel-Training verfügbar.

Wird am besten verwendet, wenn die Batchgröße auf jeder GPU klein ist (<= 8).

Um SyncBatchNorm zu aktivieren, übergebe --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 Multi-GPU DistributedDataParallel-Training verfügbar.

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

Wähle eine Master-Maschine (die, zu 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 dann 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 ist, N die Anzahl der Maschinen und R der Maschinenrang in 0...(N-1). Setze beispielsweise bei zwei Maschinen mit jeweils zwei GPUs G = 2, N = 2 und R = 1 auf der zweiten Maschine.

Das Training beginnt 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 beibehält und die Checkpoints verwaltet.

  • 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 ...

Ergebnisse#

DDP-Profilierungsergebnisse auf einer AWS EC2 P4d instance 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 --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
batch-sizeCUDA_mem
device0 (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 schließt das Training etwa 6,5-mal schneller ab als mit einer einzelnen GPU, während die Speichernutzung pro Gerät gleich bleibt.

Unterstützte Umgebungen#

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

Projektstatus#

YOLOv5 CI

Dieses Badge zeigt an, dass alle Continuous Integration (CI)-Tests von YOLOv5 GitHub Actions erfolgreich bestanden wurden. Diese CI-Tests überprüfen streng die Funktionalität und Leistung von YOLOv5 in verschiedenen Schlüsselbereichen: Training, Validierung, Inferenz, Export und Benchmarks. Sie gewährleisten einen konsistenten und zuverlässigen Betrieb unter macOS, Windows und Ubuntu, wobei alle 24 Stunden und bei jedem neuen Commit Tests durchgeführt werden.

Credits#

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

Siehe auch#

FAQ#

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

Checklist (click to expand)
  • Hast du diesen Leitfaden von Anfang bis Ende gelesen?
  • Hast du die Codebasis neu geklont? Der Code ändert sich täglich.
  • Hast du nach der Fehlermeldung gesucht? Jemand anderes ist vielleicht 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 zu isolieren?

Wenn all das oben Genannte in Ordnung ist, eröffne ein Issue mit so vielen Details wie möglich und befolge die Vorlage.

Kommentare