Implante o Ultralytics YOLOv5 com o DeepSparse da Neural Magic para obter desempenho de classe GPU em CPUs

Equipa Ultralytics

5 min. de leitura

5 de janeiro de 2023

Capacite o treinamento e a implantação do modelo Ultralytics YOLOv5 com o DeepSparse da Neural Magic para desempenho de classe GPU em CPUs. Obtenha implantações YOLOv5 mais rápidas e escaláveis.

Quer acelerar a formação e a implementação dos seus modelos YOLOv5? Nós temos tudo o que precisa! Apresentamos o nosso mais novo parceiro, Neural Magic. Como a Neural Magic fornece ferramentas de software que enfatizam o desempenho máximo do modelo e a simplicidade do fluxo de trabalho, é natural que nos juntemos para oferecer uma solução para tornar o processo de implantação do YOLOv5 ainda melhor.

DeepSparse é o tempo de execução de inferência de CPU do Neural Magic, que aproveita a esparsidade e a aritmética de baixa precisão dentro das redes neurais para oferecer um desempenho excecional em hardware de commodity. Por exemplo, comparado com a linha de base do ONNX Runtime, o DeepSparse oferece um aumento de velocidade de 5,8x para YOLOv5s rodando na mesma máquina!

Comparação do rendimento do YOLOv5 com o DeepSparse

Pela primeira vez, suas cargas de trabalho de aprendizado profundo podem atender às demandas de desempenho da produção sem a complexidade e os custos dos aceleradores de hardware. Simplificando, o DeepSparse oferece o desempenho das GPUs e a simplicidade do software:

  1. Implantações flexíveis: Execute de forma consistente na nuvem, no centro de dados e na borda com qualquer provedor de hardware
  2. Escalabilidade infinita: Escale com Kubernetes padrão, verticalmente para 100s de núcleos ou totalmente abstraído com serverless
  3. Fácil integração: Utilize APIs simples para integrar o seu modelo numa aplicação e monitorizá-lo na produção

Obtenha um desempenho de classe GPU em CPUs comuns

O DeepSparse tira partido da esparsidade do modelo para aumentar o seu desempenho.

A esparsificação por meio de poda e quantização permite reduções de ordem de magnitude no tamanho e na computação necessários para executar uma rede, mantendo alta precisão. O DeepSparse é sensível à esparsidade, pulando as adições de multiplicação por zero e diminuindo a quantidade de computação em uma passagem direta. Como a computação esparsa é limitada pela memória, o DeepSparse executa a rede em profundidade, dividindo o problema em Colunas de Tensor, que são faixas verticais de computação que cabem no cache.

Rede YOLOv5 DeepSparse e Ultralytics

Redes esparsas com computação comprimida, executadas em profundidade no cache, permitem que o DeepSparse ofereça desempenho de classe GPU em CPUs!

Criar uma versão esparsa do YOLOv5 treinada em dados personalizados

O repositório de modelos de código aberto da Neural Magic, SparseZoo, contém pontos de verificação pré-esparsificados de cada modelo YOLOv5. Usando SparseML, que é integrado ao Ultralytics, é possível ajustar um ponto de verificação esparso em seus dados com um único comando CLI.

Consulte a documentação do YOLOv5 da Neural Magic para obter mais detalhes.

Implantar YOLOv5 com DeepSparse

Instalar o DeepSparse

Execute o seguinte para instalar o DeepSparse. Recomendamos que você use um ambiente virtual com Python.

pip install deepsparse[server,yolo,onnxruntime]

Recolher um ficheiro ONNX

DeepSparse aceita um modelo no formato ONNX, passado como:

  • Um caminho local para um modelo ONNX
  • Um esboço SparseZoo que identifica um modelo no SparseZoo

Iremos comparar os YOLOv5s densos padrão com os YOLOv5s com quantização podada, identificados pelos seguintes stubs SparseZoo:

zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none

Implementar um modelo

O DeepSparse oferece APIs convenientes para integrar seu modelo em um aplicativo.

Para experimentar os exemplos de implantação abaixo, puxe uma imagem de amostra para o exemplo e salve como basilica.jpg com o seguinte comando:

wget -O basilica.jpg https://raw.githubusercontent.com/neuralmagic/deepsparse/main/src/deepsparse/yolo/sample_images/basilica.jpg

API Python

Os pipelines envolvem o pré-processamento e o pós-processamento de saída em torno do tempo de execução, fornecendo uma interface limpa para adicionar o DeepSparse a um aplicativo. A integração DeepSparse-Ultralytics inclui um Pipeline pronto para uso que aceita imagens brutas e gera as caixas delimitadoras.

Criar um pipeline e executar a inferência:

from deepsparse import Pipeline

# lista de imagens no sistema de ficheiros local
images = ["basilica.jpg"]

# criar Pipeline
model_stub = "zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none"
yolo_pipeline = Pipeline.create(
task="yolo",
model_path=model_stub,
)

# executar inferência em imagens, receber caixas delimitadoras + classes
pipeline_outputs = yolo_pipeline(images=images, iou_thres=0.6, conf_thres=0.001)
print(pipeline_outputs)

Se você estiver executando na nuvem, poderá receber um erro informando que o open-cv não pode encontrar libGL.so.1. Executar o seguinte no Ubuntu instala-o:

apt-get install libgl1-mesa-glx

Servidor HTTP

