質問があります? TensorFlowフォーラム訪問フォーラムでコミュニティとつながる

パフォーマンス測定

ベンチマークツール

TensorFlow Liteベンチマークツールは現在、次の重要なパフォーマンス指標の統計を測定および計算しています。

  • 初期化時間
  • ウォームアップ状態の推論時間
  • 定常状態の推論時間
  • 初期化時のメモリ使用量
  • 全体的なメモリ使用量

ベンチマークツールは、AndroidおよびiOSのベンチマークアプリとして、およびネイティブコマンドラインバイナリとして利用でき、すべて同じコアパフォーマンス測定ロジックを共有します。ランタイム環境の違いにより、使用可能なオプションと出力形式がわずかに異なることに注意してください。

Androidベンチマークアプリ

Androidでベンチマークツールを使用するには、2つのオプションがあります。 1つはネイティブベンチマークバイナリで、もう1つはAndroidベンチマークアプリです。これは、モデルがアプリでどのように機能するかをより正確に把握するためのものです。いずれにせよ、ベンチマークツールの数値は、実際のアプリでモデルを使用して推論を実行した場合とは少し異なります。

このAndroidベンチマークアプリにはUIがありません。 adbコマンドを使用してインストールおよび実行し、 adb logcatコマンドを使用して結果を取得します。

アプリをダウンロードまたはビルドする

以下のリンクを使用して、毎晩ビルド済みのAndroidベンチマークアプリをダウンロードします。

Flexデリゲートを介してTFopsをサポートするAndroidベンチマークアプリについては、以下のリンクを使用してください。

次の手順に従って、ソースからアプリをビルドすることもできます

ベンチマークを準備する

ベンチマークアプリを実行する前に、アプリをインストールし、次のようにモデルファイルをデバイスにプッシュします。

adb install -r -d -g android_aarch64_benchmark_model.apk
adb push your_model.tflite /data/local/tmp

ベンチマークを実行する

adb shell am start -S \
  -n org.tensorflow.lite.benchmark/.BenchmarkModelActivity \
  --es args '"--graph=/data/local/tmp/your_model.tflite \
              --num_threads=4"'

graphは必須パラメーターです。

  • graphstring
    TFLiteモデルファイルへのパス。

ベンチマークを実行するためのオプションのパラメーターをさらに指定できます。

使用しているデバイスによっては、これらのオプションの一部が使用できないか、効果がない場合があります。ベンチマークアプリで実行できるその他のパフォーマンスパラメーターについては、 パラメーターを参照してください。

logcatコマンドを使用して結果を表示します。

adb logcat | grep "Average inference"

ベンチマーク結果は次のように報告されます。

... tflite  : Average inference timings in us: Warmup: 91471, Init: 4108, Inference: 80660.1

ネイティブベンチマークバイナリ

ベンチマークツールは、ネイティブバイナリbenchmark_modelとしても提供されbenchmark_model 。このツールは、Linux、Mac、組み込みデバイス、およびAndroidデバイスのシェルコマンドラインから実行できます。

バイナリをダウンロードまたはビルドする

以下のリンクをたどって、毎晩ビルド済みのネイティブコマンドラインバイナリをダウンロードします。

支援することを毎晩事前に構築されたバイナリのようTFオプス経由フレックスデリゲートは、以下のリンクを使用します。

コンピューターのソースからネイティブベンチマークバイナリを構築することもできます。

bazel build -c opt //tensorflow/lite/tools/benchmark:benchmark_model

Android NDKツールチェーンを使用してビルドするには、最初にこのガイドに従ってビルド環境をセットアップするか、このガイドの説明に従ってDockerイメージを使用する必要があります。

bazel build -c opt --config=android_arm64 \
  //tensorflow/lite/tools/benchmark:benchmark_model

ベンチマークを実行する

コンピューターでベンチマークを実行するには、シェルからバイナリを実行します。

path/to/downloaded_or_built/benchmark_model \
  --graph=your_model.tflite \
  --num_threads=4

ネイティブコマンドラインバイナリでは、上記と同じパラメータセットを使用できます。

モデル操作のプロファイリング

ベンチマークモデルバイナリを使用すると、モデルopsのプロファイルを作成し、各オペレーターの実行時間を取得することもできます。これを行うには、呼び出し中にフラグ--enable_op_profiling=truebenchmark_modelに渡します。詳細はこちらで説明しています

