Ultralytics YOLO27:
Get Started

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 # install
Docker verwenden

Für alle Trainingsläufe mit mehreren GPUs wird das Ultralytics-Docker-Image empfohlen. Sieh dir die Docker-Schnellstartanleitung an. Docker Pulls

PyTorch >= 1.9

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.

YOLOv5 Models

Eine GPU#

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

Ü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,1

DataParallel ist langsam und beschleunigt das Training im Vergleich zur Verwendung einer einzelnen GPU kaum.

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_node gibt die Anzahl der zu verwendenden GPUs an. Im obigen Beispiel ist der Wert 2.
  • --batch ist die Gesamt-Batch-Größe, die gleichmäßig auf die einzelnen GPUs verteilt wird. Im obigen Beispiel entspricht 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, 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,3
SyncBatchNorm 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-bn
Mehrere 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.

  • --batch muss 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 use erhältst, verwenden wahrscheinlich mehrere Trainingsläufe denselben Port. Gib mit --master_port einen 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öß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, 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.

Projektstatus#

YOLOv5 CI

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#

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 coco128 oder coco2017 ausprobiert, um die Ursache einzugrenzen?

Wenn alles oben Genannte zutrifft, erstelle ein Issue mit möglichst vielen Details und verwende dabei die Vorlage.

Kommentare