マイコンに文章で指示を出そうとすると、たいていはクラウドが要る。言葉を解釈する言語モデルは数十億のパラメーターを抱えていて、メモリが数MBしかないマイコンには載らないからだ。ネットが切れれば止まり、APIキーの管理も付いて回る。Jorge Bareiro氏(AK SOLUTIONS E.A.S.)は58万2000パラメーターの言語モデルをゼロから学習させ、ESP32-S3の中だけで動かした。ソースコードと学習済みモデルはMITライセンスでGitHubに置いてある。
ボード自体がWi-Fiのアクセスポイントになり、ブラウザーから文章を打ち込む。17番ピンのLEDをつける、5番を75%の明るさにする、サーボを30度動かすといった指示を解釈し、デジタル出力やPWM、周波数の生成、入力の読み取り、停止をこなす。対応するのは英語とスペイン語で、日本語は含まない。守備範囲の外にある文には、理解できないと答える。
設計で肝になるのは、モデルにピンの可否を判断させないところだ。モデルが出すのは「DOUT 1 7 HIGH」のような短い命令形式だけで、そのピンを触ってよいかはC言語で書いた固定表が決める。ESP32-S3のGPIO 30は内蔵のSPIフラッシュにつながっており、書き込めばボードが固まる。小さなモデルにこれを覚え込ませるのは無理があるとBareiro氏は書く。誤って30番を出しても、ファームウェアが理由を添えて断る。
数字は1桁ずつ扱う。「17」を1語にせず「1」「7」と分けることで語彙が小さく収まり、学習データに出てこなかったピン番号や角度もプロンプトから写して使える。デコードは常に確率が最大の語を選び、同じ文にはいつも同じ動作を返させる。
学習データは人間の会話ログではなく、語彙とテンプレートから作った合成文40万件を使う。学習はRTX 4070で約4分で終わる。検証データでの完全一致は英語98.9%、スペイン語99.1%だが、Bareiro氏はこの数値を学習と同じテンプレートから作った文で測っており、新しい言い回しへの一般化を示すものではないと断っている。手書きの31文で試した結果はスペイン語が31問、英語が30問だった。
制約も本人が並べている。実機で動かしたのはスペイン語版だけで、英語版はPC上の検証しか通していない。条件分岐や常駐するルールは扱えず、指示は1回ずつになる。動かすにはPSRAMを積んだESP32-S3が必要だ。推論エンジンはAndrej Karpathy氏のllama2.cと、そのESP32-S3への移植を土台にしている。Bareiro氏は、同じやり方を別の閉じた領域に向ければ、画面のない機械に話しかける操作盤にもなると書いている。
I trained a 582k-parameter transformer from scratch that runs entirely on an ESP32-S3(Reddit)