Implemente YOLOv5 con DeepSparse de Neural Magic
Le damos la bienvenida a la IA distribuida 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 las CPU. Por ejemplo, en comparación con la línea de base de ONNX Runtime, ¡DeepSparse ofrece una aceleración de 5,8x para YOLOv5s, ejecutándose en la misma máquina!
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 costos de los aceleradores de hardware. En pocas palabras, DeepSparse le brinda el rendimiento de las GPU y la simplicidad del software:
- Implementaciones flexibles: Ejecute de forma consistente en la nube, el centro de datos y el borde con cualquier proveedor de hardware, desde Intel hasta AMD y ARM.
- Escalabilidad infinita: Escale verticalmente a cientos de núcleos, con Kubernetes estándar o totalmente abstraído con Serverless
- Fácil integración: API limpias para integrar su modelo en una aplicación y supervisarlo en producción
¿Cómo logra DeepSparse un rendimiento de clase GPU?
DeepSparse aprovecha la dispersión del modelo para obtener su aceleración de rendimiento.
La esparcificación mediante la poda y la cuantificació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 se salta los parámetros puestos a cero, reduciendo la cantidad de cálculo en un pase 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é.
Las redes dispersas con computación comprimida, ejecutadas en profundidad en la caché, permiten a DeepSparse ofrecer un rendimiento de clase GPU en las CPUs.
¿Cómo creo una versión dispersa de YOLOv5 entrenada en mis datos?
El repositorio de modelos de código abierto de Neural Magic, SparseZoo, contiene puntos de control pre-esparcidos de cada modelo YOLOv5. Usando SparseML, que está integrado con Ultralytics, puede ajustar un punto de control disperso en sus datos con un solo comando de la CLI.
Consulta la documentación de YOLOv5 de Neural Magic para obtener más detalles.
Uso de DeepSparse
Repasaremos un ejemplo de evaluación comparativa e implementación 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 formato ONNX, pasado ya sea como:
- Un stub de SparseZoo que identifica un archivo ONNX en SparseZoo
- Una ruta local a un modelo ONNX en un sistema de archivos
Los siguientes ejemplos utilizan los puntos de control estándar densos y podados-cuantificados 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
Implementar un modelo
DeepSparse ofrece APIs convenientes para integrar tu modelo en una aplicación.
Para probar los ejemplos de implementación que se muestran a continuación, descargue 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
API de Python
Pipelines
envuelve el preprocesamiento y el postprocesamiento de salida alrededor del tiempo de ejecución, proporcionando una interfaz limpia para agregar DeepSparse a una aplicación. La integración DeepSparse-Ultralytics incluye una solución lista para usar Pipeline
que acepta imágenes sin procesar y genera los cuadros delimitadores.
Crea 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 se está ejecutando en la nube, es posible que obtenga un error que open-cv no puede encontrar libGL.so.1
. Para instalarlo en Ubuntu, ejecute lo siguiente:
apt-get install libgl1
Servidor HTTP
DeepSparse Server se ejecuta sobre el popular marco web FastAPI y el servidor web Uvicorn. Con un solo comando de la CLI, puede configurar fácilmente un punto final de servicio de modelo con DeepSparse. El servidor admite cualquier Pipeline 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.
Activa el servidor con el modelo YOLOv5s podado y cuantificado:
deepsparse.server \
--task yolo \
--model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
Una solicitud de ejemplo, usando Python 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"]
CLI de anotación
También puede usar el comando annotate para que el motor guarde una foto anotada en el disco. Intente --source 0
¡para anotar la transmisión de tu cámara web en vivo!
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
carpeta y guardar la imagen anotada dentro.
Evaluación comparativa del rendimiento
Compararemos el rendimiento de DeepSparse con el rendimiento de ONNX Runtime en YOLOv5s, utilizando el script de evaluación comparativa de DeepSparse.
Las pruebas de rendimiento se ejecutaron en un AWS c6i.8xlarge
instancia (16 núcleos).
Comparación del Rendimiento del Lote 32
Línea base de ONNX Runtime
En el lote 32, ONNX Runtime alcanza 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
Si bien DeepSparse ofrece su mejor rendimiento con modelos dispersos optimizados, también funciona bien con los YOLOv5s densos estándar.
En el lote 32, DeepSparse alcanza 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 la dispersión al modelo, las ganancias de rendimiento de DeepSparse sobre ONNX Runtime son aún mayores.
En el lote 32, DeepSparse alcanza 241 imágenes/seg con el YOLOv5s podado y cuantificado, ¡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
Comparación del Rendimiento del Lote 1
DeepSparse también puede obtener una aceleración sobre ONNX Runtime para el escenario de latencia sensible, lote 1.
Línea base de ONNX Runtime
En el lote 1, ONNX Runtime alcanza 48 imágenes/seg 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 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 alcanza 135 elementos/seg con un YOLOv5s podado y cuantificado, ¡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
Desde c6i.8xlarge
instancias 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 elementos/seg con un YOLOv5s podado y cuantificado 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
Comenzar con DeepSparse
¿Investigación o pruebas? DeepSparse Community es gratuito para investigación y pruebas. Comience con su Documentación.
Para obtener más información sobre la implementación de YOLOv5 con DeepSparse, consulte la documentación de DeepSparse de Neural Magic y la publicación del blog de Ultralytics sobre la integración de DeepSparse.