Meet YOLO26: next-gen vision AI.

Link to this sectionAddestramento Multi-GPU con YOLOv5#

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

Link to this sectionPrima di iniziare#

Clona il repository e installa requirements.txt in un ambiente Python>=3.8.0, incluso 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 # install
Usa Docker

L'immagine Docker di Ultralytics è consigliata per tutte le sessioni 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. Vedi la documentazione distribuita di PyTorch per i dettagli.

Link to this sectionAddestramento#

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 in Multi-GPU sul dataset COCO.

YOLOv5 Models

Link to this sectionSingola GPU#

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

Link to this sectionModalità 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,1

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

Link to this sectionModalità Multi-GPU DistributedDataParallel (✅ consigliata)#

Preponi 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 precedente, è 2.
  • --batch è la dimensione totale del batch, divisa equamente tra ogni GPU. Nell'esempio precedente, questo equivale a 64 / 2 = 32 per GPU.

Il comando precedente utilizza le GPU 0...(N-1). Per controllare la visibilità del dispositivo tramite variabili d'ambiente, imposta CUDA_VISIBLE_DEVICES=2,3 (o qualsiasi altra lista) prima di eseguire il lancio.

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,3
Use 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.

Da utilizzare preferibilmente 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 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 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 inizia finché tutte le N macchine non sono collegate. L'output viene mostrato solo sulla macchina master.

Link to this sectionNote#

  • Il supporto per Windows non è testato; si consiglia Linux.

  • --batch deve 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, solitamente significa che più sessioni di addestramento stanno utilizzando la stessa porta. Specifica una porta diversa con --master_port:

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

Link to this sectionRisultati#

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-sizeCUDA_mem
device0 (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 viene completato circa 6,5 volte più velocemente rispetto a una singola GPU, mantenendo lo stesso utilizzo di memoria per dispositivo.

Link to this sectionFAQ#

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 di seguito?
  • Hai provato un dataset più piccolo come coco128 o coco2017 per isolare la causa principale?

Se tutto quanto sopra è verificato, apri un Issue con quanti più dettagli possibili, seguendo il template.

Link to this sectionAmbienti supportati#

Ultralytics fornisce una serie di ambienti pronti all'uso, ciascuno preinstallato con le dipendenze essenziali come CUDA, CUDNN, Python e PyTorch, per dare il via ai tuoi progetti.

Link to this sectionStato 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 controllano rigorosamente la funzionalità e le prestazioni di YOLOv5 attraverso 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 ad ogni nuovo commit.

Link to this sectionCrediti#

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

Link to this sectionVedi anche#

Commenti