パフォーマンスの測定

ベンチマーク ツール

LiteRT ベンチマーク ツールは現在、 パフォーマンス指標について学びました

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

ベンチマーク ツールは、Android と iOS 向けのベンチマーク アプリとして利用できます。また、 ネイティブのコマンドライン バイナリをサポートし、いずれも同じコア パフォーマンス あります。使用可能なオプションと出力形式は、 若干異なる可能性があります。

Android ベンチマーク アプリ

Android でベンチマーク ツールを使用するには、2 つの方法があります。1 つ目は ネイティブ ベンチマーク バイナリ、もう 1 つは Android アプリでのモデルのパフォーマンスをより正確に評価できます。どちらでもかまわない ベンチマークツールの数値は 実際のアプリでモデルを使用して推論を実行します。

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

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

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

TF オペレーションをサポートする Android ベンチマーク アプリの場合 Flex デリゲート経由、 以下のリンクを使用してください。

以下の手順で、ソースからアプリをビルドすることもできます。 こちらの手順をご覧ください。

ベンチマークを準備する

ベンチマーク アプリを実行する前に、アプリをインストールしてモデルファイルを 使用します。

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 は必須パラメータです。

  • graph: string
    TFLite モデルファイルのパス。

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

  • num_threads: int(デフォルト=1)
    TFLite インタープリタの実行に使用するスレッド数。
  • use_gpu: bool(デフォルト=false)
    GPU デリゲートを使用する。
  • use_xnnpack: bool(デフォルト=false
    使用 XNNPACK デリゲート

お使いのデバイスによっては、これらのオプションの一部が 効果がない場合もあります。詳しくは、 パラメータ をご覧ください。

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

adb logcat | grep "Inference timings"

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

... tflite  : Inference timings in us: Init: 5685, First inference: 18535, Warmup (avg): 14462.3, Inference (avg): 14575.2

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

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

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

次のコマンドを実行して、夜間にビルド済みのネイティブ コマンドライン バイナリをダウンロードします。 以下のリンクをご覧ください。

TF オペレーションをサポートするビルド済みのナイトリー バイナリについて Flex デリゲート経由、 以下のリンクを使用してください。

また、Terraform からネイティブのベンチマーク バイナリを 出典 できます。

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

同じ一連の パラメータ ネイティブコマンドラインバイナリで コードを実行します

モデルの運用のプロファイリング

ベンチマーク モデルバイナリでは、モデルの運用をプロファイリングして、 各演算子の実行時間を表しますこれを行うには、このフラグに 呼び出し中の --enable_op_profiling=true から benchmark_model へ。詳細は次のとおりです。 説明 こちらをご覧ください。

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

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

perf_options_list: string(default='all')
ベンチマーク対象の TFLite パフォーマンス オプションのカンマ区切りのリスト。

以下に示すように、このツールの夜間のビルド済みバイナリを取得できます。

iOS ベンチマーク アプリ

iOS デバイスでベンチマークを実行するには、 出典。 LiteRT モデルファイルを benchmark_data ディレクトリに移動し、benchmark_params.json ファイルを変更します。これら ファイルがアプリにパッケージ化され、アプリがこのディレクトリからデータを読み取ります。アクセス iOS ベンチマーク アプリ をご覧ください。

既知のモデルのパフォーマンス ベンチマーク

このセクションでは、適切に実行しているときの LiteRT パフォーマンス ベンチマークを示します。 一部の Android および iOS デバイスでは既知のモデルが使用されています。

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

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

以下のパフォーマンス値は Android 10 で測定したものです。

モデル名 デバイス CPU、4 スレッド GPU
Mobilenet_1.0_224(float) Google Pixel 3 23.9 ミリ秒 6.45 ミリ秒
Google Pixel 4 14.0 ミリ秒 9.0 ミリ秒
Mobilenet_1.0_224(quant) Google Pixel 3 13.4 ミリ秒 ---
Google Pixel 4 5.0 ミリ秒 ---
NASNet モバイル Google Pixel 3 56 ミリ秒 ---
Google Pixel 4 34.5 ミリ秒 ---
SqueezeNet Google Pixel 3 35.8 ミリ秒 9.5 ミリ秒
Google Pixel 4 23.9 ミリ秒 11.1 ミリ秒
Inception_ResNet_V2 Google Pixel 3 422 ミリ秒 99.8 ミリ秒
Google Pixel 4 272.6 ミリ秒 87.2 ミリ秒
Inception_V4 Google Pixel 3 486 ミリ秒 93 ミリ秒
Google Pixel 4 324.1 ミリ秒 97.6 ミリ秒

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

これらのパフォーマンス ベンチマークの数値は、 iOS ベンチマーク アプリ

iOS ベンチマークを実行するために、ベンチマーク アプリを修正し、 モデルと benchmark_params.json が、num_threads を 2 に設定するように変更されました。用途 GPU デリゲート、"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 ミリ秒

トレース LiteRT の内部

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

Android アプリの LiteRT インタープリタからの内部イベント キャプチャ Android トレースツール。 これは Android でも同じです Trace API を使用して、 Java/Kotlin コードからキャプチャしたイベントが LiteRT と一緒に表示される 内部イベントを記録します。

イベントの例を以下に示します。

  • 演算子の呼び出し
  • 委譲によるグラフの変更
  • テンソルの割り当て

このガイドでは、トレースをキャプチャするさまざまなオプションのうち、Android Studio の CPU Profiler と System Tracing アプリ。詳しくは、 Perfetto コマンドライン ツール または Systrace コマンドライン ツール をご覧ください。

Java コードにトレース イベントを追加する

これは 画像分類 サンプルアプリです。LiteRT インタープリタは recognizeImage/runInference セクション。このステップは省略可能ですが、 推論呼び出しが行われた場所をすぐに確認できます。

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

LiteRT トレースを有効にする

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

adb shell setprop debug.tflite.trace 1

LiteRT インタープリタの初期化時にこのプロパティが設定されていた場合、 キーイベント(演算子の呼び出しなど)がトレースされます。

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

adb shell setprop debug.tflite.trace 0

Android Studio の CPU Profiler

トレースをキャプチャする Android Studio の CPU Profiler 手順は次のとおりです。

  1. [Run] >プロファイル「app」を選択します。

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

  3. [Trace System Calls] を選択します。パフォーマンスが向上します

    [Trace System Calls] を選択します。

  4. [Record] を押します。] ボタンを離します。

  5. [Stop] を押す] ボタンを離します。

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

    Android Studio のトレース

