Zum Inhalt springen

Multi-GPU Ausbildung

📚 Diese Anleitung erklärt, wie man mehrere GPUs richtig einsetzt, um einen Datensatz mit YOLOv5 🚀 auf einem oder mehreren Rechnern zu trainieren.

Bevor Sie beginnen

Repo klonen und requirements.txt in einem Python>=3.8.0 Umgebung, einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch von der neuestenVersion von YOLOv5 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-Züge

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

Ausbildung

Wählen Sie ein vorab 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 finden Sie einen vollständigen Vergleich aller Modelle. Wir werden dieses Modell mit Multi-GPU auf dem COCO-Datensatz trainieren.

YOLOv5 Modelle

Einzeln GPU

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

Sie können 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 1 GPU.

Sie müssen Folgendes 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 Sie verwenden möchten. Im obigen Beispiel sind es 2. --batch ist die gesamte Losgröß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) Sie können dies tun, indem Sie einfach `--device` gefolgt von Ihren spezifischen GPUs übergeben. Im folgenden Code verwenden wir zum Beispiel die GPUs 2 und 3.
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](https://www.ultralytics.com/glossary/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 die Schulung Multiple GPU DistributedDataParallel verfügbar. Bevor wir fortfahren, vergewissern Sie sich, dass die Dateien auf allen Rechnern die gleichen sind, also Datensatz, Codebasis usw. Stellen Sie anschließend sicher, dass die Rechner miteinander kommunizieren können. Sie müssen einen Master-Rechner auswählen (der Rechner, mit dem die anderen kommunizieren sollen). Notiere 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 verwenden, können Sie 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 GPU pro Maschine ist, `N` die Anzahl der Maschinen und `R` die Maschinennummer von `0...(N-1)` ist. Nehmen wir an, ich habe zwei Rechner mit je zwei GPUs, dann wäre `G = 2`, `N = 2` und `R = 1` für die obigen Angaben. Das Training beginnt nicht vor alle N" Rechner sind angeschlossen. Die Ausgabe wird nur auf dem Master-Rechner angezeigt!

Anmerkungen

  • Die Unterstützung von Windows ist 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 für Checkpointing usw. zuständig ist.
  • Wenn Sie RuntimeError: Address already in useEs könnte daran liegen, dass Sie mehrere Schulungen gleichzeitig durchführen. Um dies zu beheben, verwenden Sie einfach eine andere Portnummer, indem Sie --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.

Profiling-Code
# 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, lesen Sie bitte zuerst die folgende Checkliste! (Das könnte Ihnen Zeit sparen)

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

Unterstützte Umgebungen

Ultralytics bietet eine Reihe gebrauchsfertiger Umgebungen, die jeweils mit wichtigen Abhängigkeiten vorinstalliert sind, z. B. CUDA, CUDNN, Python, und PyTorchvorinstalliert, um Ihre Projekte in Gang zu bringen.

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 Schlüsselbereichen: 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 jeder neuen Übertragung durchgeführt werden.

Kredite

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 vor 1 Jahr ✏️ Aktualisiert vor 1 Monat

Kommentare