Ultralytics YOLO27 :
Get Started

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, avec 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 # install
Utiliser Docker

L'image Docker Ultralytics est recommandée pour tous les entraînements multi-GPU. Consulte le Guide de démarrage rapide Docker. Docker Pulls

PyTorch >= 1.9

torch.distributed.run remplace torch.distributed.launch dans PyTorch >= 1.9. Consulte la documentation sur la distribution de PyTorch pour en savoir plus.

Entraînement#

Choisis un modèle préentraîné pour commencer l'entraînement. Nous choisissons ici YOLOv5s, un modèle petit et rapide. Consulte le tableau de notre README pour comparer tous les modèles. Nous entraînerons ce modèle sur le jeu de données COCO avec plusieurs GPU.

YOLOv5 Models

Un seul GPU#

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

Transmets plusieurs identifiants de GPU à --device pour activer le mode DataParallel :

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

DataParallel est lent et accélère à peine l'entraînement par rapport à l'utilisation d'un seul GPU.

Fais précéder la commande d'entraînement de 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_node correspond au nombre de GPU à utiliser. Dans l'exemple ci-dessus, il s'agit de 2.
  • --batch correspond à la taille totale du lot, répartie équitablement entre chaque GPU. Dans l'exemple ci-dessus, cela représente 64 / 2 = 32 par GPU.

La commande ci-dessus utilise les GPU 0...(N-1). Pour contrôler la visibilité des périphériques à l'aide de variables d'environnement, définis plutôt CUDA_VISIBLE_DEVICES=2,3 (ou toute autre liste) avant le lancement.

Utiliser des GPU spécifiques (cliquer pour développer)

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,3
Utiliser SyncBatchNorm (cliquer pour développer)

SyncBatchNorm peut améliorer la précision de l'entraînement multi-GPU, mais ralentit considérablement l'entraînement. Cette option est uniquement disponible pour l'entraînement multi-GPU avec DistributedDataParallel.

À privilégier lorsque la taille de lot 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-bn
Utiliser plusieurs machines (cliquer pour développer)

Cette option est uniquement disponible pour l'entraînement multi-GPU avec DistributedDataParallel.

Avant de continuer, vérifie que le jeu de données, la base de code et toutes les autres dépendances sont identiques sur toutes les machines, puis assure-toi qu'elles peuvent communiquer entre elles sur le réseau.

Choisis une machine principale (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 s’affiche uniquement sur la machine principale.

Remarques#

  • La prise en charge de Windows n’a pas été testée ; Linux est recommandé.

  • --batch doit ê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 exécutions d’entraînement utilisent le même port. Indique 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 avec 8x A100 SXM4-40GB pour YOLOv5l pendant 1 epoch COCO.

Profilage du 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
taille du lotCUDA_mem
device0 (G)
COCO
entraînement
COCO
validation
1x1626GB20:390:55
2x3226GB11:430:57
4x6426GB5:570:55
8x12826GB3:090:57

Comme le montrent les résultats, l’utilisation de DistributedDataParallel avec plusieurs GPU permet d’obtenir une accélération de l’entraînement presque linéaire. 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 mémoire par appareil.

Environnements pris en charge#

Ultralytics propose un ensemble d’environnements prêts à l’emploi, chacun préinstallé avec les dépendances essentielles comme CUDA, CUDNN, Python et PyTorch, pour te permettre de démarrer tes projets.

État du projet#

YOLOv5 CI

Ce badge indique que tous les tests d’intégration continue (CI) de GitHub Actions pour YOLOv5 réussissent. Ces tests CI vérifient rigoureusement le fonctionnement et les performances de YOLOv5 dans plusieurs domaines clés : entraînement, validation, inférence, exportation et tests de performance. Ils garantissent un fonctionnement cohérent et fiable sur macOS, Windows et Ubuntu, grâce à des tests effectués toutes les 24 heures et à chaque nouveau commit.

Remerciements#

Nous remercions @MagicFrogSJTU, qui a fait tout le gros du travail, ainsi que @glenn-jocher, qui nous a guidés tout au long du parcours.

Voir aussi#

FAQ#

Lis la liste de vérification ci-dessous avant d’ouvrir un ticket — elle permet souvent de gagner du temps.

Liste de vérification (cliquer pour développer)
  • As-tu lu ce guide dans son intégralité ?
  • 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 répertoriés ci-dessus ?
  • As-tu essayé un jeu de données standard, comme coco128 ou coco2017, pour isoler la cause première ?

Si tout ce qui précède est en ordre, ouvre un ticket en fournissant autant de détails que possible et en suivant le modèle.

Commentaires