Zum Inhalt springen

Neural Magic's DeepSparse

Willkommen bei softwaregestützter KI.

Dieser Leitfaden erklärt, wie du YOLOv5 mit Neural Magic's DeepSparse einsetzt.

DeepSparse ist eine Inferenz-Runtime mit außergewöhnlicher Leistung auf CPUs. Im Vergleich zur ONNX Runtime bietet DeepSparse zum Beispiel eine 5,8-fache Beschleunigung für YOLOv5s, und das auf demselben Rechner!

YOLOv5 Geschwindigkeitsverbesserung

Zum ersten Mal können deine Deep Learning-Workloads die Leistungsanforderungen der Produktion erfüllen, ohne die Komplexität und Kosten von Hardware-Beschleunigern. Kurz gesagt: DeepSparse bietet dir die Leistung von GPUs und die Einfachheit von Software:

  • Flexible Einsätze: Konsistenter Betrieb in der Cloud, im Rechenzentrum und im Edge-Bereich mit jedem Hardware-Anbieter von Intel über AMD bis ARM
  • Unendliche Skalierbarkeit: Vertikale Skalierung auf Hunderte von Kernen, mit Standard-Kubernetes oder vollständig abstrahiert mit Serverless
  • Einfache Integration: Saubere APIs für die Integration deines Modells in eine Anwendung und seine Überwachung in der Produktion

Wie erreicht DeepSparse eine Leistung der GPU-Klasse?

DeepSparse macht sich die Sparsamkeit des Modells zunutze, um seine Leistung zu steigern.

Sparsamkeit durch Beschneidung und Quantisierung ist eine weithin untersuchte Technik, die es ermöglicht, die Größe und den Rechenaufwand für die Ausführung eines Netzes um Größenordnungen zu reduzieren und gleichzeitig eine hohe Genauigkeit zu gewährleisten. DeepSparse ist sparsam, d. h., es überspringt die auf Null gesetzten Parameter und verringert so den Rechenaufwand in einem Vorwärtsdurchlauf. Da die spärliche Berechnung nun speichergebunden ist, führt DeepSparse das Netzwerk in der Tiefe aus und zerlegt das Problem in Tensor Spalten, vertikale Berechnungsstreifen, die in den Cache passen.

YOLO Modellbeschneidung

Sparse-Netzwerke mit komprimierten Berechnungen, die tiefenweise im Cache ausgeführt werden, ermöglichen DeepSparse eine Leistung der GPU-Klasse auf CPUs!

Wie erstelle ich eine Sparse-Version von YOLOv5 , die mit meinen Daten trainiert wurde?

Neural MagicDas Open-Source-Modell-Repository SparseZoo enthält vorgesparste Checkpoints für jedes YOLOv5 Modell. Mit SparseML, das in Ultralytics integriert ist, kannst du einen Sparse-Checkpoint mit einem einzigen CLI Befehl auf deine Daten abstimmen.

Weitere Informationen findest du in der Dokumentation von Neural Magic unter YOLOv5 .

DeepSparse Verwendung

Wir werden ein Beispiel durchgehen, bei dem wir eine Sparse-Version von YOLOv5s mit DeepSparse testen und einsetzen.

DeepSparse installieren

Führe das Folgende aus, um DeepSparse zu installieren. Wir empfehlen dir, eine virtuelle Umgebung mit Python zu verwenden.

pip install "deepsparse[server,yolo,onnxruntime]"

Sammle eine ONNX Datei

DeepSparse akzeptiert ein Modell im ONNX Format, das entweder als:

  • Ein SparseZoo-Stub, der eine ONNX Datei im SparseZoo identifiziert
  • Ein lokaler Pfad zu einem ONNX Modell in einem Dateisystem

Die folgenden Beispiele verwenden die standardmäßigen dichten und beschnittenen YOLOv5s-Checkpoints, die durch die folgenden SparseZoo-Stubs gekennzeichnet sind:

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

Ein Modell bereitstellen

DeepSparse bietet praktische APIs, um dein Modell in eine Anwendung zu integrieren.

Um die folgenden Einsatzbeispiele auszuprobieren, ziehe ein Beispielbild herunter und speichere es als basilica.jpg mit den folgenden:

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

Python API

