パフォーマンス値の取得

このガイドでは、benchmark_app を使用してパフォーマンス値を取得する方法について説明します。また、内部推論パフォーマンス・カウンターと実行グラフを通じてパフォーマンス値がどのように反映されるかも説明します。また、ITT およびインテル® VTune™ プロファイラーを使用してパフォーマンスを観察する方法についても説明します。

benchmark_app でパフォーマンスをテスト

OpenVINO ベンチマークは C++ API と Python API の両方で実行できますが、エクスペリエンスはそれぞれで異なります。Python は OpenVINO ランタイムのインストールに含まれますが、C++ はコードサンプルとして利用できます。詳細については、benchmark_app を参照してください。

テストするモデルのフレームワークをサポートする最新のリリースパッケージを必ずインストールしてください。最も信頼性の高いパフォーマンス・ベンチマークを得るには、OpenVINO で使用するモデルを準備します。

ベンチマーク・アプリケーションを実行

benchmark_app にはデバイス固有のオプションが多数含まれていますが、使い方は簡単です。

benchmark_app -m <model> -d <device> -i <input>

OpenVINO でサポートされるデバイスは、ベンチマーク・アプリで同等のコマンドラインを含むパフォーマンス設定を提供します。

これらの設定は、特定のデバイスで最適なモデルのパフォーマンスを実現する低レベルの制御を提供しますが、最初に OpenVINO の高レベルのパフォーマンス・ヒントを適用してパフォーマンス評価を開始することを推奨します。

# for throughput prioritization
benchmark_app -hint tput -m <model> -d <device>
# for latency prioritization
benchmark_app -hint latency -m <model> -d <device>

追加のベンチマーク考慮事項

1 - 測定する適切な一連の操作を選択

OpenVINO ランタイムを使用してモデルのパフォーマンスを評価する場合、適切な操作を測定する必要があります。

  • モデルの読み込みなど一度限りのコストを含めないようにしてください。

  • OpenVINO ランタイム外部で発生する操作 (ビデオデコードなど) を個別に追跡します。

一部の画像前処理を OpenVINO IR に変換し、それに応じて高速化できます。詳細については、埋め込み前処理および一般的な実行時の最適化を参照してください。

2 - 信頼できるデータを取得

パフォーマンスに関する結論は、再現可能なデータによって構築される必要があります。パフォーマンスの測定では、同じルーチンを多数呼び出して行う必要があります。ほとんどの場合、最初の反復は後続の反復よりも大幅に低速であるため、最終的な予測の実行時間として集計値を使用できます。

  • ウォームアップ実行が有用でない、または実行時間が一定でない場合は、多数の反復を実行してから、結果の平均または平均値を求めることができます。

  • 時間値の範囲が広すぎる場合は、幾何平均を考慮してください。

  • スロットルやその他の電力の異常に注意してください。デバイスは、いくつかの異なる電源状態のいずれかになります。モデルを最適化する場合、パフォーマンス・データの再現性を高めるためにデバイスの動作周波数を固定することを検討してください。ただし、エンドツーエンド (アプリケーション) のベンチマークは実際の運用条件下で実行する必要があります。

3 - ネイティブ/フレームワーク・コードとのパフォーマンスの比較

OpenVINO ランタイムのパフォーマンスをフレームワークまたは別のリファレンス・コードと比較する場合は、両方のバージョンが可能な限り同一であることを確認してください。

  • 正確な推論の実行をラップします (例: ベンチマーク・アプリを参照してください)。

  • モデルのロード時間は含めません。

  • OpenVINO ランタイムとフレームワークの入力が同一であることを確認してください。例えば、入力に設定されるランダムな値に注意してください。

  • ユーザー側の前処理を個別に追跡する場合、画像の前処理と変換を検討してください。

  • 該当する場合は、動的形状のサポートを活用してください。

  • 可能であれば、同じ精度を適用してください。例えば、TensorFlow は FP16 の実行が可能であるため、それと比較する場合は、OpenVINO ランタイムも FP16 でテストしてください。

内部推論パフォーマンス・カウンターと実行グラフ

