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
💡 ¡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.
Único GPU
Multi-GPU ModoDatosParalelo (⚠️ no recomendado)
Puedes aumentar la device
para utilizar varias GPUs en modo DataParallel.
Este método es lento y apenas acelera el entrenamiento en comparación con el uso de sólo 1 GPU.
Multi-GPU DistributedDataModo paralelo (✅ recomendado)
Tendrás que aprobar python -m torch.distributed.run --nproc_per_node
seguido 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`.Utiliza SyncBatchNorm (haz 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, simple pass `--sync-bn` to the command like below,Utilizar varias máquinas (haz clic para ampliar)
Esto **sólo** está disponible para el entrenamiento DistribuidoDatosParalelo de Múltiples 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 que sigue. Para utilizarlo, puedes hacer lo siguiente, 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.- 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 use
podrí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,
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.
Entornos compatibles
Ultralytics proporciona una serie de entornos listos para usar, cada uno de ellos preinstalado con dependencias esenciales como CUDA, CUDNNPythony PyTorchpara poner en marcha tus proyectos.
- Cuadernos gratuitos GPU:
- Google La Nube: Guía de inicio rápido de GCP
- Amazon: Guía de inicio rápido de AWS
- Azure: Guía de inicio rápido de AzureML
- Docker: Guía de inicio rápido de Docker
Estado del proyecto
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.