O DeepSparse Server é executado sobre o popular framework web FastAPI e o servidor web Uvicorn. Com apenas um único comando CLI, é possível configurar facilmente um endpoint de serviço de modelo com o DeepSparse. O Servidor suporta qualquer Pipeline do DeepSparse, incluindo deteção de objetos com YOLOv5, permitindo enviar imagens brutas para o endpoint e receber as caixas delimitadoras.

Girar o servidor com os YOLOv5s podados-quantificados:

deepsparse.server \
--task yolo \
--model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none

Um pedido de exemplo, utilizando o pacote requests do Python:

importar pedidos, json

# lista de imagens para inferência (ficheiros locais no lado do cliente)
path = ['basilica.jpg']
files = [('request', open(img, 'rb')) for img in path]

# enviar o pedido por HTTP para o ponto final /predict/from_files
url = 'http://0.0.0.0:5543/predict/from_files'
resp = requests.post(url=url, files=files)

# a resposta é devolvida em JSON
annotations = json.loads(resp.text) # dicionário de resultados de anotação
bounding_boxes = annotations["boxes"]
labels = annotations["labels"]

Anotar CLI

Também pode utilizar o comando annotate para que o motor guarde uma fotografia anotada no disco. Experimente a opção --source 0 para anotar o feed da sua webcam em direto!

deepsparse.object_detection.annotate --model_filepath zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none --source basilica.jpg

A execução do comando acima criará uma pasta de resultados de anotação e guardará a imagem anotada no seu interior.

Basílica anotada com YOLOv5

Desempenho de referência

Usando o script de benchmarking do DeepSparse, compararemos a taxa de transferência do DeepSparse com a taxa de transferência do ONNX Runtime no YOLOv5s.

Os testes de referência foram executados numa instância AWS c6i.8xlarge (16 núcleos).

Comparação de desempenho do lote 32

Linha de base do tempo de execução ONNX

No lote 32, o tempo de execução do ONNX atinge 42 imagens/seg. com os YOLOv5s densos padrão:

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1 -e onnxruntime

> Caminho do modelo original: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> Tamanho do lote: 32
> Cenário: sync
> Taxa de transferência (itens/seg): 41.9025

DeepSparse Dense Desempenho

Embora o DeepSparse ofereça o seu melhor desempenho com modelos esparsos optimizados, também tem um bom desempenho com os YOLOv5s densos padrão.

No lote 32, o DeepSparse atinge 70 imagens/seg. com o YOLOv5s denso padrão - umamelhoria de desempenho de 1,7x em relação ao ORT!

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1

> Caminho do modelo original: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> Tamanho do lote: 32
> Cenário: sync
> Taxa de transferência (itens/seg): 69.5546

DeepSparse Desempenho esparso

Quando a esparsidade é aplicada ao modelo, os ganhos de desempenho do DeepSparse em relação ao ONNX Runtime são ainda maiores.

No lote 32, o DeepSparse alcança 241 imagens/seg. com o YOLOv5s com quantização podada - umamelhoria de desempenho de 5,8x em relação ao ORT!

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 32 -nstreams 1

> Caminho do modelo original: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
> Tamanho do lote: 32
> Cenário: sync
> Taxa de transferência (itens/seg): 241.2452

Comparação do desempenho do lote 1

O DeepSparse também é capaz de ganhar velocidade em relação ao ONNX Runtime para o cenário de lote 1 sensível à latência.

Linha de base do tempo de execução ONNX

No lote 1, o tempo de execução do ONNX atinge 48 imagens/seg. com os YOLOv5s padrão e densos.

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 1 -nstreams 1 -e onnxruntime

> Caminho do modelo original: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> Tamanho do lote: 1
> Cenário: sync
> Taxa de transferência (itens/seg): 48.0921

DeepSparse Desempenho esparso

Quando a esparsidade é aplicada ao modelo, os ganhos de desempenho do DeepSparse em relação ao ONNX Runtime são ainda maiores.

No lote 1, o DeepSparse alcança 135 imagens/seg. com o YOLOv5s com quantização podada - umamelhoria de desempenho de 2,8x em relação ao ONNX Runtime!

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 32 -nstreams 1

> Caminho do modelo original: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
> Tamanho do lote: 1
> Cenário: sync
> Taxa de transferência (itens/seg): 134.9468

Uma vez que as instâncias c6i.8xlarge têm instruções VNNI, o rendimento do DeepSparse pode ser aumentado ainda mais se os pesos forem podados em blocos de 4.

No lote 1, o DeepSparse alcança 180 itens/seg. com um YOLOv5s de 4 blocos com quantização podada - umganho de desempenho de 3,7 vezes em relação ao ONNX Runtime!

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni -s sync -b 1 -nstreams 1

> Caminho do modelo original: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni
> Tamanho do lote: 1
> Cenário: sync
> Taxa de transferência (itens/seg): 179.7375

E pronto! Você está pronto para otimizar sua implantação do YOLOv5 com DeepSparse.

Introdução ao YOLOv5 e ao DeepSparse

Para entrar em contacto connosco, junte-se à nossa comunidade e deixe-nos as suas perguntas e comentários. Confira o repositório Ultralytics YOLOv5 e a documentação completa do Neural Magic para implantar o YOLOv5.

Na Ultralytics, estabelecemos parcerias comerciais com outras startups para nos ajudar a financiar a investigação e o desenvolvimento das nossas fantásticas ferramentas de código aberto, como o YOLOv5, para as manter gratuitas para todos. Este artigo pode conter links de afiliados para esses parceiros.

Vamos construir juntos o futuro
da IA!

Comece a sua viagem com o futuro da aprendizagem automática

Comece gratuitamente
Ligação copiada para a área de transferência