Ir al contenido

Entrenamiento GPU con YOLOv5

Esta guía explica cómo utilizar correctamente varias GPU para entrenar un conjunto de datos con YOLOv5 🚀 en una o varias máquinas.

Antes de empezar

Clonar repo e instalar requirements.txt en a Python>=3.8.0 incluyendo PyTorch>=1.8. Los modelos y conjuntos de datos se descargan automáticamente de la últimaversión de YOLOv5 .

git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install

Consejo profesional

Imagen Docker se recomienda para todas las formaciones Multi-GPU . Véase Guía de inicio rápido de Docker Tirones de Docker

Consejo profesional

torch.distributed.run sustituye a torch.distributed.launch en PyTorch>=1.9. Véase Documentación distribuida de PyTorch para más detalles.

Formación

Selecciona un modelo preentrenado para empezar a entrenar. Aquí seleccionamos YOLOv5s, el modelo más pequeño y rápido disponible. Consulte nuestra tabla README para ver una comparación completa de todos los modelos. Entrenaremos este modelo con Multi-GPU en el conjunto de datos COCO.

YOLOv5 Modelos

Único GPU

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

Puede aumentar el device para utilizar múltiples GPUs en modo DataParallel.

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

Este método es lento y apenas acelera el entrenamiento en comparación con el uso de sólo 1 GPU.

Tendrá que pasar python -m torch.distributed.run --nproc_per_nodeseguido de los argumentos habituales.

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 especifica cuántas GPUs quieres utilizar. En el ejemplo anterior, es 2.
  • --batch es el tamaño total del lote. Se dividirá equitativamente entre cada GPU. En el ejemplo anterior, es 64/2=32 por GPU.

El código anterior utilizará GPUs 0... (N-1).

Utilizar GPU específicas (haga clic para ampliar) Puedes hacerlo simplemente pasando `--device` seguido de tus GPUs específicas. Por ejemplo, en el código siguiente, utilizaremos las GPUs `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
Utilice SyncBatchNorm (haga clic para ampliar) [SyncBatchNorm](https://pytorch.org/docs/master/generated/torch.nn.SyncBatchNorm.html) could increase [accuracy](https://www.ultralytics.com/glossary/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, simply pass `--sync-bn` to the command like below:
python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --sync-bn
Utilizar varias máquinas (haga clic para ampliar) Esto **sólo** está disponible para el entrenamiento DistributedDataParallel con múltiples GPU . Antes de continuar, asegúrese de que los archivos en todas las máquinas son los mismos, conjunto de datos, base de código, etc. Después, asegúrate de que las máquinas pueden comunicarse entre sí. Tendrás que elegir una máquina maestra (la máquina con la que hablarán las demás). Anota su dirección (`master_addr`) y elige un puerto (`master_port`). Yo usaré `dirección_maestra = 192.168.1.1` y `puerto_maestra = 1234` para el ejemplo de abajo. Para usarlo, puedes hacer lo siguiente:
# 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 ''
donde `G` es el número de GPU por máquina, `N` es el número de máquinas y `R` es el número de máquinas entre `0...(N-1)`. Digamos que tengo dos máquinas con dos GPUs cada una, sería `G = 2`, `N = 2`, y `R = 1` para lo anterior. El entrenamiento no comenzará hasta que **todas** las máquinas `N` estén conectadas. Los resultados sólo se mostrarán en la máquina maestra.

Notas

  • La compatibilidad con Windows no está probada, se recomienda Linux.
  • --batch debe ser múltiplo del número de GPUs.
  • GPU 0 ocupará algo más de memoria que las otras GPUs, ya que mantiene EMA y es responsable de los puntos de control, etc.
  • Si consigues RuntimeError: Address already in usepuede deberse a que esté realizando varios cursos a la vez. Para solucionarlo, simplemente utilice un número de puerto diferente añadiendo --master_port como abajo:
python -m torch.distributed.run --master_port 1234 --nproc_per_node 2 ...

Resultados

Resultados de perfiles DDP en una instancia AWS EC2 P4d con 8x A100 SXM4-40GB para YOLOv5l para 1 COCO epoch.

Perfilar el código
# 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
GPUs
A100
tamaño del lote CUDA_mem
dispositivo0 (G)
Tren COCO
COCO
val
1x 16 26 GB 20:39 0:55
2x 32 26 GB 11:43 0:57
4x 64 26 GB 5:57 0:55
8x 128 26 GB 3:09 0:57

Como muestran los resultados, el uso de DistributedDataParallel con varias GPU proporciona un escalado casi lineal de la velocidad de entrenamiento. Con 8 GPUs, el entrenamiento se completa aproximadamente 6,5 veces más rápido que con una sola GPU, manteniendo el mismo uso de memoria por dispositivo.

PREGUNTAS FRECUENTES

Si se produce un error, lea primero la siguiente lista de comprobación. (Podría ahorrarle tiempo)

Lista de control (haga clic para ampliar) - ¿Has leído bien este post? - ¿Has intentado volver a clonar el código base? El código cambia **diariamente**. - ¿Has intentado buscar tu error? Puede que alguien ya lo haya encontrado en este repo o en otro y tenga la solución. - ¿Has instalado todos los requisitos listados arriba (incluyendo las versiones correctas de Python y PyTorch )? - ¿Has probado en otros entornos listados en la sección "Entornos" más abajo? - ¿Has probado con otro conjunto de datos como coco128 o coco2017? Así será más fácil encontrar la causa raíz. Si ha hecho todo lo anterior, no dude en plantear una incidencia con el mayor detalle posible siguiendo la plantilla.

Entornos compatibles

Ultralytics proporciona una serie de entornos listos para usar, cada uno de ellos preinstalado con dependencias esenciales como CUDACUDNN, Pythony PyTorchpara poner en marcha sus proyectos.

Estado del proyecto

YOLOv5 CI

Este distintivo indica que todas las pruebas de integración continua (IC) deYOLOv5 GitHub Actions se han superado con éxito. Estas pruebas de IC comprueban rigurosamente la funcionalidad y el rendimiento de YOLOv5 en varios aspectos clave: formación, validación, inferencia, exportación y puntos de referencia. Garantizan un funcionamiento coherente y fiable en macOS, Windows y Ubuntu, con pruebas realizadas cada 24 horas y en cada nueva confirmación.

Créditos

Queremos dar las gracias a @MagicFrogSJTU, que hizo todo el trabajo pesado, y a @glenn-jocher por guiarnos por el camino.

Ver también

Creado hace 1 año ✏️ Actualizado hace 8 días

Comentarios