Neural MagicのDeepSparseを使用してYOLOv5をデプロイする

ソフトウェア主導のAIへようこそ。

本ガイドでは、Neural MagicのDeepSparseを使用してYOLOv5をデプロイする方法を説明します。

DeepSparseは、CPU上で優れたパフォーマンスを発揮する推論ランタイムです。例えば、ONNX Runtimeのベースラインと比較して、DeepSparseは同じマシン上で実行した場合、YOLOv5sに対して5.8倍の高速化を実現します。

YOLOv5 DeepSparse vs ONNX Runtime speed comparison chart

初めて、ディープラーニングのワークロードが、ハードウェアアクセラレータの複雑さやコストをかけずに、本番環境のパフォーマンス要求を満たせるようになります。簡単に言えば、DeepSparseはGPU並みのパフォーマンスとソフトウェアの簡便さを提供します。

  • 柔軟なデプロイメント: IntelからAMD、ARMまで、あらゆるハードウェアプロバイダーを使用して、クラウド、データセンター、エッジ環境で一貫して実行可能です。
  • 無限のスケーラビリティ: 数百コアへの垂直スケール、標準的なKubernetesを使用した水平スケール、あるいはサーバーレスによる完全な抽象化が可能です。
  • 簡単な統合: モデルをアプリケーションに統合し、本番環境で監視するためのクリーンなAPIを備えています。

DeepSparseはどのようにしてGPUクラスのパフォーマンスを実現しているのでしょうか?

DeepSparseはモデルのスパース性(疎性)を活用してパフォーマンスを向上させています。

プルーニングと量子化によるスパース化は広く研究されている手法であり、ネットワーク実行に必要なサイズと計算量を桁違いに削減しつつ、高い精度を維持できます。DeepSparseはスパース性を認識しており、ゼロ化されたパラメータをスキップすることで、フォワードパスにおける計算量を削減します。スパース計算はメモリ境界となるため、DeepSparseはネットワークを深さ方向に実行し、問題を「テンソルカラム(Tensor Columns)」、つまりキャッシュに収まる計算の垂直ストライプに分割します。

DeepSparse tensor columns for sparse neural network inference

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

データで学習させたYOLOv5のスパースバージョンをどのように作成すればよいですか?

Neural MagicのオープンソースモデルリポジトリであるSparseZooには、各YOLOv5モデルのスパース化済みチェックポイントが含まれています。Ultralyticsと統合されたSparseMLを使用することで、単一のCLIコマンドでスパースチェックポイントをデータに合わせてファインチューニングできます。

詳細はNeural MagicのYOLOv5ドキュメントを参照してください

DeepSparseの利用

YOLOv5sのスパースバージョンをDeepSparseでベンチマークおよびデプロイする例を紹介します。

DeepSparseのインストール

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

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

ONNXファイルの取得

DeepSparseは、以下のいずれかの形式で渡されるONNX形式のモデルを受け入れます:

  • SparseZoo内のONNXファイルを特定するSparseZooスタブ
  • ファイルシステム上のONNXモデルへのローカルパス

以下の例では、標準のデンス(密)およびプルーニング・量子化済みYOLOv5sチェックポイントを使用し、それらは以下のSparseZooスタブによって識別されます:

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)

クラウドで実行している場合、OpenCVがlibGL.so.1を見つけられずエラーになることがあります。不足しているライブラリをインストールするか:

apt-get install libgl1

あるいは、GUI依存関係を完全に回避するヘッドレスのUltralyticsパッケージを使用してください:

pip install ultralytics-opencv-headless

HTTPサーバー

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

プルーニング・量子化済みYOLOv5sを使用してサーバーを起動します:

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

Pythonのrequestsパッケージを使用したリクエストの例:

import json

import requests

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

Annotate CLI

annotateコマンドを使用して、エンジンにアノテーション付き写真をディスクに保存させることもできます。ライブWebカメラフィードにアノテーションを付けるには--source 0を試してください!

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

上記コマンドを実行するとannotation-resultsフォルダが作成され、その中にアノテーション付き画像が保存されます。

YOLOv5 detection results with bounding boxes

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

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

ベンチマークはAWSのc6i.8xlargeインスタンス(16コア)で実行されました。

バッチサイズ32のパフォーマンス比較

ONNX Runtimeのベースライン

バッチサイズ32において、ONNX Runtimeは標準的なデンスYOLOv5sで毎秒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デンスパフォーマンス

DeepSparseは最適化されたスパースモデルで最高のパフォーマンスを発揮しますが、標準的なデンスYOLOv5sでも十分に機能します。

バッチサイズ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のスパースパフォーマンス

モデルにスパース性を適用すると、ONNX Runtimeに対するDeepSparseのパフォーマンス向上はさらに顕著になります。

バッチサイズ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 Runtimeのベースライン

バッチサイズ1において、ONNX Runtimeは標準のデンスYOLOv5sで毎秒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はプルーニング・量子化済みYOLOv5sで毎秒135アイテムを達成し、ONNX Runtimeと比較して2.8倍のパフォーマンス向上を実現しました!

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は研究やテスト目的で無料で使用できます。ドキュメントから始めてください。

DeepSparseでのYOLOv5デプロイに関する詳細については、Neural MagicのDeepSparseドキュメントおよびDeepSparse統合に関するUltralyticsブログ記事を参照してください。

コメント