Ir para o conteúdo

Treinamento Multi-GPU com YOLOv5

Este guia explica como usar corretamente múltiplas GPUs para treinar um conjunto de dados com YOLOv5 🚀 em uma ou várias máquinas.

Antes de Começar

Clone o repositório e instale os requirements.txt num ambiente Python>=3.8.0, incluindo PyTorch>=1.8. Os modelos e os conjuntos de dados são descarregados automaticamente a partir da última versão do YOLOv5.

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

Dica Pro!

Imagem Docker é recomendado para todos os treinamentos Multi-GPU. Veja Guia de Início Rápido do Docker Puxadas do Docker

Dica Pro!

torch.distributed.run substitui torch.distributed.launch em PyTorch>=1.9. Veja Documentação distribuída do PyTorch para mais detalhes.

Treinamento

Selecione um modelo pré-treinado para começar o treinamento. Aqui, selecionamos o YOLOv5s, o modelo menor e mais rápido disponível. Consulte nossa tabela no README para uma comparação completa de todos os modelos. Treinaremos este modelo com Multi-GPU no conjunto de dados COCO.

Modelos YOLOv5

GPU Única

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

Você pode aumentar a device para usar múltiplas GPUs no modo DataParallel.

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

Este método é lento e mal acelera o treinamento em comparação com o uso de apenas 1 GPU.

Você terá que passar python -m torch.distributed.run --nproc_per_node, seguido pelos argumentos usuais.

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, são 2.
  • --batch é o tamanho total do batch. Ele será dividido uniformemente para cada GPU. No exemplo acima, é 64/2=32 por GPU.

O código acima usará GPUs 0... (N-1).

Use 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, usaremos as 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
Use SyncBatchNorm (clique para expandir) [SyncBatchNorm](https://docs.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
Use várias máquinas (clique para expandir) Isto está **apenas** disponível para treinamento DistributedDataParallel com múltiplas GPUs. Antes de continuarmos, certifique-se de que os arquivos em todas as máquinas são os mesmos, conjunto de dados, codebase, etc. Depois, certifique-se de que as máquinas conseguem comunicar entre si. Terá de escolher uma máquina mestre (a máquina com a qual as outras irão comunicar). Anote o seu endereço (`master_addr`) e escolha uma porta (`master_port`). Usarei `master_addr = 192.168.1.1` e `master_port = 1234` para o exemplo abaixo. Para usar, pode fazer como o seguinte:
# 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 ''
onde `G` é o número de GPUs 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 começará até que **todas** as máquinas `N` estejam conectadas. A saída só será mostrada na máquina mestre!

Notas

  • O suporte ao Windows não foi testado, o Linux é recomendado.
  • --batch deve ser um múltiplo do número de GPUs.
  • A GPU 0 usará um pouco mais de memória do que as outras GPUs, pois mantém o EMA e é responsável pelo checkpointing, etc.
  • Se você receber RuntimeError: Address already in use, pode ser porque você está executando vários treinamentos ao mesmo tempo. Para corrigir isso, simplesmente use um número de porta diferente adicionando --master_port como abaixo:

    python -m torch.distributed.run --master_port 1234 --nproc_per_node 2 ...
    

Resultados

Resultados de perfil DDP em uma instância AWS EC2 P4d com 8x A100 SXM4-40GB para YOLOv5l para 1 época COCO.

Profiling de 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
tamanho do lote (batch-size) 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, usar DistributedDataParallel com múltiplas 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, por favor, leia a lista de verificação abaixo primeiro! (Pode poupar o seu tempo)

Lista de verificação (clique para expandir) - Você leu este post corretamente? - Você tentou clonar novamente a base de código? As alterações no código são **diárias**. - Você tentou pesquisar seu erro? Alguém pode já ter encontrado ele neste repositório ou em outro e ter a solução. - Você instalou todos os requisitos listados na parte superior (incluindo as versões corretas de python e PyTorch)? - Você tentou em outros ambientes listados na seção "Ambientes" abaixo? - Você tentou com outro conjunto de dados como coco128 ou coco2017? Isso tornará mais fácil encontrar a causa raiz. Se você passou por tudo isso, sinta-se à vontade para levantar um problema, fornecendo o máximo de detalhes possível, seguindo o modelo.

Ambientes suportados

A Ultralytics oferece uma variedade de ambientes prontos para uso, cada um pré-instalado com dependências essenciais como CUDA, CUDNN, Python e PyTorch, para dar o pontapé inicial em seus projetos.

Estado do Projeto

YOLOv5 CI

Este selo indica que todos os testes de Integração Contínua (CI) das Ações do GitHub YOLOv5 estão sendo aprovados com sucesso. 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 guiar ao longo do caminho.

Veja Também



📅C riado há 1 ano ✏️ Atualizado há 27 dias

Comentários