在一块8美元的微控制器上运行28.9M参数的LLM
在一块8美元的微控制器上运行28.9M参数的LLM 开放工作 · 𝕏 slvDev · LinkedIn 这是一个拥有2890万个参数的语言模型,能够在一款约8美元的ESP32-S3微控制器上生成文本。它在芯片上本身运行,无需将数据发送到服务器,并且以每秒大约9个标记的速度将每个单词写入连接到芯片的小屏幕上。之前在这种芯片上运行的语言模型只有26万参数,所以这个模型的参数数量大约多了100倍。之所以能实现,是因为大部分模型存储在闪存中而非RAM中,采用了谷歌Gemma模型中的一种叫做每层嵌入(Per-Layer Embeddings)的思想。 数字 参数:28.9M(其中2500万存储在闪存查找表中) 芯片:ESP32-S3,约8美元,带512KB SRAM,8MB PSRAM和16MB闪存 速度:端到端约9.5托每秒(纯计算9.7托每秒) 连接性:无,所有操作都在设备上进行 模型大小:14.9MB,4位 为什么这很难,以及它是如何适应的 微控制器几乎没有快速内存。ESP32-S3提供512KB的SRAM。通常整个模型必须能够从这里访问,这限制了可用的小模型大小,这也是为什么在这种芯片上之前的模型只有26万个参数。解决办法是完全不将模型放入快速内存中。大部分语言模型的参数位于嵌入表中,模型从中读取而不是进行计算。因此,您可以将那2500万行的表留在慢速闪存中,只提取每个标记所需的少量行,约450字节,而执行实际工作的较小部分则保留在快速内存中。这样,大模型的运行成本几乎为零,因为您永远不会加载大部分内容。它就静静地待在闪存中,一次被抽取一点。这一思想是谷歌的每层嵌入(Per-Layer Embeddings),来自Gemma 3n和Gemma 4。在这里,它在微控制器的内存布局上运行,而不是在手机或GPU上。据我所知,没有人尝试在如此小的芯片上进行此项工作。 SRAM(快速,微小):每个标记上使用的“思考”核心 PSRAM(中速):输出头和工作内存 FLASH(巨大,慢速):2500万参数表,每个标记大约读取6行(约450 B) 它的功能和限制 该模型是在TinyStories上训练的,因此它编写短小简单的故事,并大致保持一致性。它不会回答问题、执行指令、编写代码或知道事实。这一限制来自于模型中负责推理的小部分,内存技巧并未改变这一点。这里有趣的是架构,将大型模型放置在微小芯片上,而不是一个28.9M参数的模型所能说的内容。 自己运行它 固件、接线和刷新步骤在firmware/esp32_llm/README.md中。 训练、消融和量化代码位于src/和experiments/中。 完整的方法、消融结果和芯片上的测量结果写在RESULTS.md中。 致谢 TinyStories是该模型训练的数据集:短小的合成故事,简单到一个小模型仍能学会写得连贯(Ronen Eldan和Yuanzhi Li,微软研究,arXiv:2305.07759)。另一半是每层嵌入(Per-Layer Embeddings),这是谷歌Gemma模型的设计,使得大型模型能够适应小芯片。Andrej Karpathy的llama2.c是许多人(包括我)相信可以用普通C语言训练一个小语言模型并运行的原因。这是从这一点出发的。 这个过程其实是怎样的 我故意在代码库中保留了这个混乱的历史。这包括我在参数计算中发现的一个错误,这个错误夸大了早期的数字,并在我纠正后得出了修正后的结果。提交历史和RESULTS.md显示了数据的变化及其原因。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