Formazione multiGPU
📚 Questa guida spiega come utilizzare correttamente più GPU per addestrare un set di dati con YOLOv5 🚀 su una o più macchine.
Prima di iniziare
Clona il repo e installa il file requirements.txt in un file di tipo Python>=3.8.0 con l'inclusione di PyTorch>=1.8. I modelli e i dataset vengono scaricati automaticamente dall'ultimarelease di YOLOv5 .
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install
💡 ProTip! Immagine Docker è consigliato per tutte le formazioni Multi-GPU . Vedi Guida rapida a Docker
💡 ProTip! torch.distributed.run
sostituisce torch.distributed.launch
in PyTorch>=1.9. Vedi documenti per i dettagli.
Formazione
Seleziona un modello pre-addestrato da cui iniziare l'addestramento. In questo caso abbiamo selezionato YOLOv5s, il modello più piccolo e veloce disponibile. Consulta la nostra tabella README per un confronto completo di tutti i modelli. Alleneremo questo modello con Multi-GPU sul set di dati COCO.
Singolo GPU
Multi-GPU DataParallel Mode (⚠️ non è raccomandato)
Puoi aumentare il device
per utilizzare più GPU in modalità DataParallel.
Questo metodo è lento e accelera appena l'allenamento rispetto all'utilizzo di 1 solo GPU.
Multi-GPU DistributedDataParallel Mode (✅ consigliato)
Dovrai superare python -m torch.distributed.run --nproc_per_node
, seguito dalle solite argomentazioni.
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
specifica il numero di GPU che si desidera utilizzare. Nell'esempio precedente è 2.
--batch
è la dimensione totale del lotto. Verrà diviso equamente per ogni GPU. Nell'esempio precedente, è 64/2=32 per GPU.
Il codice qui sopra utilizzerà le GPU 0... (N-1)
.
Usa GPU specifiche (clicca per espandere)
Puoi farlo semplicemente passando `--device` seguito dalle tue GPU specifiche. Ad esempio, nel codice qui sotto, utilizzeremo le GPU `2,3`.Usa SyncBatchNorm (clicca per espandere)
[SyncBatchNorm](https://pytorch.org/docs/master/generated/torch.nn.SyncBatchNorm.html) could increase accuracy for multiple gpu training, however, it will slow down training by a significant factor. It is **only** available for Multiple GPU DistributedDataParallel training. It is best used when the batch-size on **each** GPU is small (<= 8). To use SyncBatchNorm, simple pass `--sync-bn` to the command like below,Usa più macchine (clicca per espandere)
Questo è **solo** disponibile per la formazione Multiple GPU DistributedDataParallel. Prima di continuare, assicurati che i file su tutte le macchine siano gli stessi, dataset, codebase, ecc. Successivamente, assicurati che le macchine possano comunicare tra loro. Dovrai scegliere una macchina master (la macchina con cui le altre parleranno). Annota il suo indirizzo (`master_addr`) e scegli una porta (`master_port`). Nell'esempio che segue utilizzerò `master_addr = 192.168.1.1` e `master_port = 1234`. Per utilizzarlo, puoi procedere come segue, dove `G` è il numero di GPU per macchina, `N` è il numero di macchine e `R` è il numero di macchina da `0...(N-1)`. Supponiamo di avere due macchine con due GPU ciascuna: `G = 2`, `N = 2` e `R = 1` per quanto detto sopra. L'addestramento non inizierà prima che tutti Sono collegate `N` macchine. L'output verrà mostrato solo sulla macchina master!Note
- Il supporto di Windows non è stato testato, si consiglia Linux.
--batch
deve essere un multiplo del numero di GPU.- GPU 0 occuperà un po' più di memoria rispetto alle altre GPU perché mantiene l'EMA ed è responsabile del checkpoint ecc.
- Se ottieni
RuntimeError: Address already in use
potrebbe essere dovuto al fatto che stai eseguendo più allenamenti alla volta. Per risolvere il problema, è sufficiente utilizzare un numero di porta diverso aggiungendo--master_port
come in basso,
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 --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 |
dimensione del lotto | CUDA_mem device0 (G) |
Treno COCO |
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 |
DOMANDE FREQUENTI
Se si verifica un errore, leggi prima la lista di controllo qui sotto! (Potrebbe farti risparmiare tempo)
Lista di controllo (clicca per espandere)
- Hai letto bene questo post?
- Hai provato a riclonare la base di codice? Il codice cambia ogni giorno.
- Hai provato a cercare il tuo errore? Qualcuno potrebbe averlo già riscontrato in questa repo o in un'altra e avere la soluzione.
- Hai installato tutti i requisiti elencati sopra (comprese le versioni corrette di Python e Pytorch )?
- Hai provato in altri ambienti elencati nella sezione "Ambienti" qui sotto?
- Hai provato con un altro set di dati come coco128 o coco2017? Sarà più facile trovare la causa principale.
Ambienti supportati
Ultralytics offre una serie di ambienti pronti all'uso, ognuno dei quali è preinstallato con le dipendenze essenziali, come ad esempio CUDA, CUDNN, Python, e PyTorchper dare il via ai tuoi progetti.
- Taccuini gratuiti GPU:
- Google Cloud: Guida rapida a GCP
- Amazon: Guida rapida di AWS
- Azure: Guida rapida ad AzureML
- Docker: Guida rapida a Docker
Stato del progetto
Questo badge indica che tutti i test di YOLOv5 GitHub Actions Continuous Integration (CI) sono stati superati con successo. Questi test CI verificano rigorosamente la funzionalità e le prestazioni di YOLOv5 in vari aspetti chiave: formazione, validazione, inferenza, esportazione e benchmark. Assicurano un funzionamento coerente e affidabile su macOS, Windows e Ubuntu, con test condotti ogni 24 ore e su ogni nuovo commit.
Crediti
Vorremmo ringraziare @MagicFrogSJTU, che ha fatto tutto il lavoro pesante, e @glenn-jocher per averci guidato lungo il percorso.