1 ポイント 投稿者 GN⁺ 3 시간 전 | 1件のコメント | WhatsAppで共有
  • 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件のコメント

 
GN⁺ 3 시간 전
Hacker News のコメント
  • 最近は5ドルのマイクロコントローラでできることが驚くほど多い。Milk-V ボードのうち Duo は最大256MBのメモリと 1TOPS@INT8 の TPU を備え、Linux まで動くので5個購入した

    • 128ビットのベクトル ISAと32本のレジスタも見逃せない。最大64ビット整数・浮動小数点をサポートし、LMUL=8 なら単一命令で1,024ビットを処理し、ほとんどの演算は128ビットあたり3サイクルかかる
      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-duohttps://arace.tech/products/milkv-duo-s
    • 0.5ドル未満のマイクロコントローラも買えるが、5ドル製品であってもモデル実行には制約が厳しすぎて、事実上使い物にならない環境に見える。モデル需要でMCU 不足が起きないことを願う
    • マイクロコントローラが1980年代のハードウェアにとどまっているかのように、アセンブリ言語や C だけが唯一の選択肢だと思う必要はない。この程度のデバイスなら Xerox PARC のオペレーティングシステムも難なく実行できる
      4KB PIC が最善という用途も依然としてあるが、ほとんどの状況でより良い選択肢がないかのように振る舞うべきではない
    • この価格と性能は、ARM の独占的地位が業界全体にどれほど大きなコストを課してきたかを実感させる
  • 音声・テキスト変換モデルもこのサイズに近づいており、私たちと会話できる小型デバイスがどれほど近づいているのか気になる。歯ブラシが口腔衛生のアドバイスをしたり、歯磨き粉の広告まで流したりする世界が来るかもしれない

    • 口腔衛生のアドバイスはすでに可能。Philips の上位モデルの歯ブラシは Bluetooth で接続し、アプリでフィードバックを提供する
      しかし、歯ブラシ AI 用の広告ブロッカーまで探さなければならない世界は望んでいない
  • レイヤー別埋め込み手法を非常に巧みに活用している。約2,000万〜3,000万パラメータの実用的な TTS モデルもあるので、ネットワークに接続されていない ESP32 がほぼリアルタイムで文章を読み上げることもできるかもしれない

    • MCU ごとにモデルのレイヤーを1つずつ担当させる構成を試してみたい。複数の RP2350 を PIO 専用回線で接続し、補間器と二重乗算命令を組み合わせる方式だ
      PSRAM、フラッシュ、SD カードは個別の帯域幅は高くないが、多数を同時に動かせばかなりのスループットに到達できる。大規模な専用ハードウェアのほうが電力あたり性能では上回るだろうが、低い初期コストと段階的な拡張性のため、こうした構成も魅力的だ
  • マイクロコントローラよりも、Raspberry Pi 4 のローカル LLMが回答に毎回30秒かからないようにする現実的な選択肢が気になる

  • 超小型デバイスで LLM を動かすのも素晴らしいが、それ以上に、この重みを作り出した学習方法のほうが印象的だ

    • 小さなパラメータ領域ではベンチマークだけを狙った過度な最適化が難しいため、リーダーボードの有用性が終わったわけではない。むしろ、同じベンチマーク性能を出すより小さなモデルを見つけ出し、モデリング段階で圧縮可能性や冗長性を認識して取り除くよう促す役割が残っている
  • 良いアクセスパターンでフラッシュを活用できるなら、CPU ではるかに大きなモデルを実行する形に拡張できないのか気になる

    • 似た試みが最近あった。一般的なデスクトップ CPU、NVMe SSD、約25GB RAM で GLM-5.2 を実行したが、速度は秒あたりトークン数ではなくトークンあたり最大20秒程度だった: https://github.com/JustVugg/colibri
    • ESP32 のフラッシュ帯域幅は内部 SRAM の約4分の1にすぎない。より強力なシステムではこの差はさらに大きくなり、増えた演算性能を効率よく活用するには、供給すべきメモリ帯域幅も大きく増える
  • ESP32-S3 はかなり強力で、現在 Raspberry Pi 4 の開発作業に使っている。2つある USB ポートのうち1つが OTG をサポートしているため、別の方法なら100ドル以上かかる機能も実現できる

    • 一部の制約を受け入れれば、RP2350 で約1ドルで似た構成が可能。最大速度は USB Full Speed の 12Mbps で、1つはチップ内蔵の USB ペリフェラルを使い、もう1つは PIO がサポートする GPIO ピンに接続すればよい
      現在 tinyusb と pico-pio-usb で動作しており、より高い性能を期待して Rust への移植も実験中
  • この量子化モデルの精度がどの程度なのか気になる

  • このサイズで示している性能は驚くべきもので、スレッドに出てきたもう少し強力なシングルボードコンピュータではどこまで可能なのか期待している