Despliega YOLOv5 con DeepSparse de Neural Magic

Bienvenido a la IA entregada por software.

Esta guía explica cómo desplegar YOLOv5 con DeepSparse de Neural Magic.

DeepSparse es un motor de inferencia con un rendimiento excepcional en CPUs. Por ejemplo, en comparación con la línea base de ONNX Runtime, ¡DeepSparse ofrece una velocidad 5.8 veces mayor para YOLOv5s, ejecutándose en la misma máquina!

YOLOv5 DeepSparse vs ONNX Runtime speed comparison chart

Por primera vez, tus cargas de trabajo de deep learning pueden cumplir con las demandas de rendimiento de producción sin la complejidad y los costes de los aceleradores de hardware. En pocas palabras, DeepSparse te ofrece el rendimiento de las GPUs y la simplicidad del software:

  • Despliegues flexibles: Ejecuta de forma consistente en la nube, centros de datos y dispositivos edge con cualquier proveedor de hardware, desde Intel hasta AMD o ARM
  • Escalabilidad infinita: Escala verticalmente hasta cientos de núcleos, horizontalmente con Kubernetes estándar o de forma totalmente abstracta con Serverless
  • Fácil integración: APIs limpias para integrar tu modelo en una aplicación y monitorizarlo en producción

¿Cómo logra DeepSparse un rendimiento de clase GPU?

DeepSparse aprovecha la dispersión (sparsity) del modelo para ganar velocidad en su rendimiento.

La esparsificación mediante poda (pruning) y cuantización es una técnica ampliamente estudiada, que permite reducciones de orden de magnitud en el tamaño y el cálculo necesarios para ejecutar una red, manteniendo una alta precisión. DeepSparse es consciente de la dispersión, lo que significa que omite los parámetros puestos a cero, reduciendo la cantidad de cálculo en una pasada hacia adelante. Dado que el cálculo disperso ahora está limitado por la memoria, DeepSparse ejecuta la red en profundidad, dividiendo el problema en columnas de tensores, franjas verticales de cálculo que caben en la caché.

DeepSparse tensor columns for sparse neural network inference

Las redes dispersas con cálculo comprimido, ejecutadas en profundidad en la caché, ¡permiten que DeepSparse ofrezca un rendimiento de clase GPU en CPUs!

¿Cómo creo una versión dispersa de YOLOv5 entrenada con mis datos?

El repositorio de modelos de código abierto de Neural Magic, SparseZoo, contiene puntos de control pre-esparsificados de cada modelo YOLOv5. Usando SparseML, que está integrado con Ultralytics, puedes ajustar un punto de control disperso con tus datos con un solo comando CLI.

Consulta la documentación de YOLOv5 de Neural Magic para más detalles.

Uso de DeepSparse

Repasaremos un ejemplo de benchmarking y despliegue de una versión dispersa de YOLOv5s con DeepSparse.

Instalar DeepSparse

Ejecuta lo siguiente para instalar DeepSparse. Recomendamos que utilices un entorno virtual con Python.

pip install "deepsparse[server,yolo,onnxruntime]"

Obtén un archivo ONNX

DeepSparse acepta un modelo en formato ONNX, pasado de una de estas formas:

  • Un stub de SparseZoo que identifica un archivo ONNX en SparseZoo
  • Una ruta local a un modelo ONNX en un sistema de archivos

Los ejemplos a continuación utilizan los puntos de control estándar densos y podados-cuantizados de YOLOv5s, identificados por los siguientes stubs de SparseZoo:

zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none

Desplegar un modelo

DeepSparse ofrece APIs convenientes para integrar tu modelo en una aplicación.

Para probar los ejemplos de despliegue a continuación, descarga 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

API de Python

Los Pipelines envuelven el preprocesamiento y el postprocesamiento de salida alrededor del motor de ejecución, proporcionando una interfaz limpia para añadir DeepSparse a una aplicación. La integración DeepSparse-Ultralytics incluye un Pipeline listo para usar que acepta imágenes en bruto y genera las cajas delimitadoras.

