Neural MagicDeepSparse
Benvenuti nell'IA fornita dal software.
Questa guida spiega come distribuire YOLOv5 con DeepSparse di Neural Magic.
DeepSparse è un runtime di inferenza con prestazioni eccezionali sulle CPU. Ad esempio, rispetto al runtime di base ONNX , DeepSparse offre una velocità di 5,8 volte superiore per YOLOv5, in esecuzione sulla stessa macchina!
Per la prima volta, i carichi di lavoro di deep learning possono soddisfare le prestazioni richieste dalla produzione senza la complessità e i costi degli acceleratori hardware. In parole povere, DeepSparse offre le prestazioni delle GPU e la semplicità del software:
- Distribuzioni flessibili: Esecuzione coerente su cloud, data center ed edge con qualsiasi fornitore di hardware, da Intel ad AMD ad ARM.
- Scalabilità infinita: Scalabilità verticale fino a 100 core, con Kubernetes standard o completamente astratta con Serverless.
- Facile integrazione: API pulite per integrare il modello in un'applicazione e monitorarlo in produzione.
Come fa DeepSparse a ottenere prestazioni di classe GPU?
DeepSparse sfrutta la sparsità del modello per aumentare la velocità delle prestazioni.
La sparsificazione attraverso la potatura e la quantizzazione è una tecnica ampiamente studiata, che consente di ridurre di un ordine di grandezza le dimensioni e i calcoli necessari per eseguire una rete, pur mantenendo un'elevata precisione. DeepSparse è sparsity-aware, cioè salta i parametri azzerati, riducendo la quantità di calcolo in un passaggio in avanti. Poiché il calcolo rado è ora limitato dalla memoria, DeepSparse esegue la rete in profondità, suddividendo il problema in Tensor Colonne, strisce verticali di calcolo che possono essere inserite 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 si crea una versione sparsa di YOLOv5 addestrata sui dati?
Neural MagicIl repository di modelli open-source, SparseZoo, contiene checkpoint pre-sparsificati di ogni modello YOLOv5 . Utilizzando SparseML, integrato con Ultralytics, è possibile mettere a punto un checkpoint sparse sui propri dati con un singolo comando CLI .
Consultate la documentazione di Neural Magic'YOLOv5 per maggiori dettagli.
Utilizzo di DeepSparse
Verrà presentato un esempio di benchmarking e di distribuzione di una versione rada di YOLOv5s con DeepSparse.
Installare DeepSparse
Eseguire quanto segue per installare DeepSparse. Si consiglia di utilizzare un ambiente virtuale con Python.
Raccogliere un file ONNX
DeepSparse accetta un modello nel formato ONNX , passato come:
- Uno stub di SparseZoo che identifica un file ONNX nel file SparseZoo.
- Un percorso locale a un modello ONNX in un filesystem
Gli esempi che seguono utilizzano i checkpoint YOLOv5s standard densi e potati-quantizzati, identificati dai seguenti stub SparseZoo:
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
Distribuire un modello
DeepSparse offre comode API per integrare il modello in un'applicazione.
Per provare gli esempi di implementazione riportati di seguito, selezionare un'immagine di esempio e salvarla come basilica.jpg
con quanto segue:
wget -O basilica.jpg https://raw.githubusercontent.com/neuralmagic/deepsparse/main/src/deepsparse/yolo/sample_images/basilica.jpg
Python API
Pipelines
avvolge la pre-elaborazione e la post-elaborazione dell'output attorno al runtime, fornendo un'interfaccia pulita per aggiungere DeepSparse a un'applicazione. L'integrazione tra DeepSparse eUltralytics comprende un'interfaccia Pipeline
che accetta immagini grezze e produce i riquadri di delimitazione.
Creare un Pipeline
ed eseguire 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 si sta eseguendo nel cloud, è possibile che venga visualizzato un errore che indica che open-cv non può trovare libGL.so.1
. L'esecuzione di quanto segue su Ubuntu lo installa:
Server HTTP
DeepSparse Server si basa sul popolare framework web FastAPI e sul server web Uvicorn. Con un solo comando CLI , è possibile configurare facilmente un endpoint di servizio modello con DeepSparse. Il server supporta qualsiasi pipeline di DeepSparse, compreso il rilevamento degli oggetti con YOLOv5, consentendo di inviare immagini grezze all'endpoint e di ricevere le bounding box.
Avviare il server con gli YOLOv5 potati e quantificati:
deepsparse.server \
--task yolo \
--model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
Un esempio di richiesta, utilizzando Python's requests
pacchetto:
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"]
Annotare CLI
È anche possibile usare il comando annotate per far sì che il motore salvi su disco una foto annotata. Provate --source 0 per annotare il feed della vostra webcam in diretta!
deepsparse.object_detection.annotate --model_filepath zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none --source basilica.jpg
L'esecuzione del comando precedente creerà un file annotation-results
e salvare l'immagine annotata al suo interno.
Benchmarking 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 sistema AWS c6i.8xlarge
(16 core).
Confronto delle prestazioni del batch 32
ONNX Linea di base del tempo di esecuzione
Al batch 32, ONNX Runtime raggiunge 42 immagini/sec con le YOLOv5 dense standard:
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
ProfondoSparso Denso Prestazioni
Sebbene DeepSparse offra le sue migliori prestazioni con i modelli sparsi ottimizzati, si comporta bene anche con i modelli densi standard di YOLOv5.
Al batch 32, DeepSparse raggiunge 70 immagini/sec con le YOLOv5 dense standard, con un miglioramento delle prestazioni di 1,7 volte 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.5546
DeepSparse Prestazioni sparse
Quando la sparsità viene applicata al modello, il guadagno di prestazioni di DeepSparse rispetto a ONNX Runtime è ancora maggiore.
Al batch 32, DeepSparse raggiunge 241 immagini/sec con le YOLOv5 pruned-quantized, con un miglioramento delle prestazioni di 5,8 volte 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.2452
Confronto delle prestazioni del lotto 1
DeepSparse è anche in grado di ottenere una maggiore velocità rispetto a ONNX Runtime per lo scenario batch 1, sensibile alla latenza.
ONNX Linea di base del tempo di esecuzione
Al batch 1, ONNX Runtime raggiunge 48 immagini/sec con le YOLOv5 standard e dense.
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
DeepSparse Prestazioni sparse
Al batch 1, DeepSparse raggiunge 135 item/sec con un YOLOv5s potato e quantificato, con un guadagno di prestazioni di 2,8 volte 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.9468
Da quando c6i.8xlarge
Se le istanze dispongono di istruzioni VNNI, il throughput di DeepSparse può essere ulteriormente spinto se i pesi vengono tagliati in blocchi di 4.
Al batch 1, DeepSparse raggiunge 180 item/sec con un YOLOv5s pruned-quantizzato a 4 blocchi, con un guadagno di prestazioni di 3,7 volte 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.7375
Iniziare con DeepSparse
Ricerca o test? DeepSparse Community è gratuita per la ricerca e la sperimentazione. Iniziate con la nostra documentazione.