Pipelines wrap pre-processing und output post-processing um die Runtime herum und bietet eine saubere Schnittstelle, um DeepSparse zu einer Anwendung hinzuzufügen. Die DeepSparse-Ultralytics Integration umfasst eine sofort einsatzbereite Pipeline die Rohbilder akzeptiert und die Begrenzungsrahmen ausgibt.

Erstellen einer Pipeline und Inferenz durchführen:

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)

Wenn du in der Cloud arbeitest, kann es sein, dass du eine Fehlermeldung erhältst, dass open-cv nicht gefunden werden kann libGL.so.1. Wenn du das Folgende unter Ubuntu ausführst, wird es installiert:

apt-get install libgl1

HTTP-Server

DeepSparse Server läuft auf dem beliebten FastAPI Web Framework und dem Uvicorn Webserver. Mit nur einem einzigen CLI Befehl kannst du ganz einfach einen Modelldienst-Endpunkt mit DeepSparse einrichten. Der Server unterstützt alle Pipelines von DeepSparse, einschließlich der Objekterkennung mit YOLOv5. So kannst du Rohbilder an den Endpunkt senden und die Boundingboxen empfangen.

Schalte den Server mit den beschnittenen YOLOv5s ein:

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

Ein Beispiel für eine Anfrage, die Python requests Paket:

import requests, json

# 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"]

Kommentiere CLI

Du kannst auch den Befehl annotate verwenden, damit die Engine ein kommentiertes Foto auf der Festplatte speichert. Probiere --source 0 aus, um deinen Live-Webcam-Feed mit Anmerkungen zu versehen!

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

Die Ausführung des obigen Befehls erstellt eine annotation-results Ordner und speichere das kommentierte Bild darin.

kommentiert

Benchmarking Leistung

Wir werden den Durchsatz von DeepSparse mit dem Durchsatz von ONNX Runtime auf YOLOv5s vergleichen, indem wir das Benchmarking-Skript von DeepSparse verwenden.

Die Benchmarks wurden auf einer AWS c6i.8xlarge Instanz (16 Kerne).

Batch 32 Leistungsvergleich

ONNX Laufzeit Baseline

Bei Batch 32 erreicht ONNX Runtime 42 Bilder/Sek. mit den standardmäßig dichten YOLOv5s:

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

DeepSparse Dense Leistung

Obwohl DeepSparse seine beste Leistung mit optimierten Sparse-Modellen erbringt, funktioniert es auch mit den standardmäßigen dichten YOLOv5-Modellen gut.

Bei Batch 32 erreicht DeepSparse 70 Bilder/Sek. mit den standardmäßigen 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

> Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> Batch Size: 32
> Scenario: sync
> Throughput (items/sec): 69.5546

DeepSparse Sparse Leistung

Wenn Sparsity auf das Modell angewandt wird, ist der Leistungsgewinn von DeepSparse gegenüber ONNX Runtime noch größer.

Bei Batch 32 erreicht DeepSparse 241 Bilder/Sek. mit den quantisierten 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

> Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
> Batch Size: 32
> Scenario: sync
> Throughput (items/sec): 241.2452

Batch 1 Leistungsvergleich

DeepSparse ist auch in der Lage, einen Geschwindigkeitsvorteil gegenüber ONNX Runtime für das latenzabhängige Batch-1-Szenario zu erzielen.

ONNX Laufzeit Baseline

Bei Batch 1 erreicht ONNX Runtime 48 Bilder/Sek. mit den standardmäßigen, dichten YOLOv5s.

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 Sparse Leistung

Bei Batch 1 erreicht DeepSparse 135 Items/Sek. mit einem pruned-quantized YOLOv5s, ein 2,8-facher Leistungsgewinn gegenüber 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

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

Bei Batch 1 erreicht DeepSparse 180 Items/Sek. mit einem 4-Block pruned-quantized YOLOv5s, eine 3,7-fache Leistungssteigerung gegenüber 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

Mit DeepSparse loslegen

Forschen oder Testen? Die DeepSparse Community ist für Forschung und Tests kostenlos. Beginne mit unserer Dokumentation.



Erstellt am 2023-11-12, Aktualisiert am 2024-03-19
Autoren: glenn-jocher (4)

Kommentare