- ESP32-S3上でサーバー接続なしに2,890万パラメータの言語モデルを動かし、小さな画面に約毎秒9トークンでテキストを出力する
- 全パラメータのうち2,500万個を低速なフラッシュに置き、トークンごとに必要な約6行、450バイトだけを読む Per-Layer Embeddings 構造を使用する
- モデルは4ビット基準で14.9MBで、512KB SRAMには各トークンで使う演算コア、8MB PSRAMには出力ヘッドと作業メモリ、16MBフラッシュには大型の埋め込みテーブルを配置する
- TinyStoriesで学習しており、短く単純な物語はおおむね一貫して生成できるが、質問応答・命令実行・コード作成・事実知識には適していない
- 以前に類似チップで動作した26万パラメータのモデルより約100倍多いパラメータを搭載しており、要点は生成品質よりも、大規模モデルを小型チップに収めるメモリ構造にある
ハードウェアと実行性能
- 約8ドルのESP32-S3 1個で全処理を行い、サーバーへデータを送らない
- 512KB SRAM、8MB PSRAM、16MBフラッシュを使用する
- 全体速度は約9.5 tok/s、純粋な演算速度は約9.7 tok/s
- 4ビットモデルのサイズは14.9MB
- 合計2,890万パラメータのうち2,500万個がフラッシュの参照テーブルに保存される
小さなメモリにモデルを入れる方法
- 通常はモデル全体に高速メモリからアクセスできる必要があるが、ESP32-S3のSRAMは512KBしかなく、ごく小さなモデルしか収容できない
- パラメータの大半が計算対象ではない埋め込みテーブルにあることを利用し、テーブルをフラッシュに残す
- トークンごとに必要な約6行、約450バイトだけを読む
- 実際の計算を担う小さな部分だけを高速メモリに保持する
- モデルの大部分は実行中にロードされず、必要な部分だけがフラッシュから選択される
- メモリの役割は次のように分かれる
- SRAM: すべてのトークンで使う演算コア
- PSRAM: 出力ヘッドと作業メモリ
- フラッシュ: 2,500万パラメータのテーブル
Per-Layer Embeddings の適用
- Googleの Gemma 3n と Gemma 4 で使われたPer-Layer Embeddingsを、携帯電話やGPUではなくマイクロコントローラのメモリ構造に適用する
- プロジェクト作者が確認した範囲では、このような小さなチップにこの方式を適用した前例はない
モデルにできることと限界
- TinyStories の短い合成ストーリーを学習し、単純な物語を生成しておおむね一貫性を保つ
- 質問応答、命令実行、コード作成、事実知識の提供はできない
- この限界は推論を担う小さなコアに由来し、メモリ配置手法が推論能力そのものを高めるわけではない
コードと実験資料
firmware/esp32_llm/README.mdにファームウェア、配線、フラッシュ手順があるsrc/とexperiments/に学習、アブレーション実験、量子化コードが含まれるRESULTS.mdに全体手法、アブレーション実験、オンチップ測定値が整理されている
ベースとなるプロジェクトと記録
- TinyStoriesは、小さなモデルでも一貫した文章生成を学べるように作られた短い合成ストーリーのデータセット
- Google Gemma の Per-Layer Embeddings が、大規模モデルを小型チップに収める基盤になっている
- Andrej Karpathyの llama2.c は、小さな言語モデルを学習して純粋なCで実行できるというアプローチに影響を与えている
- リポジトリには、初期のパラメータ数を水増ししていた計算ミスとその修正過程も残されている
- コミット履歴と
RESULTS.mdで、数値が変更された箇所と理由を確認できる
- コミット履歴と
1件のコメント
Hacker News のコメント
最近は5ドルのマイクロコントローラでできることが驚くほど多い。Milk-V ボードのうち Duo は最大256MBのメモリと 1TOPS@INT8 の TPU を備え、Linux まで動くので5個購入した
GCC と Clang は xTHeadVector を完全にサポートしており、C の組み込み関数を使えば、コマンドラインオプションだけで RVV 1.0 と互換になる。8ビット要素を扱う
memcpy()、memset()、memcmp()、strlen()、strcpy()、strcmp()のようなコードの多くはバイナリ互換になる64MB Duo を買ったときは3ドルで、その後 64MB・256MB・512MB モデルがそれぞれ 5・7・10ドルだったが、今年は価格がかなり上がった: https://arace.tech/products/milk-v-duo、https://arace.tech/products/milkv-duo-s
4KB PIC が最善という用途も依然としてあるが、ほとんどの状況でより良い選択肢がないかのように振る舞うべきではない
音声・テキスト変換モデルもこのサイズに近づいており、私たちと会話できる小型デバイスがどれほど近づいているのか気になる。歯ブラシが口腔衛生のアドバイスをしたり、歯磨き粉の広告まで流したりする世界が来るかもしれない
しかし、歯ブラシ AI 用の広告ブロッカーまで探さなければならない世界は望んでいない
レイヤー別埋め込み手法を非常に巧みに活用している。約2,000万〜3,000万パラメータの実用的な TTS モデルもあるので、ネットワークに接続されていない ESP32 がほぼリアルタイムで文章を読み上げることもできるかもしれない
PSRAM、フラッシュ、SD カードは個別の帯域幅は高くないが、多数を同時に動かせばかなりのスループットに到達できる。大規模な専用ハードウェアのほうが電力あたり性能では上回るだろうが、低い初期コストと段階的な拡張性のため、こうした構成も魅力的だ
マイクロコントローラよりも、Raspberry Pi 4 のローカル LLMが回答に毎回30秒かからないようにする現実的な選択肢が気になる
超小型デバイスで LLM を動かすのも素晴らしいが、それ以上に、この重みを作り出した学習方法のほうが印象的だ
良いアクセスパターンでフラッシュを活用できるなら、CPU ではるかに大きなモデルを実行する形に拡張できないのか気になる
ESP32-S3 はかなり強力で、現在 Raspberry Pi 4 の開発作業に使っている。2つある USB ポートのうち1つが OTG をサポートしているため、別の方法なら100ドル以上かかる機能も実現できる
現在 tinyusb と pico-pio-usb で動作しており、より高い性能を期待して Rust への移植も実験中
この量子化モデルの精度がどの程度なのか気になる
このサイズで示している性能は驚くべきもので、スレッドに出てきたもう少し強力なシングルボードコンピュータではどこまで可能なのか期待している