Rasperry Pi 4のCPUでDeep Learningを高速化の続きです。
Deep Learningを高速化するためには、どの処理がどれくらいの時間を消費しているかを調査して、実際の処理時間を削減していく必要があります。そのため、まずはONNX Runtimeのプロファイル機能を使用してプロファイリングを行います。
プロファイル機能を有効にする方法はONNX公式チュートリアルに記載されています。
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のグラフ最適化を行ったモデルを使用します。
プロファイル結果
モデルのロード、セッション初期化、モデル実行の順に処理がされています。
モデル実行部分を拡大すると、BatchNormalization処理が融合されたConvolution処理が複数回実行されています。
(本来であればBatchNormalizationは独立して処理されるはずですが、ONNX Runrimeのグラフ最適化の結果、Convolution処理に融合されています。)
プロファイル結果をまとめると以下の表のとおりです。
項目 | 処理時間(ms) | 割合(%) |
---|---|---|
全処理 | 157.19 | - |
Convolution | 148.017 | 94.2 |
gemm | 6.053 | 3.9 |
その他 | 3.12 | 1.9 |
全体の処理時間を短縮化するためには、Convolution処理をなんとかしないといけないということがわかりました。
どのようなアプローチが必要かを次回以降で検討していきたいと思います。