この例では、スレッド内のイベントの階層と統計情報を確認できます。 アプリ全体のデータフローも確認できます。 説明します。

System Tracing アプリ

以下の手順に沿って、Android Studio を使用せずにトレースをキャプチャする System Tracing アプリ

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

Perfetto トレース

iOS での LiteRT の内部をトレースする

iOS アプリの LiteRT インタープリタからの内部イベント キャプチャ 楽器 Xcode に含まれるツールについて説明します。iOS signpost Swift/Objective-C コードからキャプチャしたイベントが LiteRT 内部イベントと併用します。

イベントの例を以下に示します。

  • 演算子の呼び出し
  • 委譲によるグラフの変更
  • テンソルの割り当て

LiteRT トレースを有効にする

次の手順で環境変数 debug.tflite.trace を設定します。

  1. [Product]>スキーム >[Edit Scheme...] をクリックします。

  2. [プロフィール] をクリックします。をクリックします。

  3. [Run アクションの引数と環境変数を使用する] の選択を解除する 選択します。

  4. [環境変数] に debug.tflite.trace を追加します。。

    環境変数の設定

iOS アプリのプロファイリング時に LiteRT イベントを除外する場合は、 環境変数を削除してトレースを無効にします。

XCode 計測

次の手順でトレースをキャプチャします。

  1. [Product]>プロファイルを選択します。

  2. Instruments ツールの起動時に、プロファイリング テンプレートの中で [Logging] をクリックします。

  3. [Start] を押す] ボタンを離します。

  4. [Stop] を押す] ボタンを離します。

  5. [os_signpost] をクリックします。OS Logging サブシステムの項目が展開されます。

  6. 「org.tensorflow.lite」をクリックします。OS Logging サブシステム。

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

    Xcode Instruments トレース

この例では、各イベントと統計情報の階層と、 あります。

トレースデータの使用

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

プロファイラから得られる分析情報の例を次に挙げます。 ソリューションの例を紹介します

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