Ir al contenido

Despliegue de YOLOv5 con DeepSparse de Neural Magic Magic

Bienvenido a la IA por software.

Esta guía explica cómo implementar 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 el tiempo de ejecución básico de ONNX , DeepSparse ofrece una velocidad 5,8 veces superior para YOLOv5, ¡ejecutándose en la misma máquina!

YOLOv5 mejora de la velocidad

Por primera vez, sus cargas de trabajo de aprendizaje profundo pueden satisfacer las demandas de rendimiento de la producción sin la complejidad y los costes de los aceleradores de hardware. En pocas palabras, DeepSparse le ofrece el rendimiento de las GPU y la sencillez del software:

  • Implementaciones flexibles: Ejecute de forma coherente en la nube, el centro de datos y el perímetro con cualquier proveedor de hardware, desde Intel hasta AMD o ARM.
  • Escalabilidad infinita: Escala verticalmente a 100s de núcleos, hacia fuera con Kubernetes estándar, o totalmente abstracto con Serverless.
  • Integración sencilla: API limpias para integrar su 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.

La sparsificación a través de la poda y la 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 al mismo tiempo una alta precisión. DeepSparse es consciente de la escasez, lo que significa que omite los parámetros reducidos a cero, reduciendo la cantidad de cálculo en una pasada hacia delante. Como el cálculo disperso está ahora limitado por la memoria, DeepSparse ejecuta la red en profundidad, dividiendo el problema en Tensor Columns, franjas verticales de cálculo que caben en la caché.

YOLO poda de modelos

Las redes dispersas con cálculo comprimido, ejecutadas en profundidad en caché, permiten a DeepSparse ofrecer un rendimiento de clase GPU en CPU.

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

El repositorio de modelos de código abierto de Neural Magic Magic, SparseZoo, contiene puntos de control preespaciados de cada modelo YOLOv5 . Mediante SparseML, que está integrado con Ultralytics, puede ajustar con precisión un punto de control disperso en sus datos con un solo comando CLI .

Consulte la documentación de YOLOv5 en Neural Magic para obtener más información.

Uso de DeepSparse

Recorreremos un ejemplo de evaluación comparativa y despliegue de una versión dispersa de YOLOv5s con DeepSparse.

Instalar DeepSparse

Ejecute lo siguiente para instalar DeepSparse. Le recomendamos que utilice un entorno virtual con Python.

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

Recopilar un archivo ONNX

DeepSparse acepta un modelo en el formato ONNX , pasado como:

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

Los ejemplos siguientes utilizan los puntos de control YOLOv5s estándar densos y cuantificados, 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

Desplegar un modelo

DeepSparse ofrece cómodas API para integrar su modelo en una aplicación.

Para probar los ejemplos de despliegue que aparecen a continuación, despliegue una imagen de muestra y guárdela 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 alrededor del tiempo de ejecución, proporcionando una interfaz limpia para añadir DeepSparse a una aplicación. La integración de DeepSparse enUltralytics incluye una interfaz Pipeline que acepta imágenes sin procesar y genera los cuadros delimitadores.

Crear un Pipeline y ejecutar 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á ejecutando en la nube, puede obtener un error que open-cv no puede encontrar libGL.so.1. Ejecutando lo siguiente en Ubuntu se instala:

apt-get install libgl1

Servidor HTTP

DeepSparse Server se ejecuta sobre el popular framework web FastAPI y el servidor web Uvicorn. Con un solo comando CLI , puede configurar fácilmente un punto final de servicio de modelo con DeepSparse. El servidor es compatible con cualquier tubería de DeepSparse, incluida la detección de objetos con YOLOv5, lo que le permite enviar imágenes sin procesar al punto final y recibir los cuadros delimitadores.

Haz girar el servidor con los YOLOv5 podados y cuantificados:

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"]

Anote CLI

También puedes utilizar el comando de anotación para que el motor guarde en disco una foto anotada. Prueba --source 0 para hacer anotaciones en 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 guarde dentro la imagen anotada.

anotado

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 un servidor AWS c6i.8xlarge (16 núcleos).

Comparación del rendimiento del Lote 32

ONNX Tiempo de base

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 logra 70 imágenes/segundo con los YOLOv5 densos estándar, ¡una mejora de rendimiento de 1,7 veces con 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 sparsity al modelo, el rendimiento de DeepSparse es aún mayor que el de ONNX Runtime.

En el lote 32, DeepSparse alcanza 241 imágenes/seg con los YOLOv5s cuantificados y podados, ¡lo que supone 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 mejorar la velocidad de ONNX Runtime en el caso del lote 1, sensible a la latencia.

ONNX Tiempo de base

En el lote 1, ONNX Runtime 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 cuantificado y podado, lo que supone un aumento del rendimiento de 2,8 veces con 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 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/segundo con un YOLOv5s de 4 bloques cuantificado y podado, lo que supone un aumento del rendimiento de 3,7 veces con 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

Introducción a 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 la implementación de YOLOv5 con DeepSparse, consulte la documentación de DeepSparse deNeural Magic Magic y la entrada del blog deUltralytics sobre la integración de DeepSparse.

Creado hace 1 año ✏️ Actualizado hace 9 días

Comentarios