Zum Inhalt springen

Multi-GPU Ausbildung

📚 In diesem Leitfaden wird erklärt, wie man mehrere GPUs richtig einsetzt, um einen Datensatz mit YOLOv5 🚀 auf einer oder mehreren Maschinen zu trainieren.

Bevor du anfängst

Klone das Repo und installiere die requirements.txt in einem Python>=3.8.0 Umgebung, einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch von der neuesten YOLOv5 Version heruntergeladen.

git clone https://github.com/ultralytics/yolov5  # clone
cd yolov5
pip install -r requirements.txt  # install

💡 ProTip! Docker Image wird für alle Multi-GPU-Schulungen empfohlen. Siehe Docker Schnellstart-Anleitung Docker Pulls

💡 ProTip! torch.distributed.run Ersetzt torch.distributed.launch in PyTorch>=1.9. Siehe docs für Details.

Ausbildung

Wähle ein trainiertes Modell aus, um mit dem Training zu beginnen. Hier wählen wir YOLOv5s, das kleinste und schnellste verfügbare Modell. In unserer README-Tabelle findest du einen vollständigen Vergleich aller Modelle. Wir werden dieses Modell mit Multi-GPU auf dem COCO-Datensatz trainieren.

YOLOv5 Modelle

Einzelne GPU

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

Du kannst die device um mehrere GPUs im DataParallel-Modus zu verwenden.

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

Diese Methode ist langsam und beschleunigt das Training kaum im Vergleich zur Verwendung von nur einem Grafikprozessor.

Du musst bestehen python -m torch.distributed.run --nproc_per_node, gefolgt von den üblichen Argumenten.

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 an, wie viele GPUs du verwenden möchtest. Im obigen Beispiel sind es 2. --batch ist die gesamte Batch-Größe. Sie wird gleichmäßig auf jede GPU aufgeteilt. Im obigen Beispiel sind es 64/2=32 pro GPU.

Der obige Code wird GPUs verwenden 0... (N-1).

Spezielle GPUs verwenden (zum Erweitern klicken) Du kannst dies tun, indem du einfach `--device` gefolgt von deinen spezifischen GPUs angibst. Im folgenden Code werden wir zum Beispiel die GPUs 2 und 3 verwenden.
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 Erweitern klicken) [SyncBatchNorm](https://pytorch.org/docs/master/generated/torch.nn.SyncBatchNorm.html) could increase accuracy for multiple gpu training, however, it will slow down training by a significant factor. It is **only** available for Multiple GPU DistributedDataParallel training. It is best used when the batch-size on **each** GPU is small (<= 8). To use SyncBatchNorm, simple pass `--sync-bn` to the command like below,
python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --sync-bn
Mehrere Maschinen verwenden (zum Erweitern klicken) Dies ist **nur** für das Multiple GPU DistributedDataParallel Training verfügbar. Bevor wir fortfahren, stelle sicher, dass die Dateien auf allen Rechnern gleich sind, also Datensatz, Codebasis usw. Stelle anschließend sicher, dass die Rechner miteinander kommunizieren können. Du musst einen Master-Rechner auswählen (der Rechner, mit dem die anderen kommunizieren sollen). Notiere dir seine Adresse (`master_addr`) und wähle einen Port (`master_port`). Für das folgende Beispiel verwende ich "master_addr = 192.168.1.1" und "master_port = 1234". Um es zu benutzen, kannst du wie folgt vorgehen,
# 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 Grafikprozessoren pro Maschine, "N" die Anzahl der Maschinen und "R" die Maschinennummer von "0...(N-1)" ist. Nehmen wir an, ich habe zwei Maschinen mit je zwei Grafikprozessoren, dann wäre `G = 2`, `N = 2` und `R = 1` für die obigen Angaben. Das Training beginnt nicht, bevor alle N" Maschinen angeschlossen sind. Die Ausgabe wird nur auf der Master-Maschine angezeigt!

Anmerkungen

  • Die Windows-Unterstützung ist ungetestet, Linux wird empfohlen.
  • --batch muss ein Vielfaches der Anzahl der GPUs sein.
  • Die GPU 0 benötigt etwas mehr Speicher als die anderen GPUs, da sie die EMA verwaltet und für das Checkpointing usw. zuständig ist.
  • Wenn du RuntimeError: Address already in useEs könnte daran liegen, dass du mehrere Trainings gleichzeitig durchführst. Um dies zu beheben, verwende einfach eine andere Portnummer, indem du --master_port wie unten,
python -m torch.distributed.run --master_port 1234 --nproc_per_node 2 ...

Ergebnisse

DDP-Profiling-Ergebnisse auf einer AWS EC2 P4d-Instanz mit 8x A100 SXM4-40GB für YOLOv5l für eine COCO-Epoche.

Code profilieren
# prepare
t=ultralytics/yolov5:latest && sudo docker pull $t && sudo docker run -it --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
Losgröße CUDA_mem
device0 (G)
COCO
Zug
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

FAQ

Wenn ein Fehler auftritt, lies bitte zuerst die Checkliste unten! (Das könnte dir Zeit sparen)

Checkliste (zum Vergrößern klicken)
  • Hast du diesen Beitrag richtig gelesen?
  • Hast du versucht, die Codebase neu zu klonen? Der Code ändert sich täglich.
  • Hast du versucht, nach deinem Fehler zu suchen? Vielleicht ist jemand in diesem oder einem anderen Repo schon darauf gestoßen und hat die Lösung.
  • Hast du alle oben aufgeführten Anforderungen installiert (einschließlich der korrekten Versionen von Python und Pytorch )?
  • Hast du es in anderen Umgebungen versucht, die im Abschnitt "Umgebungen" unten aufgeführt sind?
  • Hast du es mit einem anderen Datensatz wie coco128 oder coco2017 versucht? Das macht es einfacher, die Ursache zu finden.
Wenn du alle oben genannten Punkte beachtet hast, kannst du ein Problem melden, indem du so viele Details wie möglich in der Vorlage angibst.

Unterstützte Umgebungen

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

Projektstatus

YOLOv5 CI

Dieses Abzeichen zeigt an, dass alle YOLOv5 GitHub Actions Continuous Integration (CI) Tests erfolgreich bestanden wurden. Diese CI-Tests überprüfen die Funktionalität und Leistung von YOLOv5 in verschiedenen 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 und bei jeder neuen Übertragung durchgeführt.

Credits

Wir möchten uns bei @MagicFrogSJTU bedanken, der die ganze Arbeit gemacht hat, und bei @glenn-jocher, der uns auf unserem Weg begleitet hat.



Erstellt am 2023-11-12, Aktualisiert am 2023-12-03
Autoren: glenn-jocher (2)

Kommentare