TinyML
TinyMLは、キロバイト単位のメモリとミリワット単位の電力しかないマイクロコントローラー上で機械学習を実行します。モデルの小型化、用途、ツールについて解説します。
TinyML(超小型機械学習)とは、通常は数百キロバイト程度のメモリ、OSなし、ミリワット単位の電力予算という制約下で、マイクロコントローラーなどの超低消費電力チップ上で機械学習モデルを動かす技術です。センサーのすぐ隣にあるチップ上で推論を実行すると、バッテリー駆動のデバイスは周囲の音、映像、振動などを数か月から数年間にわたって連続的に検知し、生データではなく「キーワードを検出」「機械の異常振動」といった結果だけを送信できます。これによりレイテンシを抑え、データのプライバシーを守り、ストリーミングに必要な無線通信の電力も節約できます。この分野のコミュニティ組織であるEDGE AI FOUNDATIONは、以前はtinyML Foundationという名称でした。
マイクロコントローラーにモデルを収める方法#
マイクロコントローラーは、モデルの重みをプログラムとともにフラッシュメモリに保存し、計算中のアクティベーションを通常はより制約の厳しいSRAMに保持します。モデル量子化で8ビット整数にすると重みのサイズをFP32の4分の1にでき、小さなコアでも効率よく実行できる整数演算に置き換えられます。深度方向分離可能な畳み込み、モデルプルーニング、低い入力解像度を活用したコンパクトなアーキテクチャによって、残りのサイズも縮小できます。また、ニューラルアーキテクチャ探索を使えば、特定チップのメモリに合わせたネットワークを設計できます。MCUNetはこうした探索とメモリを考慮したランタイムを組み合わせ、市販のマイクロコントローラーでImageNetのトップ1精度70%以上を達成しました。完成したモデルはファームウェアにコンパイルされ、小型インタープリターまたはコンパイル済みコードによって実行されます。
ハードウェアを使う前に、必要なリソースを見積もることができます。このキーワードスポッティングネットワークは、音声特徴量から音声コマンドを認識する用途で使われる深度方向分離可能CNNであり、フラッシュ用にはINT8の重みを1バイトずつ数え、SRAM用には入力と出力のアクティベーションのうち最大の組み合わせを数えます。
import torch
from torch import nn
# A depthwise-separable CNN for keyword spotting on 49x10 MFCC audio features
model = nn.Sequential(
nn.Conv2d(1, 64, (10, 4), stride=2, padding=(5, 1)),
nn.ReLU(),
nn.Conv2d(64, 64, 3, padding=1, groups=64),
nn.Conv2d(64, 64, 1),
nn.ReLU(),
nn.Conv2d(64, 64, 3, padding=1, groups=64),
nn.Conv2d(64, 64, 1),
nn.ReLU(),
nn.AdaptiveAvgPool2d(1),
nn.Flatten(),
nn.Linear(64, 12),
)
# At INT8, flash stores one byte per weight and SRAM holds activations in flight
weights = sum(p.numel() for p in model.parameters())
x, peak = torch.randn(1, 1, 49, 10), 0
for layer in model:
y = layer(x)
peak = max(peak, x.numel() + y.numel()) # a layer's input and output coexist
x = y
print(f"Flash: {weights / 1024:.1f} KB, peak SRAM: {peak / 1024:.1f} KB")出力はフラッシュ12.7 KB、ピーク時のSRAM 15.6 KBです。これは、Arduino Nano 33 BLE Senseに搭載されたnRF52840マイクロコントローラーのフラッシュ1 MB、RAM 256 KBのごく一部であり、音声パイプラインとランタイム自体に十分な空きが残ります。
ランタイムとハードウェア#
- LiteRT for Microcontrollers: Googleのインタープリターは、以前はTensorFlow Lite for Microcontrollersという名称でした。OS、標準ライブラリ、動的メモリ割り当てが不要で、コアランタイムはArm Cortex-M3上で16 KBに収まります。
- ExecuTorch: PyTorchのオンデバイスランタイムです。Arm Ethos-Uバックエンドは、低消費電力チップの多くでCortex-Mコアの隣に配置されるArm Ethos-U NPU上で、量子化モデルを実行します。
- Arm Cortex-M: TinyMLを実行するほとんどのマイクロコントローラーに搭載されたプロセッサーファミリーです。数KBのRAMを備えるCortex-M0+から、機械学習向けのベクトル命令を備えたCortex-M55やCortex-M85まで含まれます。
- Coral NPU: Googleが2025年10月に発表した、常時稼働型ウェアラブル向けのオープンソースRISC-Vアクセラレーター設計です。数ミリワットの消費電力で、毎秒約5120億回の演算を目標としています。
TinyMLとEdge AIの比較#
エッジAIは、データが生成されるデバイス上でのあらゆる推論を対象とし、スマートフォン、Raspberry Piなどのシングルボードコンピューター、NVIDIA Jetsonなどの組み込みGPUモジュールが含まれます。これらはギガバイト単位のメモリを搭載し、ワット単位の電力を消費します。TinyMLはその最小層であり、モデルのサイズはキロバイト単位です。マイクロコントローラーにアクセラレーターが搭載されるにつれて境界は変化し続けています。STのSTM32N6は、Cortex-M55に600 GOPSのニューラルプロセッシングユニットと4.2 MBのRAMを組み合わせています。Ultralytics YOLO26の最小検出器は240万パラメーターで、INT8では約2.4 MBです。そのため、INT8のLiteRTエクスポート(format="litert", quantize=8)は従来のTinyMLより上の層、つまりスマートフォン、シングルボードコンピューター、アクセラレーター搭載ボードを対象とします。
TinyMLの用途#
- キーワードスポッティング: スマートフォン、イヤホン、スマートスピーカーの常時稼働型ウェイクワード検出器は、低消費電力コアで単一のフレーズを聞き取り、検出したときだけメインプロセッサーを起動します。
- 予知保全: モーターやポンプに取り付けた振動・音響センサーが通常時の動作を学習し、故障の前兆となる異常を検出します。バッテリーで数年間動作します。
- 野生生物・環境モニタリング: 太陽光またはバッテリーで動作する音響センサーが、遠隔地の森林で動物の鳴き声やチェーンソーの音を認識し、長距離無線で短いアラートを送信します。
- 視覚ウェイクワード: マイクロコントローラーに接続した低解像度カメラが人の映り込みを判断し、人を検出したときだけ大規模なシステムを起動します。
MLPerf Tinyは、MLCommonsがこのクラスのハードウェア向けに提供するベンチマークです。キーワードスポッティング、視覚ウェイクワード、CIFAR-10の画像分類、機械音の異常検知など、これらの用途から選ばれたタスクで精度、レイテンシ、エネルギー消費を測定します。










