ヨロビジョン深圳
深セン
今すぐ参加

Ultralytics YOLOv5をNeural MagicのDeepSparseとともにデプロイし、CPU上でGPUクラスのパフォーマンスを実現

Ultralyticsチーム

5分で読めます

2023年1月5日

Neural MagicのDeepSparseを使用して、Ultralytics YOLOv5モデルのトレーニングとデプロイを強化し、CPU上でGPUクラスのパフォーマンスを実現します。より高速でスケーラブルなYOLOv5デプロイを実現します。

YOLOv5モデルのトレーニングとデプロイを加速したいですか?ご心配なく。最新のパートナーであるNeural Magicをご紹介します。Neural Magicは、モデルのピークパフォーマンスとワークフローの簡素化を重視したソフトウェアツールを提供しているため、YOLOv5のデプロイプロセスをさらに改善するためのソリューションを提供するために協力するのは当然の流れです。

DeepSparseはNeural MagicのCPU推論ランタイムであり、ニューラルネットワーク内のスパース性と低精度演算を利用して、コモディティハードウェア上で卓越したパフォーマンスを提供します。たとえば、ONNX Runtimeのベースラインと比較して、DeepSparseは同じマシン上で実行されるYOLOv5sで5.8倍の高速化を実現します。

DeepSparseによるYOLOv5スループット比較

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

  1. 柔軟なデプロイメント:クラウド、データセンター、およびエッジ全体で、任意のハードウェアプロバイダーを使用して一貫して実行
  2. 無限のスケーラビリティ: 標準のKubernetesでスケールアウト、垂直方向に数百のコアへ、またはサーバーレスで完全に抽象化。
  3. 容易な統合:モデルをアプリケーションに統合し、本番環境で監視するためのクリーンなAPIを使用します。

コモディティCPUでGPUクラスのパフォーマンスを実現

DeepSparseは、モデルのスパース性を利用してパフォーマンスを向上させます。

プルーニングと量子化によるスパース化により、高い精度を維持しながら、ネットワークの実行に必要なサイズと計算量を大幅に削減できます。DeepSparseはスパース性を認識しており、ゼロによる乗算加算をスキップし、順伝播における計算量を削減します。スパース計算はメモリバウンドであるため、DeepSparseはネットワークをデプスワイズに実行し、問題をキャッシュに収まる計算の縦ストライプであるテンソル列に分割します。

DeepSparseとUltralytics YOLOv5ネットワーク

圧縮された計算によるスパースネットワークは、キャッシュ内でデプスワイズに実行され、DeepSparseはCPU上でGPUクラスのパフォーマンスを実現します。

カスタムデータでトレーニングされたYOLOv5のスパースバージョンを作成する

Neural MagicのオープンソースモデルリポジトリであるSparseZooには、各YOLOv5モデルの事前スパース化されたチェックポイントが含まれています。Ultralyticsと統合されているSparseMLを使用すると、単一のCLIコマンドでスパースチェックポイントをデータに微調整できます。

DeepSparseによるYOLOv5のデプロイ

DeepSparseのインストール

DeepSparseをインストールするには、以下を実行してください。Pythonで仮想環境を使用することをお勧めします。

pip install deepsparse[server,yolo,onnxruntime]

ONNXファイルの収集

DeepSparseは、ONNX形式のモデルを以下のいずれかの方法で受け入れます。

  • ONNXモデルへのローカルパス
  • SparseZoo内のモデルを識別するSparseZooスタブ

標準の密な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

パイプラインは、ランタイムの周りにプリプロセスと出力ポストプロセスをラップし、DeepSparseをアプリケーションに追加するためのクリーンなインターフェイスを提供します。DeepSparse-Ultralyticsの統合には、生の画像を受け入れてバウンディングボックスを出力する、すぐに使用できるパイプラインが含まれています。

パイプラインを作成して推論を実行する:

from deepsparse import Pipeline

# ローカルファイルシステム内の画像のリスト
images = ["basilica.jpg"]

# パイプラインの作成
model_stub = "zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none"
yolo_pipeline = Pipeline.create(
task="yolo",
model_path=model_stub,
)

# 画像に対して推論を実行し、バウンディングボックスとクラスを受け取ります
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-mesa-glx

HTTPサーバー

DeepSparse Serverは、一般的なFastAPI WebフレームワークとUvicorn Webサーバー上で動作します。わずか1つの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 requests, json

# 推論に使用する画像のリスト(クライアント側のローカルファイル)
path = ['basilica.jpg']
files = [('request', open(img, 'rb')) for img in path]

# HTTP経由で/predict/from_filesエンドポイントにリクエストを送信
url = 'http://0.0.0.0:5543/predict/from_files'
resp = requests.post(url=url, files=files)

# レスポンスはJSONで返されます
annotations = json.loads(resp.text) # アノテーション結果の辞書
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フォルダーが作成され、アノテーションが付けられた画像がその中に保存されます。

YOLOv5で注釈を付けられたバシリカ聖堂

ベンチマーク性能

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

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

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

ONNX Runtime Baseline

バッチサイズ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

> オリジナルモデルパス: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> バッチサイズ: 32
> シナリオ: sync
> スループット (items/秒): 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

> オリジナルモデルパス: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> バッチサイズ: 32
> シナリオ: sync
> スループット (items/秒): 69.5546

DeepSparseのスパース性能

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

バッチサイズ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

> オリジナルモデルパス: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
> バッチサイズ: 32
> シナリオ: sync
> スループット (items/秒): 241.2452

バッチ1のパフォーマンス比較

DeepSparseは、レイテンシの影響を受けやすいバッチサイズ1のシナリオにおいて、ONNX Runtimeよりも高速化を実現できます。

ONNX Runtime Baseline

バッチサイズ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

> オリジナルモデルパス: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
> バッチサイズ: 1
> シナリオ: sync
> スループット (items/秒): 48.0921

DeepSparseのスパース性能

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

バッチサイズ1で、DeepSparseは枝刈り量子化されたYOLOv5sで135 images/secを達成しました—ONNX Runtimeと比較して2.8倍の性能向上です!

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 32 -nstreams 1

> オリジナルモデルパス: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
> バッチサイズ: 1
> シナリオ: sync
> スループット (items/秒): 134.9468

c6i.8xlargeインスタンスにはVNNI命令があるため、DeepSparseのスループットは、重みが4つのブロックでプルーニングされている場合、さらに向上させることができます。

バッチサイズ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

> オリジナルモデルパス: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni
> バッチサイズ: 1
> シナリオ: sync
> スループット (items/秒): 179.7375

ほら!これで、DeepSparseを使用してYOLOv5のデプロイを最適化する準備ができました。

YOLOv5とDeepSparseを始めてみましょう

お問い合わせは、コミュニティに参加して、質問やコメントをお寄せください。Ultralytics YOLOv5リポジトリと、YOLOv5を展開するためのNeural Magicドキュメントをご覧ください。

Ultralyticsでは、YOLOv5のような素晴らしいオープンソースツールをすべての人に無料で提供し続けるために、他のスタートアップ企業と提携して、研究開発の資金を調達しています。この記事には、これらのパートナーへのアフィリエイトリンクが含まれている場合があります。

AIの未来を
共に築きましょう!

未来の機械学習で、新たな一歩を踏み出しましょう。

無料ではじめる
クリップボードにコピーしました