Treino GPU com YOLOv5
Este guia explica como usar corretamente várias GPUs para treinar um conjunto de dados com YOLOv5 🚀 em uma ou várias máquinas.
Antes de começar
Clonar repo e instalar requirements.txt em um Python>=3.8.0 incluindo PyTorch>=1.8. Os modelos e conjuntos de dados são descarregados automaticamente a partir daversão mais recentede YOLOv5 .
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install
Dica profissional!
Imagem Docker é recomendado para todas as formações Multi-GPU . Ver Guia de início rápido do Docker
Dica profissional!
torch.distributed.run
substitui torch.distributed.launch
em PyTorch>=1.9. Veja Documentação distribuída PyTorch para mais pormenores.
Formação
Selecione um modelo pré-treinado para iniciar o treino. Aqui seleccionamos o YOLOv5s, o modelo mais pequeno e mais rápido disponível. Veja a nossa tabela README para uma comparação completa de todos os modelos. Iremos treinar este modelo com Multi-GPU no conjunto de dados COCO.
Individual GPU
Multi-GPU ModoDataParallel (⚠️ não recomendado)
É possível aumentar o device
para usar várias GPUs no modo DataParallel.
Este método é lento e quase não acelera o treino em comparação com a utilização de apenas 1 GPU.
Multi-GPU DistributedDataParallel Mode (✅ recomendado)
Terá de passar python -m torch.distributed.run --nproc_per_node
, seguido dos argumentos habituais.
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 quantas GPUs você gostaria de usar. No exemplo acima, é 2.--batch
é o tamanho total do lote. Será dividido uniformemente por cada GPU. No exemplo acima, é 64/2=32 por GPU.
O código acima usará GPUs 0... (N-1)
.
Utilizar GPUs específicas (clique para expandir)
Você pode fazer isso simplesmente passando `--device` seguido por suas GPUs específicas. Por exemplo, no código abaixo, nós usaremos GPUs `2,3`.Utilizar SyncBatchNorm (clique para expandir)
[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:Utilizar várias máquinas (clique para expandir)
Isto está **apenas** disponível para a formação Multiple GPU DistributedDataParallel. Antes de continuarmos, certifique-se de que os ficheiros em todas as máquinas são os mesmos, conjunto de dados, base de código, etc. Depois, certifique-se de que as máquinas podem comunicar umas com as outras. Terá de escolher uma máquina mestre (a máquina com a qual as outras irão falar). Anote seu endereço (`master_addr`) e escolha uma porta (`master_port`). Vou utilizar `addr_master = 192.168.1.1` e `porta_master = 1234` no exemplo abaixo. Para utilizá-lo, pode-se fazer o seguinte: onde `G` é o número de GPU por máquina, `N` é o número de máquinas e `R` é o número da máquina de `0...(N-1)`. Digamos que eu tenha duas máquinas com duas GPUs cada, seria `G = 2`, `N = 2`, e `R = 1` para o acima. O treinamento não será iniciado até que **todas** as `N` máquinas estejam conectadas. A saída só será mostrada na máquina mestre!Notas
- O suporte para Windows não foi testado, recomenda-se o Linux.
--batch
deve ser um múltiplo do número de GPUs.- GPU 0 ocupará um pouco mais de memória do que as outras GPUs, uma vez que mantém o EMA e é responsável pelo checkpointing, etc.
- Se tiveres
RuntimeError: Address already in use
Se o problema não for resolvido, pode ser porque está a executar várias formações ao mesmo tempo. Para resolver este problema, basta utilizar um número de porta diferente, adicionando--master_port
como abaixo:
Resultados
Resultados da criação de perfis DDP numa instância AWS EC2 P4d com 8x A100 SXM4-40GB para YOLOv5l para 1 época COCO.
Código de perfilagem
# 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 |
tamanho do lote | CUDA_mem device0 (G) |
COCO train |
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 mostrado nos resultados, o uso do DistributedDataParallel com várias GPUs fornece um escalonamento quase linear na velocidade de treinamento. Com 8 GPUs, o treinamento é concluído aproximadamente 6,5 vezes mais rápido do que com uma única GPU, mantendo o mesmo uso de memória por dispositivo.
FAQ
Se ocorrer um erro, leia primeiro a lista de verificação abaixo! (Pode poupar-lhe tempo)
Lista de controlo (clique para expandir)
- Leu corretamente esta publicação? - Já tentou clonar novamente a base de código? O código muda **diariamente**. - Já tentou procurar o seu erro? Alguém pode já o ter encontrado neste repositório ou noutro e ter a solução. - Você instalou todos os requisitos listados no topo (incluindo as versões corretas Python e PyTorch )? - Já tentou noutros ambientes listados na secção "Ambientes" abaixo? - Já tentou com outro conjunto de dados como coco128 ou coco2017? Isso tornará mais fácil encontrar a causa raiz. Se você passou por todas as etapas acima, sinta-se à vontade para levantar um problema, fornecendo o máximo de detalhes possível, seguindo o modelo.Ambientes suportados
Ultralytics fornece uma gama de ambientes prontos a utilizar, cada um pré-instalado com dependências essenciais, tais como CUDA, CUDNN, Python, e PyTorchpara dar início aos seus projectos.
- Grátis GPU Notebooks:
- Google Nuvem: Guia de início rápido do GCP
- Amazon: Guia de início rápido do AWS
- Azure: Guia de início rápido do AzureML
- Docker: Guia de início rápido do Docker
Estado do projeto
Este emblema indica que todos os testes de Integração Contínua (CI) do YOLOv5 GitHub Actions foram aprovados com êxito. Esses testes de CI verificam rigorosamente a funcionalidade e o desempenho do YOLOv5 em vários aspectos principais: treinamento, validação, inferência, exportação e benchmarks. Eles garantem uma operação consistente e confiável no macOS, Windows e Ubuntu, com testes realizados a cada 24 horas e a cada novo commit.
Créditos
Gostaríamos de agradecer a @MagicFrogSJTU, que fez todo o trabalho pesado, e a @glenn-jocher por nos ter guiado ao longo do caminho.
Ver também
- Modo de treino - Saiba como treinar modelos YOLO com o Ultralytics
- Afinação de hiperparâmetros - Optimize o desempenho do seu modelo
- Guia de início rápido do Docker - Configure seu ambiente Docker para treinamento