1回の実行で複数のパフォーマンスオプションを実行するためのネイティブベンチマークバイナリ

便利でシンプルなC ++バイナリも提供されており、1回の実行で複数のパフォーマンスオプションベンチマークできます。このバイナリは、一度に1つのパフォーマンスオプションしかベンチマークできない前述のベンチマークツールに基づいて構築されています。これらは同じビルド/インストール/実行プロセスを共有しますが、このバイナリのBUILDターゲット名はbenchmark_model_performance_optionsあり、いくつかの追加パラメーターを取ります。このバイナリの重要なパラメータは次のとおりです。

perf_options_liststring (デフォルト= 'すべて')
ベンチマークするTFLiteパフォーマンスオプションのコンマ区切りのリスト。

以下にリストされているように、このツール用に毎晩ビルド済みのバイナリを取得できます。

iOSベンチマークアプリ

iOSデバイスでベンチマークを実行するには、 ソースからアプリをビルドする必要があります。 TensorFlow Liteモデルファイルをソースツリーのbenchmark_dataディレクトリに配置し、 benchmark_params.jsonファイルを変更します。これらのファイルはアプリにパッケージ化され、アプリはディレクトリからデータを読み取ります。詳細な手順については、 iOSベンチマークアプリにアクセスしてください。

よく知られているモデルのパフォーマンスベンチマーク

このセクションでは、一部のAndroidおよびiOSデバイスで既知のモデルを実行した場合のTensorFlowLiteのパフォーマンスベンチマークを示します。

Androidのパフォーマンスベンチマーク

これらのパフォーマンスベンチマークの数値は、ネイティブベンチマークバイナリを使用して生成されました。

Androidベンチマークの場合、CPUアフィニティは、デバイスで大きなコアを使用して変動を減らすように設定されています(詳細を参照)。

モデルがダウンロードされ、 /data/local/tmp/tflite_modelsディレクトリに解凍されたと想定しています。ベンチマークバイナリは、 これらの命令を使用して構築され、 /data/local/tmpディレクトリにあると想定されます。

ベンチマークを実行するには:

adb shell /data/local/tmp/benchmark_model \
  --num_threads=4 \
  --graph=/data/local/tmp/tflite_models/${GRAPH} \
  --warmup_runs=1 \
  --num_runs=50

nnapiデリゲートで実行するには、 --use_nnapi=true設定し--use_nnapi=true 。 GPUデリゲートで実行するには、 --use_gpu=true設定し--use_gpu=true

以下のパフォーマンス値はAndroid10で測定されています。

モデル名端末CPU、4スレッドGPU NNAPI
Mobilenet_1.0_224(float) Pixel 3 23.9ミリ秒6.45ミリ秒13.8ミリ秒
Pixel 4 14.0ミリ秒9.0ミリ秒14.8ミリ秒
Mobilenet_1.0_224(quant) Pixel 3 13.4ミリ秒--- 6.0ミリ秒
Pixel 4 5.0ミリ秒--- 3.2ミリ秒
NASNetモバイルPixel 3 56ミリ秒--- 102ミリ秒
Pixel 4 34.5ミリ秒--- 99.0ミリ秒
SqueezeNet Pixel 3 35.8ミリ秒9.5ミリ秒18.5ミリ秒
Pixel 4 23.9ミリ秒11.1ミリ秒19.0ミリ秒
Inception_ResNet_V2 Pixel 3 422ミリ秒99.8ミリ秒201ミリ秒
Pixel 4 272.6ミリ秒87.2ミリ秒171.1ミリ秒
Inception_V4 Pixel 3 486ミリ秒93ミリ秒292ミリ秒
Pixel 4 324.1ミリ秒97.6ミリ秒186.9ミリ秒

iOSパフォーマンスベンチマーク

これらのパフォーマンスベンチマークの数値は、 iOSベンチマークアプリで生成されました。

iOSベンチマークを実行するために、ベンチマークアプリを変更して適切なモデルを含め、 benchmark_params.jsonを変更してnum_threadsを2に設定しました"use_gpu" : "1"デリゲートを使用するには、 "use_gpu" : "1"および"gpu_wait_type" : "aggressive"オプションを使用しました。また、 benchmark_params.json追加されました。

