Ir para o conteúdo

Implante o YOLOv5 com o DeepSparse da Neural Magic

Bem-vindo à IA fornecida por software.

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

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 YOLOv5s, executado na mesma máquina!

Melhoria de velocidade do YOLOv5

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:

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

Como é que o DeepSparse Atinge o Desempenho da Classe GPU?

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

A esparsificação por meio de poda e quantização é uma técnica amplamente estudada, permitindo 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, o que significa que ele ignora os parâmetros zerados, diminuindo a quantidade de computação em um passe direto. Como a computação esparsa agora está limitada pela memória, o DeepSparse executa a rede em profundidade, dividindo o problema em Colunas Tensor, faixas verticais de computação que cabem no cache.

Poda de modelo YOLO

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

Como é que Crio uma Versão Sparse do YOLOv5 Treinada nos Meus Dados?

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

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

Utilização do DeepSparse

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

Instalar DeepSparse

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

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

Coletar um Arquivo ONNX

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

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

Os exemplos abaixo usam os checkpoints YOLOv5s densos e podados-quantizados padrão, 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, baixe uma imagem de amostra 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 envolve 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 que aceita imagens brutas e retorna as bounding boxes.

Criar 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, poderá receber um erro de que o open-cv não consegue encontrar libGL.so.1. Executar o seguinte no Ubuntu o instala:

apt-get install libgl1

Servidor HTTP

O DeepSparse Server é executado sobre a popular estrutura 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 Server com o YOLOv5s podado e quantizado:

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

Um exemplo de solicitação, usando o requests pacote:

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 que o motor salve uma foto anotada no disco. Experimente --source 0 para anotar o feed da sua 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 annotation-results e salvar a imagem anotada dentro.

anotado

Avaliação Comparativa de Desempenho

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

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

Comparação de Desempenho em Batch 32

Linha de Base do ONNX Runtime

No batch 32, o ONNX Runtime atinge 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 Denso do DeepSparse

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 atinge 70 imagens/seg com o YOLOv5s denso padrão, uma melhora 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

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

Desempenho Esparso do DeepSparse

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

No batch 32, o DeepSparse atinge 241 imagens/seg com o YOLOv5s podado e quantizado, uma melhora 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

# 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 do Lote 1

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

Linha de Base do ONNX Runtime

No batch 1, o ONNX Runtime atinge 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 Esparso do DeepSparse

No batch 1, o DeepSparse atinge 135 itens/seg com um YOLOv5s podado e quantizado, um ganho 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 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

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

No batch 1, o DeepSparse atinge 180 itens/seg com um YOLOv5s quantizado e podado em 4 blocos, um ganho de desempenho de 3,7x 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

# 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 DeepSparse

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

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



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

Comentários