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

¿Quieres acelerar el entrenamiento y la implementación de tus modelos YOLOv5? ¡Tenemos lo que necesitas! Te presentamos a nuestro nuevo socio, Neural Magic. Neural Magic ofrece herramientas de software que priorizan el máximo rendimiento de los modelos y la sencillez de los flujos de trabajo; por eso, unir fuerzas para ofrecer una solución que mejore aún más el proceso de implementación de YOLOv5 era lo más natural.
DeepSparse es el entorno de ejecución de inferencia de CPU de Neural Magic, que aprovecha la dispersión y la aritmética de baja precisión en las redes neuronales para ofrecer un rendimiento excepcional en hardware estándar. Por ejemplo, en comparación con la referencia de ONNX Runtime, DeepSparse ofrece una aceleración de 5,8 veces para YOLOv5s en el mismo equipo.

Por primera vez, tus cargas de trabajo de aprendizaje profundo pueden satisfacer las exigencias de rendimiento de los entornos de producción sin la complejidad ni los costes de los aceleradores de hardware. En pocas palabras, DeepSparse te ofrece el rendimiento de las GPU y la sencillez del software:
- Implementaciones flexibles: Ejecuta tus cargas de trabajo de forma uniforme en la nube, en centros de datos y en el edge, con cualquier proveedor de hardware.
- Escalabilidad ilimitada: Escala horizontalmente con Kubernetes estándar, verticalmente hasta cientos de núcleos o con una abstracción total mediante una arquitectura sin servidor.
- Integración sencilla: Utiliza API claras para integrar tu modelo en una aplicación y supervisarlo en producción.
Consigue un rendimiento de clase GPU en CPU estándar#
DeepSparse aprovecha la dispersión de los modelos para aumentar el rendimiento.
La dispersión mediante poda y cuantización permite reducir en órdenes de magnitud el tamaño de una red y la capacidad de cálculo necesaria para ejecutarla, manteniendo una alta precisión. DeepSparse tiene en cuenta la dispersión: omite las multiplicaciones y sumas cuyo resultado es cero y reduce la cantidad de cálculo en una pasada hacia delante. Como el cálculo disperso está limitado por la memoria, DeepSparse ejecuta la red en profundidad y divide el problema en columnas tensoriales, es decir, franjas verticales de cálculo que caben en la caché.

Las redes dispersas con cálculo comprimido, ejecutadas por capas en la caché, permiten que DeepSparse ofrezca un rendimiento de nivel GPU en CPU.
Crea una versión dispersa de Ultralytics YOLOv5 entrenada con datos personalizados#
El repositorio de modelos de código abierto SparseZoo, de Neural Magic, contiene puntos de control preprocesados para lograr dispersión de cada modelo YOLOv5. Con SparseML, integrado con Ultralytics, puedes ajustar un punto de control disperso a tus datos con un único comando CLI.
Implementa Ultralytics YOLOv5 con DeepSparse#
Instala DeepSparse#
Ejecuta lo siguiente para instalar DeepSparse. Te recomendamos usar un entorno virtual con Python.
pip install deepsparse[server,yolo,onnxruntime]Consigue un archivo ONNX#
DeepSparse acepta un modelo en formato ONNX, que se puede proporcionar como:
- Una ruta local a un modelo ONNX
- Un identificador de SparseZoo que señala un modelo en SparseZoo
Compararemos el YOLOv5s denso estándar con el YOLOv5s podado y cuantizado, identificado por los siguientes identificadores de SparseZoo:
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-noneImplementa un modelo#
DeepSparse ofrece API prácticas para integrar tu modelo en una aplicación.
Para probar los ejemplos de implementación que aparecen a continuación, descarga una imagen de muestra para el 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.jpgAPI de Python#
Las canalizaciones integran el preprocesamiento y el posprocesamiento de la salida con el motor de ejecución, y ofrecen una interfaz clara para añadir DeepSparse a una aplicación. La integración de DeepSparse con Ultralytics incluye una canalización lista para usar que acepta imágenes sin procesar y devuelve los cuadros delimitadores.
Crea una canalización y ejecuta la inferencia:
from deepsparse import Pipeline
# lista de imágenes en el sistema de archivos local
images = ["basilica.jpg"]
# crear canalización
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 en las imágenes y recibir cuadros delimitadores + clases
pipeline_outputs = yolo_pipeline(images=images, iou_thres=0.6, conf_thres=0.001)
print(pipeline_outputs)Si ejecutas el proceso en la nube, puede que recibas un error porque OpenCV no encuentra libGL.so.1. Ejecuta lo siguiente en Ubuntu para instalarlo:
apt-get install libgl1-mesa-glxServidor 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 endpoint de servicio de modelos con DeepSparse. Server admite cualquier canalización de DeepSparse, incluida la detección de objetos con Ultralytics YOLOv5, lo que te permite enviar imágenes sin procesar al endpoint y recibir los cuadros delimitadores.
Inicia Server con YOLOv5s podado y cuantizado:
deepsparse.server \
--task yolo \
--model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-noneEjemplo de solicitud con el paquete requests de Python:
import requests, json
# lista de imágenes para la inferencia (archivos locales en el lado del cliente)
path = ['basilica.jpg']
files = [('request', open(img, 'rb')) for img in path]
# enviar solicitud por HTTP al endpoint /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 anotación
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 la señal de vídeo de tu webcam en directo!
deepsparse.object_detection.annotate --model_filepath zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none --source basilica.jpgAl ejecutar el comando anterior, se creará una carpeta annotation-results y se guardará la imagen anotada dentro.

