Addestramento Multi-GPU con YOLOv5

Questa guida spiega come addestrare YOLOv5 con più GPU su una singola macchina o su più macchine.

Prima di iniziare

Clona il repository e installa requirements.txt in un ambiente Python>=3.8.0, incluso PyTorch>=1.8. Modelli e dataset si scaricano automaticamente dall'ultima release di YOLOv5.

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

L'immagine Docker di Ultralytics è raccomandata per tutti i cicli di addestramento multi-GPU. Consulta la Guida Rapida Docker. Docker Pulls

PyTorch >= 1.9

torch.distributed.run sostituisce torch.distributed.launch in PyTorch >= 1.9. Consulta la documentazione distribuita di PyTorch per i dettagli.

Addestramento

Seleziona un modello pre-addestrato per iniziare l'addestramento. Qui selezioniamo YOLOv5s, il modello più piccolo e veloce disponibile. Vedi la tabella nel nostro README per un confronto completo di tutti i modelli. Addestreremo questo modello in modalità Multi-GPU sul dataset COCO.

YOLOv5 Models

Singola GPU

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

Modalità Multi-GPU DataParallel (⚠️ non raccomandata)

Passa più ID di GPU a --device per abilitare la modalità DataParallel:

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

DataParallel è lento e accelera a malapena l'addestramento rispetto all'uso di una singola GPU.

Modalità Multi-GPU DistributedDataParallel (✅ raccomandata)

Anteponi al comando di addestramento python -m torch.distributed.run --nproc_per_node, quindi passa gli argomenti consueti:

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 è il numero di GPU da utilizzare. Nell'esempio sopra, è 2.
  • --batch è la dimensione totale del batch, suddivisa equamente tra ogni GPU. Nell'esempio sopra, è 64 / 2 = 32 per GPU.

Il comando sopra utilizza le GPU 0...(N-1). Per controllare la visibilità dei dispositivi tramite variabili d'ambiente, imposta CUDA_VISIBLE_DEVICES=2,3 (o qualsiasi altra lista) prima di avviare.

Use specific GPUs (click to expand)

Passa --device seguito dagli specifici ID delle GPU. L'esempio seguente utilizza 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
Use SyncBatchNorm (click to expand)

SyncBatchNorm può aumentare l'accuratezza nell'addestramento multi-GPU, ma rallenta notevolmente l'addestramento. È disponibile solo per l'addestramento multi-GPU con DistributedDataParallel.

Ideale quando la dimensione del batch su ogni GPU è piccola (<= 8).

Per abilitare SyncBatchNorm, passa --sync-bn:

python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --sync-bn
Use Multiple machines (click to expand)

Questo è disponibile solo per l'addestramento multi-GPU con DistributedDataParallel.

Prima di continuare, assicurati che il dataset, la base di codice e qualsiasi altra dipendenza corrispondano su tutte le macchine, quindi verifica che le macchine possano raggiungersi a vicenda sulla rete.

Scegli una macchina master (quella a cui si connetteranno le altre), annota il suo indirizzo (master_addr) e scegli una porta (master_port). L'esempio sotto usa master_addr = 192.168.1.1 e master_port = 1234.

Poi esegui:

# 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 rango della macchina in 0...(N-1). Ad esempio, con due macchine e due GPU ciascuna, imposta G = 2, N = 2 e R = 1 sulla seconda macchina.

L'addestramento non inizia finché tutte le N macchine non sono connesse. L'output viene mostrato solo sulla macchina master.

Note

  • Il supporto Windows non è testato; Linux è consigliato.

  • --batch deve essere un multiplo del numero di GPU.

  • La GPU 0 usa leggermente più memoria delle altre perché mantiene l'EMA e gestisce il checkpointing.

  • Se ricevi RuntimeError: Address already in use, di solito significa che più processi di addestramento stanno usando la stessa porta. Specifica una porta diversa con --master_port:

    python -m torch.distributed.run --master_port 1234 --nproc_per_node 2 ...

Results

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

Profiling code
# prepare
t=ultralytics/yolov5:latest && sudo docker pull $t && sudo docker run -it --runtime=nvidia --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
batch-sizeMemoria CUDA
dispositivo0 (G)
COCO
train
COCO
val
1x1626GB20:390:55
2x3226GB11:430:57
4x6426GB5:570:55
8x12826GB3:090:57

Come mostrato nei risultati, l'utilizzo di DistributedDataParallel con più GPU offre uno scaling quasi lineare nella velocità di addestramento. Con 8 GPU, l'addestramento si completa circa 6,5 volte più velocemente rispetto a una singola GPU, mantenendo lo stesso utilizzo di memoria per dispositivo.

FAQ

Leggi la lista di controllo qui sotto prima di aprire una segnalazione: spesso fa risparmiare tempo.

Checklist (click to expand)
  • Hai letto questa guida dall'inizio alla fine?
  • Hai ricollegato la base di codice? Il codice cambia ogni giorno.
  • Hai cercato il messaggio di errore? Qualcun altro potrebbe aver già riscontrato lo stesso problema e condiviso una soluzione.
  • Hai installato tutti i requisiti (incluse le versioni corrette di Python e PyTorch)?
  • Hai provato uno degli ambienti supportati elencati di seguito?
  • Hai provato con un dataset più piccolo come coco128 o coco2017 per isolare la causa principale?

Se tutto quanto sopra risulta corretto, apri una Issue con quanti più dettagli possibili, seguendo il modello.

Ambienti supportati

Ultralytics fornisce una gamma di ambienti pronti all'uso, ciascuno pre-installato con dipendenze essenziali come CUDA, CUDNN, Python e PyTorch, per avviare i tuoi progetti.

Stato del progetto

YOLOv5 CI

Questo badge indica che tutti i test di Continuous Integration (CI) di YOLOv5 GitHub Actions vengono superati con successo. Questi test CI verificano rigorosamente la funzionalità e le prestazioni di YOLOv5 su vari aspetti chiave: training, validation, inference, export e benchmarks. Garantiscono un funzionamento coerente e affidabile su macOS, Windows e Ubuntu, con test condotti ogni 24 ore e ad ogni nuovo commit.

Crediti

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

Vedi anche

Commenti