Neural MagicのDeepSparseを使用してYOLOv5をデプロイする#
ソフトウェアによって提供されるAIの世界へようこそ。
本ガイドでは、Neural MagicのDeepSparseを使用してYOLOv5をデプロイする方法を説明します。
DeepSparseは、CPU上で卓越したパフォーマンスを発揮する推論ランタイムです。例えば、ONNX Runtimeのベースラインと比較して、DeepSparseは同じマシン上で実行した場合にYOLOv5sで5.8倍の高速化を実現します。
初めて、deep learningのワークロードは、ハードウェアアクセラレータの複雑さとコストをかけずに、プロダクションのパフォーマンス要件を満たすことができるようになります。簡単に言えば、DeepSparseはGPUのパフォーマンスとソフトウェアのシンプルさを提供します。
- 柔軟なデプロイメント: Intel、AMDからARMまで、あらゆるハードウェアプロバイダーを使用して、クラウド、データセンター、エッジ環境で一貫して動作させることができます。
- 無限のスケーラビリティ: 数百のコアへの垂直スケール、標準的なKubernetesによる水平スケール、またはサーバーレスによる完全な抽象化が可能です。
- 簡単な統合: モデルをアプリケーションに統合し、プロダクション環境で監視するためのクリーンなAPIを提供します。
DeepSparseはどのようにしてGPUクラスのパフォーマンスを実現するのか?#
DeepSparseは、モデルのスパース性(疎性)を活用してパフォーマンスを高速化します。
プルーニングと量子化によるスパース化は広く研究されている手法であり、高いaccuracyを維持しながら、ネットワークの実行に必要なサイズと計算量を桁違いに削減できます。DeepSparseはスパース性を認識しているため、ゼロにされたパラメータをスキップし、フォワードパスでの計算量を削減します。スパース計算は現在メモリバウンドであるため、DeepSparseはネットワークを深さ方向に実行し、問題をキャッシュに収まる計算の垂直ストライプであるTensor Columnsに分割します。
計算を圧縮し、キャッシュ内で深さ方向に実行するスパースネットワークにより、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モデルへのローカルパス
以下の例では、次のSparseZooスタブで識別される標準的な密な(dense)チェックポイントと、プルーニングおよび量子化された(pruned-quantized)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.jpgPython 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-headlessHTTPサーバー#
DeepSparse Serverは、人気の高いFastAPIWebフレームワークとUvicornWebサーバー上で実行されます。単一のCLIコマンドだけで、DeepSparseを使用したモデルサービスエンドポイントを簡単にセットアップできます。サーバーは、YOLOv5によるobject detectionを含むDeepSparseからの任意のPipelineをサポートしており、未加工の画像をエンドポイントに送信してバウンディングボックスを受け取ることができます。
プルーニングおよび量子化されたYOLOv5sを使用してサーバーを起動します。
deepsparse.server \
--task yolo \
--model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-nonePythonの requests パッケージを使用したリクエストの例:
import json
from contextlib import ExitStack
import requests
# list of images for inference (local files on client side)
path = ["basilica.jpg"]
# send request over HTTP to /predict/from_files endpoint
url = "http://0.0.0.0:5543/predict/from_files"
with ExitStack() as stack:
files = [("request", stack.enter_context(open(img, "rb"))) for img in path]
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 を試して、ライブWebカメラフィードにアノテーションを付けましょう。
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画像/秒を達成します。
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.9025DeepSparse(密なモデル)のパフォーマンス#
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.5546DeepSparse(スパースモデル)のパフォーマンス#
モデルにスパース性を適用すると、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.0921DeepSparse(スパースモデル)のパフォーマンス#
バッチサイズ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.9468c6i.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.7375DeepSparseを始める#
研究またはテストですか? DeepSparse Communityは、研究およびテスト用として無料で使用できます。Documentationから始めてください。
DeepSparseを使ったYOLOv5のデプロイの詳細については、Neural MagicのDeepSparseドキュメントおよびDeepSparse統合に関するUltralyticsのブログ記事をご確認ください。