用 7 块十几块钱的开发板,把一个 0.5B 参数的语言模型真正"跑"起来,整簇功耗只要约 1.53 瓦——这是开发者 Low-Zi-Hong 开源的 ESP32s3-LLM-Cluster 交出的答案。项目在 Hacker News 拿下 149 点热度、30 多条讨论,MIT 协议,固件与工具链全部公开。

怎么把 0.5B 模型塞进单片机

项目基座是 Qwen2-0.5B:24 层 Transformer,hidden size 896,MLP 中间维 4864,注意力是 14 个 Q 头配 2 个 KV 头的 GQA。整个集群由 7 块 ESP32-S3 组成:1 块 master 负责 BPE 分词、token embedding(INT4 量化,约 14MB 放 flash)、最后的 RMSNorm 和输出头;剩下 6 块计算节点每块扛 4 层,恰好分完 24 层。节点间用 SPI 菊花链串联,每块板两个 SPI 通道,一个收上一节点传来的隐向量(FP32),一个发给下一节点,主从之间还有专门的复位与就绪信号线。

量化方案是 BitNet 式 1.58-bit 三值权重——线性层权重只有 -1、0、1 三种取值,4 个权重打包进 1 个字节;embedding 单独走 INT4。词表从原始 151K 砍到 32K,因为 32K 已是 ESP32-S3 的 16MB flash 能装下的上限。算下来每层约 3.82MB,每块计算节点约 15.3MB,正好卡在 flash 分区内。为了榨速度,作者给三值矩阵乘写了汇编级 MAC 优化,并配上查找表。

代价:每节点 1.3 秒,输出接近随机

这份账本的另一面写得很清楚。workflow 文档自报:每个节点推理耗时约 1.3 秒,且随节点数线性增长——100 块板理论上能跑 400 层的模型,但延迟同步涨上去。功耗数字同样来自作者实测:待机 5V 0.23A 约 1.17W,推理时约 1.53W。

更诚实的是训练侧的自曝:QAT 微调脚本只做了部分训练,loss 停在 8.0 左右,"基本就是在吐随机 token"。排错指南里专门写了一条:输出卡在重复同一个词,是欠训练模型叠加贪心采样的已知行为,不一定是代码 bug。换句话说,这个项目目前证明的是 1.58-bit 模型可以在单片机集群上完整跑完一遍前向计算,而不是"能对话"。

HN 的两盆冷水

评论区最硬的两条批评指向同一件事:这不是通往实用边缘推理的路。一条指出 LLM 推理的瓶颈始终是内存带宽,"一块两倍显存的大 GPU 永远显著快过两块各一半显存的 GPU",GDDR7 时代信号一个时钟周期只能走约 10mm,把系统摊到几十块小芯片上,大部分资源都浪费在数据搬运上。另一条直接点名菊花链 SPI 的扩展性存疑。也有人畅想 RISC-V 大规模并行集群,但没人反驳"经济上不划算"这个判断。

所以呢

这个项目的价值不在跑分,而在把"极端量化 + 模型切片 + 板间流水线"这条完整链路在 7 块开发板上走通了,每一环——词表裁剪、三值权重打包、汇编 MAC、KV cache 放 PSRAM——都是可复用的工程积木。等有人用充足算力把 QAT 做完整,同一套骨架就能从"吐随机 token"变成"能说话"。对做边缘部署的团队,这份开源实现比大多数论文附录实在。