Neural MagicDeepSparse
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!
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茅.
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?
Neural MagicSparseZoo, un repositorio de modelos de c贸digo abierto, contiene puntos de control preespaciados de cada modelo YOLOv5 . Con SparseML, que est谩 integrado en Ultralytics, puede ajustar un punto de control disperso a sus datos con un 煤nico 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.
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:
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 annotate para que el motor guarde en disco una foto anotada. 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
Al ejecutar el comando anterior se crear谩 un annotation-results
y guarde dentro la imagen anotada.
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 nuestra Documentaci贸n.