Saltar al contenido

Formaci贸n Multi-GPU

馃摎 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 un 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

馃挕 隆ProTip! Imagen Docker se recomienda para todas las formaciones Multi-GPU. Consulta Gu铆a de inicio r谩pido de Docker Tirones de Docker

馃挕 隆ProTip! torch.distributed.run sustituye a torch.distributed.launch en PyTorch>=1.9. Ver docs para m谩s detalles.

Formaci贸n

Selecciona un modelo preentrenado a partir del cual empezar a entrenar. Aqu铆 seleccionamos YOLOv5s, el modelo m谩s peque帽o y r谩pido disponible. Consulta nuestra tabla L脡EME para ver una comparaci贸n completa de todos los modelos. Entrenaremos este modelo con Multi-GPU en el conjunto de datos COCO.

YOLOv5 Modelos

GPU 煤nica

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

Puedes aumentar la device para utilizar varias 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谩s que aprobar 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 GPU 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 (haz clic para ampliar) Puedes hacerlo simplemente pasando `--device` seguido de tus GPU 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
Utiliza SyncBatchNorm (haz clic para ampliar) [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,
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 (haz clic para ampliar) Esto **s贸lo** est谩 disponible para el entrenamiento DistribuidoDatosParalelo en varias GPU. Antes de continuar, aseg煤rate de que los archivos de 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 (`direcci贸n_maestra`) y elige un puerto (`puerto_maestra`). Yo utilizar茅 `direcci贸n_maestra = 192.168.1.1` y `puerto_maestra = 1234` para el ejemplo siguiente. Para utilizarlo, 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 desde `0...(N-1)`. Digamos que tengo dos m谩quinas con dos GPU cada una, ser铆a `G = 2` , `N = 2`, y `R = 1` para lo anterior. El entrenamiento no empezar谩 hasta que todos Hay `N` m谩quinas conectadas. 隆La salida s贸lo se mostrar谩 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.
  • La GPU 0 ocupar谩 algo m谩s de memoria que las otras GPUs, ya que mantiene la EMA y es responsable del checkpointing, etc.
  • Si consigues RuntimeError: Address already in usepodr铆a deberse a que est谩s realizando varios entrenamientos a la vez. Para solucionarlo, simplemente utiliza un n煤mero de puerto diferente a帽adiendo --master_port como a continuaci贸n,
python -m torch.distributed.run --master_port 1234 --nproc_per_node 2 ...

Resultados

Resultados del perfil 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)
COCO
tren
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

PREGUNTAS FRECUENTES

Si se produce un error, 隆lee primero la lista de comprobaci贸n que aparece a continuaci贸n! (Podr铆a ahorrarte tiempo)

Lista de control (haz clic para ampliar)
  • 驴Has le铆do bien este post?
  • 驴Has intentado volver a clonar el c贸digo base? El c贸digo cambia a diario.
  • 驴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 indicados arriba (incluidas las versiones correctas de Python y Pytorch )?
  • 驴Has probado en otros entornos de los que aparecen en la secci贸n "Entornos"?
  • 驴Has probado con otro conjunto de datos como coco128 o coco2017? As铆 ser谩 m谩s f谩cil encontrar la causa ra铆z.
Si has pasado por todo lo anterior, no dudes en plantear una Cuesti贸n dando todos los detalles posibles siguiendo la plantilla.

Entornos compatibles

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

Estado del proyecto

YOLOv5 CI

Este distintivo indica que todas las pruebas de Integraci贸n Continua (IC) de las Acciones de GitHub deYOLOv5 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 con 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.



Creado 2023-11-12, Actualizado 2024-05-08
Autores: Burhan-Q (1), glenn-jocher (2)

Comentarios