Neural MagicDeepSparse
Bienvenido a la IA por software.
Esta guía explica cómo desplegar YOLOv5 con DeepSparse de Neural Magic.
DeepSparse es un tiempo de ejecución de inferencia con un rendimiento excepcional en CPU. Por ejemplo, en comparación con la línea de base de ONNX Runtime, DeepSparse ofrece una velocidad 5,8 veces superior para YOLOv5s, ¡ejecutándose en la misma 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:
- Despliegues flexibles: Funciona de forma coherente en la nube, el centro de datos y el perímetro con cualquier proveedor de hardware, desde Intel a AMD o ARM.
- Escalabilidad infinita: Escala verticalmente a cientos de núcleos, hacia fuera con Kubernetes estándar, o de forma totalmente abstracta con Serverless
- Fácil integración: API limpias para integrar tu modelo en una aplicación y supervisarlo en producción
¿Cómo consigue DeepSparse un rendimiento de clase GPU?
DeepSparse aprovecha la dispersión del modelo para acelerar su rendimiento.
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.
Las redes dispersas con cálculo comprimido, ejecutadas en profundidad en la caché, permiten a DeepSparse ofrecer un rendimiento de clase GPU en las CPU.
¿Cómo puedo crear una versión dispersa de YOLOv5 entrenada con mis datos?
Neural MagicSparseZoo, el repositorio de modelos de código abierto, contiene puntos de control preespaciados de cada modelo YOLOv5 . Con SparseML, que está integrado en Ultralytics, puedes ajustar un punto de control disperso a tus datos con un solo comando CLI .
Consulta la documentación de Neural Magic's YOLOv5 para más detalles.
Uso de DeepSparse
Recorreremos un ejemplo de evaluación comparativa y despliegue de una versión dispersa de YOLOv5s con DeepSparse.
Instalar DeepSparse
Ejecuta lo siguiente para instalar DeepSparse. Te recomendamos que utilices un entorno virtual con Python.
Recopila un archivo ONNX
DeepSparse acepta un modelo en el formato ONNX , pasado como:
- Un stub de SparseZoo que identifica un archivo ONNX en el SparseZoo
- Una ruta local a un modelo ONNX en un sistema de archivos
Los ejemplos que siguen utilizan los puntos de control YOLOv5s estándar densos y podados-cuantizados, identificados por los siguientes stubs SparseZoo:
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
Despliega un modelo
DeepSparse ofrece cómodas API para integrar tu modelo en una aplicación.
Para probar los ejemplos de despliegue que aparecen a continuación, despliega una imagen de muestra y guárdala como basilica.jpg
con lo siguiente:
wget -O basilica.jpg https://raw.githubusercontent.com/neuralmagic/deepsparse/main/src/deepsparse/yolo/sample_images/basilica.jpg
Python API
Pipelines
envuelven el preprocesamiento y el postprocesamiento de salida en torno al tiempo de ejecución, proporcionando una interfaz limpia para añadir DeepSparse a una aplicación. La integración DeepSparse-Ultralytics incluye una interfaz Pipeline
que acepta imágenes sin procesar y genera los cuadros delimitadores.
Crea una Pipeline
y ejecuta la inferencia:
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)
Si estás ejecutando en la nube, puedes obtener un error que indique que open-cv no puede encontrar libGL.so.1
. Ejecutando lo siguiente en Ubuntu se instala:
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.
Haz girar el Servidor con los YOLOv5 podados-cuantizados:
deepsparse.server \
--task yolo \
--model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
Una solicitud de ejemplo, utilizando Python's requests
paquete:
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"]
Anota CLI
También puedes utilizar el comando anotar para que el motor guarde en disco una foto anotada. Prueba --fuente 0 para anotar la imagen de tu webcam en directo.
deepsparse.object_detection.annotate --model_filepath zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none --source basilica.jpg
Al ejecutar el comando anterior se creará un annotation-results
y guarda dentro la imagen anotada.
Evaluación comparativa de resultados
Compararemos el rendimiento de DeepSparse con el de ONNX Runtime en YOLOv5s, utilizando el script de evaluación comparativa de DeepSparse.
Las pruebas se ejecutaron en una plataforma AWS c6i.8xlarge
(16 núcleos).
Comparación del rendimiento del Lote 32
ONNX Línea de base en tiempo de ejecución
En el lote 32, ONNX Runtime alcanza 42 imágenes/seg con los YOLOv5 estándar densos:
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
Rendimiento DeepSparse Dense
Aunque DeepSparse ofrece su mejor rendimiento con modelos dispersos optimizados, también funciona bien con los YOLOv5 densos estándar.
En el lote 32, DeepSparse consigue 70 imágenes/seg con los YOLOv5 densos estándar, ¡una mejora de rendimiento de 1,7 veces respecto a 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
Rendimiento de DeepSparse Sparse
Cuando se aplica la sparsity al modelo, el aumento de rendimiento de DeepSparse respecto a ONNX Runtime es aún mayor.
En el lote 32, DeepSparse consigue 241 imágenes/seg. con los YOLOv5 podados-cuantizados, ¡una mejora de rendimiento de 5,8 veces respecto a 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
Comparación del rendimiento del Lote 1
DeepSparse también es capaz de aumentar la velocidad respecto a ONNX Runtime en el escenario del lote 1, sensible a la latencia.
ONNX Línea de base en tiempo de ejecución
En el lote 1, ONNX Tiempo de ejecución alcanza 48 imágenes/seg con los YOLOv5 estándar y 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
Rendimiento de DeepSparse Sparse
En el lote 1, DeepSparse alcanza 135 ítems/seg con un YOLOv5s podado-cuantizado, ¡una ganancia de rendimiento de 2,8 veces respecto a 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
instancias tienen instrucciones VNNI, el rendimiento de DeepSparse puede aumentar aún más si los pesos se podan en bloques de 4.
En el lote 1, DeepSparse alcanza 180 ítems/seg con un YOLOv5s de 4 bloques podado-cuantizado, ¡una ganancia de rendimiento de 3,7 veces respecto a 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
Empieza con DeepSparse
¿Investigación o pruebas? La Comunidad DeepSparse es gratuita para investigación y pruebas. Empieza con nuestra Documentación.