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!
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.
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.
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.