Crea un 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 ejecutas en la nube, es posible que recibas un error indicando que OpenCV no puede encontrar libGL.so.1. Puedes instalar la biblioteca que falta:

apt-get install libgl1

O utiliza el paquete headless de Ultralytics que evita por completo las dependencias de GUI:

pip install ultralytics-opencv-headless

Servidor HTTP

DeepSparse Server se ejecuta sobre el popular framework web FastAPI y el servidor web Uvicorn. Con un solo comando CLI, puedes configurar fácilmente un punto final de servicio de modelo con DeepSparse. El servidor admite cualquier Pipeline de DeepSparse, incluyendo la detección de objetos con YOLOv5, lo que te permite enviar imágenes en bruto al punto final y recibir las cajas delimitadoras.

Inicia el servidor con YOLOv5s podado-cuantizado:

deepsparse.server \
  --task yolo \
  --model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none

Una solicitud de ejemplo, utilizando el paquete requests de 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"]

CLI de anotación

También puedes usar el comando annotate para que el motor guarde una foto anotada en el disco. ¡Prueba --source 0 para anotar tu transmisión de webcam en vivo!

deepsparse.object_detection.annotate --model_filepath zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none --source basilica.jpg

Ejecutar el comando anterior creará una carpeta annotation-results y guardará la imagen anotada dentro.

YOLOv5 detection results with bounding boxes

Rendimiento de benchmarking

Compararemos el rendimiento (throughput) de DeepSparse con el de ONNX Runtime en YOLOv5s, utilizando el script de benchmarking de DeepSparse.

Los benchmarks se ejecutaron en una instancia AWS c6i.8xlarge (16 núcleos).

Comparativa de rendimiento con lote (batch) 32

Línea base de ONNX Runtime

En el lote 32, ONNX Runtime logra 42 imágenes/seg con el YOLOv5s denso estándar:

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 denso de DeepSparse

Aunque DeepSparse ofrece su mejor rendimiento con modelos dispersos optimizados, también funciona bien con el YOLOv5s denso estándar.

En el lote 32, DeepSparse logra 70 imágenes/seg con el YOLOv5s denso estándar, ¡una mejora de rendimiento de 1.7x sobre 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 disperso de DeepSparse

Cuando se aplica dispersión al modelo, las ganancias de rendimiento de DeepSparse sobre ONNX Runtime son aún mayores.

En el lote 32, DeepSparse logra 241 imágenes/seg con el YOLOv5s podado-cuantizado, ¡una mejora de rendimiento de 5.8x sobre 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

Comparativa de rendimiento con lote 1

DeepSparse también es capaz de obtener una mejora de velocidad sobre ONNX Runtime para el escenario de lote 1, sensible a la latencia.

Línea base de ONNX Runtime

En el lote 1, ONNX Runtime logra 48 imágenes/seg con el YOLOv5s estándar y denso.

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 disperso de DeepSparse

En el lote 1, DeepSparse logra 135 elementos/seg con un YOLOv5s podado-cuantizado, ¡una ganancia de rendimiento de 2.8x sobre 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

Dado que las instancias c6i.8xlarge tienen instrucciones VNNI, el rendimiento de DeepSparse puede aumentarse aún más si los pesos se podan en bloques de 4.

En el lote 1, DeepSparse logra 180 elementos/seg con un YOLOv5s podado-cuantizado de 4 bloques, ¡una ganancia de rendimiento de 3.7x sobre 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? DeepSparse Community es gratuito para investigación y pruebas. Empieza con su documentación.

Para obtener más información sobre el despliegue de YOLOv5 con DeepSparse, consulta la documentación de DeepSparse de Neural Magic y la entrada del blog de Ultralytics sobre la integración con DeepSparse.

Comentarios