Neural MagicのDeepSparseでYOLOv5をデプロイする#
ソフトウェアで提供されるAIへようこそ。
このガイドでは、Neural MagicのDeepSparseを使用してYOLOv5をデプロイする方法を説明します。
DeepSparseは、CPU上で卓越したパフォーマンスを発揮する推論ランタイムです。例えば、ONNX Runtimeのベースラインと比較して、DeepSparseは同じマシン上でYOLOv5sを実行した場合に5.8倍の高速化を実現します。
初めて、ハードウェアアクセラレータの複雑さやコストを伴わずに、ディープラーニングのワークロードで本番環境のパフォーマンス要件を満たせるようになります。簡単に言えば、DeepSparseはGPUのパフォーマンスとソフトウェアのシンプルさを提供します。
- 柔軟なデプロイ: Intel、AMD、ARMなど、あらゆるハードウェアプロバイダーを利用し、クラウド、データセンター、エッジ環境で一貫して実行できます
- 無限のスケーラビリティ: 最大数百コアまで垂直方向にスケールすることも、標準のKubernetesで水平方向にスケールすることも、Serverlessで完全に抽象化することもできます
- 容易な統合: モデルをアプリケーションに統合し、本番環境で監視するための、シンプルで使いやすいAPIを提供します
DeepSparseはどのようにGPUクラスのパフォーマンスを実現するのでしょうか?#
DeepSparseは、モデルのスパース性を活用してパフォーマンスを向上させます。
プルーニングと量子化によるスパース化は広く研究されている手法であり、ネットワークの実行に必要なサイズと計算量を桁違いに削減しながら、高い精度を維持できます。DeepSparseはスパース性を認識するため、ゼロ化されたパラメーターをスキップし、フォワードパスの計算量を削減します。スパースな計算はメモリ帯域幅に制約されるため、DeepSparseはネットワークを深さ方向に実行し、キャッシュに収まる計算の垂直ストライプであるTensor Columnに問題を分割します。
圧縮された計算をキャッシュ内で深さ方向に実行するスパースネットワークにより、DeepSparseはCPU上でGPUクラスのパフォーマンスを実現します。
データで学習したYOLOv5のスパース版を作成するにはどうすればよいですか?#
Neural MagicのオープンソースモデルリポジトリであるSparseZooには、各YOLOv5モデルの事前スパース化済みチェックポイントが含まれています。Ultralyticsと統合されているSparseMLを使用すると、1つの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 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.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は、人気のあるWebフレームワークであるFastAPIとWebサーバーのUvicorn上で動作します。1つのCLIコマンドだけで、DeepSparseを使用したモデルサービスのエンドポイントを簡単に構築できます。Serverは、DeepSparseのあらゆるPipelineをサポートしており、YOLOv5による物体検出も含まれます。これにより、未加工の画像をエンドポイントに送信してバウンディングボックスを受け取れます。
プルーニング・量子化済みYOLOv5sでServerを起動します。
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"]Annotate 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は標準のdense 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のdenseパフォーマンス#
DeepSparseは最適化されたスパースモデルで最高のパフォーマンスを発揮しますが、標準のdense YOLOv5sでも優れた性能を発揮します。
バッチ32では、DeepSparseは標準のdense 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は標準のdense 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は研究およびテスト目的で無料で利用できます。ドキュメントを参照して始めてください。
DeepSparseを使用したYOLOv5のデプロイについて詳しくは、Neural MagicのDeepSparseドキュメントとDeepSparse統合に関するUltralyticsのブログ記事をご確認ください。