TensorFlow Lite の委譲

デリゲートは、GPU や Digital Signal Processor(DSP)などのオンデバイス アクセラレータを活用して、TensorFlow Lite モデルのハードウェア アクセラレーションを可能にします。

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

一方、最新のスマートフォンには、こうした負荷の高い操作をより適切に処理できるチップが搭載されています。これらをニューラル ネットワーク処理に使用すると、レイテンシと電力効率の面で大きなメリットが得られます。たとえば、GPU ではレイテンシを最大 5 倍高速化できます。

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

デリゲートを伴うランタイム

代理人を選択する

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

プラットフォーム別の委任

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

  • GPU デリゲート - Android と iOS の両方で GPU デリゲートを使用できます。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 CoreML
浮動小数点(32 ビット)
トレーニング後の float16 量子化
トレーニング後のダイナミック レンジ量子化 ×
トレーニング後の整数量子化 ×
量子化認識トレーニング ×

パフォーマンスの検証

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

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

評価ツール

レイテンシとメモリ使用量

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

adb で GPU を使用する量子化モデルの実行例を次に示します。

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 アーキテクチャ)とドキュメントについては、こちらをご覧ください。

次の例は、Pixel 4 の GPU を使用した画像分類評価を示しています。

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_gpu=true

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

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 - 0.0 のように高くなります。