Cheque verde
Enlace copiado en el portapapeles

Despliega Ultralytics YOLOv5 Con Neural Magic's DeepSparse para GPU-Clase de rendimiento en CPUs

Potencia el entrenamiento y despliegue de modelos de Ultralytics YOLOv5 con DeepSparse de Neural Magic para obtener un rendimiento de clase GPU en CPU. Consigue despliegues YOLOv5 más rápidos y escalables.

¿Quieres acelerar la formación y el despliegue de tus YOLOv5 modelos? ¡Te cubrimos las espaldas! Te presentamos a nuestro socio más reciente, Neural Magic. Dado que 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 deYOLOv5 .

DeepSparse es el tiempo de ejecución de inferencia de Neural Magic's CPU , que aprovecha la escasez 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.

YOLOv5 Comparación del rendimiento con DeepSparse

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

  1. Despliegues flexibles: Funciona de forma coherente en la nube, el centro de datos y el perímetro con cualquier proveedor de hardware.
  2. Escalabilidad infinita: Escala con Kubernetes estándar, verticalmente a 100s de núcleos, o totalmente abstraído con serverless
  3. Fácil integración: Utiliza API limpias para integrar tu modelo en una aplicación y supervisarlo en producción

Alcanza un rendimiento de clase GPU en CPUs básicas

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

La sparsificación mediante 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 una alta precisión. DeepSparse tiene en cuenta la sparsificación, omitiendo las multiplicaciones por cero y reduciendo la cantidad de cálculo en una pasada hacia delante. Como el cálculo disperso está limitado por la memoria, DeepSparse ejecuta el grafo en profundidad, dividiendo el problema en Tensor Columnas, 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 de clase GPU en las CPU.

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

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 YOLOv5 en Neural Magicpara más detalles.

Despliega YOLOv5 con DeepSparse

Instalar DeepSparse

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

pip install deepsparse[servidor,yolo,onnxruntime]

Recopila un archivo ONNX

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

  • Un camino local hacia un modelo ONNX
  • Un stub de 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

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, extrae una imagen de muestra del ejemplo y guárdala 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

Python API

Los Pipelines envuelven el preprocesamiento y el postprocesamiento de salida en el tiempo de ejecución, proporcionando una interfaz limpia para añadir DeepSparse a una aplicación. La integración DeepSparse-Ultralytics incluye un conducto listo para usar que acepta imágenes sin procesar y genera los cuadros delimitadores.

Crea una Tubería y ejecuta la inferencia:

from deepsparse import Pipeline

# lista de imágenes en el sistema de archivos local
images = ["basilica.jpg"]

# crear tubería
model_stub = "zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none"
yolo _pipeline = Pipeline.create(
task="yolo",
model_path=model_stub,
)

# ejecuta la inferencia en las imágenes, recibe los cuadros delimitadores + las clases
pipeline_outputs = yolo_pipeline(images=images, iou_thres=0.6, conf_thres=0.001)
print(pipeline_outputs)

Si estás ejecutando en la nube, es posible que obtengas un error que indique que open-cv no puede encontrar libGL.so.1. Ejecutando lo siguiente en Ubuntu se instala:

apt-get install libgl1-mesa-glx

Servidor HTTP

DeepSparse Server se ejecuta sobre el popular marco web FastAPI y el servidor web Uvicorn. Con un solo comando CLI , puedes configurar fácilmente un punto final de servicio modelo con DeepSparse. El Servidor admite cualquier canalización de DeepSparse, incluida la detección de objetos con YOLOv5, lo que te permite enviar imágenes sin procesar al punto final y recibir los cuadros delimitadores.

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 el paquete de solicitudes 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]

# envía la 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=ficheros)

# la respuesta se devuelve en JSON
annotations = json.loads(resp.text) # diccionario de resultados de anotaciones
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

Ejecutando el comando anterior se creará una carpeta de resultados de anotación y se guardará dentro la imagen anotada.

Anotado Basilica 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

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

> 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/seg con el YOLOv5 denso estándar, ¡unamejora 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

> 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 la sparsity al modelo, las ganancias de rendimiento de DeepSparse respecto a ONNX Runtime son aún mayores.

En el lote 32, DeepSparse alcanza 241 imágenes/seg con el YOLOv5 podado-cuantizado, ¡unamejora 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

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

> 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 la sparsity al modelo, las ganancias de rendimiento de DeepSparse respecto a ONNX Runtime son aún mayores.

En el lote 1, DeepSparse alcanza 135 imágenes/seg con el YOLOv5s podado-cuantizado, ¡unamejora 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 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

Como las instancias 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/seg. con un YOLOv5 cuantificado y podado en 4 bloques: ¡unaumento del 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

> 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ás listo para optimizar tu despliegue de YOLOv5 con DeepSparse.

Empieza con YOLOv5 y DeepSparse

Para ponerte en contacto con nosotros, únete a nuestra comunidad y déjanos tus preguntas y comentarios. Consulta el repositorioUltralytics YOLOv5 y la documentación completa 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 esos socios.

Logotipo de FacebookLogotipo de TwitterLogotipo de LinkedInSímbolo de enlace de copia

Leer más en esta categoría

¡Construyamos juntos el futuro
de la IA!

Comienza tu viaje con el futuro del aprendizaje automático