Distribuisci YOLOv5 con DeepSparse di Neural Magic#
Benvenuto nell'AI distribuita via software.
Questa guida spiega come distribuire YOLOv5 con DeepSparse di Neural Magic.
DeepSparse è un runtime di inferenza con prestazioni eccezionali su CPU. Ad esempio, rispetto al baseline di ONNX Runtime, DeepSparse offre un'accelerazione di 5,8 volte per YOLOv5s, eseguito sulla stessa macchina!
Per la prima volta, i tuoi carichi di lavoro di deep learning possono soddisfare le esigenze di performance della produzione senza la complessità e i costi degli acceleratori hardware. In parole semplici, DeepSparse ti offre le performance delle GPU e la semplicità del software:
- Distribuzioni flessibili: Esegui in modo coerente su cloud, data center e edge con qualsiasi fornitore di hardware, da Intel ad AMD fino ad ARM
- Scalabilità infinita: Scala verticalmente fino a centinaia di core, orizzontalmente con Kubernetes standard, oppure in modo completamente astratto con il Serverless
- Integrazione semplice: API pulite per integrare il tuo modello in un'applicazione e monitorarlo in produzione
Come ottiene DeepSparse prestazioni di classe GPU?#
DeepSparse sfrutta la sparsità del modello per ottenere il suo incremento di prestazioni.
La sparsificazione tramite potatura (pruning) e quantizzazione è una tecnica ampiamente studiata che consente riduzioni di ordini di grandezza nelle dimensioni e nel calcolo necessari per eseguire una rete, mantenendo al contempo un'alta precisione. DeepSparse è consapevole della sparsità, il che significa che salta i parametri azzerati, riducendo la quantità di calcolo in un passaggio in avanti (forward pass). Poiché il calcolo sparso è ora limitato dalla memoria (memory bound), DeepSparse esegue la rete in profondità, suddividendo il problema in Tensor Columns, strisce verticali di calcolo che rientrano nella cache.
Le reti sparse con calcolo compresso, eseguite in profondità nella cache, consentono a DeepSparse di fornire prestazioni di classe GPU sulle CPU!
Come posso creare una versione sparsa di YOLOv5 addestrata sui miei dati?#
Il repository di modelli open-source di Neural Magic, SparseZoo, contiene checkpoint pre-sparsificati di ciascun modello YOLOv5. Usando SparseML, che è integrato con Ultralytics, puoi effettuare il fine-tuning di un checkpoint sparso sui tuoi dati con un singolo comando CLI.
Dai un'occhiata alla documentazione YOLOv5 di Neural Magic per maggiori dettagli.
Utilizzo di DeepSparse#
Vedremo un esempio di benchmarking e distribuzione di una versione sparsa di YOLOv5s con DeepSparse.
Installa DeepSparse#
Esegui quanto segue per installare DeepSparse. Ti consigliamo di utilizzare un ambiente virtuale con Python.
pip install "deepsparse[server,yolo,onnxruntime]"Raccogli un file ONNX#
DeepSparse accetta un modello in formato ONNX, passato in uno dei seguenti modi:
- Uno stub di SparseZoo che identifica un file ONNX in SparseZoo
- Un percorso locale verso un modello ONNX nel filesystem
Gli esempi seguenti utilizzano i checkpoint standard YOLOv5s densi e pruned-quantized, identificati dai seguenti stub di SparseZoo:
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-noneDistribuisci un modello#
DeepSparse offre comode API per integrare il tuo modello in un'applicazione.
Per provare gli esempi di deployment qui sotto, scarica un'immagine di esempio e salvala come basilica.jpg con il seguente comando:
wget -O basilica.jpg https://raw.githubusercontent.com/neuralmagic/deepsparse/main/src/deepsparse/yolo/sample_images/basilica.jpgAPI Python#
Pipelines incapsula il pre-elaborazione (pre-processing) e il post-elaborazione (post-processing) dei risultati attorno al runtime, fornendo un'interfaccia pulita per aggiungere DeepSparse a un'applicazione. L'integrazione DeepSparse-Ultralytics include un Pipeline pronto all'uso che accetta immagini grezze e restituisce i bounding box.
Crea un Pipeline ed esegui l'inferenza:
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)Se stai eseguendo nel cloud, potresti ricevere un errore in cui OpenCV non riesce a trovare libGL.so.1. Puoi installare la libreria mancante:
apt-get install libgl1Oppure utilizza il pacchetto Ultralytics headless che evita completamente le dipendenze GUI:
pip install ultralytics-opencv-headlessServer HTTP#
DeepSparse Server è eseguito sul celebre framework web FastAPI e sul server web Uvicorn. Con un singolo comando CLI, puoi configurare facilmente un endpoint di servizio del modello con DeepSparse. Il Server supporta qualsiasi Pipeline di DeepSparse, inclusa il rilevamento di oggetti con YOLOv5, permettendoti di inviare immagini grezze all'endpoint e ricevere i bounding box.
Avvia il server con YOLOv5s pruned-quantized:
deepsparse.server \
--task yolo \
--model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-noneUn esempio di richiesta, utilizzando il pacchetto requests di Python:
import json
from contextlib import ExitStack
import requests
# list of images for inference (local files on client side)
path = ["basilica.jpg"]
# send request over HTTP to /predict/from_files endpoint
url = "http://0.0.0.0:5543/predict/from_files"
with ExitStack() as stack:
files = [("request", stack.enter_context(open(img, "rb"))) for img in path]
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 Annotate#
Puoi anche usare il comando annotate per fare in modo che il motore salvi una foto annotata su disco. Prova --source 0 per annotare il tuo feed webcam in tempo reale!
deepsparse.object_detection.annotate --model_filepath zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none --source basilica.jpgL'esecuzione del comando precedente creerà una cartella annotation-results e vi salverà all'interno l'immagine annotata.
Benchmark delle prestazioni#
Confronteremo il throughput di DeepSparse con quello di ONNX Runtime su YOLOv5s, utilizzando lo script di benchmarking di DeepSparse.
I benchmark sono stati eseguiti su un'istanza AWS c6i.8xlarge (16 core).
Confronto delle prestazioni con Batch 32#
Baseline ONNX Runtime#
Al batch 32, ONNX Runtime raggiunge 42 immagini/sec con il modello standard denso YOLOv5s:
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.9025Prestazioni di DeepSparse denso#
Sebbene DeepSparse offra le sue migliori prestazioni con modelli sparsi ottimizzati, funziona bene anche con il modello standard denso YOLOv5s.
Al batch 32, DeepSparse raggiunge 70 immagini/sec con il modello standard denso YOLOv5s, un miglioramento delle prestazioni di 1,7x rispetto 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.5546Prestazioni di DeepSparse sparso#
Quando la sparsità viene applicata al modello, i guadagni di prestazioni di DeepSparse rispetto a ONNX Runtime sono ancora più forti.
Al batch 32, DeepSparse raggiunge 241 immagini/sec con il modello YOLOv5s pruned-quantized, un miglioramento delle prestazioni di 5,8x rispetto 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.2452Confronto delle prestazioni con Batch 1#
DeepSparse è anche in grado di ottenere un'accelerazione rispetto a ONNX Runtime per lo scenario con batch 1, sensibile alla latenza.
Baseline ONNX Runtime#
Al batch 1, ONNX Runtime raggiunge 48 immagini/sec con il modello standard, denso YOLOv5s.
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.0921Prestazioni di DeepSparse sparso#
Al batch 1, DeepSparse raggiunge 135 elementi/sec con un YOLOv5s pruned-quantized, un guadagno di prestazioni di 2,8x rispetto 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.9468Poiché le istanze c6i.8xlarge dispongono di istruzioni VNNI, il throughput di DeepSparse può essere spinto oltre se i pesi vengono potati in blocchi di 4.
Al batch 1, DeepSparse raggiunge 180 elementi/sec con un YOLOv5s pruned-quantized a 4 blocchi, un guadagno di prestazioni di 3,7x rispetto 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.7375Inizia con DeepSparse#
Ricerca o Test? DeepSparse Community è gratuito per ricerca e test. Inizia con la loro Documentazione.
Per ulteriori informazioni sul deployment di YOLOv5 con DeepSparse, consulta la documentazione DeepSparse di Neural Magic e il post sul blog di Ultralytics sull'integrazione con DeepSparse.