コンテンツへスキップ

Neural MagicのDeepSparse

ソフトウェアで提供されるAIへようこそ。

このガイドでは、Neural Magic の DeepSparse を使用してYOLOv5 を展開する方法を説明します。

DeepSparseは、CPU上で卓越したパフォーマンスを発揮する推論ランタイムです。例えば、ONNX Runtimeのベースラインと比較して、DeepSparseは同じマシン上で実行されるYOLOv5sに対して5.8倍のスピードアップを提供します!

YOLOv5 スピードアップ

初めて、ディープラーニングのワークロードは、ハードウェアアクセラレータの複雑さとコストを伴わずに、実稼働環境でのパフォーマンス要求を満たすことができます。簡単に言えば、DeepSparseはGPUのパフォーマンスとソフトウェアのシンプルさを提供します:

  • 柔軟な展開:Intel、AMD、ARMなど、あらゆるハードウェア・プロバイダを使用して、クラウド、データセンター、エッジで一貫して実行できます。
  • 無限のスケーラビリティ:標準的なKubernetesを使用して、またはServerlessを使用して完全に抽象化された、数百のコアに垂直にスケールします。
  • 簡単な統合:モデルをアプリケーションに統合し、本番環境でモニタリングするためのクリーンなAPI

DeepSparseはどのようにしてGPUクラスの性能を実現しているのか?

DeepSparseは、モデルのスパース性を利用して性能の高速化を図っている。

刈り込みと量子化によるスパース化は広く研究されている手法であり、高い精度を維持しながら、ネットワークの実行に必要なサイズと計算量を桁違いに削減できる。DeepSparseはスパース化を意識しており、ゼロ化されたパラメータをスキップし、フォワードパスでの計算量を削減します。DeepSparseは、スパース計算がメモリに束縛されるようになったため、深さ方向にネットワークを実行し、問題をTensor 、キャッシュに収まる計算の縦縞に分割します。

YOLO モデル刈り込み

圧縮された計算をキャッシュ内で深さ方向に実行するスパース・ネットワークにより、DeepSparseはCPU上でGPUクラスのパフォーマンスを実現します!

自分のデータで訓練したYOLOv5 のスパース・バージョンを作成するには?

Neural MagicのオープンソースモデルリポジトリであるSparseZooには、YOLOv5 各モデルのスパース済みチェックポイントが含まれています。Ultralytics と統合されている SparseML を使えば、CLI コマンドひとつで、スパースチェックポイントをデータに微調整することができます。

詳しくは Neural Magic のYOLOv5 ドキュメントをご覧ください。

DeepSparseの使用法

DeepSparseを使用したYOLOv5sのスパース・バージョンのベンチマークとデプロイの例を説明する。

DeepSparse のインストール

以下を実行して、DeepSparse をインストールします。Python の仮想環境を使用することをお勧めします。

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

ONNX ファイルの収集

DeepSparse は、ONNX 形式のモデルを受け取ります:

  • SparseZooのスタブで、SparseZooのONNX 。
  • ファイルシステム内のONNX モデルへのローカルパス。

以下の例では、以下のSparseZooスタブで識別される、標準的な密なYOLOv5sチェックポイントとプルーニングされた量子化YOLOv5sチェックポイントを使用しています:

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

モデルを配置する

DeepSparseは、モデルをアプリケーションに統合するための便利なAPIを提供します。

以下の配置例を試すには、サンプル画像をプルダウンして、次のように保存します。 basilica.jpg 以下のように:

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

Python API

Pipelines 前処理と出力の後処理をランタイムでラップし、アプリケーションにDeepSparseを追加するためのクリーンなインタフェースを提供します。DeepSparse-Ultralytics の統合には、すぐに使用できる Pipeline これは生の画像を受け取り、バウンディングボックスを出力する。

を作成する。 Pipeline と推論を実行する:

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)

クラウド上で実行している場合、open-cvが見つからないというエラーが出るかもしれません。 libGL.so.1.Ubuntuで以下を実行するとインストールされる:

apt-get install libgl1

HTTPサーバー

DeepSparse Serverは、人気の高いFastAPI WebフレームワークとUvicorn Webサーバーの上で動作します。CLI コマンドを 1 つ実行するだけで、DeepSparse を使用したモデルサービスのエンドポイントを簡単にセットアップできます。Serverは、YOLOv5 によるオブジェクト検出を含む、DeepSparseからのあらゆるPipelineをサポートしており、生画像をエンドポイントに送信し、バウンディングボックスを受信することができます。

プルーニングされたYOLOv5でサーバーをスピンアップする:

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

Python を使ったリクエストの例 requests パッケージで提供される:

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

注釈CLI

annotateコマンドを使えば、エンジンが注釈付き写真をディスクに保存することもできます。ライブ・ウェブカメラ・フィードに注釈を付けるには、-source 0を試してください!

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

上記のコマンドを実行すると annotation-results フォルダの中に注釈付き画像を保存します。

注釈付き

パフォーマンスのベンチマーク

DeepSparseのベンチマーク・スクリプトを使用して、YOLOv5s上でDeepSparseのスループットとONNX Runtimeのスループットを比較します。

ベンチマークはAWS c6i.8xlarge インスタンス(16コア)。

バッチ32の性能比較

ONNX ランタイム・ベースライン

バッチ32では、ONNX Runtimeは、標準的な高密度のYOLOv5で42画像/秒を達成した:

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 パフォーマンス

DeepSparseは最適化されたスパース・モデルで最高の性能を発揮するが、標準的な密なYOLOv5でも十分な性能を発揮する。

バッチ32では、DeepSparseは標準的な高密度のYOLOv5sで70画像/秒を達成し、ORTの1.7倍の性能向上を実現した!

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 スパース・パフォーマンス

モデルにスパース性を適用すると、DeepSparseの性能はONNX Runtimeよりもさらに向上する。

バッチ32では、DeepSparseは、プルーニングされた量子化YOLOv5sで241画像/秒を達成し、ORTの5.8倍の性能向上を実現した!

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

バッチ1のパフォーマンス比較

DeepSparseは、レイテンシを重視するバッチ1のシナリオにおいても、ONNX Runtimeを上回るスピードアップを実現しています。

ONNX ランタイム・ベースライン

バッチ1では、ONNX Runtimeは、標準的な高密度のYOLOv5で48画像/秒を達成した。

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 スパース・パフォーマンス

バッチ1では、DeepSparseは、 ONNX Runtimeと比較して2.8倍の性能向上である、プルーニングされた量子化YOLOv5sで135アイテム/秒を達成した!

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

以来 c6i.8xlarge インスタンスに VNNI 命令がある場合、重みを 4 単位で刈り込めば、DeepSparse のスループットはさらに向上する。

バッチ1では、DeepSparseは4ブロック刈り込み量子化YOLOv5sで180アイテム/秒を達成し、 ONNX Runtimeと比較して3.7倍の性能向上を実現した!

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

DeepSparseを使い始める

研究かテストか?DeepSparse Communityは、研究やテストに無料でご利用いただけます。まずはドキュメントをご覧ください。



作成日:2023-11-12 更新日:2023-12-03
作成者:glenn-jocher(3)

コメント