Link to this sectionImplemente 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!
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
Link to this sectionComo 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.
Redes esparsas com computação compactada, executadas camada por camada no cache, permitem que o DeepSparse entregue desempenho de classe GPU em CPUs!
Link to this sectionComo 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.
Link to this sectionUso do DeepSparse#
Vamos percorrer um exemplo de benchmarking e implantação de uma versão esparsa do YOLOv5s com o DeepSparse.
Link to this sectionInstale 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]"Link to this sectionColete 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-noneLink to this sectionImplante 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.jpgLink to this sectionAPI 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 libgl1Ou use o pacote Ultralytics headless que evita totalmente as dependências de GUI:
pip install ultralytics-opencv-headlessLink to this sectionServidor 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-noneUm 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"]Link to this sectionCLI 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.jpgExecutar o comando acima criará uma pasta annotation-results e salvará a imagem anotada dentro dela.
Link to this sectionDesempenho 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).
Link to this sectionComparação de Desempenho em Batch 32#
Link to this sectionLinha 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.9025Link to this sectionDesempenho 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.5546Link to this sectionDesempenho 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.2452Link to this sectionComparaçã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.
Link to this sectionLinha 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.0921Link to this sectionDesempenho 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.9468Como 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.7375Link to this sectionComece 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.