モデルを構築して変換する

マイクロコントローラは RAM とストレージが限られているため、ML モデルのサイズに制約があります。また、TensorFlow Lite for Microcontrollers は現在、一部の演算のみをサポートしているため、すべてのモデル アーキテクチャが可能なわけではありません。

このドキュメントでは、マイクロコントローラ上で動作するように TensorFlow モデルを変換するプロセスについて説明します。また、サポートされているオペレーションの概要と、限られたメモリに収まるモデルの設計とトレーニングに関するガイダンスも提供します。

モデルの構築と変換に関するエンドツーエンドの実行可能な例については、Hello World の例をご覧ください。

モデル変換

トレーニング済みの TensorFlow モデルをマイクロコントローラ上で実行できるように変換するには、TensorFlow Lite コンバータ Python API を使用する必要があります。これにより、モデルが FlatBuffer に変換され、モデルサイズが縮小され、TensorFlow Lite オペレーションを使用するように変更されます。

モデルサイズを可能な限り小さくするには、トレーニング後の量子化の使用を検討する必要があります。

C 配列に変換する

多くのマイクロコントローラ プラットフォームは、ネイティブのファイルシステムをサポートしていません。プログラムからモデルを使用する最も簡単な方法は、それを C 配列として組み込んでプログラムにコンパイルすることです。

次の unix コマンドは、TensorFlow Lite モデルを 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 をご覧ください。

モデル アーキテクチャとトレーニング

マイクロコントローラで使用するモデルを設計する際は、モデルのサイズ、ワークロード、使用するオペレーションを考慮することが重要です。

モデルの規模

モデルは、バイナリと実行時の両方で、プログラムの残りの部分とともにターゲット デバイスのメモリに収まる大きさでなければなりません。

より小さなモデルを作成するには、アーキテクチャで使用するレイヤの数を減らし、小さくします。ただし、小さいモデルでは学習不足が発生する可能性が高くなります。つまり、多くの問題では、メモリに収まる最大のモデルを試すのが合理的です。ただし、大規模なモデルを使用すると、プロセッサのワークロードも増加します。

ワークロード

モデルのサイズと複雑さはワークロードに影響します。大規模で複雑なモデルでは、デューティ サイクルが高くなる可能性があります。これは、デバイスのプロセッサが処理に費やす時間が長くなり、アイドル状態の時間が少なくなることを意味します。これにより、消費電力と熱出力が増加しますが、アプリケーションによっては問題になることがあります。

オペレーション サポート

TensorFlow Lite for Microcontrollers は現在、TensorFlow オペレーションの一部のみをサポートしています。これは、実行可能なモデル アーキテクチャに影響します。Google は、リファレンス実装と特定のアーキテクチャの最適化の両面から、オペレーション サポートの拡大に取り組んでいます。

サポートされているオペレーションは、micro_mutable_ops_resolver.h ファイルで確認できます。