Meet YOLO26: next-gen vision AI.

Link to this sectionMulti-GPU-Training mit YOLOv5#

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

Link to this sectionBevor du beginnst#

Klone das Repo und installiere requirements.txt in einer Python>=3.8.0-Umgebung, einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch von der 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-Trainingsläufe empfohlen. Siehe den Docker-Schnellstart-Leitfaden. Docker Pulls

PyTorch >= 1.9

torch.distributed.run ersetzt torch.distributed.launch in PyTorch >= 1.9. Siehe die PyTorch Distributed-Dokumentation für Details.

Link to this sectionTraining#

Wähle ein vortrainiertes Modell, um mit dem Training zu beginnen. 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

Link to this sectionEinzel-GPU#

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

Link to this sectionMulti-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.

Link to this sectionMulti-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 dies 2.
  • --batch ist die gesamte Batch-Größe, die gleichmäßig auf jede GPU aufgeteilt wird. Im obigen Beispiel sind das 64 / 2 = 32 pro GPU.

Der obige Befehl verwendet GPUs 0...(N-1). Um die Gerätesichtbarkeit stattdessen über Umgebungsvariablen zu steuern, setze CUDA_VISIBLE_DEVICES=2,3 (oder eine beliebige 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 beim Multi-GPU-Training erhöhen, verlangsamt das Training jedoch erheblich. Es ist nur für das Multi-GPU DistributedDataParallel-Training verfügbar.

Am besten geeignet, wenn die Batch-Größ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 (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.

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 Maschinen-Rang in 0...(N-1). Setze zum Beispiel 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.

Link to this sectionHinweise#

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

Link to this sectionErgebnisse#

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-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 der gleiche Speicherverbrauch pro Gerät beibehalten wird.

Link to this sectionFAQ#

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 unten aufgeführten unterstützten Umgebungen ausprobiert?
  • Hast du einen kleineren Datensatz wie coco128 oder coco2017 ausprobiert, um die Ursache einzugrenzen?

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

Link to this sectionUnterstützte Umgebungen#

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

Link to this sectionProjektstatus#

YOLOv5 CI

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

Link to this sectionCredits#

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.

Link to this sectionSiehe auch#

Kommentare