Rendimiento en pruebas de referencia#
Con el script de pruebas de rendimiento de DeepSparse, compararemos el rendimiento de DeepSparse con el de ONNX Runtime en YOLOv5s.
Las pruebas de rendimiento se ejecutaron en una instancia AWS c6i.8xlarge (16 núcleos).
Comparación del rendimiento con lotes de 32#
Referencia de ONNX Runtime#
Con un lote de 32, ONNX Runtime procesa 42 imágenes/s 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 onnxruntimeRuta del modelo original: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none Tamaño del lote: 32 Escenario: sync Rendimiento (elementos/s): 41.9025
Rendimiento de DeepSparse con modelos densos#
Aunque DeepSparse ofrece su mejor rendimiento con modelos dispersos optimizados, también funciona bien con el YOLOv5s denso estándar.
Con un lote de 32, DeepSparse procesa 70 imágenes/s con el YOLOv5s denso estándar: ¡una mejora del rendimiento de 1,7x con respecto a ORT!
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1Ruta del modelo original: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none Tamaño del lote: 32 Escenario: sync Rendimiento (elementos/s): 69.5546
Rendimiento de DeepSparse con modelos dispersos#
Cuando se aplica dispersión al modelo, la mejora del rendimiento de DeepSparse con respecto a ONNX Runtime es aún mayor.
Con un lote de 32, DeepSparse procesa 241 imágenes/s con el YOLOv5s podado y cuantizado: ¡una mejora del rendimiento de 5,8x con respecto a ORT!
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 32 -nstreams 1Ruta del modelo original: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none Tamaño del lote: 32 Escenario: sync Rendimiento (elementos/s): 241.2452
Comparación del rendimiento con lotes de 1#
DeepSparse también puede ofrecer una mejora de velocidad con respecto a ONNX Runtime en el escenario de lote 1, sensible a la latencia.
Referencia de ONNX Runtime#
Con un lote de 1, ONNX Runtime procesa 48 imágenes/s con el YOLOv5s denso estándar.
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 1 -nstreams 1 -e onnxruntimeRuta del modelo original: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none Tamaño del lote: 1 Escenario: sync Rendimiento (elementos/s): 48.0921
Rendimiento de DeepSparse con modelos dispersos#
Cuando se aplica dispersión al modelo, la mejora del rendimiento de DeepSparse con respecto a ONNX Runtime es aún mayor.
Con un lote de 1, DeepSparse procesa 135 imágenes/s con el YOLOv5s podado y cuantizado: ¡una mejora del rendimiento de 2,8x con respecto a ONNX Runtime!
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 1 -nstreams 1Ruta del modelo original: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none Tamaño del lote: 1 Escenario: sync Rendimiento (elementos/s): 134.9468
Como las instancias c6i.8xlarge cuentan con instrucciones VNNI, el rendimiento de DeepSparse puede aumentarse aún más si se podan los pesos en bloques de 4.
Con un lote de 1, DeepSparse procesa 180 elementos/s con un YOLOv5s podado y cuantizado en bloques de 4: ¡una mejora del rendimiento de 3,7x con respecto a ONNX Runtime!
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni -s sync -b 1 -nstreams 1Ruta del modelo original: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni Tamaño del lote: 1 Escenario: sync Rendimiento (elementos/s): 179.7375
¡Y listo! Ya puedes optimizar tu implementación de YOLOv5 con DeepSparse.
Empieza a usar Ultralytics YOLOv5 y DeepSparse#
Para ponerte en contacto con nosotros, únete a nuestra comunidad y envíanos tus preguntas y comentarios. Echa un vistazo al repositorio de Ultralytics YOLOv5 y a la documentación completa de Neural Magic para implementar YOLOv5.
En Ultralytics, colaboramos comercialmente con otras startups para financiar la investigación y el desarrollo de nuestras fantásticas herramientas de código abierto, como YOLOv5, y mantenerlas gratuitas para todo el mundo. Este artículo puede incluir enlaces de afiliados a esas empresas.









