モバイルデバイスや組み込みデバイスは計算リソースが限られているため、アプリのリソースを効率的に保つことが重要になります。ここでは、TensorFlow Lite モデルのパフォーマンス向上に使用可能な、ベストプラクティスと戦略を紹介します。
タスクに最適なモデルを選択する
タスクによっては、モデルの複雑さとサイズの間でトレードオフを行う必要があります。高い精度が要求されるタスクの場合は、大規模かつ複雑なモデルが必要になる可能性があります。さほど精度を必要としないタスクの場合は、小規模モデルを使用した方がディスク容量とメモリの使用量が少なくて済むだけでなく、一般的に高速でエネルギー効率が良くなります。例えば、以下のグラフは一般的な画像分類モデルの精度とレイテンシのトレードオフを示しています。
モバイルデバイス向けに最適化されたモデルの一例には MobileNets がありますが、これはモバイルビジョンアプリケーション向けに最適化されています。TensorFlow Hub には、モバイルデバイスや組み込みデバイス向けに最適化されたモデルがほかにも複数掲載されています。
掲載されているモデルは、転移学習を用いることで、独自のデータセットで再トレーニングすることが可能です。TensorFlow Liteのモデルメーカーを使った、転移学習のチュートリアルをご覧ください。
モデルをプロファイルする
タスクに適した候補モデルを選択したら、モデルのプロファイルとベンチマークを行うことをお勧めします。TensorFlow Lite ベンチマークツールには、演算子ごとのプロファイル統計を表示するプロファイラが組み込まれています。これはパフォーマンスのボトルネックや、どの演算子が計算時間を支配しているかを理解するのに有用です。
また、TensorFlow Lite トレーシングを使用して、標準的な Android システムのトレーシングで Android アプリ内のモデルをプロファイルしたり、GUI ベースのプロファイルツールで演算子呼び出しを時間ごとに可視化したりすることも可能です。
グラフ内の演算子をプロファイルして最適化する
モデル内で特定の演算子が頻繁に現れ、その演算子が最も時間を消費することがプロファイルで分かっている場合は、その演算子の最適化の検討をお勧めします。TensorFlow Lite の演算子のほとんどは最適化されたバージョンなので、このようなシナリオは稀なはずです。しかし、演算実行の制約が分かっている場合には、より高速なバージョンのカスタム演算子を記述することができる可能性があります。詳しくはカスタム演算子のガイドをご覧ください。
モデルを最適化する
モデル最適化は、モバイルデバイスにデプロイできるようにするため、一般的に高速でエネルギー効率の良い小規模モデルの作成を目的としています。TensorFlow Lite は量子化など複数の最適化手法をサポートしています。
詳細については、モデル最適化のドキュメントをご覧ください。
スレッド数を微調整する
TensorFlow Lite は、多くの演算子のマルチスレッドカーネルをサポートしています。スレッド数を増やすことにより演算の実行を高速化することができます。ただし、スレッド数を増やすとモデルがより多くのリソースと電力を使用することになります。
アプリによっては、エネルギー効率よりもレイテンシの方が重要な場合があります。インタプリタスレッドの数を設定してスレッド数を増やすことは可能です。しかし、マルチスレッドの実行は、他に何が同時に実行されているか次第で、パフォーマンスのばらつきが大きくなるという代償を伴います。特にモバイルアプリではこれが顕著です。例えば、単独のテストではシングルスレッドと比較して 2 倍に高速化しても、別のアプリが同時実行している場合にはシングルスレッドよりもパフォーマンスが低下する可能性があります。
冗長なコピーを排除する
慎重に設計されていないアプリの場合、モデルへの入力供給やモデルからの出力読み込みの際に、冗長なコピーが発生することがあります。冗長なコピーは必ず削除してください。Java のような高レベル API を使用している場合、パフォーマンスに関する注意事項があるかどうか、ドキュメントをしっかりチェックするようにしてください。例えば、ByteBuffers
を入力として使用する際には、Java API の方がはるかに高速です。
プラットフォーム固有のツールでアプリをプロファイルする
Android Profiler や Instruments などのプラットフォーム固有のツールは、アプリのデバッグに使用できる豊富なプロファイル情報を提供しています。パフォーマンスのバグはモデルではなく、モデルと相互作用するアプリケーションコードの一部にある場合があります。プラットフォームに精通するようにしてください。
デバイスのハードウェアアクセラレータでモデルにメリットがあるか評価する
TensorFlow Lite には、GPU、DSP、ニューラルアクセラレータなど、より高速なハードウェアを使用してモデルを高速化する新しい方法が追加されました。通常、これらのアクセラレータはインタプリタの実行の一部を引き継ぐデリゲートサブモジュールから利用することができます。TensorFlow Lite では、以下の方法でデリゲートの使用が可能です。
- Android のニューラルネットワーク API を使用します。ハードウェアアクセラレータバックエンドを利用して、モデルの速度と効率を向上させることができます。ニューラルネットワーク API を有効にするには、NNAPI デリゲートガイドをご覧ください。
- GPU デリゲートは、Android と iOS でそれぞれ OpenGL/OpenCL と Metal を使用して利用できます。これを試す場合は、GPU デリゲートのチュートリアルとドキュメントをご覧ください。
- Hexagon デリゲートは Android で利用可能です。デバイスで利用可能な場合には、Qualcomm Hexagon DSP を使用します。詳細については、Hexagon デリゲートチュートリアルをご覧ください。
- 非標準のハードウェアへのアクセスが可能な場合、独自のデリゲートを作成することができます。詳細は、TensorFlow Lite デリゲートをご覧ください。
アクセラレータによっては、モデルの種類次第で動作が良くなる場合があることに留意してください。一部のデリゲートは、浮動小数点数モデルや特定の方法で最適化されたモデルのみをサポートしています。各デリゲートをベンチマークして、それがアプリケーションに適しているかどうかを確認することが重要です。たとえば、非常に小規模のモデルの場合は、モデルを NN API や GPU にデリゲートする価値はない可能性があります。逆に、算術強度の高い大規模モデルにはアクセラレータが適しています。
さらにヘルプが必要な場合
特定のパフォーマンスの問題がありましたら詳細を明記の上、GitHub に課題を提出してください。TensorFlow チームは、喜んで問題の診断と対処をサポートいたします。