Entraînement multi-GPU avec YOLOv5#
Ce guide explique comment entraîner YOLOv5 avec plusieurs GPU sur une seule machine ou sur plusieurs machines.
Avant de commencer#
Clone le dépôt et installe requirements.txt dans un environnement Python>=3.8.0, notamment PyTorch>=1.8. Les modèles et les jeux de données sont téléchargés automatiquement depuis la dernière version de YOLOv5.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # installL’image Docker Ultralytics est recommandée pour toutes les exécutions d’entraînement multi-GPU. Consulte le Guide de démarrage rapide Docker.
torch.distributed.run remplace torch.distributed.launch dans PyTorch >= 1.9. Consulte la documentation sur la distribution de PyTorch pour plus de détails.
Entraînement#
Sélectionne un modèle pré-entraîné pour commencer l'entraînement. Ici, nous sélectionnons YOLOv5s, un modèle petit et rapide. Consulte le [tableau](https://ultralytics-translation-1.invalid de notre README pour une comparaison complète de tous les modèles. Nous entraînerons ce modèle avec le mode multi-GPU sur le dataset COCO.

GPU unique#
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0Mode multi-GPU DataParallel (⚠️ non recommandé)#
Transmets plusieurs identifiants de GPU à --device pour activer le mode DataParallel :
python train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1DataParallel est lent et accélère à peine l'entraînement par rapport à l'utilisation d'un seul GPU.
Mode multi-GPU DistributedDataParallel (✅ recommandé)#
Préfixe la commande d'entraînement avec python -m torch.distributed.run --nproc_per_node, puis transmets les arguments habituels :
python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1--nproc_per_nodecorrespond au nombre de GPU à utiliser. Dans l'exemple ci-dessus, il vaut2.--batchcorrespond à la taille totale du batch, répartie équitablement entre chaque GPU. Dans l'exemple ci-dessus, cela représente64 / 2 = 32par GPU.
La commande ci-dessus utilise les GPU 0...(N-1). Pour contrôler la visibilité des périphériques via des variables d'environnement à la place, définis CUDA_VISIBLE_DEVICES=2,3 (ou toute autre liste) avant le lancement.
Use specific GPUs (click to expand)
Transmets --device suivi des identifiants des GPU concernés. L'exemple ci-dessous utilise les 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 peut améliorer la précision de l'entraînement multi-GPU, mais il ralentit considérablement l'entraînement. Il est uniquement disponible pour l'entraînement multi-GPU avec DistributedDataParallel.
À utiliser de préférence lorsque la taille du batch sur chaque GPU est faible (<= 8).
Pour activer SyncBatchNorm, transmets --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)
Cette option est uniquement disponible pour l'entraînement multi-GPU avec DistributedDataParallel.
Avant de continuer, vérifie que le dataset, la base de code et toutes les autres dépendances sont identiques sur toutes les machines, puis vérifie que les machines peuvent communiquer entre elles sur le réseau.
Choisis une machine maître (celle à laquelle les autres se connecteront), note son adresse (master_addr) et choisis un port (master_port). L'exemple ci-dessous utilise master_addr = 192.168.1.1 et master_port = 1234.
Exécute ensuite :
# 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 ''où G correspond au nombre de GPU par machine, N au nombre de machines et R au rang de la machine dans 0...(N-1). Par exemple, avec deux machines et deux GPU chacune, définis G = 2, N = 2 et R = 1 sur la deuxième machine.
L'entraînement ne démarre pas tant que toutes les machines N ne sont pas connectées. La sortie ne s'affiche que sur la machine maître.
Remarques#
-
La prise en charge de Windows n'a pas été testée ; Linux est recommandé.
-
--batchdoit être un multiple du nombre de GPU. -
Le GPU 0 utilise légèrement plus de mémoire que les autres, car il conserve l'EMA et gère les points de contrôle.
-
Si tu obtiens
RuntimeError: Address already in use, cela signifie généralement que plusieurs entraînements utilisent le même port. Spécifie un autre port avec--master_port:python -m torch.distributed.run --master_port 1234 --nproc_per_node 2 ...
Résultats#
Résultats du profilage DDP sur une instance AWS EC2 P4d équipée de 8 A100 SXM4-40GB pour YOLOv5l pendant 1 epoch 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 entraînement | COCO validation |
|---|---|---|---|---|
| 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 |
Comme le montrent les résultats, l'utilisation de DistributedDataParallel avec plusieurs GPU offre une mise à l'échelle presque linéaire de la vitesse d'entraînement. Avec 8 GPU, l'entraînement se termine environ 6,5 fois plus vite qu'avec un seul GPU, tout en conservant la même utilisation de mémoire par périphérique.
Environnements pris en charge#
Ultralytics fournit une gamme d'environnements prêts à l'emploi, chacun incluant déjà les dépendances essentielles telles que CUDA, CUDNN, Python et PyTorch, pour te permettre de démarrer rapidement tes projets.
- Notebooks GPU gratuits :
- Google Cloud : Guide de démarrage rapide de GCP
- Amazon : Guide de démarrage rapide d’AWS
- Azure : Guide de démarrage rapide d’AzureML
- Docker : Guide de démarrage rapide de Docker
État du projet#
Ce badge indique que tous les tests d’intégration continue (CI) de YOLOv5 GitHub Actions passent avec succès. Ces tests de CI vérifient rigoureusement les fonctionnalités et les performances de YOLOv5 sous plusieurs aspects essentiels : entraînement, validation, inférence, exportation et benchmarks. Ils garantissent un fonctionnement cohérent et fiable sur macOS, Windows et Ubuntu, avec des tests exécutés toutes les 24 heures et à chaque nouveau commit.
Crédits#
Nous remercions @MagicFrogSJTU, qui a effectué l'essentiel du travail, ainsi que @glenn-jocher pour nous avoir guidés tout au long du projet.
Voir aussi#
- Mode entraînement - Découvre comment entraîner des modèles YOLO avec Ultralytics
- Réglage des hyperparamètres - Optimise les performances de ton modèle
- Guide de démarrage rapide Docker - Configure ton environnement Docker pour l'entraînement
FAQ#
Lis la checklist ci-dessous avant d'ouvrir un ticket — cela permet souvent de gagner du temps.
Checklist (click to expand)
- As-tu lu ce guide de bout en bout ?
- As-tu cloné à nouveau la base de code ? Le code change quotidiennement.
- As-tu recherché le message d'erreur ? Quelqu'un a peut-être déjà rencontré le même problème et partagé une solution.
- As-tu installé toutes les dépendances (y compris les bonnes versions de Python et de PyTorch) ?
- As-tu essayé l'un des environnements pris en charge listés ci-dessus ?
- As-tu essayé un dataset plus petit, comme
coco128oucoco2017, pour isoler la cause première ?
Si tout ce qui précède est vérifié, ouvre un ticket en fournissant autant de détails que possible et en suivant le modèle.