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