Yolo Vision Shenzhen
Shenzhen
Jetzt beitreten

Bereitstellung von Ultralytics YOLOv5 mit Neural Magic’s DeepSparse für GPU-ähnliche Leistung auf CPUs

Ultralytics Team

5 Min. Lesezeit

5. Januar 2023

Optimieren Sie das Training und die Bereitstellung von Ultralytics YOLOv5-Modellen mit Neural Magic's DeepSparse für GPU-ähnliche Leistung auf CPUs. Erzielen Sie schnellere, skalierbare YOLOv5-Bereitstellungen.

Möchten Sie das Training und die Bereitstellung Ihrer YOLOv5-Modelle beschleunigen? Wir haben die Lösung! Wir stellen Ihnen unseren neuesten Partner Neural Magic vor. Da Neural Magic Softwaretools anbietet, die die maximale Modellleistung und Workflow-Einfachheit betonen, ist es nur natürlich, dass wir zusammengekommen sind, um eine Lösung anzubieten, die den YOLOv5-Bereitstellungsprozess noch besser macht.

DeepSparse ist die CPU-Inferenz-Runtime von Neural Magic, die die Vorteile von Sparsity und Low-Precision-Arithmetik innerhalb neuronaler Netze nutzt, um eine außergewöhnliche Leistung auf Standardhardware zu bieten. Im Vergleich zur ONNX Runtime-Baseline bietet DeepSparse beispielsweise eine 5,8-fache Beschleunigung für YOLOv5s, das auf derselben Maschine läuft!

YOLOv5 Durchsatzvergleich mit DeepSparse

Zum ersten Mal können Ihre Deep-Learning-Workloads die Leistungsanforderungen der Produktion erfüllen, ohne die Komplexität und die Kosten von Hardwarebeschleunigern. Einfach ausgedrückt: DeepSparse bietet Ihnen die Leistung von GPUs und die Einfachheit von Software:

  1. Flexible Bereitstellungen: Einheitliche Ausführung in Cloud-, Rechenzentrums- und Edge-Umgebungen mit jedem Hardwareanbieter
  2. Unendliche Skalierbarkeit: Skalieren Sie mit Standard-Kubernetes, vertikal auf Hunderte von Kernen oder vollständig abstrahiert mit Serverless.
  3. Einfache Integration: Verwenden Sie saubere APIs, um Ihr Modell in eine Anwendung zu integrieren und es in der Produktion zu überwachen.

GPU-Klassen-Performance auf Standard-CPUs erreichen

DeepSparse nutzt die Modellsparsität, um seine Leistungssteigerung zu erzielen.

Sparsifizierung durch Pruning und Quantisierung ermöglicht eine Reduzierung der Größe und des Rechenaufwands, der für die Ausführung eines Netzwerks erforderlich ist, um Größenordnungen, während gleichzeitig eine hohe Genauigkeit erhalten bleibt. DeepSparse ist sich der Sparsity bewusst, überspringt die Multiplizier-Addierer mit Null und reduziert den Rechenaufwand in einem Vorwärtsdurchlauf. Da Sparse-Berechnungen speichergebunden sind, führt DeepSparse das Netzwerk tiefenweise aus und zerlegt das Problem in Tensor-Spalten, d. h. vertikale Berechnungsstreifen, die in den Cache passen.

DeepSparse und Ultralytics YOLOv5 Netzwerk

Sparse Netzwerke mit komprimierter Berechnung, die tiefenweise im Cache ausgeführt werden, ermöglichen es DeepSparse, GPU-ähnliche Leistung auf CPUs zu liefern!

Erstellen einer Sparse-Version von YOLOv5, die mit benutzerdefinierten Daten trainiert wurde

SparseZoo, das Open-Source-Modell-Repository von Neural Magic, enthält vorab mit Sparsifizierung versehene Checkpoints jedes YOLOv5-Modells. Mit SparseML, das in Ultralytics integriert ist, können Sie einen Sparse-Checkpoint mit einem einzigen CLI-Befehl auf Ihre Daten feinabstimmen.

YOLOv5 mit DeepSparse bereitstellen

DeepSparse installieren

Führen Sie Folgendes aus, um DeepSparse zu installieren. Wir empfehlen die Verwendung einer virtuellen Umgebung mit Python.

