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

Einzelne GPU
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0Multi-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,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 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_nodeist die Anzahl der zu verwendenden GPUs. Im obigen Beispiel ist dies2.--batchist die gesamte Batch-Größe, gleichmäßig verteilt auf jede GPU. 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)
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,3Use 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-bnUse 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.
-
--batchmuss 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 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 ...
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öße | CUDA_mem Gerät0 (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 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
coco128odercoco2017ausprobiert, 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.
- Kostenlose GPU-Notebooks:
- Google Cloud: GCP Quickstart Guide
- Amazon: AWS Quickstart Guide
- Azure: AzureML Quickstart Guide
- Docker: Docker Quickstart Guide
Projektstatus
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
- Train-Modus - 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