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

Team Ultralytics

5 minuti di lettura

5 gennaio 2023

Potenziate l'addestramento e la distribuzione dei modelli YOLOv5 di Ultralytics con DeepSparse di Neural Magic per ottenere prestazioni di classe GPU su CPU. Ottenete implementazioni YOLOv5 più rapide e scalabili.

Volete accelerare la formazione e la distribuzione dei vostri modelli YOLOv5? Ci pensiamo noi! Vi presentiamo il nostro nuovo partner, Neural Magic. Poiché Neural Magic fornisce strumenti software che enfatizzano le massime prestazioni dei modelli e la semplicità del flusso di lavoro, è naturale che ci siamo uniti per offrire una soluzione che renda il processo di distribuzione di YOLOv5 ancora migliore.

DeepSparse è il runtime di inferenza per CPU di Neural Magic, che sfrutta la spazialità e l'aritmetica a bassa precisione delle reti neurali per offrire prestazioni eccezionali su hardware commodity. Ad esempio, rispetto al Runtime ONNX di base, DeepSparse offre una velocità di 5,8 volte superiore per YOLOv5 in esecuzione sulla stessa macchina!

Confronto del throughput di YOLOv5 con DeepSparse

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:

  1. Distribuzioni flessibili: Esecuzione coerente su cloud, data center ed edge con qualsiasi fornitore di hardware.
  2. Scalabilità infinita: Scalabilità con Kubernetes standard, verticale fino a 100 core o completamente astratta con serverless.
  3. Facile integrazione: Utilizzare API pulite per integrare il modello in un'applicazione e monitorarlo in produzione.

Ottenere prestazioni di classe GPU su CPU commodity

DeepSparse sfrutta la sparsità del modello per aumentare la velocità delle prestazioni.

La sparsificazione attraverso la potatura e la quantizzazione consente di ridurre di un ordine di grandezza le dimensioni e i calcoli necessari per l'esecuzione di una rete, mantenendo un'elevata precisione. DeepSparse è consapevole della sparsità, saltando le aggiunte di moltiplicazione per zero e riducendo la quantità di calcolo in un passaggio in avanti. Poiché il calcolo rado è legato alla memoria, DeepSparse esegue la rete in profondità, suddividendo il problema in colonne di tensori, strisce verticali di calcolo che possono essere inserite nella cache.

Rete DeepSparse e Ultralytics YOLOv5

Le reti sparse con calcolo compresso, eseguite in profondità nella cache, consentono a DeepSparse di offrire prestazioni di classe GPU sulle CPU!

Creare una versione sparsa di YOLOv5 addestrata su dati personalizzati

L'archivio di modelli open-source di Neural Magic, SparseZoo, contiene checkpoint pre-sparsificati di ogni modello YOLOv5. Utilizzando SparseML, integrato con Ultralytics, è possibile mettere a punto un checkpoint sparse sui dati con un unico comando CLI.

Distribuzione di YOLOv5 con DeepSparse

Installare DeepSparse

Eseguire quanto segue per installare DeepSparse. Si consiglia di utilizzare un ambiente virtuale con Python.

pip installare deepsparse[server,yolo,onnxruntime]

Raccogliere un file ONNX

DeepSparse accetta un modello nel formato ONNX, passato come:

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

Confronteremo le YOLOv5 dense standard con le YOLOv5 potate-quantizzate, identificate 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, estraete un'immagine di esempio e salvatela 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 avvolgono la pre-elaborazione e la post-elaborazione dell'output attorno al runtime, fornendo un'interfaccia pulita per aggiungere DeepSparse a un'applicazione. L'integrazione DeepSparse-Ultralytics include una pipeline pronta all'uso che accetta immagini grezze e produce i riquadri di delimitazione.

Creare una pipeline ed eseguire l'inferenza:

da deepsparse import Pipeline

# elenco di immagini nel filesystem locale
immagini = ["basilica.jpg"]

# creare 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,
)

# eseguire l'inferenza sulle immagini, ricevere le bounding box + le classi
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 riesce a trovare libGL.so.1. Eseguire il seguente comando su Ubuntu lo installa:

apt-get installare libgl1-mesa-glx

Server HTTP

DeepSparse Server si basa sul famoso framework web FastAPI e sul server web Uvicorn. Con un solo comando CLI, è possibile impostare 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 il pacchetto requests di Python:

importare richieste, json

# lista di immagini per l'inferenza (file locali sul lato client)
path = ['basilica.jpg']
files = [('request', open(img, 'rb')) for img in path]

# invia una richiesta via 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 delle annotazioni
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à 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 quello di ONNX Runtime su YOLOv5s.

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

Confronto delle prestazioni del batch 32

Linea di base del runtime ONNX

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

> Percorso del modello originale: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> Dimensione del batch: 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 lo standard denso YOLOv5, con unmiglioramento 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 (items/sec): 69.5546

DeepSparse Prestazioni sparse

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

Al batch 32, DeepSparse raggiunge 241 immagini/sec con YOLOv5 pruned-quantized, unmiglioramento 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 (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.

Linea di base del runtime ONNX

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

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

DeepSparse Prestazioni sparse

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

Al batch 1, DeepSparse raggiunge 135 immagini/sec con YOLOv5 pruned-quantized, unmiglioramento 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 (items/sec): 134.9468

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

Al batch 1, DeepSparse raggiunge 180 item/sec con un YOLOv5 pruned-quantized a 4 blocchi: unguadagno 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

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

E voilà! Siete pronti a ottimizzare la vostra distribuzione di YOLOv5 con DeepSparse.

Iniziare con YOLOv5 e DeepSparse

Per entrare in contatto con noi, unitevi alla nostra comunità e lasciateci le vostre domande e i vostri commenti. Consultate il repository Ultralytics YOLOv5 e la 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'IA!

Iniziate il vostro viaggio nel futuro dell'apprendimento automatico

Iniziare gratuitamente
Link copiato negli appunti