Distribuisci Ultralytics YOLOv5 con DeepSparse di Neural Magic per ottenere prestazioni da GPU su CPU
Potenzia l'addestramento e la distribuzione dei modelli Ultralytics YOLOv5 con DeepSparse di Neural Magic, per prestazioni da GPU su CPU. Ottieni distribuzioni YOLOv5 più rapide e scalabili.

Vuoi accelerare l'addestramento e la distribuzione dei tuoi modelli YOLOv5? Ci pensiamo noi! Ti presentiamo il nostro nuovo partner, Neural Magic. Neural Magic offre strumenti software che puntano a prestazioni ottimali dei modelli e alla semplicità dei flussi di lavoro; è quindi naturale che abbiamo unito le forze per migliorare ulteriormente il processo di distribuzione di YOLOv5.
DeepSparse è il runtime di inferenza CPU di Neural Magic, che sfrutta la sparsità e l'aritmetica a bassa precisione nelle reti neurali per offrire prestazioni eccezionali su hardware standard. Per esempio, rispetto alla configurazione di riferimento di ONNX Runtime, DeepSparse offre un incremento di velocità di 5,8 volte per YOLOv5s sulla stessa macchina!

Per la prima volta, i tuoi carichi di lavoro di deep learning possono soddisfare i requisiti prestazionali degli ambienti di produzione senza la complessità e i costi degli acceleratori hardware. In poche parole, DeepSparse offre le prestazioni delle GPU e la semplicità del software:
- Distribuzioni flessibili: esegui i tuoi carichi di lavoro in modo coerente su cloud, data center ed edge, con qualsiasi fornitore hardware
- Scalabilità illimitata: amplia la capacità con Kubernetes standard, scala verticalmente fino a centinaia di core o usa un'architettura completamente astratta con serverless
- Integrazione semplice: usa API intuitive per integrare il tuo modello in un'applicazione e monitorarlo in produzione
Ottieni prestazioni paragonabili a quelle delle GPU su CPU standard#
DeepSparse sfrutta la sparsità dei modelli per ottenere un aumento delle prestazioni.
La sparsificazione tramite pruning e quantizzazione consente di ridurre di ordini di grandezza le dimensioni e la potenza di calcolo necessarie per eseguire una rete, mantenendo al contempo un'elevata accuratezza. DeepSparse tiene conto della sparsità, evitando le operazioni di moltiplicazione e somma con valori zero e riducendo la quantità di calcolo in un passaggio forward. Poiché il calcolo sparso è limitato dalla memoria, DeepSparse esegue la rete lungo la sua profondità, suddividendo il problema in colonne di tensori, ovvero fasce verticali di calcolo che entrano nella cache.

Le reti sparse con calcolo compresso, eseguito in cache in profondità, consentono a DeepSparse di offrire prestazioni paragonabili a quelle delle GPU sulle CPU!
Crea una versione sparsa di Ultralytics YOLOv5 addestrata su dati personalizzati#
Il repository di modelli open source di Neural Magic, SparseZoo, contiene checkpoint già resi sparsi per ogni modello YOLOv5. Con SparseML, integrato con Ultralytics, puoi ottimizzare un checkpoint sparso sui tuoi dati con un solo comando CLI.
Distribuisci Ultralytics YOLOv5 con DeepSparse#
Installa DeepSparse#
Esegui il comando seguente per installare DeepSparse. Ti consigliamo di usare un ambiente virtuale con Python.
pip install deepsparse[server,yolo,onnxruntime]Recupera un file ONNX#
DeepSparse accetta un modello in formato ONNX, fornito in uno dei seguenti modi:
- Un percorso locale a un modello ONNX
- Uno stub di SparseZoo che identifica un modello in SparseZoo
Confronteremo il modello YOLOv5s denso standard con il modello YOLOv5s potato e quantizzato, identificato 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 API pratiche per integrare il tuo modello in un'applicazione.
Per provare gli esempi di distribuzione 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#
Le pipeline racchiudono nel runtime le fasi di pre-elaborazione e post-elaborazione dell'output, offrendo un'interfaccia semplice per aggiungere DeepSparse a un'applicazione. L'integrazione di DeepSparse con Ultralytics include una pipeline pronta all'uso che accetta immagini grezze e restituisce i riquadri di delimitazione.
Crea una pipeline ed esegui l'inferenza:
from deepsparse import Pipeline
# elenco di immagini nel filesystem locale
images = ["basilica.jpg"]
# crea la pipeline
model_stub = "zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none"
yolo_pipeline = Pipeline.create(
task="yolo",
model_path=model_stub,
)
# esegui l'inferenza sulle immagini, ricevi i riquadri di delimitazione e le classi
pipeline_outputs = yolo_pipeline(images=images, iou_thres=0.6, conf_thres=0.001)
print(pipeline_outputs)Se esegui il codice nel cloud, potresti ricevere un errore che indica che open-cv non trova libGL.so.1. Per installarlo su Ubuntu, esegui il comando seguente:
apt-get install libgl1-mesa-glxServer HTTP#
DeepSparse Server è basato sul popolare framework web FastAPI e sul server web Uvicorn. Con un solo comando CLI, puoi configurare facilmente un endpoint di servizio del modello con DeepSparse. Il Server supporta qualsiasi pipeline di DeepSparse, incluso il rilevamento di oggetti con Ultralytics YOLOv5, consentendoti di inviare immagini grezze all'endpoint e ricevere i riquadri di delimitazione.
Avvia il Server con il modello YOLOv5s potato e quantizzato:
deepsparse.server \
--task yolo \
--model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-noneUn esempio di richiesta con il pacchetto requests di Python:
import requests, json
# elenco di immagini per l'inferenza (file locali sul client)
path = ['basilica.jpg']
files = [('request', open(img, 'rb')) for img in path]
# invia la richiesta tramite HTTP all'endpoint /predict/from_files
url = 'http://0.0.0.0:5543/predict/from_files'
resp = requests.post(url=url, files=files)
# la risposta viene restituita in JSON
annotations = json.loads(resp.text) # dizionario dei risultati di annotazione
bounding_boxes = annotations["boxes"]
labels = annotations["labels"]CLI di annotazione#
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 feed della webcam in diretta!
deepsparse.object_detection.annotate --model_filepath zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none --source basilica.jpgL'esecuzione del comando precedente crea una cartella annotation-results e salva al suo interno l'immagine annotata.

