LoginSignup
6
6

More than 3 years have passed since last update.

ONNX Runtimeでプロファイルを取ってみる

Posted at

Rasperry Pi 4のCPUでDeep Learningを高速化の続きです。

Deep Learningを高速化するためには、どの処理がどれくらいの時間を消費しているかを調査して、実際の処理時間を削減していく必要があります。そのため、まずはONNX Runtimeのプロファイル機能を使用してプロファイリングを行います。

プロファイル機能を有効にする方法はONNX公式チュートリアルに記載されています。

sample.py
import onnxruntime

options = onnxruntime.SessionOptions()
options.enable_profiling = True          # <- プロファイル機能有効化
session = onnxruntime.InferenceSession(path_to_model, options)

[プロファイル対象]

prof_file = session.end_profiling()
print(prof_file)

プロファイル結果はJSON形式で保存されます。また、プロファイル結果はChromeに内蔵されているTracingツールで可視化できます。(ChromeのURLにchrome://tracing/と入力するとツールが起動します。)

今回、MobileNetV1 depth 1.0 224x224で画像分類を実行するケースでプロファイルを取ってみます。各モデルはONNX Runrimeのグラフ最適化を行ったモデルを使用します。

プロファイル結果

mobilenetv1_prof1.png
モデルのロード、セッション初期化、モデル実行の順に処理がされています。
mobilenetv1_prof3.png
モデル実行部分を拡大すると、BatchNormalization処理が融合されたConvolution処理が複数回実行されています。
(本来であればBatchNormalizationは独立して処理されるはずですが、ONNX Runrimeのグラフ最適化の結果、Convolution処理に融合されています。)

プロファイル結果をまとめると以下の表のとおりです。

項目 処理時間(ms) 割合(%)
全処理 157.19 -
Convolution 148.017 94.2
gemm 6.053 3.9
その他 3.12 1.9

全体の処理時間を短縮化するためには、Convolution処理をなんとかしないといけないということがわかりました。
どのようなアプローチが必要かを次回以降で検討していきたいと思います。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6