Salta para o conte√ļdo

Formação Multi-GPU

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çares

Clona o repo e instala o 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 recente de YOLOv5 .

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

ūüí° ProTip! Imagem do Docker √© recomendado para todos os treinamentos Multi-GPU. V√™ Guia de in√≠cio r√°pido do Docker Docker Pulls

ūüí° ProTip! torch.distributed.run substitui torch.distributed.launch em PyTorch>=1.9. V√™ documentos para mais pormenores.

Formação

Selecciona um modelo pré-treinado para iniciar o treino. Aqui seleccionamos o YOLOv5s, o modelo mais pequeno e mais rápido disponível. Vê a nossa tabela README para uma comparação completa de todos os modelos. Treina este modelo com Multi-GPU no conjunto de dados COCO.

YOLOv5 Modelos

GPU √ļnico

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

Podes aumentar a device para usar v√°rias GPUs no modo DataParallel.

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

Este método é lento e quase não acelera o treino em comparação com a utilização de apenas 1 GPU.

Ter√°s de passar python -m torch.distributed.run --nproc_per_nodee, em seguida, 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 especifica quantas GPUs gostarias de usar. No exemplo acima, especifica 2. --batch é o tamanho total do lote. Será dividido igualmente para cada GPU. No exemplo acima, é 64/2=32 por GPU.

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

Utiliza GPUs específicas (clique para expandir) Podes fazê-lo simplesmente passando `--device` seguido das tuas GPUs específicas. Por exemplo, no código abaixo, nós 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
Utilizar SyncBatchNorm (clique para expandir) [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 várias máquinas (clique para expandir) Isto está **somente** disponível para o treinamento Multiple GPU DistributedDataParallel. Antes de continuarmos, certifica-te de que os ficheiros em todas as máquinas são os mesmos, conjunto de dados, base de código, etc. Depois, certifica-te de que as máquinas podem comunicar umas com as outras. Terás de escolher uma máquina mestre (a máquina com a qual as outras vão falar). Anota o seu endereço (`master_addr`) e escolhe uma porta (`master_port`). Eu vou usar `addr_mestre = 192.168.1.1` e `porta_mestre = 1234` para o exemplo abaixo. Para utilizá-lo, podes fazer 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 ser√° iniciado at√© que todos `N` m√°quinas est√£o ligadas. A sa√≠da s√≥ ser√° mostrada na m√°quina principal!

Notas

  • O suporte para Windows n√£o foi testado, recomenda-se o Linux.
  • --batch deve ser um m√ļltiplo do n√ļmero de GPUs.
  • A GPU 0 ocupar√° um pouco mais de mem√≥ria do que as outras GPUs, pois mant√©m o EMA e √© respons√°vel pelo checkpointing, etc.
  • Se conseguires RuntimeError: Address already in useSe o problema n√£o for resolvido, pode ser porque est√°s a executar v√°rias forma√ß√Ķes ao mesmo tempo. Para resolver este problema, basta utilizares 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 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 criação de perfil
# 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 26GB 20:39 0:55
2x 32 26GB 11:43 0:57
4x 64 26GB 5:57 0:55
8x 128 26GB 3:09 0:57

FAQ

Se ocorrer um erro, lê primeiro a lista de verificação abaixo! (Pode poupar-te tempo)

Lista de verificação (clica para expandir)
  • J√° leste bem este post?
  • J√° tentaste voltar a clonar a base de c√≥digo? O c√≥digo muda diariamente.
  • J√° tentaste procurar o teu erro? Pode ser que algu√©m j√° o tenha encontrado neste reposit√≥rio ou noutro e tenha a solu√ß√£o.
  • Instalaste todos os requisitos indicados em cima (incluindo as vers√Ķes correctas de Python e Pytorch )?
  • J√° experimentaste noutros ambientes indicados na sec√ß√£o "Ambientes" abaixo?
  • J√° tentaste com outro conjunto de dados como coco128 ou coco2017? Ser√° mais f√°cil encontrar a causa principal.
Se passaste por tudo o que foi dito acima, não hesites em levantar uma Questão, 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 como CUDA, CUDNN, Python, e PyTorchpara dar início aos teus projectos.

Estado do projeto

YOLOv5 CI

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.



Criado em 2023-11-12, Atualizado em 2023-12-03
Autores: glenn-jocher (2)

Coment√°rios