Prestazioni del benchmark#
Con lo script di benchmark di DeepSparse, confronteremo il throughput di DeepSparse con quello di ONNX Runtime su YOLOv5s.
I benchmark sono stati eseguiti su un'istanza AWS c6i.8xlarge (16 core).
Confronto delle prestazioni con batch 32#
Baseline di ONNX Runtime#
Con batch 32, ONNX Runtime raggiunge 42 immagini/sec con il modello YOLOv5s denso standard:
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1 -e onnxruntimeOriginal Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none Batch Size: 32 Scenario: sync Throughput (items/sec): 41.9025
Prestazioni di DeepSparse con modello denso#
DeepSparse offre le prestazioni migliori con modelli sparsi ottimizzati, ma funziona bene anche con il modello YOLOv5s denso standard.
Con batch 32, DeepSparse raggiunge 70 immagini/sec con il modello YOLOv5s denso standard: 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 1Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none Batch Size: 32 Scenario: sync Throughput (items/sec): 69.5546
Prestazioni di DeepSparse con modello sparso#
Quando il modello viene reso sparso, il vantaggio prestazionale di DeepSparse rispetto a ONNX Runtime aumenta ulteriormente.
Con batch 32, DeepSparse raggiunge 241 immagini/sec con il modello YOLOv5s potato e quantizzato: 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 1Original 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 con batch 1#
DeepSparse riesce a ottenere un aumento di velocità rispetto a ONNX Runtime anche nello scenario a batch 1, sensibile alla latenza.
Baseline di ONNX Runtime#
Con batch 1, ONNX Runtime raggiunge 48 immagini/sec con il modello YOLOv5s denso standard.
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 1 -nstreams 1 -e onnxruntimeOriginal Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none Batch Size: 1 Scenario: sync Throughput (items/sec): 48.0921
Prestazioni di DeepSparse con modello sparso#
Quando il modello viene reso sparso, il vantaggio prestazionale di DeepSparse rispetto a ONNX Runtime aumenta ulteriormente.
Con batch 1, DeepSparse raggiunge 135 immagini/sec con il modello YOLOv5s potato e quantizzato: un miglioramento delle 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 1Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none Batch Size: 1 Scenario: sync Throughput (items/sec): 134.9468
Poiché le istanze c6i.8xlarge dispongono di istruzioni VNNI, è possibile aumentare ulteriormente il throughput di DeepSparse potando i pesi in blocchi di 4.
Con batch 1, DeepSparse raggiunge 180 elementi/sec con un modello YOLOv5s potato e quantizzato in blocchi da 4: un aumento delle 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 1Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni Batch Size: 1 Scenario: sync Throughput (items/sec): 179.7375
Ecco fatto! Ora puoi ottimizzare la distribuzione di YOLOv5 con DeepSparse.
Inizia a usare Ultralytics YOLOv5 e DeepSparse#
Per contattarci, unisciti alla nostra community e inviaci domande e commenti. Dai un'occhiata al repository Ultralytics YOLOv5 e alla documentazione completa di Neural Magic per la distribuzione di YOLOv5.
In Ultralytics collaboriamo a livello commerciale con altre startup per finanziare la ricerca e lo sviluppo dei nostri fantastici strumenti open source, come YOLOv5, e mantenerli gratuiti per tutti. Questo articolo potrebbe contenere link di affiliazione ai nostri partner.









