不可能な偉業:8ドルのチップで動く2900万パラメータのLLM
ウクライナの開発者Slava S.氏は、8ドルのESP32-S3マイクロコントローラー上で2890万パラメータの言語モデルを正常に実行するという驚異的な偉業を成し遂げました。この画期的なシステムは完全にオフラインで動作し、Wi-Fiやサーバー接続なしでローカルにテキストを生成します。これは組み込みAI機能における驚くべき飛躍であり、クラウドインフラから遠く離れた最小限のハードウェア上で強力な言語処理を可能にしました。
この成果は、マイクロコントローラーで何が可能かを劇的に再定義します。これまで、このようなチップ上で正常に展開された最大の言語モデルは約26万パラメータが限界でした。Slava S.氏の革新はこれを110倍にまで拡大し、オンデバイスAIの状況を根本から変え、厳しいサイズ制限が必ずしも克服不可能ではないことを証明しました。
ESP32-S3のスペックを考えると、この成果はさらに驚くべきものです。このチップのSRAMはわずか512KBで、1990年代の一般的なパーソナルコンピュータよりも少ないメモリ容量です。この深刻な制約にもかかわらず、システムは1秒間に9トークンという実用的な速度でテキストを生成します。これは、綿密なエンジニアリングがいかにして厳しいハードウェア制限を克服し、超低電力かつ切断された環境で高度なAI推論を実現できるかを示しています。
メモリハック:RAMではなくFlashを活用
ウクライナの開発者Slava S.氏は、GoogleのGemmaモデルから着想を得た巧妙な回避策を活用しました。「レイヤーごとの埋め込み(per-layer embeddings)」と呼ばれるこの技術は、大規模言語モデルのパラメータがどのように機能するかを再考するものです。核心となる洞察は、LLMのパラメータの大部分が、リアルタイムの計算に積極的に参加するのではなく、単語表現の膨大な辞書である静的なルックアップテーブルに存在しているという点です。
この根本的な区別により、過激なメモリ戦略が可能になりました。モデル全体をESP32-S3のわずか512KBの高速SRAMに詰め込もうとする代わりに、約15MBに及ぶ2500万行の巨大な埋め込みテーブルを戦略的に再配置しました。これにより、チップのより大容量で低速かつ安価な16MBのフラッシュメモリに格納されます。
推論中、システムは現在のトークンに絶対必要な数行の埋め込みのみを動的に取得します。例えば、合計で約450バイトに相当するわずか6行だけが、フラッシュメモリからSRAMに読み込まれます。この独創的なアプローチにより、限られた高速SRAMの大部分を、次のトークンを処理および生成するためのアテンションヘッドやフィードフォワード層といった、モデルの実際の計算作業のために空けておくことができます。
現実的な確認:これはChatGPTではない
Slava S.氏の成果は画期的ですが、汎用的な大規模言語モデルを生み出すものではありません。この2890万パラメータのモデルは、MicrosoftのTinyStoriesデータセットのみで学習されています。この厳選されたコレクションは、数百万パラメータしかない小さなモデルであっても、より広範なデータセットでは発生しがちな意味不明な文章を生成することなく、一貫したテキスト生成を学習できるように特別に設計された、単純で一貫性のある物語で構成されています。
対話中に重大な制限が明らかになります。このモデルは、ユーザーの最初のプロンプトに関係なく、一貫して小さな女の子についての特定の物語にデフォルトで戻ってしまいます。例えば、「ロボットについての物語」や「Star Wars」をテーマにした開始フレーズを入力しても、数文後にはすぐにこのデフォルトの物語にリダイレクトされてしまい、極めて狭い理解力しかなく、新しい会話の糸を維持できないことがわかります。この挙動は、モデルの学習パターンが非常に制約されていることを浮き彫りにしています。
さらに、動的な対話は不可能です。プロンプトを調整するには、ESP32-S3 マイクロコントローラーの完全な reflash が必要であり、このプロセスでデバイスのメモリが上書きされます。システムは一度に1つの事前作成されたプロンプトしか実行できないため、汎用的で動的なテキスト生成ツールというよりは、制約はあるものの興味深い概念実証(proof of concept)となっています。基礎となるコードや手法を探求したい方は、プロジェクトの GitHub リポジトリを参照してください: Running a 28.9M parameter LLM on an $8 microcontroller - GitHub。
この記事が気に入ったら、毎朝同じようなものをメールで受け取れます。
1日1通 · 2クリックで解除 · サードパーティのトラッキングなし
Karpathy Blueprint: その構築方法
この印象的なプロジェクトは、Andrej Karpathy 氏の独創的な 'llama2.c' の研究を直接基盤としています。Karpathy 氏は、Python や複雑な依存関係を完全に排除し、純粋でポータブルな C コードで効率的な大規模言語モデル(LLM)の推論が可能であることを実証しました。彼の設計図は、LLM が最小限のシステムで動作可能であることを証明し、それがこの ESP32-S3 実装の基礎的な洞察となり、コンセプト全体を実現可能にしました。
この低コストな LLM を再現するには、成功のために不可欠な特定のハードウェアが必要です。メモリ構成が豊富な ESP32-S3 N16R8 バリアントが必須です。この特定のモデルは 16MB のフラッシュ と 8MB の PSRAM を備えています。学習済みの 15MB のモデルファイル自体が、このより大きなフラッシュ容量を必要とするため、一般的な 4MB や 8MB バージョンのような 16MB 未満のフラッシュを持つボードでは、モデル全体を保存することができません。
Slava S. 氏のオリジナルの GitHub リポジトリには、実装の詳細や基礎となるメカニズムを探索したい人向けに必要なすべてのコードがホストされています。より直接的なデプロイ方法として、動画作成者が簡略化された one-shot script を提供しており、セットアップを大幅に効率化しています。この包括的なスクリプトは、ツールチェーンのインストール、データ準備、TinyStories データセットでのモデル学習、そして最後にコンパイルされたモデルを ESP32-S3 に書き込むまでのビルドプロセス全体を自動化します。
よくある質問
28.9M パラメータの LLM が、わずか 512KB の SRAM しかないマイクロコントローラーにどのように収まるのですか?
このモデルはメモリハックを使用しており、最大部分である 25M パラメータの埋め込みテーブルは、チップのより大きく低速な 16MB フラッシュメモリに保存されます。小さな計算部分と、現在のトークンに必要な特定の埋め込み行のみが、高速な 512KB SRAM にロードされます。
このプロジェクトを再現するには、どのような特定のハードウェアが必要ですか?
少なくとも 16MB のフラッシュメモリと 8MB の PSRAM を搭載した ESP32-S3 マイクロコントローラーのバリアントが必要です。これは一般的に N16R8 バリアントとして知られています。
ESP32 で動作する LLM の制限は何ですか?
TinyStories データセットで学習された非常にシンプルなモデルであるため、単純な物語しか生成できず、複雑なタスクを実行することはできません。また、デフォルトの物語に戻ってしまう傾向があり、最初のプロンプトを変更するにはチップ全体を再書き込み(reflash)する必要があります。
どのようなオープンソースプロジェクトがこれを可能にしましたか?
開発者 Slava S. 氏によって作成されたこのプロジェクトは、プレーンな C 言語で LLM 推論を実行することを実証した Andrej Karpathy 氏の llama2.c プロジェクトに基づいています。モデル自体は、Microsoft Research が開発した TinyStories データセットで学習されました。

