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, inclusi PyTorch>=1.8. I modelli e i dataset vengono scaricati automaticamente dall'ultima release di YOLOv5.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # installL'immagine Docker di Ultralytics è consigliata per tutti i cicli di addestramento multi-GPU. Consulta la Guida rapida a Docker.
torch.distributed.run sostituisce torch.distributed.launch in PyTorch >= 1.9. Per i dettagli, consulta la documentazione sulla distribuzione di PyTorch.
Addestramento#
Seleziona un modello pre-addestrato da cui iniziare l'addestramento. Qui selezioniamo YOLOv5s, un modello piccolo e veloce. Consulta la tabella nel nostro file README per un confronto completo di tutti i modelli. Addestreremo questo modello con più GPU sul dataset COCO.

Singola GPU#
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0Modalità Multi-GPU DataParallel (⚠️ non consigliata)#
Passa più ID GPU a --device per abilitare la modalità DataParallel:
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1DataParallel è lento e velocizza a malapena l'addestramento rispetto all'uso di una singola GPU.
Modalità Multi-GPU DistributedDataParallel (✅ consigliata)#
Anticipa il comando di addestramento con 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 precedente, è2.--batchè la dimensione totale del batch, suddivisa equamente tra ciascuna GPU. Nell'esempio precedente, corrisponde a64 / 2 = 32per GPU.
Il comando precedente utilizza le GPU 0...(N-1). Per controllare invece la visibilità dei dispositivi tramite le variabili d'ambiente, imposta CUDA_VISIBLE_DEVICES=2,3 (o qualsiasi altro elenco) prima di avviare.
Use specific GPUs (click to expand)
Passa --device seguito dagli ID specifici 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,3Use SyncBatchNorm (click to expand)
SyncBatchNorm può aumentare l'accuratezza per l'addestramento multi-GPU, ma rallenta notevolmente l'addestramento. È disponibile solo per l'addestramento multi-GPU DistributedDataParallel.
Utilizzato al meglio quando la dimensione del batch su ciascuna 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-bnUse Multiple machines (click to expand)
Questo è disponibile solo per l'addestramento multi-GPU 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), annotane l'indirizzo (master_addr) e seleziona una porta (master_port). L'esempio seguente utilizza 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 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 si avvia finché tutte le macchine N non sono connesse. L'output viene mostrato solo sulla macchina master.
Note#
-
Il supporto per Windows non è testato; si consiglia Linux.
-
--batchdeve essere un multiplo del numero di GPU. -
La GPU 0 utilizza 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 ...
Risultati#
Risultati della profilazione 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 --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 | batch-size | CUDA_mem device0 (G) | COCO train | 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 |
Come mostrato nei risultati, l'utilizzo di DistributedDataParallel con più GPU offre una scalabilità 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.
Ambienti supportati#
Ultralytics offre una gamma di ambienti pronti all'uso, ciascuno preinstallato con dipendenze essenziali come CUDA, CUDNN, Python e PyTorch, per dare il via ai tuoi progetti.
- Notebook GPU Gratuiti:
- Google Cloud: Guida rapida a GCP
- Amazon: Guida rapida AWS
- Azure: Guida rapida AzureML
- Docker: Guida rapida a Docker
Stato del progetto#
Questo badge indica che tutti i test di Integrazione Continua (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: addestramento, validazione, inferenza, esportazione e benchmark. Garantiscono un funzionamento coerente e affidabile su macOS, Windows e Ubuntu, con test condotti ogni 24 ore e a 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#
- Modalità di addestramento - Scopri di più sull'addestramento dei 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#
Consulta la lista di controllo qui sotto prima di aprire un issue: spesso fa risparmiare tempo.
Checklist (click to expand)
- Hai letto questa guida dall'inizio alla fine?
- Hai rieseguito il clone della base di codice? Il codice cambia quotidianamente.
- 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 sopra?
- Hai provato un dataset più piccolo come
coco128ococo2017per isolare la causa principale?
Se tutto quanto sopra è verificato, apri un Issue con quanti più dettagli possibili, seguendo il template.