Implemente YOLOv5 com o DeepSparse da Neural Magic

Bem-vindo à IA entregue via software.

Este guia explica como implementar o YOLOv5 com o DeepSparse da Neural Magic.

O DeepSparse é um runtime de inferência com desempenho excepcional em CPUs. Por exemplo, em comparação com a linha de base do ONNX Runtime, o DeepSparse oferece uma aceleração de 5,8x para o YOLOv5s, rodando na mesma máquina!

YOLOv5 DeepSparse vs ONNX Runtime speed comparison chart

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

  • Implantações Flexíveis: Execute consistentemente na nuvem, data center e edge com qualquer provedor de hardware, da Intel à AMD e ARM
  • Escalabilidade Infinita: Escale verticalmente para centenas de núcleos, horizontalmente com Kubernetes padrão, ou de forma totalmente abstraída com Serverless
  • Fácil Integração: APIs limpas para integrar seu modelo a uma aplicação e monitorá-lo em produção

Como o DeepSparse alcança desempenho de classe GPU?

O DeepSparse aproveita a esparsidade do modelo para obter seu aumento de desempenho.

A esparsificação por meio de pruning (poda) e quantização é uma técnica amplamente estudada, permitindo reduções de ordem de magnitude no tamanho e na computação necessária para executar uma rede, mantendo alta precisão. O DeepSparse é ciente da esparsidade, o que significa que ele ignora os parâmetros zerados, reduzindo a quantidade de computação em uma passagem forward. Como a computação esparsa agora é limitada pela memória, o DeepSparse executa a rede camada por camada, quebrando o problema em Tensor Columns, faixas verticais de computação que cabem no cache.

DeepSparse tensor columns for sparse neural network inference

Redes esparsas com computação compactada, executadas camada por camada no cache, permitem que o DeepSparse entregue desempenho de classe GPU em CPUs!

Como crio uma versão esparsa do YOLOv5 treinada nos meus dados?

O repositório de modelos open-source da Neural Magic, SparseZoo, contém checkpoints pré-esparsificados de cada modelo YOLOv5. Usando o SparseML, que é integrado ao Ultralytics, você pode ajustar um checkpoint esparso aos seus dados com um único comando CLI.

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

Uso do DeepSparse

Vamos percorrer um exemplo de benchmarking e implantação de uma versão esparsa do YOLOv5s com o DeepSparse.

Instale o DeepSparse

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

pip install "deepsparse[server,yolo,onnxruntime]"

Colete um arquivo ONNX

O DeepSparse aceita um modelo no formato ONNX, passado como:

  • Um stub SparseZoo que identifica um arquivo ONNX no SparseZoo
  • Um caminho local para um modelo ONNX em um sistema de arquivos

Os exemplos abaixo usam os checkpoints padrão densos e podados-quantizados do YOLOv5s, identificados pelos seguintes stubs do SparseZoo:

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

Implante um modelo

O DeepSparse oferece APIs convenientes para integrar seu modelo a uma aplicação.

Para testar os exemplos de implantação abaixo, baixe uma imagem de exemplo e salve-a como basilica.jpg com o seguinte:

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

API Python

Pipelines envolvem o pré-processamento e o pós-processamento de saída em torno do runtime, fornecendo uma interface limpa para adicionar o DeepSparse a uma aplicação. A integração DeepSparse-Ultralytics inclui um Pipeline pronto para uso que aceita imagens brutas e gera as bounding boxes.

Crie um Pipeline e execute a inferência:

from deepsparse import Pipeline

# list of images in local filesystem
images = ["basilica.jpg"]

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

# run inference on images, receive bounding boxes + classes
pipeline_outputs = yolo_pipeline(images=images, iou_thres=0.6, conf_thres=0.001)
print(pipeline_outputs)

Se você estiver executando na nuvem, pode receber um erro informando que o OpenCV não consegue encontrar libGL.so.1. Você pode instalar a biblioteca ausente:

apt-get install libgl1

Ou use o pacote Ultralytics headless que evita totalmente as dependências de GUI:

pip install ultralytics-opencv-headless

Servidor HTTP

