Implemente Ultralytics YOLOv5 con DeepSparse de Neural Magic para obtener un rendimiento de clase GPU en CPUs

Equipo Ultralytics

5 minutos de lectura

5 de enero de 2023

Potencie la formación y el despliegue de modelos Ultralytics YOLOv5 con DeepSparse de Neural Magic para obtener un rendimiento de clase GPU en CPU. Consiga implantaciones de YOLOv5 más rápidas y escalables.

¿Quiere acelerar la formación y el despliegue de sus modelos YOLOv5? Estamos aquí para ayudarle. Presentamos a nuestro socio más reciente, Neural Magic. Como Neural Magic proporciona herramientas de software que hacen hincapié en el máximo rendimiento de los modelos y la simplicidad del flujo de trabajo, es natural que nos hayamos unido para ofrecer una solución que mejore aún más el proceso de despliegue de YOLOv5.

DeepSparse es el tiempo de ejecución de inferencia para CPU de Neural Magic, que aprovecha la dispersión y la aritmética de baja precisión de las redes neuronales para ofrecer un rendimiento excepcional en hardware básico. Por ejemplo, en comparación con el tiempo de ejecución de ONNX, DeepSparse ofrece una velocidad 5,8 veces superior para YOLOv5 ejecutándose en la misma máquina.

Comparación del rendimiento de YOLOv5 con DeepSparse

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:

  1. Implementaciones flexibles: Ejecución coherente en la nube, el centro de datos y el perímetro con cualquier proveedor de hardware.
  2. Escalabilidad infinita: Escale con Kubernetes estándar, verticalmente a 100s de núcleos, o totalmente abstraído con serverless.
  3. Integración sencilla: Utilice API limpias para integrar su modelo en una aplicación y supervisarlo en producción.

Alcanza el rendimiento de una GPU en una CPU básica

DeepSparse aprovecha la dispersión del modelo para acelerar su rendimiento.

La sparsificación a través de la poda y la cuantización 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 tiene en cuenta la dispersión, omitiendo las multiplicaciones por cero y reduciendo la cantidad de cálculo en una pasada hacia delante. Dado que el cálculo disperso está limitado por la memoria, DeepSparse ejecuta el grafo en profundidad, dividiendo el problema en columnas tensoriales, que son franjas verticales de cálculo que caben en la caché.

Red DeepSparse y Ultralytics YOLOv5

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

Crear una versión dispersa de YOLOv5 entrenada con datos personalizados

El repositorio de modelos de código abierto de Neural 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.

Despliegue de YOLOv5 con DeepSparse

Instalar DeepSparse

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

pip install deepsparse[servidor,yolo,onnxruntime]

Recopilar un archivo ONNX

DeepSparse acepta un modelo en formato ONNX, pasado como:

  • Una ruta local a un modelo ONNX
  • Un stub SparseZoo que identifica un modelo en el SparseZoo

Compararemos los YOLOv5 densos estándar con los YOLOv5 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

Desplegar un modelo

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

Para probar los ejemplos de despliegue que se muestran a continuación, extraiga una imagen de muestra del ejemplo y guárdela como basilica.jpg con el siguiente comando:

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 tiempo 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 sin procesar y genera los cuadros delimitadores.

Crear un Pipeline y ejecutar la inferencia:

from deepsparse import Pipeline

# lista de imágenes en el sistema de archivos local
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,
)

# Ejecutar inferencia sobre imágenes, recibir cajas delimitadoras + clases
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. Ejecutar lo siguiente en Ubuntu lo instala:

apt-get install libgl1-mesa-glx

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 petición de ejemplo, utilizando el paquete requests de Python:

importar peticiones, json

# lista de imágenes para la inferencia (archivos locales en el lado del cliente)
ruta = ['basilica.jpg']
archivos = [('request', open(img, 'rb')) for img in ruta]

# enviar solicitud por HTTP al punto final /predict/from_files
url = 'http://0.0.0.0:5543/predict/from_files'
resp = requests.post(url=url, files=files)

# la respuesta se devuelve en JSON
annotations = json.loads(resp.text) # diccionario de resultados de anotaciones
bounding_boxes = annotations["boxes"]
labels = annotations["labels"]

Anotar CLI

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

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

Basílica anotada con YOLOv5

Rendimiento de referencia

Utilizando el script de evaluación comparativa de DeepSparse, compararemos el rendimiento de DeepSparse con el rendimiento de ONNX Runtime en YOLOv5s.

Las pruebas se ejecutaron en una instancia de AWS c6i.8xlarge (16 núcleos).

Comparación del rendimiento del Lote 32

Línea de base del tiempo de ejecución de ONNX

En el lote 32, ONNX Runtime alcanza 42 imágenes/seg con los YOLOv5 densos estándar:

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1 -e onnxruntime

> Ruta del modelo original: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> Tamaño del lote: 32
> Escenario: sync
> Rendimiento (ítems/seg): 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 alcanza 70 imágenes/segundo con el YOLOv5 denso estándar, lo que suponeuna mejora de 1,7 veces el rendimiento de ORT.

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1

> Ruta del modelo original: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> Tamaño del lote: 32
> Escenario: sync
> Rendimiento (ítems/seg): 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 consigue 241 imágenes por segundo con el YOLOv5 cuantificado y podado, lo que supone unamejora de 5,8 veces el rendimiento de ORT.

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 32 -nstreams 1

> Ruta del modelo original: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
> Tamaño del lote: 32
> Escenario: sync
> Rendimiento (ítems/seg): 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.

Línea de base del tiempo de ejecución de ONNX

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

> Ruta del modelo original: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> Tamaño del lote: 1
> Escenario: sync
> Rendimiento (ítems/seg): 48.0921

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 1, DeepSparse alcanza 135 imágenes/segundo con el YOLOv5 cuantificado y podado, lo que supone unamejora de 2,8 veces el rendimiento de ONNX Runtime.

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 32 -nstreams 1

> Ruta del modelo original: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
> Tamaño del lote: 1
> Escenario: sync
> Rendimiento (ítems/seg): 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 alcanza 180 ítems/segundo con un YOLOv5 cuantificado y podado en 4 bloques, lo que suponeun 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

> Ruta del modelo original: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni
> Tamaño del lote: 1
> Escenario: sync
> Rendimiento (ítems/seg): 179.7375

Y ¡voilá! Ya está listo para optimizar su despliegue de YOLOv5 con DeepSparse.

Introducción a YOLOv5 y DeepSparse

Para ponerte en contacto con nosotros, únete a nuestra comunidad y déjanos tus preguntas y comentarios. Consulte el repositorio de Ultralytics YOLOv5 y la documentación completa de Neural Magic para desplegar YOLOv5.

En Ultralytics, nos asociamos comercialmente con otras startups para que nos ayuden a financiar la investigación y el desarrollo de nuestras increíbles herramientas de código abierto, como YOLOv5, para que sigan siendo gratuitas para todo el mundo. Este artículo puede contener enlaces de afiliación a dichos socios.

¡Construyamos juntos el futuro
de la IA!

Comience su viaje con el futuro del aprendizaje automático

Empezar gratis
Enlace copiado en el portapapeles