Addestramento con più 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. Models e datasets vengono scaricati automaticamente dalla [release](https://ultralytics-translation-5.invalid più recente di YOLOv5.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # installL'immagine Docker di Ultralytics è consigliata per tutte le esecuzioni di addestramento con più GPU. Consulta la Guida rapida a Docker.
torch.distributed.run sostituisce torch.distributed.launch in PyTorch >= 1.9. Per i dettagli, consulta la documentazione distribuita di PyTorch.
Addestramento#
Seleziona un modello preaddestrato da cui iniziare l'addestramento. Qui selezioniamo YOLOv5s, un modello piccolo e veloce. Consulta la tabella nel nostro README per un confronto completo di tutti i modelli. Addestreremo questo modello sul dataset COCO usando più GPU.

Una GPU#
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0Modalità multi-GPU DataParallel (⚠️ non consigliata)#
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,1DataParallel è lento e accelera a malapena l'addestramento rispetto all'uso di una singola GPU.
Modalità multi-GPU DistributedDataParallel (✅ consigliata)#
Aggiungi python -m torch.distributed.run --nproc_per_node all'inizio del comando di addestramento, 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_nodeindica il numero di GPU da usare. Nell'esempio precedente è2.--batchindica la dimensione totale del batch, distribuita equamente tra ogni GPU. Nell'esempio precedente è64 / 2 = 32per GPU.
Il comando precedente usa le GPU 0...(N-1). Per controllare invece la visibilità dei dispositivi tramite variabili d'ambiente, imposta CUDA_VISIBLE_DEVICES=2,3 (o qualsiasi altro elenco) prima dell'avvio.
Use specific GPUs (click to expand)
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,3Use SyncBatchNorm (click to expand)
SyncBatchNorm può aumentare la precisione nell'addestramento con più GPU, ma rallenta significativamente l'addestramento. È disponibile solo per l'addestramento multi-GPU DistributedDataParallel.
È consigliato quando la dimensione del batch su ogni GPU è ridotta (<= 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-bnUse Multiple machines (click to expand)
È disponibile solo per l'addestramento multi-GPU DistributedDataParallel.
Prima di continuare, assicurati che il dataset, la base di codice e tutte le altre dipendenze siano uguali su tutte le macchine, quindi verifica che le macchine possano raggiungersi tramite la 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 seguente usa master_addr = 192.168.1.1 e master_port = 1234.
Quindi 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 rank 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 N macchine. L'output viene mostrato solo sulla macchina master.
Note#
-
Il supporto per Windows non è stato testato; Linux è consigliato.
-
--batchdeve essere un multiplo del numero di GPU. -
La GPU 0 usa leggermente più memoria delle altre perché mantiene l'EMA e gestisce il salvataggio dei 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 del profiling DDP su un'istanza AWS EC2 P4d con 8x A100 SXM4-40GB per YOLOv5l per 1 epoca di COCO.
Profiling code
# 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 batch | CUDA_mem dispositivo0 (G) | COCO addestramento | COCO validazione |
|---|---|---|---|---|
| 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 |
Come mostrano i risultati, l'uso di DistributedDataParallel con più GPU offre una scalabilità quasi lineare nella velocità di addestramento. Con 8 GPU, l'addestramento termina circa 6,5 volte più velocemente rispetto a una singola GPU, mantenendo lo stesso utilizzo di memoria per dispositivo.
Ambienti supportati#
Ultralytics offre una serie di ambienti pronti all'uso, ciascuno con dipendenze essenziali preinstallate, come CUDA, CUDNN, Python e PyTorch, per avviare rapidamente i tuoi progetti.
- Notebook GPU gratuiti:
- Google Cloud: Guida rapida a GCP
- Amazon: Guida rapida ad AWS
- Azure: Guida rapida ad AzureML
- Docker: Guida rapida a Docker
Stato del progetto#
Questo badge indica che tutti i test di GitHub Actions di YOLOv5 per l'integrazione continua (CI) vengono superati correttamente. Questi test di CI verificano rigorosamente la funzionalità e le prestazioni di YOLOv5 sotto diversi aspetti fondamentali: addestramento, convalida, 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.
Riconoscimenti#
Desideriamo ringraziare @MagicFrogSJTU, che ha svolto la maggior parte del lavoro, e @glenn-jocher per averci guidato lungo il percorso.
Vedi anche#
- Modalità Train - Scopri come addestrare i modelli YOLO con Ultralytics
- Ottimizzazione degli iperparametri - Ottimizza le prestazioni del tuo modello
- Guida rapida a Docker - Configura il tuo ambiente Docker per l'addestramento
FAQ#
Leggi la checklist seguente prima di aprire un issue: spesso consente di risparmiare tempo.
Checklist (click to expand)
- Hai letto questa guida dall'inizio alla fine?
- Hai clonato nuovamente la base di codice? 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 più piccolo, come
coco128ococo2017, per isolare la causa principale?
Se tutto quanto sopra è a posto, apri un issue con più dettagli possibili, seguendo il modello.