Training mit mehreren GPUs und YOLOv5#
Diese Anleitung erklärt, wie du YOLOv5 mit mehreren GPUs auf einem einzelnen Rechner oder verteilt auf mehrere Rechner trainierst.
Vor dem Start#
Klone das Repository und installiere requirements.txt in einer Umgebung mit Python>=3.8.0, 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 # installFür alle Trainingsläufe mit mehreren GPUs wird das Ultralytics-Docker-Image empfohlen. Sieh dir die Docker-Schnellstartanleitung an.
torch.distributed.run ersetzt torch.distributed.launch in PyTorch >= 1.9. Einzelheiten findest du in der Dokumentation zu verteiltem Training mit PyTorch.
Training#
Wähle ein vortrainiertes Modell als Ausgangspunkt für das Training aus. Hier wählen wir YOLOv5s, ein kleines und schnelles Modell. Einen vollständigen Vergleich aller Modelle findest du in der Tabelle unserer README. Wir trainieren dieses Modell mit mehreren GPUs auf dem COCO-Datensatz.

Eine GPU#
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0DataParallel-Modus mit mehreren GPUs (DataParallel – ⚠️ nicht empfohlen)#
Übergib 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.
DistributedDataParallel-Modus mit mehreren GPUs (DistributedDataParallel – ✅ empfohlen)#
Stelle dem Trainingsbefehl python -m torch.distributed.run --nproc_per_node voran 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_nodegibt die Anzahl der zu verwendenden GPUs an. Im obigen Beispiel ist der Wert2.--batchist die Gesamt-Batch-Größe, die gleichmäßig auf die einzelnen GPUs verteilt wird. Im obigen Beispiel entspricht das64 / 2 = 32pro GPU.
Der obige Befehl verwendet die GPUs 0...(N-1). Um die Sichtbarkeit der Geräte stattdessen über Umgebungsvariablen zu steuern, lege vor dem Start CUDA_VISIBLE_DEVICES=2,3 (oder eine beliebige andere Liste) fest.
Bestimmte GPUs verwenden (zum Aufklappen klicken)
Übergib --device, gefolgt von den jeweiligen GPU-IDs. Im folgenden Beispiel werden die GPUs 2,3 verwendet.
python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --device 2,3SyncBatchNorm verwenden (zum Aufklappen klicken)
SyncBatchNorm kann die Genauigkeit beim Training mit mehreren GPUs erhöhen, verlangsamt das Training jedoch erheblich. Diese Funktion ist nur beim Training mit mehreren GPUs und DistributedDataParallel verfügbar.
Am besten geeignet, wenn die Batch-Größ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-bnMehrere Rechner verwenden (zum Aufklappen klicken)
Diese Funktion ist nur beim Training mit mehreren GPUs und DistributedDataParallel verfügbar.
Bevor du fortfährst, stelle sicher, dass Datensatz, Codebasis und alle weiteren Abhängigkeiten auf allen Rechnern übereinstimmen. Prüfe anschließend, ob die Rechner im Netzwerk miteinander kommunizieren können.
Wähle einen Master-Rechner (mit dem sich die anderen Rechner verbinden), notiere seine Adresse (master_addr) und wähle einen Port (master_port). Im folgenden Beispiel werden master_addr = 192.168.1.1 und master_port = 1234 verwendet.
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 ''wobei G die Anzahl der GPUs pro Rechner, N die Anzahl der Rechner und R der Rang des Rechners in 0...(N-1) ist. Wenn du beispielsweise zwei Rechner mit jeweils zwei GPUs verwendest, setze auf dem zweiten Rechner G = 2, N = 2 und R = 1.
Das Training beginnt erst, wenn alle N Rechner verbunden sind. Die Ausgabe wird nur auf dem Hauptrechner angezeigt.
Hinweise#
-
Die Unterstützung für Windows wurde nicht getestet; Linux wird empfohlen.
-
--batchmuss ein Vielfaches der Anzahl der GPUs sein. -
GPU 0 benötigt etwas mehr Speicher als die anderen GPUs, da sie die EMA verwaltet und Checkpoints erstellt.
-
Wenn du
RuntimeError: Address already in useerhältst, verwenden wahrscheinlich mehrere Trainingsläufe denselben Port. Gib mit--master_porteinen anderen Port an:python -m torch.distributed.run --master_port 1234 --nproc_per_node 2 ...
Ergebnisse#
DDP-Profiling-Ergebnisse für YOLOv5l über 1 COCO-Epoche auf einer AWS-EC2-P4d-Instanz mit 8x A100 SXM4-40GB.
Code-Profiling
# 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öße | CUDA-Speicher Gerät0 (G) | COCO Training | COCO Validierung |
|---|---|---|---|---|
| 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 die Ergebnisse zeigen, lässt sich die Trainingsgeschwindigkeit mit DistributedDataParallel und mehreren GPUs nahezu linear steigern. Mit 8 GPUs ist das Training etwa 6,5-mal schneller abgeschlossen als mit einer einzelnen GPU, wobei der Speicherverbrauch pro Gerät gleich bleibt.
Unterstützte Umgebungen#
Ultralytics bietet verschiedene sofort einsatzbereite Umgebungen, in denen wichtige Abhängigkeiten wie CUDA, CUDNN, Python und PyTorch bereits installiert sind, damit du schnell mit deinen Projekten loslegen kannst.
- Kostenlose GPU-Notebooks:
- Google Cloud: GCP-Schnellstartanleitung
- Amazon: AWS-Schnellstartanleitung
- Azure: AzureML-Schnellstartanleitung
- Docker: Docker-Schnellstartanleitung
Projektstatus#
Dieses Badge zeigt an, dass alle GitHub-Actions von YOLOv5 für die kontinuierliche Integration (CI) erfolgreich durchlaufen. Diese CI-Tests prüfen gründlich 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 ausgeführt.
Danksagungen#
Wir möchten @MagicFrogSJTU danken, der den größten Teil der Arbeit übernommen hat, und @glenn-jocher, der uns dabei angeleitet hat.
Siehe auch#
- Trainingsmodus – Erfahre, wie du YOLO-Modelle mit Ultralytics trainierst
- Hyperparameteroptimierung – Optimiere die Leistung deines Modells
- Docker-Schnellstartanleitung – Richte deine Docker-Umgebung für das Training ein
Häufig gestellte Fragen#
Lies die folgende Checkliste, bevor du ein Issue erstellst – das spart oft Zeit.
Checkliste (zum Aufklappen klicken)
- Hast du diese Anleitung vollständig gelesen?
- Hast du den Code erneut geklont? Der Code ändert sich täglich.
- Hast du nach der Fehlermeldung gesucht? Möglicherweise ist bereits jemand auf dasselbe Problem gestoßen und hat eine Lösung veröffentlicht.
- Hast du alle Voraussetzungen installiert, einschließlich der passenden Versionen von Python und PyTorch?
- Hast du eine der oben aufgeführten unterstützten Umgebungen ausprobiert?
- Hast du einen der Standarddatensätze wie
coco128odercoco2017ausprobiert, um die Ursache einzugrenzen?
Wenn alles oben Genannte zutrifft, erstelle ein Issue mit möglichst vielen Details und verwende dabei die Vorlage.