AI・機械学習
8ドルのマイクロコントローラーで2890万パラメータのLLMを実行する
Running a 28.9M parameter LLM on an $8 microcontroller (github.com)
要約
約8ドルのESP32-S3マイクロコントローラー上で、2890万パラメータを持つ大規模言語モデル(LLM)を実行することに成功しました。このモデルはサーバーに接続せず、チップ上で直接動作し、毎秒約9トークンの速度でテキストを生成します。これは、従来の同等チップで実行できたモデル(26万パラメータ)の約100倍の規模です。
全文翻訳
8ドルのマイクロコントローラーで2890万パラメータのLLMを実行する
Open to Work
𝕏 slvDev
LinkedIn
これは2890万パラメータの言語モデルで、約8ドルのマイクロコントローラーであるESP32-S3上でテキストを生成します。モデルはチップ自体で動作し、サーバーには何も送信されません。そして、チップに配線された小さなディスプレイに、毎秒約9トークンの速度で各単語を書き出します。
この種のチップで最後に実行された言語モデルは26万パラメータだったので、今回のモデルはその約100倍のパラメータを保持しています。これは、モデルの大部分がRAMではなくフラッシュメモリに格納されるため可能になりました。このアイデアは、GoogleのGemmaモデルに見られるPer-Layer Embeddingsという手法に基づいています。
数値
パラメータ: 28.9M (うち25Mはフラッシュのルックアップテーブルに格納)
チップ: ESP32-S3、約8ドル、512KB SRAM、8MB PSRAM、16MBフラッシュ
速度: エンドツーエンドで約9.5トークン/秒 (純粋な計算では9.7トークン/秒)
接続性: なし、すべてデバイス上で実行
モデルサイズ: 4ビットで14.9MB
なぜ難しいのか、そしてどのようにして収まったのか
マイクロコントローラーには高速メモリが非常に少ないです。ESP32-S3は512KBのSRAMを提供します。通常、モデル全体がそこからアクセス可能である必要があり、これにより小さなモデルに限定されてしまいます。これが、この種のチップで以前のモデルがわずか26万パラメータだった理由です。
その回避策は、モデルを高速メモリに全く配置しないことです。言語モデルのパラメータの大部分は、モデルが計算するのではなく読み取る埋め込みテーブルにあります。そのため、2500万行のテーブルを低速なフラッシュメモリに置いたまま、トークンごとに必要な数行(約450バイト)だけを取得できます。実際の処理を行う小さな部分は高速メモリに残ります。これにより、大規模モデルの実行コストはほとんどかかりません。なぜなら、その大部分をロードする必要がないからです。それはフラッシュメモリに置かれたままで、少しずつサンプリングされるだけです。
このアイデアは、GoogleのGemma 3nおよびGemma 4のPer-Layer Embeddingsです。ここでは、電話やGPUではなく、マイクロコントローラーのメモリレイアウト上で実行されます。私の知る限り、これほど小さなチップで試した人はいませんでした。
SRAM (高速、小さい): 各トークンで使われる「思考」コア
PSRAM (中程度): 出力ヘッドと作業メモリ
FLASH (巨大、低速): 25Mパラメータのテーブル、トークンあたり約6行読み込み (~450 B)
何ができるか、何ができないか
モデルはTinyStoriesでトレーニングされたため、短くシンプルな物語を書き、ほとんどの場合一貫性を保ちます。質問に答えたり、指示に従ったり、コードを書いたり、事実を知ったりすることはできません。その限界は、推論を行うモデルの小さな部分に由来しており、メモリトリックではそれを変えることはできません。ここで興味深いのは、2890万パラメータのモデルが何を言えるかではなく、アーキテクチャ、つまり大きなモデルを小さなチップに収めることです。
自分で実行する
ファームウェア、配線、フラッシュの手順は、firmware/esp32_llm/README.mdにあります。トレーニング、アブレーション、量子化コードはsrc/およびexperiments/にあります。完全な方法、アブレーション、チップ上での測定はRESULTS.mdにまとめられています。
クレジット
TinyStoriesは、このモデルがトレーニングされたデータセットです。これは、小さなモデルでも一貫性のある文章を書くことを学べるほど単純な、短い合成ストーリーです(Ronen EldanとYuanzhi Li、Microsoft Research、arXiv:2305.07759)。もう半分は、大きなモデルを小さなチップに収めることを可能にする、GemmaモデルからのGoogleのデザインであるPer-Layer Embeddingsです。Andrej Karpathyのllama2.cは、私を含む多くの人々が、小さな言語モデルをトレーニングしてプレーンCで実行できると信じる理由です。これがそこから発展しました。
実際にはどうだったか
意図的に、リポジトリに厄介な履歴を残しました。それには、私が自身のパラメータ計算に見つけたバグが含まれており、初期の数値を誇張していましたが、それを修正した後の修正された結果も含まれています。コミット履歴とRESULTS.mdは、数値がどのように変化し、その理由を示しています。