YOLO Vision 2026:

Treino com várias GPUs usando YOLOv5#

Este guia explica como treinar YOLOv5 com várias GPUs numa única máquina ou em várias máquinas.

Antes de Começares#

Clona o repositório e instala o requirements.txt num ambiente Python>=3.8.0, incluindo PyTorch>=1.8. Os modelos e os conjuntos de dados são transferidos automaticamente a partir da versão mais recente do YOLOv5.

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

A imagem Docker da Ultralytics é recomendada para todas as execuções de treino com várias GPUs. Consulte o Guia de início rápido do Docker. Docker Pulls

PyTorch >= 1.9

torch.distributed.run substitui torch.distributed.launch em PyTorch >= 1.9. Consulta a documentação de distribuição do PyTorch para obter mais informações.

Treino#

Seleciona um modelo pré-treinado a partir do qual iniciar o treino. Aqui selecionamos YOLOv5s, um modelo pequeno e rápido. Consulta a tabela do nosso README para ver uma comparação completa de todos os modelos. Vamos treinar este modelo com várias GPUs no conjunto de dados COCO.

YOLOv5 Models

Uma GPU#

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

Modo DataParallel com várias GPUs (⚠️ não recomendado)#

Passa vários IDs de GPU para --device para ativar o modo DataParallel:

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

O DataParallel é lento e quase não acelera o treino em comparação com a utilização de uma única GPU.

Modo DistributedDataParallel com várias GPUs (✅ recomendado)#

Coloca python -m torch.distributed.run --nproc_per_node no início do comando de treino e passa os 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 é o número de GPUs a utilizar. No exemplo acima, é 2.
  • --batch é o tamanho total do lote, dividido igualmente entre cada GPU. No exemplo acima, são 64 / 2 = 32 por GPU.

O comando acima utiliza as GPUs 0...(N-1). Para controlar a visibilidade dos dispositivos através de variáveis de ambiente, define CUDA_VISIBLE_DEVICES=2,3 (ou qualquer outra lista) antes de iniciar.

Use specific GPUs (click to expand)

Passa --device seguido dos IDs específicos das GPUs. O exemplo abaixo utiliza 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 (click to expand)

SyncBatchNorm pode aumentar a precisão do treino com várias GPUs, mas torna o treino significativamente mais lento. Está disponível apenas para o treino DistributedDataParallel com várias GPUs.

É mais útil quando o tamanho do lote em cada GPU é pequeno (<= 8).

Para ativar o SyncBatchNorm, passa --sync-bn:

python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --sync-bn
Use Multiple machines (click to expand)

Está disponível apenas para o treino DistributedDataParallel com várias GPUs.

Antes de continuar, garante que o conjunto de dados, a base de código e quaisquer outras dependências são iguais em todas as máquinas e, em seguida, verifica se as máquinas conseguem comunicar entre si através da rede.

Escolhe uma máquina principal (à qual as outras se vão ligar), regista o respetivo endereço (master_addr) e escolhe uma porta (master_port). O exemplo abaixo utiliza master_addr = 192.168.1.1 e master_port = 1234.

Em seguida, executa:

# 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 é a classificação da máquina em 0...(N-1). Por exemplo, com duas máquinas e duas GPUs em cada uma, define G = 2, N = 2 e R = 1 na segunda máquina.

O treino não começa até que todas as N máquinas estejam ligadas. A saída só é apresentada na máquina principal.

Notas#

  • O suporte para Windows não foi testado; recomenda-se Linux.

  • --batch tem de ser um múltiplo do número de GPUs.

  • A GPU 0 utiliza ligeiramente mais memória do que as outras porque mantém a EMA e gere os pontos de verificação.

  • Se obtiveres RuntimeError: Address already in use, normalmente significa que várias execuções de treino estão a utilizar a mesma porta. Especifica uma porta diferente com --master_port:

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

Resultados#

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

Profiling code
# prepare
t=ultralytics/yolov5:latest && sudo docker pull $t && sudo docker run -it --ipc=host --device nvidia.com/gpu=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 loteCUDA_mem
device0 (G)
COCO
treino
COCO
validação
1x1626GB20:390:55
2x3226GB11:430:57
4x6426GB5:570:55
8x12826GB3:090:57

Como mostram os resultados, utilizar DistributedDataParallel com várias GPUs proporciona uma escalabilidade quase linear na velocidade de treino. Com 8 GPUs, o treino termina aproximadamente 6,5 vezes mais depressa do que com uma única GPU, mantendo a mesma utilização de memória por dispositivo.

Ambientes suportados#

A Ultralytics disponibiliza vários ambientes prontos a utilizar, cada um com dependências essenciais pré-instaladas, como CUDA, CUDNN, Python e PyTorch, para iniciares os teus projetos.

Estado do projeto#

YOLOv5 CI

Este selo indica que todos os testes de Integração Contínua (CI) das GitHub Actions do YOLOv5 estão a passar com sucesso. Estes testes de CI verificam rigorosamente a funcionalidade e o desempenho do YOLOv5 em vários aspetos importantes: treino, validação, inferência, exportação e benchmarks. Garantem um funcionamento consistente e fiável no macOS, Windows e Ubuntu, com testes realizados a cada 24 horas e após cada novo commit.

Créditos#

Gostaríamos de agradecer a @MagicFrogSJTU, que fez todo o trabalho pesado, e a @glenn-jocher, que nos orientou ao longo do processo.

Ver também#

Perguntas frequentes#

Lê a lista de verificação abaixo antes de abrir um problema — muitas vezes poupa tempo.

Checklist (click to expand)
  • Leste este guia do princípio ao fim?
  • Voltaste a clonar a base de código? O código muda diariamente.
  • Pesquisaste a mensagem de erro? É possível que alguém já tenha encontrado o mesmo problema e partilhado uma solução.
  • Instalaste todos os requisitos (incluindo as versões corretas de Python e PyTorch)?
  • Experimentaste um dos ambientes compatíveis listados acima?
  • Experimentaste um conjunto de dados mais pequeno, como coco128 ou coco2017, para isolar a causa principal?

Se tudo o que foi indicado acima estiver correto, abre um Issue com o máximo de detalhes possível, seguindo o modelo.

Comentários