TensorFlow Lite の委譲

デリゲートは、GPU やデジタル シグナル プロセッサ(DSP)などのオンデバイス アクセラレータを利用することで、TensorFlow Lite モデルのハードウェア アクセラレーションを実現します。

デフォルトでは、TensorFlow Lite は ARM Neon 命令セット用に最適化された CPU カーネルを利用します。ただし、CPU は多目的プロセッサであり、ML モデルで一般的に見られる負荷の高い演算(畳み込みレイヤと密レイヤに関連する行列計算など)に必ずしも最適化されるとは限りません。

一方、最近のほとんどのスマートフォンには、このような負荷の大きい操作に適したチップが搭載されています。ニューラル ネットワークの操作に利用すると、レイテンシと電力効率の面で大きなメリットがあります。たとえば、GPU はレイテンシで最大 5 倍の高速化を実現でき、Qualcomm® Hexagon DSP は、Google のテストで消費電力を最大 75% 削減することが示されています。

これらの各アクセラレータには、モバイル GPU 用の OpenCLOpenGL ES などのカスタム計算を可能にする API が関連付けられています。通常、これらのインターフェースを介してニューラル ネットワークを実行するには、大量のカスタムコードを記述する必要があります。各アクセラレータには長所と短所があり、ニューラル ネットワークですべての演算を実行できないと考えると、事態はさらに複雑になります。TensorFlow Lite の Delegate API は、TFLite ランタイムと低レベル API の間のブリッジとして機能することで、この問題を解決します。

委譲ありのランタイム

代理人の選択

TensorFlow Lite は複数のデリゲートをサポートしており、各デリゲートは特定のプラットフォームと特定のタイプのモデル用に最適化されています。通常は、ターゲットとなるプラットフォーム(Android か iOS か)と、高速化するモデルタイプ(浮動小数点数か量子化か)の 2 つの主要な基準に応じて、ユースケースに適用される複数のデリゲートがあります。

プラットフォーム別の代理人

クロス プラットフォーム(Android と iOS)

  • GPU デリゲート - GPU デリゲートは Android と iOS の両方で使用できます。GPU が利用可能な 32 ビットと 16 ビットの浮動小数点ベースのモデルを実行するように最適化されています。また、8 ビットの量子化モデルをサポートし、浮動小数点数バージョンと同等の GPU パフォーマンスを提供します。GPU デリゲートの詳細については、GPU での TensorFlow Lite をご覧ください。

iOS

  • 新しい iPhone と iPad 向けの Core ML デリゲート - Neural Engine が利用可能な新しい iPhone と iPad では、Core ML デリゲートを使用して 32 ビットまたは 16 ビットの浮動小数点モデルの推論を高速化できます。Neural Engine は、A12 SoC 以降を搭載した Apple モバイル デバイスで利用できます。Core ML デリゲートの概要と詳細な手順については、TensorFlow Lite Core ML デリゲートをご覧ください。

モデルタイプ別のデリゲート

各アクセラレータは、特定のビット幅のデータを考慮して設計されています。8 ビットの量子化演算のみをサポートするデリゲートに浮動小数点モデルを提供すると、その演算はすべて拒否され、モデル全体が CPU 上で実行されます。このような想定外の事態を避けるため、次の表に、モデルタイプに基づくデリゲートのサポートの概要を示します。

モデルタイプ GPU NNAPI 六角形 CoreML
浮動小数点(32 ビット) はい はい × はい
トレーニング後の float16 の量子化 はい × × はい
トレーニング後のダイナミック レンジ量子化 はい はい × ×
トレーニング後の整数量子化 はい はい はい ×
量子化認識トレーニング はい はい はい ×

パフォーマンスの検証

このセクションの情報は、アプリケーションの改善に役立ちそうなデリゲートをリストアップするための大まかなガイドラインとして機能します。ただし、各デリゲートがサポートするオペレーションのセットが事前に定義されており、モデルやデバイスによって実行方法が異なる可能性があるので注意してください。したがって、通常はベンチマークを実行して、デリゲートがニーズに対してどの程度有用であるかを測定することをおすすめします。これは、TensorFlow Lite ランタイムへのデリゲートの接続に関連するバイナリサイズの増加の正当化にも役立ちます。

TensorFlow Lite には、パフォーマンスと精度を評価する広範なツールが用意されており、デベロッパーは安心してアプリケーションでデリゲートを使用できます。これらのツールについては、次のセクションで説明します。

評価ツール

レイテンシとメモリ フットプリント

TensorFlow Lite のベンチマーク ツールは、平均推論レイテンシ、初期化オーバーヘッド、メモリ フットプリントなど、モデルのパフォーマンスを推定するための適切なパラメータとともに使用できます。このツールは、モデルに最適なデリゲート構成を判断するための複数のフラグをサポートしています。たとえば、--gpu_backend=gl--use_gpu と指定すると、OpenGL で GPU の実行を測定できます。サポートされているデリゲート パラメータの完全なリストについては、詳細なドキュメントをご覧ください。

