たった8ドルのマイコンで言語モデルがローカル動作!

Transcript

00:00:00これは2,890万パラメータの言語モデルで、現在1単語ずつテキストを生成しています
00:00:08価格は約8ドルのチップ上で動いており、Wi-Fiもサーバー送信も一切ありません。
00:00:14すべては90年代のコンピューターよりもRAMが少ないマイクロコントローラー、
00:00:22ESP32S3の内部で起きています。あり得ない話ですよね。一体どうやって可能にしているのでしょうか?
00:00:29どんな仕掛けがあるのか、そして自作する方法とは?本日の動画では、
00:00:34そうした疑問をすべて探っていきます。とても面白い内容になるので、早速飛び込んでみましょう。ESP32S3には
00:00:46512キロバイトのSRAMが搭載されており、これが高速メモリの容量となります。通常、
00:00:54この中でLLMを動かそうとすると、モデル全体をそこに収める必要があります。
00:01:00この種のチップで動作した過去最大の言語モデルは、26万パラメータが限界でした。しかし
00:01:08今回のモデルは約110倍の規模を誇ります。これを成し遂げたのはウクライナのデベロッパー、Slava S氏です。
00:01:16では、一体どのような魔法を使ったのでしょうか?わずか8ドルのチップに2,890万パラメータをどう収めたのか?
00:01:24その解決策は、GoogleがGemmaで採用した「レイヤーごとの埋め込み(per-layer embeddings)」というアイデアです。
00:01:31言語モデルのパラメータの大部分は、計算そのものを行いません。読み取り専用の
00:01:37埋め込みテーブルに格納されているだけです。パラメータの大半が参照されるだけなら、高速メモリは不要です。
00:01:44そのため、テーブルは安価で低速なフラッシュメモリに置いたままにし、現在のトークンに必要な行だけを読み出せば十分なのです。
00:01:52そして、実際に計算を行って次のトークンを考えるアテンションヘッドやFFNなどの小さな部分だけをSRAMに置きます。
00:01:59計算部分は理解できましたが、これほど巨大なモデルを小さなチップにどう収めるかという疑問が残ります。
00:02:052,500万行のテーブルはフラッシュメモリに置かれます。これがモデル全体の
00:02:122,890万パラメータのうち最大の割合を占めます。このチップのフラッシュメモリは安価で大容量であり、16メガバイトあります。
00:02:20したがって、テーブルをわずか512キロバイトのSRAMに無理やり詰め込むのではなく、
00:02:26フラッシュメモリ内にそのまま配置しておきます。そこからモデルの6つのレイヤー用に各1行、計6行だけを取り出します。
00:02:33合計でわずか約450バイトです。ただし期待しすぎる前に、
00:02:40これが非常に単純で制限されたモデルである点に触れておく必要があります。一般的なGPT形式のLLMとは異なり、
00:02:47コードを生成したり難しい質問に答えたりはできません。このサイズのモデルを一般的なデータセットで学習させても、
00:02:532,800万パラメータでは意味不明な文字列しか出力されないからです。しかし、このモデルは
00:03:01Microsoftの研究者が作成した「Tiny Stories」というデータセットで学習されています。あえて非常にシンプルに書かれており、
00:03:08数百万パラメータ程度の小さなモデルでも破綻のない物語を書けるようになっています。そして、
00:03:15OSもPython環境もないチップ上でピュアC言語を使って動かす手法は、有名なAndrei
00:03:22Karpathy氏の「Llama2.c」プロジェクトに由来しています。移植性の高い数百行のCコードだけで
00:03:28小型言語モデルの学習と推論を行えることを証明したプロジェクトです。これこそがプロジェクト全体の設計図となっており、
00:03:35Karpathy氏がいなければ実現しなかったでしょう。概要は以上の通りです。
00:03:40それでは実際に自分たちで構築し、チップ上で動かしてパフォーマンスを見てみましょう。
00:03:47実際に構築する際、最初に必要なのは適切なハードウェア、具体的には16MBのフラッシュと
00:03:548MBのPSRAMを備えたESP32S3です。N16R8というモデルになります。これは非常に重要なポイントで、
00:04:03先ほど話したフラッシュ上の2,500万行のテーブルを思い出してください。学習後に書き出すと、
00:04:10単体で約15メガバイトになります。そのため、4MBや8MBのフラッシュを搭載したボードでは
00:04:17容量が足りません。実際に試すためにボードを購入する場合は、まずこのスペックを確認してください。
00:04:22プロジェクトの公式手順を最初に確認した際、設定手順が複数のファイルに分かれており、
00:04:28前提知識が必要とされる部分が多くありました。そこで、
00:04:34書かれている通りに説明するのではなく、全工程をこなすワンショットスクリプトを作成しました。
00:04:40ボード確認、ツールチェーン設定、データ準備、学習、書き出し、検証、
00:04:47ビルド、書き込みまでを一気に実行します。では、そのスクリプトを実行してみましょう。補足として、
00:04:55一緒に試す場合、スクリプト全体の完了には約25分かかります。手動でステップごとに
00:05:00進めても同じくらいの時間がかかるはずです。個別のコマンドが多いためであり、
00:05:05時間の大部分はTiny Storiesモデルの学習に使われます。MacBookでは約13分かかりました。
00:05:11学習が完了すると、ボード上のLEDが点滅し始めます。
00:05:18これはモデルの読み込み準備が整った合図です。読み込みが終わると、
00:05:24少女の物語という最初の基本的な例が表示されます。確かに
00:05:29毎秒9トークンの速度が出ていることがわかります。しかし、ある時点で
00:05:33物語が再び最初からやり直されることに気づくでしょう。モデルがループに入っているようです。
00:05:39カスタムプロンプトを与えたい場合は、自作のプロンプトを実行するための
00:05:44サンプルスクリプトも同梱しています。例として、ロボットについての物語を始めてみましょう。
00:05:50プロンプトを変更する際は、ESP32を再書き込みする必要があります。これがこの手法の制限事項であり、
00:05:56事前書き込みされた1つのプロンプトしか再生できません。ご覧の通り、
00:06:02物語の中にロボットについての言及があり、今回は展開が少し異なっています。
00:06:08ですが、段落の終わりで何が起きるか注目してください。再び小さな少女の物語に戻ってしまいました。
00:06:13なぜこうなるのかは不明ですが、明らかにモデルがあの少女の物語へと引き戻される傾向があります。
00:06:19もう1つ例を試してみましょう。今度はすべてのスター・ウォーズ映画の冒頭に登場する
00:06:24有名なフレーズを使ってみます。どうなるか見てみましょう。
00:06:30興味深い結果になりました。モデルが即座に少女の物語へ漂着して戻ってしまうのがわかります。
00:06:36このサイズのモデルにとっては「銀河」という概念すら理解できていないと考えられます。
00:06:42そのため、指定したプロンプトが無視されているのでしょう。
00:06:47そしてやはり次の段落からは同じ物語が始まります。この実験は素晴らしく、
00:06:53極小マイクロチップ上で毎秒9トークンを生成する様子は実に驚異的ですが、
00:06:59依然として非常に限定的な概念実証(PoC)の域を出ません。見てもらった通り、何を入力しても
00:07:06学習データの影響で物語の生成へと戻ってしまいます。もしこの検証に
00:07:11興味を持っていただけたなら、初代Raspberry Piで本物のLLMをローカル動作させられるか
00:07:18検証した関連動画もありますので、ぜひチェックしてみてください。
00:07:24いかがでしたでしょうか。以上がESP32チップで2,890万パラメータの言語モデルを動かす方法です。
00:07:32実際に動作することを確認できました。このプロジェクトを作成したSlava氏に拍手を送りたいと思います。みなさんはどう思われましたか?
00:07:38こうした実装が役立つ実社会でのユースケースは思い浮かびますでしょうか?
00:07:43ぜひ下のコメント欄でご意見をお寄せください。このような技術解説が好きな方は、
00:07:48高評価ボタンを押して教えていただけると幸いです。チャンネル登録も
00:07:53お忘れなく。BetterstackのAndresがお送りしました。それではまた次の動画でお会いしましょう。