pip install deepsparse[server,yolo,onnxruntime]

Eine ONNX-Datei sammeln

DeepSparse akzeptiert ein Modell im ONNX-Format, das entweder übergeben wird als:

  • Ein lokaler Pfad zu einem ONNX-Modell
  • Ein SparseZoo-Stub, der ein Modell in der SparseZoo identifiziert

Wir werden das standardmäßige dichte YOLOv5s mit dem gestutzten-quantisierten YOLOv5s vergleichen, das durch die folgenden SparseZoo-Stubs identifiziert wird:

zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none

Modell bereitstellen

DeepSparse bietet komfortable APIs für die Integration Ihres Modells in eine Anwendung.

Um die folgenden Deployment-Beispiele auszuprobieren, laden Sie ein Beispielbild für das Beispiel herunter und speichern Sie es mit dem folgenden Befehl als basilica.jpg:

wget -O basilica.jpg https://raw.githubusercontent.com/neuralmagic/deepsparse/main/src/deepsparse/yolo/sample_images/basilica.jpg

Python API

Pipelines umschließen die Vor- und Nachverarbeitung der Ausgabe um die Laufzeit herum und bieten eine saubere Schnittstelle, um DeepSparse zu einer Anwendung hinzuzufügen. Die DeepSparse-Ultralytics-Integration umfasst eine sofort einsatzbereite Pipeline, die Rohbilder akzeptiert und die Bounding Boxes ausgibt.

Erstellen Sie eine Pipeline und führen Sie Inferenz aus:

from deepsparse import Pipeline

# Liste der Bilder im lokalen Dateisystem
images = ["basilica.jpg"]

# Pipeline erstellen
model_stub = "zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none"
yolo_pipeline = Pipeline.create(
task="yolo",
model_path=model_stub,
)

# Inferenz auf Bildern ausführen, Bounding Boxes + Klassen empfangen
pipeline_outputs = yolo_pipeline(images=images, iou_thres=0.6, conf_thres=0.001)
print(pipeline_outputs)

Wenn Sie in der Cloud arbeiten, erhalten Sie möglicherweise eine Fehlermeldung, dass Open-CV libGL.so.1 nicht finden kann. Die folgende Ausführung unter Ubuntu installiert es:

apt-get install libgl1-mesa-glx

HTTP-Server

DeepSparse Server läuft auf dem populären FastAPI Web Framework und Uvicorn Web Server. Mit nur einem einzigen CLI-Befehl können Sie einfach einen Model Service Endpoint mit DeepSparse einrichten. Der Server unterstützt jede Pipeline von DeepSparse, einschließlich Objekterkennung mit YOLOv5, wodurch Sie Rohbilder an den Endpoint senden und die Bounding Boxes empfangen können.

Starten Sie den Server mit dem pruned-quantized YOLOv5s:

deepsparse.server \
    --task yolo \
    --model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none

Eine Beispielanfrage mit dem Python-Paket Requests:

import requests, json

# Liste der Bilder für die Inferenz (lokale Dateien auf der Client-Seite)
path = ['basilica.jpg']
files = [('request', open(img, 'rb')) for img in path]

# Anfrage über HTTP an den /predict/from_files-Endpunkt senden
url = 'http://0.0.0.0:5543/predict/from_files'
resp = requests.post(url=url, files=files)

# Antwort wird in JSON zurückgegeben
annotations = json.loads(resp.text) # Dictionary der Annotationsergebnisse
bounding_boxes = annotations["boxes"]
labels = annotations["labels"]

Annotate CLI

Sie können den Befehl annotate auch verwenden, damit die Engine ein annotiertes Foto auf der Festplatte speichert. Probieren Sie --source 0 aus, um Ihren Live-Webcam-Feed zu annotieren!

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

Durch Ausführen des obigen Befehls wird ein Ordner mit Annotationsergebnissen erstellt und das annotierte Bild darin gespeichert.

Annotierte Basilika mit YOLOv5

Benchmark-Leistung

Mithilfe des Benchmarking-Skripts von DeepSparse vergleichen wir den Durchsatz von DeepSparse mit dem Durchsatz von ONNX Runtime auf YOLOv5s.

Die Benchmarks wurden auf einer AWS c6i.8xlarge-Instanz (16 Kerne) ausgeführt.

