コンテンツにスキップ

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

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

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

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

YOLOv5 の速度向上

ディープラーニングのワークロードは、ハードウェアアクセラレータの複雑さやコストをかけることなく、初めて本番環境のパフォーマンス要求を満たすことができるようになりました。簡単に言うと、DeepSparseはGPUのパフォーマンスとソフトウェアのシンプルさをもたらします。

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

DeepSparseはどのようにしてGPUクラスのパフォーマンスを達成しますか?

DeepSparse は、モデルのスパース性を利用してパフォーマンスを高速化します。

プルーニングと量子化によるスパース化は広く研究されている手法であり、高い精度を維持しながら、ネットワークの実行に必要なサイズと計算量を大幅に削減できます。DeepSparseはスパース性を認識しているため、ゼロになったパラメータをスキップし、順方向パスでの計算量を削減します。スパース計算はメモリに制約されるようになったため、DeepSparseはネットワークを深度方向に実行し、問題をテンソル列、つまりキャッシュに収まる計算の垂直ストライプに分割します。

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内のONNXファイルを識別するSparseZooスタブ
  • ファイルシステム内のONNXモデルへのローカルパス

以下の例では、標準的な密なYOLOv5sチェックポイントと、枝刈りされた量子化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)

クラウドで実行している場合、open-cvが見つからないというエラーが発生する可能性があります libGL.so.1。Ubuntuで以下を実行するとインストールされます:

apt-get install libgl1

HTTPサーバー

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

剪定および量子化された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コマンドを使用すると、エンジンがアノテーション付きの写真をディスクに保存できます。お試しください。 --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 Runtimeのベースライン

バッチ32で、ONNX Runtimeは標準的な密なYOLOv5sで42 images/secを達成しました:

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 images/secを達成しました。これは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 images/secを達成しました。これは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 images/secを達成しました。

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 items/secを達成しました。これは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 items/secを達成しました。これは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 のブログ記事をご確認ください。



📅 1年前に作成 ✏️ 2か月前に更新

コメント