GPU を使用した量子化モデルに対して、adb を使用して実行した例を次に示します。

adb shell /data/local/tmp/benchmark_model \
  --graph=/data/local/tmp/mobilenet_v1_224_quant.tflite \
  --use_gpu=true

Android および 64 ビット ARM アーキテクチャ向けのビルド済みバージョンのこのツールは、こちらからダウンロードできます(詳細)。

正確性と正確性

デリゲートは通常、対応する CPU とは異なる精度で計算を実行します。その結果、ハードウェア アクセラレーションでデリゲートを使用することには、精度のトレードオフが(通常は軽微な)存在します。これは常に当てはまるとは限りません。たとえば GPU は浮動小数点精度を使用して量子化モデルを実行するため、精度がわずかに向上する場合があります(例: ILSVRC 画像分類における上位 5 項目の改善率 <1%)

TensorFlow Lite には、特定のモデルに対するデリゲートの動作精度を測定するため、タスクベースとタスク非依存の 2 種類のツールがあります。このセクションで説明するツールはすべて、前のセクションのベンチマーク ツールで使用される高度な委任パラメータをサポートしています。以下のサブセクションでは、モデル評価(モデル自体がタスクに適しているか?)ではなく、デリゲートの評価(デリゲートが CPU と同じように動作するか)に焦点を当てています。

タスクベースの評価

TensorFlow Lite には、次の 2 つの画像ベースのタスクで正確性を評価するツールがあります。

これらのツールのビルド済みバイナリ(Android、64 ビット ARM アーキテクチャ)とドキュメントは、次の場所にあります。

次の例は、Google Pixel 4 で Google の Edge-TPU を利用する NNAPI による画像分類評価を示しています。

adb shell /data/local/tmp/run_eval \
  --model_file=/data/local/tmp/mobilenet_quant_v1_224.tflite \
  --ground_truth_images_path=/data/local/tmp/ilsvrc_images \
  --ground_truth_labels=/data/local/tmp/ilsvrc_validation_labels.txt \
  --model_output_labels=/data/local/tmp/model_output_labels.txt \
  --output_file_path=/data/local/tmp/accuracy_output.txt \
  --num_images=0 # Run on all images. \
  --use_nnapi=true \
  --nnapi_accelerator_name=google-edgetpu

予想される出力は、1 ~ 10 のトップ K 指標のリストです。

Top-1 Accuracy: 0.733333
Top-2 Accuracy: 0.826667
Top-3 Accuracy: 0.856667
Top-4 Accuracy: 0.87
Top-5 Accuracy: 0.89
Top-6 Accuracy: 0.903333
Top-7 Accuracy: 0.906667
Top-8 Accuracy: 0.913333
Top-9 Accuracy: 0.92
Top-10 Accuracy: 0.923333

タスクに依存しない評価

オンデバイス評価ツールが確立されていないタスクや、カスタムモデルを試してみる場合は、TensorFlow Lite に推論差分ツールが用意されています。(Android、64 ビット ARM バイナリ アーキテクチャ バイナリについては、こちら

推論差分では、次の 2 つの設定で TensorFlow Lite の実行を(レイテンシと出力値の偏差の観点から)比較します。

これを行うために、ツールはランダムなガウスデータを生成し、2 つの TFLite インタープリタ(1 つはシングルスレッド CPU カーネルを実行、もう 1 つはユーザーの引数によってパラメータ化された)を介してデータを渡します。

両方のレイテンシと、各インタープリタからの出力テンソルの絶対差を、要素ごとに測定します。

単一の出力テンソルを持つモデルの場合、出力は次のようになります。

Num evaluation runs: 50
Reference run latency: avg=84364.2(us), std_dev=12525(us)
Test run latency: avg=7281.64(us), std_dev=2089(us)
OutputDiff[0]: avg_error=1.96277e-05, std_dev=6.95767e-06

つまり、インデックス 0 の出力テンソルの場合、CPU 出力の要素は、デリゲート出力と平均 1.96e-05 だけ異なります。

これらの数値を解釈するには、モデルと、各出力テンソルが何を意味するかについて、より深い知識が必要です。なんらかのスコアやエンベディングを決定する単純な回帰の場合、差は小さくなります(さもなければ、デリゲートのエラーになります)。ただし、SSD モデルからの「検出クラス」のような出力は、解釈が少し難しくなります。たとえば、このツールを使用すると違いが表示される可能性がありますが、デリゲートに問題があるとは限りません。「TV (ID: 10)」、「Monitor (ID:20)」の 2 つのクラスについて考えてみましょう。デリゲートがゴールデン トゥルースから少し外れていて、TV ではなくモニターが表示される場合、このテンソルの出力差分は 1 ~ 10 になります。