Neural MagicのDeepSparseでCPU上にUltralytics YOLOv5をデプロイし、GPUクラスのパフォーマンスを実現する
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はGPUのパフォーマンスとソフトウェアのシンプルさを提供します。
- 柔軟なデプロイ:任意のハードウェアプロバイダーを使用し、クラウド、データセンター、エッジで一貫して実行できます
- 無限のスケーラビリティ:標準のKubernetesで水平スケール、数百コアまで垂直スケール、またはサーバーレスで完全に抽象化できます
- 簡単な統合:クリーンなAPIを使用してモデルをアプリケーションに統合し、本番環境で監視できます
コモディティCPUでGPUクラスのパフォーマンスを実現#
DeepSparseはモデルのスパース性を活用して、パフォーマンスを高速化します。
プルーニングと量子化によるスパース化により、高い精度を維持しながら、ネットワークの実行に必要なサイズと計算量を桁違いに削減できます。DeepSparseはスパース性を認識し、ゼロとの積和演算をスキップして、フォワードパスに必要な計算量を削減します。スパース計算はメモリバウンドであるため、DeepSparseはネットワークを深さ方向に実行し、キャッシュに収まる計算の縦方向のストライプであるTensor Columnsに問題を分割します。

圧縮された計算を用いるスパースネットワークをキャッシュ内で深さ方向に実行することで、DeepSparseはCPU上でGPUクラスのパフォーマンスを実現します!
カスタムデータでトレーニングしたUltralytics YOLOv5のスパース版を作成する#
Neural MagicのオープンソースモデルリポジトリであるSparseZooには、各YOLOv5モデルの事前スパース化済みチェックポイントが含まれています。Ultralyticsと統合されたSparseMLを使用すると、1つのCLIコマンドでスパースチェックポイントをデータに対してファインチューニングできます。
DeepSparseでUltralytics YOLOv5をデプロイする#
DeepSparseをインストールする#
次のコマンドを実行してDeepSparseをインストールします。Pythonを使用する仮想環境の利用を推奨します。
pip install deepsparse[server,yolo,onnxruntime]ONNXファイルを収集する#
DeepSparseは、次のいずれかの形式で渡されたONNXモデルを受け付けます。
- ONNXモデルへのローカルパス
- SparseZoo内のモデルを識別するSparseZooスタブ
標準の密なYOLOv5sと、次のSparseZooスタブで識別されるプルーニング済み・量子化済み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#
Pipelineはランタイムの前後に前処理と出力の後処理をラップし、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-mesa-glxHTTPサーバー#
DeepSparse Serverは、広く利用されているFastAPI WebフレームワークとUvicorn Webサーバー上で動作します。1つのCLIコマンドだけで、DeepSparseを使用したモデルサービスエンドポイントを簡単にセットアップできます。Serverは、Ultralytics YOLOv5による物体検出を含む、DeepSparseの任意のPipelineをサポートしており、エンドポイントに未加工の画像を送信してバウンディングボックスを受け取ることができます。
プルーニング済み・量子化済みYOLOv5sでServerを起動します。
deepsparse.server \
--task yolo \
--model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-nonePythonのrequestsパッケージを使用したリクエストの例です。
import requests, json
# 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コマンドを使用して、エンジンに注釈付き写真をディスクへ保存させることもできます。ライブWebカメラ映像に注釈を付けるには、--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枚の画像を処理します。
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1 -e onnxruntimeOriginal 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枚の画像を処理します。これはORTに対して1.7倍のパフォーマンス向上です!
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1Original 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枚の画像を処理します。これはORTに対して5.8倍のパフォーマンス向上です!
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 32 -nstreams 1Original 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 onnxruntimeOriginal Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none Batch Size: 1 Scenario: sync Throughput (items/sec): 48.0921
DeepSparseのスパースモデルでのパフォーマンス#
モデルにスパース性を適用すると、ONNX Runtimeに対するDeepSparseのパフォーマンス向上はさらに大きくなります。
バッチ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 1Original 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項目を処理します。これはONNX Runtimeに対して3.7倍のパフォーマンス向上です!
deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni -s sync -b 1 -nstreams 1Original 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でYOLOv5のデプロイを最適化する準備が整いました。
Ultralytics YOLOv5とDeepSparseを始める#
お問い合わせいただくには、コミュニティに参加して、質問やコメントをお寄せください。Ultralytics YOLOv5リポジトリと、YOLOv5のデプロイに関するNeural Magicの完全なドキュメントもご覧ください。
Ultralyticsでは、YOLOv5のような優れたオープンソースツールをすべての人に無料で提供し続けるため、研究開発資金の調達を支援していただく目的で、他のスタートアップと商業的に提携しています。この記事には、提携先へのアフィリエイトリンクが含まれている場合があります。









