マイクロコントローラは RAM とストレージが限られているため、ML モデルのサイズに制約があります。また、LiteRT for Microcontrollers は現在、オペレーションの限定的なサブセットのみをサポートしているため、すべてのモデル アーキテクチャが可能なわけではありません。
このドキュメントでは、マイクロコントローラで実行するために TensorFlow モデルを変換するプロセスについて説明します。また、サポートされているオペレーションの概要を示し、メモリ容量の制限内でモデルを設計してトレーニングするためのガイダンスも提供します。
モデルのビルドと変換のエンドツーエンドの実行可能な例については、Hello World の例をご覧ください。
モデル変換
トレーニング済みの TensorFlow モデルを変換してマイクロコントローラで実行するには、LiteRT コンバータ Python API を使用する必要があります。これにより、モデルが FlatBuffer に変換され、モデルサイズが縮小され、LiteRT オペレーションを使用するように変更されます。
モデルサイズを可能な限り小さくするには、トレーニング後の量子化の使用を検討してください。
C 配列に変換する
多くのマイクロコントローラ プラットフォームには、ネイティブのファイル システム サポートがありません。プログラムからモデルを使用する最も簡単な方法は、モデルを C 配列として含め、プログラムにコンパイルすることです。
次の Unix コマンドは、LiteRT モデルを char 配列として含む C ソースファイルを生成します。
xxd -i converted_model.tflite > model_data.cc
出力は次のようになります。
unsigned char converted_model_tflite[] = {
0x18, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x0e, 0x00,
// <Lines omitted>
};
unsigned int converted_model_tflite_len = 18200;
ファイルを生成したら、プログラムに含めることができます。組み込みプラットフォームでのメモリ効率を向上させるには、配列の宣言を const に変更することが重要です。
プログラムでモデルを含めて使用する方法の例については、Hello World の例の hello_world_test.cc をご覧ください。
モデルのアーキテクチャとトレーニング
マイクロコントローラで使用するモデルを設計する際は、モデルサイズ、ワークロード、使用されるオペレーションを考慮することが重要です。
モデルの規模
モデルは、バイナリと実行時の両方で、プログラムの残りの部分とともにターゲット デバイスのメモリに収まる程度の小さなサイズである必要があります。
より小さなモデルを作成するには、アーキテクチャで使用するレイヤーの数を減らし、レイヤーのサイズを小さくします。ただし、小さいモデルは過小適合が発生しやすくなります。つまり、多くの問題では、メモリに収まる最大のモデルを使用してみるのが妥当です。ただし、大規模なモデルを使用すると、プロセッサのワークロードも増加します。
ワークロード
モデルのサイズと複雑さはワークロードに影響します。大規模で複雑なモデルでは、デューティ サイクルが長くなる可能性があります。これは、デバイスのプロセッサが動作している時間が長くなり、アイドル状態の時間が短くなることを意味します。これにより、消費電力と発熱量が増加します。これは、アプリケーションによっては問題になる可能性があります。
運用サポート
現在、マイクロコントローラ用の LiteRT では、TensorFlow オペレーションの一部しかサポートされていません。そのため、実行可能なモデル アーキテクチャに影響します。現在、リファレンス実装と特定のアーキテクチャの最適化の両面で、オペレーション サポートの拡大に取り組んでいます。
サポートされているオペレーションは、micro_mutable_ops_resolver.h ファイルで確認できます。