Vai al contenuto

Formazione multiGPU

📚 Questa guida spiega come utilizzare correttamente più GPU per addestrare un set di dati con YOLOv5 🚀 su una o più macchine.

Prima di iniziare

Clonare il repo e installare il file requirements.txt in un file Python>=3.8.0 con l'inclusione di PyTorch>=1.8. I modelli e i dataset vengono scaricati automaticamente dall'ultimarelease di YOLOv5 .

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

💡 ProTip! Immagine Docker è consigliato per tutti i corsi di formazione Multi-GPU . Vedere Guida rapida a Docker Docker tira

💡 ProTip! torch.distributed.run sostituisce torch.distributed.launch in PyTorch>=1.9. Vedi documenti per i dettagli.

Formazione

Selezionare un modello preaddestrato da cui iniziare l'addestramento. In questo caso abbiamo scelto YOLOv5s, il modello più piccolo e veloce disponibile. Per un confronto completo di tutti i modelli, consultare la tabella README. Questo modello verrà addestrato con Multi-GPU sul set di dati COCO.

YOLOv5 Modelli

Singolo GPU

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

È possibile aumentare il device per utilizzare più GPU in modalità DataParallel.

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

Questo metodo è lento e accelera appena l'allenamento rispetto all'utilizzo di 1 solo GPU.

Dovrete superare python -m torch.distributed.run --nproc_per_node, seguito dalle solite argomentazioni.

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 specifica il numero di GPU che si desidera utilizzare. Nell'esempio precedente, è 2. --batch è la dimensione totale del batch. Verrà divisa in modo uniforme per ogni GPU. Nell'esempio precedente, è 64/2=32 per GPU.

Il codice qui sopra utilizzerà le GPU 0... (N-1).

Utilizzare GPU specifiche (fare clic per espandere) È possibile farlo semplicemente passando `--device` seguito dalle GPU specifiche. Per esempio, nel codice qui sotto, useremo le GPU `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
Utilizzare SyncBatchNorm (fare clic per espandere) [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
Utilizzare più macchine (fare clic per espandere) Questo è **solo** disponibile per la formazione Multiple GPU DistributedDataParallel. Prima di continuare, assicurarsi che i file su tutte le macchine siano gli stessi, dataset, codebase, ecc. Successivamente, assicurarsi che le macchine possano comunicare tra loro. Si dovrà scegliere una macchina master (la macchina con cui le altre parleranno). Annotate il suo indirizzo (`master_addr`) e scegliete una porta (`master_port`). Nell'esempio che segue utilizzerò `master_addr = 192.168.1.1` e `master_port = 1234`. Per usarlo, si può fare come segue,
# 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 ''
dove `G` è il numero di GPU per macchina, `N` è il numero di macchine e `R` è il numero di macchina da `0...(N-1)`. Supponiamo di avere due macchine con due GPU ciascuna, sarebbe `G = 2` , `N = 2` e `R = 1` per quanto detto sopra. L'addestramento non inizierà fino a quando tutti Sono collegate `N` macchine. L'output verrà mostrato solo sulla macchina master!

Note

  • Il supporto per Windows non è stato testato, si consiglia Linux.
  • --batch deve essere un multiplo del numero di GPU.
  • GPU 0 occuperà un po' più di memoria rispetto alle altre GPU, poiché mantiene l'EMA ed è responsabile del checkpoint, ecc.
  • Se si ottiene RuntimeError: Address already in usepotrebbe essere dovuto al fatto che si stanno eseguendo più allenamenti alla volta. Per risolvere il problema, è sufficiente utilizzare un numero di porta diverso, aggiungendo --master_port come di seguito,
python -m torch.distributed.run --master_port 1234 --nproc_per_node 2 ...

Risultati

Risultati della profilazione DDP su un'istanza AWS EC2 P4d con 8x A100 SXM4-40GB per YOLOv5l per 1 epoca COCO.

Profilazione del codice
# 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
A100
dimensione del lotto CUDA_mem
device0 (G)
Treno COCO
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

Se si verifica un errore, leggere prima la lista di controllo qui sotto! (Potrebbe farvi risparmiare tempo)

Lista di controllo (fare clic per espandere)
  • Avete letto bene questo post?
  • Avete provato a clonare nuovamente la base di codice? Il codice cambia ogni giorno.
  • Avete provato a cercare il vostro errore? Qualcuno potrebbe averlo già riscontrato in questa repo o in un'altra e avere la soluzione.
  • Sono stati installati tutti i requisiti elencati sopra (comprese le versioni corrette di Python e Pytorch )?
  • Avete provato in altri ambienti elencati nella sezione "Ambienti" qui sotto?
  • Avete provato con un altro set di dati come coco128 o coco2017? Sarà più facile trovare la causa principale.
Se avete seguito tutte le indicazioni di cui sopra, sentitevi liberi di sollevare un problema fornendo il maggior numero di dettagli possibile seguendo il modello.

Ambienti supportati

Ultralytics fornisce una serie di ambienti pronti all'uso, ognuno dei quali è preinstallato con le dipendenze essenziali quali CUDA, CUDNN, Python, e PyTorchper avviare i vostri progetti.

Stato del progetto

YOLOv5 CI

Questo badge indica che tutti i test di Continuous Integration (CI) di YOLOv5 GitHub Actions sono stati superati con successo. Questi test CI verificano rigorosamente la funzionalità e le prestazioni di YOLOv5 in vari aspetti chiave: formazione, validazione, inferenza, esportazione e benchmark. Assicurano un funzionamento coerente e affidabile su macOS, Windows e Ubuntu, con test condotti ogni 24 ore e su ogni nuovo commit.

Crediti

Vorremmo ringraziare @MagicFrogSJTU, che ha fatto tutto il lavoro pesante, e @glenn-jocher per averci guidato lungo il percorso.

📅C reato 1 anno fa ✏️ Aggiornato 1 mese fa

Commenti