在 8 美元的微控制器上运行拥有 2890 万参数的大语言模型
Hacker News 摘要原标题:Running a 28.9M parameter LLM on an $8 microcontroller
这个项目在售价仅为 8 美元的 ESP32-S3 微控制器上成功运行了一个拥有 2890 万参数的大语言模型。该模型完全在芯片本地运行,无需连接服务器,能够以每秒约 9 个标记(token)的速度在连接的小屏幕上生成文字。
在此之前,人们在同类芯片上运行的模型参数量仅为 26 万左右。本项目实现的模型规模是之前的 100 倍以上。其核心原理是借鉴了谷歌 Gemma 模型中的每层嵌入(Per-Layer Embeddings)设计,将模型的大部分内容存储在闪存(Flash)而非内存(RAM)中。
关键数据指标
• 参数量:总计 2890 万个参数,其中 2500 万个存储在闪存查找表中。
• 硬件配置:ESP32-S3 芯片,拥有 512KB SRAM、8MB PSRAM 以及 16MB 闪存。
• 运行速度:端到端速度约为每秒 9.5 个标记,纯计算速度约为每秒 9.7 个标记。
• 连接性:无需联网,所有功能均在设备上完成。
• 模型大小:经过 4-bit 量化后为 14.9MB。
实现原理与技术突破
微控制器的快速内存非常有限。ESP32-S3 仅提供 512KB 的 SRAM。通常情况下,整个模型必须能够从这里访问,这限制了模型只能是极小规模的。
本项目通过改变模型存储方式解决了这一难题。大语言模型的大部分参数位于嵌入表中,模型对其进行读取而非计算。因此,可以将包含 2500 万行数据的表留在速度较慢的闪存中,每次仅抽取当前标记所需的几行数据(约 450 字节)。而执行实际计算工作的核心部分则留在快速内存中。这样一来,运行大型模型的成本大幅降低,因为大部分模型内容只需静置在闪存中,每次仅少量采样。
内存布局分配如下:
• SRAM(极快且极小):存放思考核心,用于处理每个标记。
• PSRAM(中等速度):存放输出头和工作内存。
• 闪存(巨大且较慢):存放 2500 万参数的查找表,每个标记仅需读取约 6 行数据。
功能范围与限制
该模型是在 TinyStories 数据集上训练的,因此它擅长编写简短、简单的故事,并能保持基本的连贯性。
模型无法完成以下任务:
• 回答问题或遵循复杂指令。
• 编写代码。
• 陈述事实性知识。
这些限制源于模型中负责推理的部分依然很小,内存优化技术并不能改变推理能力的上限。本项目的意义更多在于架构创新,即证明了如何在极其微小的芯片上塞进大型模型。
运行说明与参考来源
项目的固件、接线说明和刷机步骤位于 firmware/esp32_llm/ 目录下。训练、消融实验和量化代码分布在 src/ 和 experiments/ 文件夹中。详细的方法说明、实验结果和芯片实测数据记录在 RESULTS.md 文件里。
项目致敬了以下研究成果:
• TinyStories:来自微软研究院。该数据集包含简单的合成故事,非常适合小型模型学习连贯写作。
• 每层嵌入技术:来自谷歌的 Gemma 模型设计,是模型能塞进芯片的关键。
• llama2.c:由 Andrej Karpathy 开发。它证明了使用纯 C 语言运行微型大语言模型的可行性。
作者在仓库中特意保留了开发过程中的原始记录,包括早期因参数统计错误导致数值偏大的错误修正。通过提交历史和实验报告,可以看到各项数据的演变过程。