O DeepSparse Server roda sobre o popular framework web FastAPI e o servidor web Uvicorn. Com apenas um único comando CLI, você pode configurar facilmente um endpoint de serviço de modelo com o DeepSparse. O Server suporta qualquer Pipeline do DeepSparse, incluindo detecção de objetos com YOLOv5, permitindo que você envie imagens brutas para o endpoint e receba as bounding boxes.

Inicie o servidor com o YOLOv5s podado-quantizado:

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

Um exemplo de requisição, usando o pacote requests do Python:

import json

import requests

# list of images for inference (local files on client side)
path = ["basilica.jpg"]
files = [("request", open(img, "rb")) for img in path]

# send request over HTTP to /predict/from_files endpoint
url = "http://0.0.0.0:5543/predict/from_files"
resp = requests.post(url=url, files=files)

# response is returned in JSON
annotations = json.loads(resp.text)  # dictionary of annotation results
bounding_boxes = annotations["boxes"]
labels = annotations["labels"]

CLI de Anotação

Você também pode usar o comando annotate para fazer com que o motor salve uma foto anotada no disco. Tente --source 0 para anotar seu feed de webcam ao vivo!

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

Executar o comando acima criará uma pasta annotation-results e salvará a imagem anotada dentro dela.

YOLOv5 detection results with bounding boxes

Desempenho de Benchmarking

Vamos comparar o throughput do DeepSparse com o do ONNX Runtime no YOLOv5s, usando o script de benchmarking do DeepSparse.

Os benchmarks foram executados em uma instância AWS c6i.8xlarge (16 núcleos).

Comparação de Desempenho em Batch 32

Linha de base do ONNX Runtime

No batch 32, o ONNX Runtime alcança 42 imagens/seg com o YOLOv5s denso padrão:

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

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
# Batch Size: 32
# Scenario: sync
# Throughput (items/sec): 41.9025

Desempenho do DeepSparse Denso

Embora o DeepSparse ofereça seu melhor desempenho com modelos esparsos otimizados, ele também tem um bom desempenho com o YOLOv5s denso padrão.

No batch 32, o DeepSparse alcança 70 imagens/seg com o YOLOv5s denso padrão, uma melhoria de desempenho de 1,7x sobre o ORT!

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

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
# Batch Size: 32
# Scenario: sync
# Throughput (items/sec): 69.5546

Desempenho do DeepSparse Esparso

Quando a esparsidade é aplicada ao modelo, os ganhos de desempenho do DeepSparse sobre o ONNX Runtime são ainda mais fortes.

No batch 32, o DeepSparse alcança 241 imagens/seg com o YOLOv5s podado-quantizado, uma melhoria de desempenho de 5,8x sobre o ORT!

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

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
# Batch Size: 32
# Scenario: sync
# Throughput (items/sec): 241.2452

Comparação de Desempenho em Batch 1

O DeepSparse também é capaz de obter uma aceleração sobre o ONNX Runtime para o cenário de batch 1, que é sensível à latência.

Linha de base do ONNX Runtime

No batch 1, o ONNX Runtime alcança 48 imagens/seg com o YOLOv5s denso padrão.

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

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
# Batch Size: 1
# Scenario: sync
# Throughput (items/sec): 48.0921

Desempenho do DeepSparse Esparso

No batch 1, o DeepSparse alcança 135 itens/seg com um YOLOv5s podado-quantizado, um ganho de desempenho de 2,8x sobre o ONNX Runtime!

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

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
# Batch Size: 1
# Scenario: sync
# Throughput (items/sec): 134.9468

Como as instâncias c6i.8xlarge possuem instruções VNNI, o throughput do DeepSparse pode ser aumentado ainda mais se os pesos forem podados em blocos de 4.

No batch 1, o DeepSparse alcança 180 itens/seg com um YOLOv5s podado-quantizado de bloco 4, um ganho de desempenho de 3,7x sobre o ONNX Runtime!

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

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni
# Batch Size: 1
# Scenario: sync
# Throughput (items/sec): 179.7375

Comece com o DeepSparse

Pesquisa ou Testes? O DeepSparse Community é gratuito para pesquisa e testes. Comece com a Documentação deles.

Para obter mais informações sobre como implementar o YOLOv5 com o DeepSparse, confira a documentação do DeepSparse da Neural Magic e o post do blog da Ultralytics sobre a integração com o DeepSparse.

Comentários