Performance-Vergleich Batch 32

ONNX Runtime Baseline

Bei Batch 32 erreicht ONNX Runtime 42 Bilder/Sek. mit dem Standard, dichten YOLOv5s:

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

> Ursprünglicher Modellpfad: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> Batch-Größe: 32
> Szenario: sync
> Durchsatz (Elemente/Sek.): 41.9025

DeepSparse Dichte Leistung

Obwohl DeepSparse seine beste Leistung mit optimierten Sparse-Modellen bietet, funktioniert es auch gut mit dem Standard-Dense-YOLOv5s.

Bei Batch 32 erreicht DeepSparse 70 Bilder/Sek. mit dem Standard, dichten YOLOv5s – eine 1,7-fache Leistungssteigerung gegenüber ORT!

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

> Ursprünglicher Modellpfad: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> Batch-Größe: 32
> Szenario: sync
> Durchsatz (Elemente/Sek.): 69.5546

DeepSparse Sparse Leistung

Wenn Sparsity auf das Modell angewendet wird, sind die Leistungsvorteile von DeepSparse gegenüber ONNX Runtime noch stärker.

Bei Batch 32 erreicht DeepSparse 241 Bilder/Sek. mit dem pruned-quantized YOLOv5s – eine 5,8-fache Leistungssteigerung gegenüber ORT!

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

> Ursprünglicher Modellpfad: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
> Batch-Größe: 32
> Szenario: sync
> Durchsatz (Elemente/Sek.): 241.2452

Performance-Vergleich Batch 1

DeepSparse ist auch in der Lage, gegenüber ONNX Runtime eine Beschleunigung für das latenzempfindliche Batch-1-Szenario zu erzielen.

ONNX Runtime Baseline

Bei Batch 1 erreicht ONNX Runtime 48 Bilder/Sek. mit dem Standard, dichten YOLOv5s.

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

> Ursprünglicher Modellpfad: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> Batch-Größe: 1
> Szenario: sync
> Durchsatz (Elemente/Sek.): 48.0921

DeepSparse Sparse Leistung

Wenn Sparsity auf das Modell angewendet wird, sind die Leistungsvorteile von DeepSparse gegenüber ONNX Runtime noch stärker.

Bei Batch 1 erreicht DeepSparse 135 Bilder/Sek. mit dem pruned-quantized YOLOv5s – eine 2,8-fache Leistungssteigerung gegenüber ONNX Runtime!

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

> Ursprünglicher Modellpfad: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
> Batch-Größe: 1
> Szenario: sync
> Durchsatz (Elemente/Sek.): 134.9468

Da c6i.8xlarge-Instanzen über VNNI-Anweisungen verfügen, kann der Durchsatz von DeepSparse weiter gesteigert werden, wenn Gewichte in 4er-Blöcken reduziert werden.

Bei Batch 1 erreicht DeepSparse 180 Elemente/Sek. mit einem 4-Block pruned-quantized YOLOv5s – ein 3,7-facher Leistungszuwachs gegenüber ONNX Runtime!

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni -s sync -b 1 -nstreams 1

> Ursprünglicher Modellpfad: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni
> Batch-Größe: 1
> Szenario: sync
> Durchsatz (Elemente/Sek.): 179.7375

Und voilà! Sie sind bereit, Ihre YOLOv5-Bereitstellung mit DeepSparse zu optimieren.

Erste Schritte mit YOLOv5 und DeepSparse

Um mit uns in Kontakt zu treten, treten Sie unserer Community bei und hinterlassen Sie uns Ihre Fragen und Kommentare. Sehen Sie sich das Ultralytics YOLOv5 Repository und die vollständige Neural Magic-Dokumentation für die Bereitstellung von YOLOv5 an.

Wir bei Ultralytics arbeiten kommerziell mit anderen Startups zusammen, um die Forschung und Entwicklung unserer großartigen Open-Source-Tools wie YOLOv5 zu finanzieren, damit sie für alle kostenlos bleiben. Dieser Artikel kann Affiliate-Links zu diesen Partnern enthalten.

Lasst uns gemeinsam die Zukunft
der KI gestalten!

Beginnen Sie Ihre Reise mit der Zukunft des maschinellen Lernens

Kostenlos starten
Link in die Zwischenablage kopiert