Description

A developer got a 28.9-million-parameter language model running entirely offline on an $8 ESP32-S3 microcontroller, a chip with just 512KB of RAM, using a memory trick borrowed from Google's Gemma architecture called Per-Layer Embeddings. In this video we break down how the trick actually works, reproduce the entire training and flashing process ourselves from a bare board, and put the model through some prompt tests of our own, including one it stubbornly refuses to follow. If you're curious how far you can push AI onto hardware that was never meant to run it, this one's for you. 🔗 Relevant Links Esp32-ai: https://github.com/slvDev/esp32-ai build_and_flash.sh: https://gist.github.com/andrisgauracs/ce459630660f82cf4ca7e43aa81604c7 run_prompt.sh: https://gist.github.com/andrisgauracs/e84b842d0f5e301485ecbf6654b0838e ❤️ More about us Radically better observability stack: https://betterstack.com/ Written tutorials: https://betterstack.com/community/ Example projects: https://github.com/BetterStackHQ 📱 Socials Twitter: https://twitter.com/betterstackhq Instagram: https://www.instagram.com/betterstackhq/ TikTok: https://www.tiktok.com/@betterstack LinkedIn: https://www.linkedin.com/company/betterstack 📌 Chapters: 00:00 Running an LLM on an $8 Chip 00:43 The ESP32’s Memory Problem 01:12 How Did They Make It Work? 01:30 The Per-Layer Embedding Trick 02:04 Fitting 28.9 Million Parameters 02:36 What This Tiny LLM Can Actually Do 02:58 TinyStories and Karpathy’s llama2.c 03:41 Building It Ourselves 03:47 Choosing the Right ESP32 04:23 The One-Shot Installation Script 04:52 Training and Flashing the Model 05:24 Testing the LLM at 9 Tokens per Second 05:38 Trying Custom Prompts 06:21 The Star Wars Prompt Test 06:51 Is an ESP32 LLM Actually Useful? 07:23 Final Thoughts

Community Posts

No posts yet. Be the first to write about this video!

Write about this video