Ultralytics YOLO27:
Get Started

Addestramento di YOLOv5 con più GPU#

Questa guida spiega come addestrare YOLOv5 usando 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, che includa PyTorch>=1.8. Modelli e dataset vengono scaricati automaticamente dalla versione più recente 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 è consigliata per tutti gli addestramenti multi-GPU. Consulta la Guida rapida a Docker. Docker Pulls

PyTorch >= 1.9

torch.distributed.run sostituisce torch.distributed.launch in PyTorch >= 1.9. Consulta la documentazione di PyTorch sulla distribuzione per maggiori dettagli.

Addestramento#

Scegli un modello pretrained da cui avviare l'addestramento. Qui scegliamo YOLOv5s, un modello piccolo e veloce. Consulta la tabella del nostro README per un confronto completo di tutti i modelli. Addestreremo questo modello con più GPU sul dataset COCO.

YOLOv5 Models

Una sola GPU#

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

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

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

DataParallel è lento e accelera appena l'addestramento rispetto all'uso di una sola GPU.

Aggiungi python -m torch.distributed.run --nproc_per_node all'inizio del comando di addestramento, quindi passa i soliti argomenti:

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 usare. Nell'esempio precedente, è 2.
  • --batch è la dimensione totale del batch, suddivisa equamente tra le GPU. Nell'esempio precedente, corrisponde a 64 / 2 = 32 per GPU.

Il comando precedente usa le GPU 0...(N-1). Per controllare quali dispositivi sono visibili tramite variabili d'ambiente, imposta CUDA_VISIBLE_DEVICES=2,3 (o un altro elenco) prima dell'avvio.

Usa GPU specifiche (fai clic per espandere)

Passa --device seguito dagli ID delle GPU specifiche. L'esempio seguente usa 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
Usa SyncBatchNorm (fai clic per espandere)

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

È preferibile usarlo quando la dimensione del batch su ogni GPU è ridotta (<= 8).

Per attivare 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
Usa più macchine (fai clic per espandere)

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

Prima di proseguire, assicurati che dataset, base di codice e tutte le altre dipendenze siano identici su tutte le macchine, quindi verifica che le macchine possano comunicare tra loro in rete.

Scegli una macchina master (a cui si collegheranno le altre), annota il suo indirizzo (master_addr) e scegli una porta (master_port). L'esempio seguente 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é non sono connesse tutte le macchine N. L'output viene 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.

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

  • Se ricevi RuntimeError: Address already in use, di solito significa che più esecuzioni 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 ...

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 --device nvidia.com/gpu=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 batchCUDA_mem
device0 (G)
COCO
addestramento
COCO
val
1x1626GB20:390:55
2x3226GB11:430:57
4x6426GB5:570:55
8x12826GB3:090:57

Come mostrano i risultati, l'uso di DistributedDataParallel con più GPU consente una scalabilità pressoché lineare della velocità di addestramento. Con 8 GPU, l'addestramento termina circa 6,5 volte più velocemente rispetto a una singola GPU, mantenendo invariato l'utilizzo di memoria per dispositivo.

Ambienti supportati#

Ultralytics offre una gamma di ambienti pronti all'uso, ciascuno con le dipendenze essenziali già installate, come CUDA, CUDNN, Python e PyTorch, per dare il via ai tuoi progetti.

Stato del progetto#

YOLOv5 CI

Questo badge indica che tutti i test di integrazione continua (CI) di YOLOv5 GitHub Actions sono superati correttamente. Questi test CI verificano rigorosamente la funzionalità e le prestazioni di YOLOv5 in diversi ambiti chiave: addestramento, validazione, inferenza, esportazione e benchmark. Garantiscono un funzionamento coerente e affidabile su macOS, Windows e Ubuntu, con test eseguiti ogni 24 ore e a ogni nuovo commit.

Ringraziamenti#

Desideriamo ringraziare @MagicFrogSJTU, che ha fatto tutto il lavoro più impegnativo, e @glenn-jocher per averci guidato lungo il percorso.

Vedi anche#

Domande frequenti#

Leggi la checklist qui sotto prima di aprire una segnalazione: spesso ti fa risparmiare tempo.

Lista di controllo (fai clic per espandere)
  • Hai letto questa guida dall'inizio alla fine?
  • Hai clonato di nuovo il repository? Il codice cambia ogni giorno.
  • Hai cercato il messaggio di errore? Qualcuno 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 sopra?
  • Hai provato un dataset standard, ad esempio coco128 o coco2017, per individuare la causa principale?

Se hai verificato tutti i punti sopra, apri una segnalazione includendo più dettagli possibile e seguendo il modello.

Commenti