在8美元的微控制器上运行2890万参数的LLM
一位开发者成功在成本约8美元的ESP32-S3微控制器上运行了一个2890万参数的语言模型,利用谷歌Gemma模型中的逐层嵌入技术将大部分参数存储在闪存中。文本生成完全在设备上运行,速度约9.5个token/秒,相比此前26万参数的模型取得了巨大飞跃。
近日,一名开发者成功在售价约8美元的ESP32-S3微控制器上运行了一个拥有2890万参数的语言模型。该模型完全在芯片本地运行,无需连接服务器,并以每秒约9.5个token的速度将生成的文本输出到连接的小屏幕上。这是微控制器上运行语言模型的一次重大突破——此前同类模型的最大参数规模仅为26万,而新模型的大小是其100倍以上。
关键数字:参数总量2890万(其中2500万存储在闪存查找表中);芯片为ESP32-S3,配备512KB SRAM、8MB PSRAM和16MB闪存;生成速度约9.5 token/秒;模型大小在4位量化后仅为14.9MB。
微控制器的SRAM非常有限(仅512KB),传统上整个模型必须常驻SRAM,因此只能容纳极小的模型。解决方案来自谷歌Gemma模型中的逐层嵌入(Per-Layer Embeddings)技术:将语言模型中庞大的嵌入表(2500万行)存储在慢速闪存中,每次只需读取每个token所需的约450字节数据,而负责实际计算的小型核心部分则留在快速SRAM中。这样一来,大部分模型几乎不会占用运行资源,只是静静地留在闪存中,每次被少量采样。据项目作者称,此前似乎没有人尝试过在如此小的芯片上实现这一设计。
该模型基于TinyStories数据集训练,因此擅长编写简短、连贯的故事。它无法回答问题、遵循指令、编写代码或提供事实信息——这种局限性源于模型负责推理的小型核心部分,而闪存技巧并未改变这一点。项目的意义在于展示了将大模型塞进极小芯片的架构可能性,而非模型本身的强大能力。
项目已在GitHub上开源,包含完整的固件、接线说明、训练和量化代码。开发者还特意保留了混乱的提交历史,包括一次由于参数计算错误导致数字膨胀的bug及其修正过程,供他人参考。该项目还引用了Andrej Karpathy的llama2.c项目,证明了即使在受限的硬件上,通过巧妙的内存管理,也能运行相对复杂的语言模型。代码仓库中包含了详细的说明文档(RESULTS.md),记录了实验方法、消融实验和片上测量数据,为后续研究提供了宝贵的参考。