Neural Magic's DeepSparse
Bem-vindo à IA fornecida por software.
Este guia explica como implantar o YOLOv5 com o DeepSparse do Neural Magic.
DeepSparse é um tempo de execução de inferência com desempenho excecional em CPUs. Por exemplo, em comparação com a linha de base do ONNX Runtime, o DeepSparse oferece um aumento de velocidade de 5,8x para o YOLOv5s, executado na mesma máquina!
For the first time, your deep learning workloads can meet the performance demands of production without the complexity and costs of hardware accelerators. Put simply, DeepSparse gives you the performance of GPUs and the simplicity of software:
- Implantações flexíveis: Executa de forma consistente na nuvem, no centro de dados e na borda com qualquer fornecedor de hardware, de Intel a AMD e ARM
- Escalabilidade infinita: Escala verticalmente até 100s de núcleos, com Kubernetes padrão, ou totalmente abstraído com Serverless
- Integração fácil: APIs limpas para integrar o teu modelo numa aplicação e monitorizá-lo na produção
Como é que o DeepSparse consegue um desempenho de classe GPU?
O DeepSparse aproveita a esparsidade do modelo para ganhar velocidade de desempenho.
Sparsification through pruning and quantization is a broadly studied technique, allowing order-of-magnitude reductions in the size and compute needed to execute a network, while maintaining high accuracy. DeepSparse is sparsity-aware, meaning it skips the zeroed out parameters, shrinking amount of compute in a forward pass. Since the sparse computation is now memory bound, DeepSparse executes the network depth-wise, breaking the problem into Tensor Columns, vertical stripes of computation that fit in cache.
Redes esparsas com computação comprimida, executadas em profundidade na cache, permitem que o DeepSparse ofereça um desempenho de classe GPU em CPUs!
Como é que crio uma versão esparsa de YOLOv5 treinada com os meus dados?
Neural MagicO repositório de modelos de código aberto da SparseZoo contém pontos de controlo pré-esparsos de cada modelo YOLOv5 . Utilizando o SparseML, que está integrado em Ultralytics, pode ajustar um ponto de verificação esparso aos seus dados com um único comando CLI .
Consulta a documentação Neural Magic's YOLOv5 para obteres mais detalhes.
Utilização do DeepSparse
Iremos analisar um exemplo de benchmarking e implementar uma versão esparsa do YOLOv5s com o DeepSparse.
Instala o DeepSparse
Executa o seguinte para instalar o DeepSparse. Recomendamos que utilizes um ambiente virtual com Python.
Recolhe um ficheiro ONNX
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 num sistema de ficheiros
Os exemplos abaixo usam os pontos de verificação YOLOv5s densos e podados-quantificados 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
Implementa um modelo
DeepSparse oferece APIs convenientes para integrar o teu modelo numa aplicação.
Para experimentar os exemplos de implementação abaixo, retira uma imagem de amostra e guarda-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
Python API
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 DeepSparse a uma aplicação. A integração do DeepSparse-Ultralytics inclui um Pipeline
que aceita imagens em bruto e produz as caixas delimitadoras.
Cria um Pipeline
e executa 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 estiveres a executar na nuvem, poderás receber um erro a indicar que o open-cv não consegue encontrar libGL.so.1
. Executa o seguinte no Ubuntu e instala-o:
Servidor HTTP
DeepSparse Server runs on top of the popular FastAPI web framework and Uvicorn web server. With just a single CLI command, you can easily setup a model service endpoint with DeepSparse. The Server supports any Pipeline from DeepSparse, including object detection with YOLOv5, enabling you to send raw images to the endpoint and receive the bounding boxes.
Liga o servidor com os YOLOv5s podados e quantificados:
deepsparse.server \
--task yolo \
--model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
Um exemplo de pedido, utilizando Python's 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"]
Anotar CLI
Também podes utilizar o comando annotate para que o motor guarde uma fotografia anotada no disco. Experimenta --source 0 para anotar a tua 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á um annotation-results
e guarda a imagem anotada dentro dela.
Avaliação comparativa do desempenho
Compararemos a taxa de transferência do DeepSparse com a taxa de transferência do ONNX Runtime no YOLOv5s, usando o script de benchmarking do DeepSparse.
Os benchmarks foram executados em um AWS c6i.8xlarge
(16 núcleos).
Comparação de desempenho do lote 32
ONNX Linha de base do tempo de execução
No lote 32, o ONNX Runtime alcança 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
> Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> Batch Size: 32
> Scenario: sync
> Throughput (items/sec): 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 consegue 70 imagens/seg. com o YOLOv5s denso padrão, uma melhoria 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
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 reduzida, uma melhoria 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 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.
ONNX Linha de base do tempo de execução
No lote 1, o ONNX Runtime alcança 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
> Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> Batch Size: 1
> Scenario: sync
> Throughput (items/sec): 48.0921
DeepSparse Desempenho esparso
No lote 1, o DeepSparse alcança 135 itens/seg. com um YOLOv5s com quantidade reduzida, um ganho de desempenho de 2,8 vezes 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
têm instruções VNNI, a taxa de transferência do DeepSparse pode ser aumentada 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, um ganho 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
> 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
Começa a usar o DeepSparse
Pesquisa ou teste? A Comunidade DeepSparse é gratuita para pesquisas e testes. Começa com a nossa Documentação.