Yolo Vision Shenzhen
Shenzhen
Iscriviti ora

Distribuisci Ultralytics YOLOv5 con DeepSparse di Neural Magic per prestazioni di classe GPU su CPU

Il team di Ultralytics

5 minuti di lettura

5 gennaio 2023

Potenzia l'addestramento e il deployment del modello Ultralytics YOLOv5 con DeepSparse di Neural Magic per prestazioni di classe GPU su CPU. Ottieni deployment YOLOv5 più rapidi e scalabili.

Vuoi accelerare l'addestramento e il deployment dei tuoi modelli YOLOv5? Abbiamo la soluzione che fa per te! Ti presentiamo il nostro nuovo partner, Neural Magic. Poiché Neural Magic fornisce strumenti software che enfatizzano le massime prestazioni del modello e la semplicità del flusso di lavoro, è naturale che ci siamo uniti per offrire una soluzione per migliorare ulteriormente il processo di deployment di YOLOv5.

DeepSparse è il runtime di inferenza CPU di Neural Magic, che sfrutta la sparsità e l'aritmetica a bassa precisione all'interno delle reti neurali per offrire prestazioni eccezionali su hardware standard. Ad esempio, rispetto alla baseline di ONNX Runtime, DeepSparse offre un aumento di velocità di 5,8 volte per YOLOv5s in esecuzione sulla stessa macchina!

Confronto del throughput di YOLOv5 con DeepSparse

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 prestazioni delle GPU e la semplicità del software:

  1. Deployment Flessibili: Esegui in modo coerente su cloud, data center ed edge con qualsiasi fornitore di hardware.
  2. Scalabilità infinita: Scala orizzontalmente con Kubernetes standard, verticalmente a centinaia di core o completamente astratta con serverless
  3. Facile integrazione: Utilizza API chiare per integrare il tuo modello in un'applicazione e monitorarlo in produzione.

Ottieni prestazioni di classe GPU su CPU standard

DeepSparse sfrutta la sparsità del modello per ottenere un aumento della velocità delle prestazioni.

La sparsificazione tramite pruning e quantizzazione consente riduzioni di ordine di grandezza nelle dimensioni e nel calcolo necessari per eseguire una rete, pur mantenendo un'elevata accuratezza. DeepSparse è sparsity-aware, ovvero salta le moltiplicazioni-somme per zero e riduce la quantità di calcolo in un forward pass. Poiché il calcolo sparso è memory-bound, DeepSparse esegue la rete depth-wise, suddividendo il problema in Tensor Columns, che sono strisce verticali di calcolo che rientrano nella cache.

DeepSparse e Rete Ultralytics YOLOv5

Le reti sparse con calcolo compresso, eseguite depth-wise nella cache, consentono a DeepSparse di offrire prestazioni di livello GPU sulle CPU!

Crea una versione sparsa di YOLOv5 addestrata su dati personalizzati

SparseZoo, il repository di modelli open-source di Neural Magic, contiene checkpoint pre-ottimizzati di ogni modello YOLOv5. Utilizzando SparseML, integrato con Ultralytics, è possibile ottimizzare un checkpoint sparse sui propri dati con un singolo comando CLI.

Deploy di YOLOv5 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 nel formato ONNX, passato come:

  • Un percorso locale a un modello ONNX
  • Uno stub di SparseZoo che identifica un modello in SparseZoo

Confronteremo lo YOLOv5s denso standard con lo YOLOv5s potato-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-none

Deploy di un modello

DeepSparse offre API convenienti per integrare il tuo modello in un'applicazione.

Per provare gli esempi di implementazione seguenti, scarica un'immagine di esempio per l'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.jpg

API Python

Le pipeline integrano pre-elaborazione e post-elaborazione dell'output attorno al runtime, fornendo un'interfaccia pulita per aggiungere DeepSparse a un'applicazione. L'integrazione DeepSparse-Ultralytics include una pipeline preconfigurata 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 una 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 bounding box + classi
pipeline_outputs = yolo_pipeline(images=images, iou_thres=0.6, conf_thres=0.001)
print(pipeline_outputs)

Se stai eseguendo l'applicazione nel cloud, potresti ricevere un errore che indica che open-cv non riesce a trovare libGL.so.1. L'esecuzione di quanto segue su Ubuntu lo installa:

apt-get install libgl1-mesa-glx

Server HTTP

DeepSparse Server viene eseguito sulla base del popolare framework web FastAPI e del server web Uvicorn. Con un solo comando CLI, puoi facilmente impostare un endpoint di servizio del modello con DeepSparse. Il server supporta qualsiasi Pipeline da DeepSparse, incluso il rilevamento di oggetti con YOLOv5, consentendoti di inviare immagini raw 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-none

