書籍『TinyML』 の要点メモ, その2

4,5,6章の要点メモです。 その1の続きです。 (要点と私の意見が混在していますがご容赦ください)

4,5,6章はこのサンプルの詳細な説明です。 github.com

4章: The "Hello World" of TinyML: Building and Training a Model

  • ランダムノイズを加えた正弦波を入力、正弦波波形を教師データとして、正弦波を出力するモデルを訓練し、推論するサンプル
  • 環境の説明(Jupter Notebook, Google Colab, Python, TensorFlow, Numpy, Keras)
  • Kerasのモデル生成方法, fit, compile, predict メソッドを知っていれば、モデルの訓練までは斜め読みでok
  • TFモデルをFlatBufferフォーマットのTFLモデルに変換する。詳細は12章。
  • モデル変換時に最適化(量子化とか)も行う。詳細は13章。
  • 量子化するときは入力値のフルレンジ(最大値、最小値)を含むrepresentative datasetを使う。(ダイナミックレンジと分解能を決めるために)
  • xddコマンドを使ってCソースファイルに変換する

5章: The "Hello World" of TinyML: Building an Application

microcontroller上で推論アプリ(正弦波の推論)を動作させる。

  • 簡易的なテストフレームワーク(TF_LITE_MICRI_TESTS)がある
  • TFLモデルを読み込んで、型のテスト、shapeのテスト、スキーマのバージョンのテスト
  • テンソル(入力、出力、中間テンソル)の記憶領域確保 ** どれくらいの領域を確保すればいいかはトライ&エラー(本当?
  • インタープリタがTFLMの肝
  • 入力が多次元配列でも平坦化してから入力値を設定する
  • 組込みアプリではできるだけPCの環境でテストする。(組込みデバイスでのテストはPCのそれより大変なので)
  • 組込みデバイス毎にデバイス固有のソースファイルが供給される
  • このサンプルは↓の構造になっている
int main(int argc, char* argv[]) {
  setup(); /* モデル読み込み、モデルの形状や型の確認 */
  while (true) { /* このアプリ(OSもない)しか動作しないので無限ループ */
    loop(); /* 推論、期待値と出力を比較 */
  }
}
  • (細かく説明してくれているので理解はできると思うが、C/C++のコードを見たことがないとちょっと手間取るかも。)

6章: The "Hello World" of TinyML: Deploying to Microcontrollers

5章でビルドしたアプリを3つの組込みデバイス(Arduino Nano 33 BLE Sense, SparkFun Edge, STM32F746G Discovery kit)にデプロイする。 ただし、自分は SparkFun Edge を中心に読んだので、ほかの2つのデバイス固有の話は含まれません。

  • 組込みデバイス毎にハードウェア構成が異なるので、loop()から呼ばれるHandleOutput() (出力表示。LED点滅, LCD表示 etc.)を組込みデバイス毎に実装する
  • マイクロコントローラの全くの初心者向けに、マイクロコントローラとはなんぞや?、という説明
  • SparkFun Edge
    • 構成、特徴:Arm Cortex M4, LED x4, 1MiB Flash, Low Power
    • 推論値に応じて異なるLEDを点滅させるコードを HandleOutput() に実装
    • ビルドしたバイナリは暗号化キーで署名する必要がある
    • UART経由でバイナリをFlashに焼く
    • 実行するとLED点滅のほかにシリアルポートにもログが流れてくる
    • (私はWindows10のWSL(Ubuntu18.04)で試しました)