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 # installDas Ultralytics Docker-Image wird für alle Multi-GPU-Trainingseinheiten empfohlen. Siehe den Docker Quickstart Guide.
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.

Einzel-GPU#
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0Multi-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,1DataParallel 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_nodeist die Anzahl der zu verwendenden GPUs. Im obigen Beispiel ist es2.--batchist die Gesamtbatchgröße, gleichmäßig auf jede GPU aufgeteilt. Im obigen Beispiel sind das64 / 2 = 32pro 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,3Use 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-bnUse 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.
-
--batchmuss 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 useerhältst, bedeutet dies normalerweise, dass mehrere Trainingsläufe denselben Port verwenden. Gib einen anderen Port mit--master_portan: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-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 |
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.
- Kostenlose GPU-Notebooks:
- Google Cloud: GCP-Schnellstartanleitung
- Amazon: AWS-Schnellstartanleitung
- Azure: AzureML-Schnellstartanleitung
- Docker: Docker-Schnellstartanleitung
Projektstatus#
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#
- Train Mode – Erfahre mehr über das Training von YOLO-Modellen mit Ultralytics
- Hyperparameter Tuning – Optimiere die Leistung deines Modells
- Docker Quickstart Guide – Richte deine Docker-Umgebung für das Training ein
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
coco128odercoco2017ausprobiert, 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.