モデル名端末CPU、2スレッドGPU
Mobilenet_1.0_224(float) iPhone XS 14.8ミリ秒3.4ミリ秒
Mobilenet_1.0_224(quant) iPhone XS 11ミリ秒---
NASNetモバイルiPhone XS 30.4ミリ秒---
SqueezeNet iPhone XS 21.1ミリ秒15.5ミリ秒
Inception_ResNet_V2 iPhone XS 261.1ミリ秒45.7ミリ秒
Inception_V4 iPhone XS 309ミリ秒54.4ミリ秒

AndroidでTensorFlowLiteの内部をトレースする

AndroidアプリのTensorFlowLiteインタープリターからの内部イベントは、 Androidトレースツールでキャプチャできます。それは、Androidと同じイベントであるトレースのJava / Kotlinコードから撮影したイベントがTensorFlow Liteの内部イベントと一緒に見られているので、API。

イベントの例は次のとおりです。

  • 演算子の呼び出し
  • デリゲートによるグラフの変更
  • テンソルの割り当て

トレースをキャプチャするためのさまざまなオプションの中で、このガイドではAndroid Studio CPUProfilerとシステムトレースアプリについて説明します。その他のオプションについては、 PerfettoコマンドラインツールまたはSystraceコマンドラインツールを参照してください。

Javaコードでのトレースイベントの追加

これは、 画像分類サンプルアプリのコードスニペットです。 TensorFlow Liteインタープリターは、 recognizeImage/runInferenceセクションで実行されます。この手順はオプションですが、推論呼び出しが行われた場所を確認するのに役立ちます。

  Trace.beginSection("recognizeImage");
  ...
  // Runs the inference call.
  Trace.beginSection("runInference");
  tflite.run(inputImageBuffer.getBuffer(), outputProbabilityBuffer.getBuffer().rewind());
  Trace.endSection();
  ...
  Trace.endSection();

TensorFlowLiteトレースを有効にする

TensorFlow Liteトレースを有効にするには、Androidアプリを起動する前に、Androidシステムプロパティdebug.tflite.tracingを1に設定します。

adb shell setprop debug.tflite.trace 1

TensorFlow Liteインタープリターの初期化時にこのプロパティが設定されている場合、インタープリターからの主要なイベント(オペレーターの呼び出しなど)がトレースされます。

すべてのトレースをキャプチャしたら、プロパティ値を0に設定してトレースを無効にします。

adb shell setprop debug.tflite.trace 0

Android StudioCPUプロファイラー

以下の手順に従って、 Android Studio CPUProfilerでトレースをキャプチャします。

  1. トップメニューから[実行]> [プロファイル]アプリを選択します。

  2. プロファイラーウィンドウが表示されたら、CPUタイムラインの任意の場所をクリックします。

  3. CPUプロファイリングモードから「システムコールのトレース」を選択します。

    [システムコールのトレース]を選択します

  4. 「録音」ボタンを押します。

  5. 「停止」ボタンを押します。

  6. トレース結果を調査します。

    AndroidStudioトレース

この例では、スレッド内のイベントの階層と各オペレーター時間の統計を確認でき、スレッド間のアプリ全体のデータフローも確認できます。

システムトレースアプリ

システムトレースアプリで詳しく説明されている手順に従って、AndroidStudioなしでトレースをキャプチャします。

この例では、Androidデバイスのバージョンに応じて、同じTFLiteイベントがキャプチャされ、PerfettoまたはSystrace形式で保存されました。キャプチャされたトレースファイルは、 PerfettoUIで開くことができます。

パーフェットトレース

トレースデータの使用

トレースデータを使用すると、パフォーマンスのボトルネックを特定できます。

プロファイラーから得られる洞察と、パフォーマンスを向上させるための潜在的なソリューションの例を次に示します。

  • 使用可能なCPUコアの数が推論スレッドの数よりも少ない場合、CPUスケジューリングのオーバーヘッドがパフォーマンスを低下させる可能性があります。アプリケーションで他のCPUを集中的に使用するタスクを再スケジュールして、モデルの推論との重複を回避したり、インタープリタースレッドの数を微調整したりできます。
  • 演算子が完全に委任されていない場合、モデルグラフの一部は、予想されるハードウェアアクセラレータではなく、CPUで実行されます。サポートされていない演算子を、同様のサポートされている演算子に置き換えることができます。