Neural MagicのDeepSparseを使用してYOLOv5をデプロイします。
ソフトウェアで提供される AI へようこそ。
このガイドでは、Neural MagicのDeepSparseを使用してYOLOv5をデプロイする方法について説明します。
DeepSparse は、CPU 上で卓越したパフォーマンスを発揮する推論ランタイムです。たとえば、ONNX Runtime のベースラインと比較して、DeepSparse は同じマシン上で実行される YOLOv5s で 5.8 倍の高速化を実現します。
ディープラーニングのワークロードは、ハードウェアアクセラレータの複雑さやコストをかけることなく、初めて本番環境のパフォーマンス要求を満たすことができるようになりました。簡単に言うと、DeepSparseはGPUのパフォーマンスとソフトウェアのシンプルさをもたらします。
- 柔軟なデプロイメント: IntelからAMD、ARMまで、あらゆるハードウェアプロバイダーを使用して、クラウド、データセンター、エッジ全体で一貫して実行できます。
- 無限のスケーラビリティ: 標準のKubernetesで数百のコアに垂直方向にスケールするか、サーバーレスで完全に抽象化します。
- 簡単な統合: モデルをアプリケーションに統合し、本番環境で監視するためのクリーンな API
DeepSparseはどのようにしてGPUクラスのパフォーマンスを達成しますか?
DeepSparse は、モデルのスパース性を利用してパフォーマンスを高速化します。
プルーニングと量子化によるスパース化は広く研究されている手法であり、高い精度を維持しながら、ネットワークの実行に必要なサイズと計算量を大幅に削減できます。DeepSparseはスパース性を認識しているため、ゼロになったパラメータをスキップし、順方向パスでの計算量を削減します。スパース計算はメモリに制約されるようになったため、DeepSparseはネットワークを深度方向に実行し、問題をテンソル列、つまりキャッシュに収まる計算の垂直ストライプに分割します。
圧縮された計算によるスパースネットワークは、キャッシュ内で深度方向に実行され、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 のブログ記事をご確認ください。