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 # installL'immagine Docker di Ultralytics è raccomandata per tutti i cicli di addestramento multi-GPU. Consulta la Guida Rapida Docker.
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.

Singola GPU
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0Modalità 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,1DataParallel è 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 = 32per 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,3Use 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-bnUse 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.
-
--batchdeve 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-size | Memoria CUDA dispositivo0 (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 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
coco128ococo2017per 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.
- Notebook GPU gratuiti:
- Google Cloud: Guida Rapida GCP
- Amazon: Guida Rapida AWS
- Azure: Guida Rapida AzureML
- Docker: Guida Rapida Docker
Stato del progetto
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
- Modalità Train - Scopri come addestrare i modelli YOLO con Ultralytics
- Ottimizzazione degli Iperparametri - Ottimizza le prestazioni del tuo modello
- Guida Rapida Docker - Configura il tuo ambiente Docker per l'addestramento