Overslaan naar inhoud

Multi-GPU-training

📚 Deze handleiding legt uit hoe je op de juiste manier meerdere GPU's kunt gebruiken om een dataset te trainen met YOLOv5 🚀 op één of meerdere machines.

Voordat je begint

Kloon repo en installeer requirements.txt in een Python>=3.8.0 omgeving, inclusief PyTorch>=1.8. Modellen en datasets worden automatisch gedownload van de nieuwste YOLOv5 release.

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

ProTip! Docker afbeelding wordt aanbevolen voor alle Multi-GPU trainingen. Zie Docker snelstartgids Docker trekt

ProTip! torch.distributed.run vervangt torch.distributed.launch in PyTorch>=1.9. Zie docs voor meer informatie.

Training

Selecteer een voorgetraind model om mee te gaan trainen. Hier selecteren we YOLOv5s, het kleinste en snelste model dat beschikbaar is. Zie onze README tabel voor een volledige vergelijking van alle modellen. We trainen dit model met Multi-GPU op de COCO dataset.

YOLOv5 Modellen

Enkele GPU

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

Je kunt de device om meerdere GPU's te gebruiken in DataParallel modus.

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

Deze methode is langzaam en versnelt de training nauwelijks in vergelijking met het gebruik van slechts 1 GPU.

Je moet slagen voor python -m torch.distributed.run --nproc_per_nodegevolgd door de gebruikelijke 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 Geeft aan hoeveel GPU's je wilt gebruiken. In het bovenstaande voorbeeld zijn dat er 2. --batch is de totale batchgrootte. Deze wordt gelijk verdeeld over elke GPU. In het bovenstaande voorbeeld is het 64/2=32 per GPU.

De bovenstaande code gebruikt GPU's 0... (N-1).

Specifieke GPU's gebruiken (klik om uit te breiden) Je kunt dit doen door simpelweg `--device` door te geven gevolgd door je specifieke GPU's. In de onderstaande code gebruiken we bijvoorbeeld GPU's `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
SyncBatchNorm gebruiken (klik om uit te breiden) [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
Meerdere machines gebruiken (klik om uit te breiden) Dit is **alleen** beschikbaar voor Multiple GPU DistributedDataParallel training. Controleer voordat we verder gaan of de bestanden op alle machines hetzelfde zijn, dataset, codebase, enz. Zorg er daarna voor dat de machines met elkaar kunnen communiceren. Je moet een mastermachine kiezen (de machine waarmee de anderen zullen praten). Noteer het adres (`master_addr`) en kies een poort (`master_port`). Ik zal `master_addr = 192.168.1.1` en `master_port = 1234` gebruiken voor het onderstaande voorbeeld. Om het te gebruiken, kun je het volgende doen,
# 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 ''
waarbij `G` het aantal GPU's per machine is, `N` het aantal machines en `R` het machinenummer van `0...(N-1)`. Stel dat ik twee machines heb met elk twee GPU's, dan is `G = 2` , `N = 2` en `R = 1` voor het bovenstaande. De training begint pas als alle Er zijn `N` machines aangesloten. Uitvoer wordt alleen op de mastermachine getoond!

Opmerkingen

  • Ondersteuning voor Windows is niet getest, Linux wordt aanbevolen.
  • --batch moet een veelvoud zijn van het aantal GPU's.
  • GPU 0 neemt iets meer geheugen in beslag dan de andere GPU's omdat deze EMA onderhoudt en verantwoordelijk is voor checkpointing en dergelijke.
  • Als je RuntimeError: Address already in useHet kan ook komen doordat je meerdere trainingen tegelijk uitvoert. Om dit op te lossen kun je een ander poortnummer gebruiken door het volgende toe te voegen --master_port zoals hieronder,
python -m torch.distributed.run --master_port 1234 --nproc_per_node 2 ...

Resultaten

DDP profileringsresultaten op een AWS EC2 P4d instance met 8x A100 SXM4-40GB voor YOLOv5l voor 1 COCO epoch.

Code profileren
# 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
GPU's
A100
partijgrootte CUDA_mem
apparaat0 (G)
COCO
trein
COCO
val
1x 16 26 GB 20:39 0:55
2x 32 26 GB 11:43 0:57
4x 64 26 GB 5:57 0:55
8x 128 26 GB 3:09 0:57

FAQ

Als er een fout optreedt, lees dan eerst de checklist hieronder! (Het kan je tijd besparen)

Checklist (klik om uit te breiden)
  • Heb je deze post goed gelezen?
  • Heb je geprobeerd de codebase opnieuw te klonen? De code verandert dagelijks.
  • Heb je geprobeerd naar je fout te zoeken? Misschien is iemand dit al tegengekomen in deze repo of in een andere repo en heeft hij de oplossing.
  • Heb je alle vereisten geïnstalleerd die bovenaan staan (inclusief de juiste Python en Pytorch versies)?
  • Heb je het geprobeerd in andere omgevingen die worden genoemd in het gedeelte "Omgevingen" hieronder?
  • Heb je het geprobeerd met een andere dataset zoals coco128 of coco2017? Dat maakt het makkelijker om de hoofdoorzaak te vinden.
Als je al het bovenstaande hebt doorlopen, voel je dan vrij om een probleem aan de orde te stellen door zoveel mogelijk details te geven volgens het sjabloon.

Ondersteunde omgevingen

Ultralytics biedt een reeks kant-en-klare omgevingen, elk vooraf geïnstalleerd met essentiële afhankelijkheden zoals CUDA, CUDNN, Python, en PyTorchom je projecten een kickstart te geven.

Projectstatus

YOLOv5 CI

Deze badge geeft aan dat alle YOLOv5 GitHub Actions Continuous Integration (CI) tests met succes zijn doorstaan. Deze CI-tests controleren rigoureus de functionaliteit en prestaties van YOLOv5 op verschillende belangrijke aspecten: training, validatie, inferentie, export en benchmarks. Ze zorgen voor een consistente en betrouwbare werking op macOS, Windows en Ubuntu, met tests die elke 24 uur en bij elke nieuwe commit worden uitgevoerd.

Credits

We willen @MagicFrogSJTU bedanken, die al het zware werk heeft gedaan, en @glenn-jocher voor de begeleiding.



Gemaakt op 2023-11-12, Bijgewerkt op 2023-12-03
Auteurs: glenn-jocher (2)

Reacties