モバイル デバイスや組み込みデバイスではコンピューティング リソースが限られているため、アプリケーションのリソース効率を維持することが重要です。TensorFlow Lite モデルのパフォーマンスを向上させるために使用できるベスト プラクティスと戦略のリストをまとめました。
タスクに最適なモデルを選択する
タスクに応じて、モデルの複雑さとサイズの間でトレードオフを行う必要があります。タスクに高い精度が求められる場合は、大規模で複雑なモデルが必要になることがあります。精度がそれほど必要ないタスクには、小さいモデルを使用することをおすすめします。小さいモデルは、ディスク容量とメモリの使用量が少ないだけでなく、一般的に高速でエネルギー効率も優れています。たとえば、次のグラフは、一般的な画像分類モデルの精度とレイテンシのトレードオフを示しています。


モバイル デバイス向けに最適化されたモデルの例として、モバイル ビジョン アプリケーション向けに最適化された MobileNets があります。Kaggle Models には、モバイル デバイスと埋め込みデバイス用に特別に最適化された他のモデルがいくつかリストされています。
転移学習を使用すると、独自のデータセットでリストされているモデルを再トレーニングできます。
モデルをプロファイリングする
タスクに適した候補モデルを選択したら、モデルのプロファイリングとベンチマークを行うことをおすすめします。LiteRT ベンチマーク ツールには、演算子ごとのプロファイリング統計情報を表示するプロファイラが組み込まれています。これは、パフォーマンスのボトルネックと、計算時間を支配しているオペレーターを理解するのに役立ちます。
また、標準の Android システム トレースを使用して Android アプリケーションでモデルをプロファイリングし、GUI ベースのプロファイリング ツールでオペレーター呼び出しを時間ごとに可視化するために、LiteRT トレースを使用することもできます。
グラフ内の演算子をプロファイリングして最適化する
特定の演算子がモデルに頻繁に現れ、プロファイリングに基づいてその演算子が最も多くの時間を消費していることがわかった場合は、その演算子の最適化を検討できます。TensorFlow Lite にはほとんどの演算子の最適化バージョンがあるため、このシナリオはまれです。ただし、演算子が実行される制約がわかっている場合は、カスタム オペレーションの高速バージョンを作成できることがあります。カスタム オペレーター ガイドをご覧ください。
モデルを最適化する
モデルの最適化は、一般的に高速でエネルギー効率の高い、より小さなモデルを作成し、モバイル デバイスにデプロイできるようにすることを目的としています。LiteRT は、量子化などの複数の最適化手法をサポートしています。
詳しくは、モデルの最適化に関するドキュメントをご覧ください。
スレッド数を調整する
LiteRT は、多くの演算子に対してマルチスレッド カーネルをサポートしています。スレッドの数を増やして、オペレーターの実行を高速化できます。ただし、スレッド数を増やすと、モデルで使用するリソースと電力が多くなります。
アプリケーションによっては、エネルギー効率よりもレイテンシが重要になることがあります。インタープリタのスレッド数を設定することで、スレッド数を増やすことができます。ただし、マルチスレッド実行では、同時に実行される他の処理に応じてパフォーマンスの変動が大きくなるというデメリットがあります。これは特にモバイルアプリに当てはまります。たとえば、単一スレッドと比較して 2 倍の高速化が示される分離テストでも、別のアプリが同時に実行されている場合は、単一スレッドよりもパフォーマンスが低下する可能性があります。
冗長なコピーを排除する
アプリケーションが慎重に設計されていない場合、モデルへの入力のフィードとモデルからの出力の読み取り時に冗長なコピーが発生する可能性があります。冗長なコピーは削除してください。Java などの高レベルの API を使用する場合は、パフォーマンスに関する注意点についてドキュメントをよく確認してください。たとえば、ByteBuffers が入力として使用される場合、Java API は大幅に高速になります。
プラットフォーム固有のツールでアプリケーションをプロファイリングする
Android Profiler や Instruments などのプラットフォーム固有のツールは、アプリのデバッグに使用できる豊富なプロファイリング情報を提供します。パフォーマンス バグは、モデルではなく、モデルとやり取りするアプリケーション コードの一部にある場合もあります。プラットフォーム固有のプロファイリング ツールと、プラットフォームのベスト プラクティスをよく理解しておいてください。
デバイスで使用可能なハードウェア アクセラレータを使用することでモデルのパフォーマンスが向上するかどうかを評価する
LiteRT には、GPU、DSP、ニューラル アクセラレータなどの高速ハードウェアでモデルを高速化する新しい方法が追加されました。通常、これらのアクセラレータは、インタープリタ実行の一部を引き継ぐ delegate サブモジュールを介して公開されます。LiteRT は、次の方法でデリゲートを使用できます。
- GPU デリゲートは Android と iOS で利用でき、それぞれ OpenGL/OpenCL と Metal を使用します。試すには、GPU デリゲートをご覧ください。
- 標準以外のハードウェアにアクセスできる場合は、独自のデリゲートを作成できます。詳しくは、LiteRT デリゲートをご覧ください。
アクセラレータによっては、モデルの種類によってパフォーマンスが異なる場合があります。一部のデリゲートは、浮動小数点モデルまたは特定の方法で最適化されたモデルのみをサポートします。各デリゲートをベンチマークして、アプリに適しているかどうかを確認することが重要です。たとえば、モデルが非常に小さい場合は、モデルを GPU に委任する価値がない可能性があります。一方、アクセラレータは、算術演算の強度が高い大規模なモデルに適しています。