Una richiesta di esempio, utilizzando il pacchetto requests di Python:

import requests, json

# elenco di immagini per l'inferenza (file locali sul lato 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 formato JSON
annotations = json.loads(resp.text) # dizionario dei risultati dell'annotazione
bounding_boxes = annotations["boxes"]
labels = annotations["labels"]

Annotate CLI

Puoi anche usare il comando annotate per fare in modo che il motore salvi una foto annotata sul disco. Prova --source 0 per annotare il tuo feed live dalla webcam!

deepsparse.object_detection.annotate --model_filepath zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none --source basilica.jpg

L'esecuzione del comando sopra indicato creerà una cartella annotation-results e salverà l'immagine annotata al suo interno.

Basilica annotata con YOLOv5

Prestazioni di benchmark

Utilizzando lo script di benchmarking di DeepSparse, confronteremo il throughput di DeepSparse con il throughput di ONNX Runtime su YOLOv5s.

I benchmark sono stati eseguiti su un'istanza AWS c6i.8xlarge (16 core).

Confronto delle prestazioni del Batch 32

Baseline ONNX Runtime

Al batch 32, ONNX Runtime raggiunge 42 immagini/sec con YOLOv5s standard e denso:

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1 -e onnxruntime

> Percorso del modello originale: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> Dimensione del batch: 32
> Scenario: sync
> Throughput (elementi/sec): 41.9025

Prestazioni Dense di DeepSparse

Sebbene DeepSparse offra le sue migliori prestazioni con modelli sparse ottimizzati, si comporta bene anche con il YOLOv5s denso standard.

Al batch 32, DeepSparse raggiunge 70 immagini/sec con YOLOv5s standard e denso: 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

> Percorso del modello originale: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> Dimensione del batch: 32
> Scenario: sync
> Throughput (elementi/sec): 69.5546

Prestazioni Sparse di DeepSparse

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 YOLOv5s potato-quantizzato: 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

> Percorso del modello originale: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
> Dimensione del batch: 32
> Scenario: sync
> Throughput (elementi/sec): 241.2452

Confronto delle prestazioni del Batch 1

DeepSparse è anche in grado di ottenere un'accelerazione rispetto a ONNX Runtime per lo scenario batch 1, sensibile alla latenza.

Baseline ONNX Runtime

Al batch 1, ONNX Runtime raggiunge 48 immagini/sec con YOLOv5s standard e denso.

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 1 -nstreams 1 -e onnxruntime

> Percorso del modello originale: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> Dimensione del batch: 1
> Scenario: sync
> Throughput (elementi/sec): 48.0921

Prestazioni Sparse di DeepSparse

Quando la sparsità viene applicata al modello, i guadagni di prestazioni di DeepSparse rispetto a ONNX Runtime sono ancora più forti.

Al batch 1, DeepSparse raggiunge 135 immagini/sec con YOLOv5s potato-quantizzato: un miglioramento delle 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 32 -nstreams 1

> Percorso del modello originale: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
> Dimensione del batch: 1
> Scenario: sync
> Throughput (elementi/sec): 134.9468

Poiché le istanze c6i.8xlarge dispongono di istruzioni VNNI, il throughput di DeepSparse può essere ulteriormente incrementato se i pesi vengono potati in blocchi di 4.

Al batch 1, DeepSparse raggiunge 180 elementi/sec con un YOLOv5s potato-quantizzato a 4 blocchi: un aumento delle 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

> Percorso del modello originale: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni
> Dimensione del batch: 1
> Scenario: sync
> Throughput (elementi/sec): 179.7375

Ed ecco fatto! Sei pronto per ottimizzare il tuo deployment di YOLOv5 con DeepSparse.

Inizia con YOLOv5 e DeepSparse

Per metterti in contatto con noi, unisciti alla nostra community e lasciaci le tue domande e i tuoi commenti. Dai un'occhiata al repository Ultralytics YOLOv5 e alla documentazione completa di Neural Magic per la distribuzione di YOLOv5.

In Ultralytics, collaboriamo commercialmente con altre startup per aiutarci a finanziare la ricerca e lo sviluppo dei nostri fantastici strumenti open-source, come YOLOv5, per mantenerli gratuiti per tutti. Questo articolo può contenere link di affiliazione a tali partner.

Costruiamo insieme il futuro
dell'AI!

Inizia il tuo viaggio con il futuro del machine learning

Inizia gratis
Link copiato negli appunti