デバイス固有のパフォーマンス・カウンターや実行グラフを使用すると、推論パフォーマンスの詳細な内訳の洞察を得ることができます。benchmark_appC++ と Python バ―ションの両方で、内部実行の内訳を出力する -pc コマンドライン・パラメーターがサポートされています。

例えば、以下に示す表は、CPU プラグイン上の ResNet-50 モデル推論の量子化 TensorFlow 実装のパフォーマンス・カウンターの一部です。デバイスは CPU であるため、realTime のウォールクロックと cpu 時間レイヤーは同じであることに注意してください。レイヤーの精度に関する情報もパフォーマンス・カウンターに保存されます。

layerName

execStatus

layerType

execType

realTime (ミリ秒)

cpuTime (ミリ秒)

resnet_model/batch_normalization_15/FusedBatchNorm/Add

EXECUTED

Convolution

jit_avx512_1x1_I8

0.377

0.377

resnet_model/conv2d_16/Conv2D/fq_input_0

NOT_RUN

FakeQuantize

undef

0

0

resnet_model/batch_normalization_16/FusedBatchNorm/Add

EXECUTED

Convolution

jit_avx512_I8

0.499

0.499

resnet_model/conv2d_17/Conv2D/fq_input_0

NOT_RUN

FakeQuantize

undef

0

0

resnet_model/batch_normalization_17/FusedBatchNorm/Add

EXECUTED

Convolution

jit_avx512_1x1_I8

0.399

0.399

resnet_model/add_4/fq_input_0

NOT_RUN

FakeQuantize

undef

0

0

resnet_model/add_4

NOT_RUN

Eltwise

undef

0

0

resnet_model/add_5/fq_input_1

NOT_RUN

FakeQuantize

undef

0

0

テーブルの execStatus カラムには、次の値が含まれます。
- EXECUTED - レイヤーはスタンドアロンのプリミティブで実行されました。
- NOT_RUN - レイヤーはスタンドアロン・プリミティブで実行されなかったか、別の操作と融合されて別のレイヤー・プリミティブで実行されました。

テーブルの execType カラムには、特定のサフィックス付きの推論プリミティブが含まれます。レイヤーには次のマークが付いている場合があります。
- I8 サフィックスは、8 ビットのデータタイプの入力を持つ、8 ビット精度で計算されたレイヤーを表します。
- FP32 サフィックスは、32 ビット精度で計算されるレイヤーを表します。

すべての Convolution レイヤーは int8 精度で実行されます。残りのレイヤーは、CPU デバイスで説明されているように、操作後の最適化で畳み込みに融合されます。これには、レイヤー名 (OpenVINO IR に表示される)、レイヤーのタイプ、および実行統計が含まれます。

benchmark_app の両方のバージョンは、exec_graph_path コマンドライン・オプションもサポートしています。OpenVINO はレイヤーごとに同じ実行統計を出力する必要がありますが、プラグイン固有の Netron で表示可能なグラフの形式でファイルに出力されます。

特にレイテンシーのパフォーマンスをデバッグする場合、カウンターが plugin/device/driver/etc キューで費やされた時間を反映していないことに注意してください。カウンターの合計が推論要求のレイテンシーと大きく異なる場合、少ない推論要求でテストすることを検討してください。例えば、複数の要求で単一の OpenVINO ストリームを実行すると、単一の推論要求を実行した場合とほぼ同じカウンターが生成されますが、実際のレイテンシーは大きく異なる可能性があります。

最後に、パフォーマンス・カウンターと実行グラフのパフォーマンス統計は平均化されるため、信頼できるデータを収集するには、動的形状の入力データは、可能であれば特定の形状を分離してループ内で複数回実行することによって慎重に測定する必要があります。

ITT を使用してパフォーマンスに関する洞察を得る

一般に、OpenVINO とその個々のプラグインは、インテル® インストルメンテーション・アンド・トレーシング・テクノロジー (ITT) を使用して高度に計測されています。したがって、ITT を有効にしてソースコードから OpenVINO をコンパイルし、インテル® VTune™ プロファイラーなどのツールを使用して、タイムライン・ビューで推論パフォーマンスの詳細な内訳とアプリケーション・レベルのパフォーマンスに関する追加の洞察を取得することもできます。