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 tempo de execução ONNX , o DeepSparse oferece um aumento de velocidade de 5,8x para o 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 centro de dados e na borda com qualquer provedor de hardware, de Intel a AMD e ARM
- Escalabilidade infinita: Escale verticalmente para 100s de núcleos, com Kubernetes padrão, ou totalmente abstraído com Serverless
- Fácil integração: APIs simples para integrar o seu modelo numa aplicação e monitorizá-lo na produção
Como é que o DeepSparse consegue um desempenho de classe GPU?
O DeepSparse tira partido da esparsidade do modelo para aumentar o seu 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, reduzindo a quantidade de computação em uma passagem direta. Como a computação esparsa agora é limitada pela memória, o DeepSparse executa a rede em profundidade, dividindo o problema em Tensor Columns, faixas verticais de computação que cabem no 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 nos 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 afinar um ponto de controlo esparso nos seus dados com um único comando CLI .
Consulte a documentação Neural Magic's YOLOv5 para obter mais detalhes.
Utilização do DeepSparse
Iremos percorrer um exemplo de avaliação comparativa e implementar uma versão esparsa do YOLOv5s com o DeepSparse.
Instalar o DeepSparse
Execute o seguinte para instalar o DeepSparse. Recomendamos o uso de um ambiente virtual com Python.
Recolher 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 controlo 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
Implementar um modelo
O DeepSparse oferece APIs convenientes para integrar seu modelo em um aplicativo.
Para experimentar os exemplos de implantação abaixo, puxe para baixo uma imagem de amostra e guarde-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 um aplicativo. A integração do DeepSparse-Ultralytics inclui um Pipeline
que aceita imagens em bruto e produz as caixas delimitadoras.
Criar um Pipeline
e executar 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 estiver a executar na nuvem, poderá receber um erro a indicar que o open-cv não consegue encontrar libGL.so.1
. Executar o seguinte no Ubuntu instala-o:
Servidor HTTP
O DeepSparse Server é executado sobre o popular framework web FastAPI e o servidor web Uvicorn. Com apenas um único comando CLI , é possível configurar facilmente um ponto de extremidade de serviço de modelo com o DeepSparse. O Servidor suporta qualquer Pipeline do DeepSparse, incluindo deteção de objetos com YOLOv5, permitindo enviar imagens brutas para o endpoint e receber as caixas delimitadoras.
Girar o servidor com os YOLOv5s podados-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 pode utilizar o comando annotate para que o motor guarde uma fotografia anotada no disco. Experimente a opção --source 0 para anotar o feed da sua webcam em direto!
deepsparse.object_detection.annotate --model_filepath zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none --source basilica.jpg
A execução do comando acima criará um arquivo annotation-results
e guardar a imagem anotada no seu interior.
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
instância (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 quantização reduzida, 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 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,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 a usar o DeepSparse
Pesquisa ou teste? A Comunidade DeepSparse é gratuita para pesquisas e testes. Comece com nossa Documentação.