在8美元的ESP32-S3微控制器上运行2890万参数的大语言模型
了解Google Gemma模型的逐层嵌入如何让一个2890万参数的语言模型完全在8美元的ESP32-S3芯片上运行,每秒生成9.5个token。
问题:大语言模型无法在微控制器上运行
微控制器的快速内存非常有限。ESP32-S3是一款售价约8美元的流行芯片,仅提供512KB的SRAM。通常,整个模型必须加载到这种快速内存中才能进行推理,这严重限制了模型大小。此前在类似芯片上的最佳成果仅为26万个参数。
突破:逐层嵌入
关键思路来自Google的Gemma 3n和Gemma 4模型:逐层嵌入(PLE)。语言模型的大部分参数位于嵌入表中——这是一个将token映射到向量的大型查找表。模型从该表中读取数据,但不对其进行计算。因此,你可以将这张2500万行的表留在慢速闪存中,每个token只需拉取几行(约450字节)。而执行实际计算的小部分则保留在快速SRAM中。
这意味着大型模型的运行成本几乎为零——你从未加载大部分参数。它只是驻留在闪存中,每次被少量采样。
数据
| 指标 | 数值 |
|---|---|
| 参数 | 2890万存储(2500万在闪存查找表中) |
| 芯片 | ESP32-S3(约8美元),512KB SRAM,8MB PSRAM,16MB闪存 |
| 速度 | 端到端约9.5 tok/s(纯计算9.7 tok/s) |
| 连接性 | 无——一切在设备上运行 |
| 模型大小 | 4位精度下14.9MB |
内存布局
该技巧得益于精心设计的内存层次结构:
- SRAM(快速,极小):"思考"核心——每个token都使用
- PSRAM(中等):输出头和工作内存
- FLASH(巨大,慢速):2500万参数表——每个token读取约6行(约450字节)
它能做什么(以及不能做什么)
该模型基于TinyStories(Ronen Eldan和Yuanzhi Li,微软研究院)训练,因此它编写简短、简单的故事,并基本保持连贯性。它不会回答问题、遵循指令、编写代码或了解事实。这一限制来自模型较小的推理部分——内存技巧不会改变一个2890万参数模型能表达的内容。
自行运行
完整的固件、接线图和刷写步骤位于firmware/esp32_llm/README.md。训练、消融和量化代码在src/和experiments/中。完整方法、消融实验和片上测量结果记录在RESULTS.md中。
致谢
- TinyStories:数据集——短小的合成故事,足够简单,让小模型也能学习连贯写作(arXiv:2305.07759)
- 逐层嵌入:Google从Gemma模型中的设计,使大型模型能在小型芯片上运行
- llama2.c:Andrej Karpathy的工作启发了一个想法:你可以训练一个小型语言模型并用纯C语言运行它
混乱的历史
该仓库有意保留了混乱的历史,包括参数统计中的一个错误导致早期数字膨胀,以及修正后的结果。提交历史和RESULTS.md展示了数字的变化及其原因。
该项目表明,通过正确的架构,即使是8美元的微控制器也能运行一个令人惊讶的强大语言模型——为真正的边缘AI应用开辟了可能性。