归零归零归ww
25-12-09 15:53

比端侧更极端:ESP32单片机推理大语言模型
阶段回顾如下。

在LLM🔥之前就买了一片ESP32,绝赞吃灰多年,听说它很强,一直想玩,但是毫无动力。

至于电子鹦鹉,半年前实现了在路由器这样的嵌入式设备上的部署,但是这些设备还是太强了,上面跑着完整的Linux操作系统,有1GB以上的DDR内存和1GHz以上的CPU,跟PC其实没有质的区别。

前段时间突发奇想,希望把电子鹦鹉部署到单片机上。一般的单片机,片上RAM只有几kB,运行LLM是绝无可能的。但是我了解到ESP32的某些型号有数MB的PSRAM,就觉得不妨一试。

今年夏天曾经炼制过90/290/1500k参数的极小语言模型,在哲学风格文本上能达到似乎还不错的生成效果。之所以训练这么小的模型,是为了验证它们在Scheme解释器上能否推理。得益于去年冬天打下的基础,现在训练这样一个极限模型易如反掌。这些M级小模型,推理时内存占用同样在M级别,因此,在M级内存的单片机上推理这些模型,理论上应该是可行的。

行动走在思想前面。这段时间做了两件事,一件事是又训练了新的150k、230k和2.7M参数的模型,另一件事是对现有的推理引擎作架构优化。这两件事完成后,很快将它们成功移植到ESP32-S3和P4上。

ESP32-S3和P4都有高达32MB的PSRAM。但是限于架构,基本的malloc只能管理4MB之内的部分,其余需要使用HimemAPI管理。但是实践发现,psMalloc似乎也能管理全部的PSRAM,因而很顺利地将2.7M模型部署上去,推理速度大概几个token每秒。这是否意味着,在手环上运行端侧AI模型,也是完全可能的?虽然很耗电就是了。

开发单片机程序,难度比开发Linux应用程序更大。我对单片机开发并不熟悉,调试完全依赖Serial.print。大模型推理的内存管理比较复杂,因此在内存越界等问题上踩了不少坑。另一个难点在于字符编码。单片机的标准库是残缺的,像utf32和utf8互转这样的琐碎问题很难处理。好在现在有了AI,AI最擅长处理这些琐碎问题。另外,ESP32上面似乎跑了一个FreeRTOS,也不是完全的裸机,但是我用ArduinoIDE开发,这个系统对我是几乎不可见的。

关于AI端侧部署的性价比问题,ESP32-P4模块(开发板)的价格大概在60元左右,而性能远远强于它的cubie-a7z(双A73+六A53,1GB内存),价格只有它的两倍。顶级MCU和SoC的界线越来越模糊了。后面抽奖抽的就是cubie-a7z。虽然对于大规模量产产品来说要锱铢必较,但是对于我们票友来说,多花一倍的钱,得到远远超过一倍的额外资源,以及节约大量开发成本,还是非常值得的。

总而言之,把自研极小语言模型部署到极低资源的单片机上,也算是今年整的一个大活儿了,虽方枘圆凿,但意义非凡。这件事证明,大语言模型,电子鹦鹉,后现代主义的涌现智能,终究是运行在现代主义的冯诺依曼自动机上。在这个问题上,没有任何神秘性。
后面我要把这个东西做成电池供电的,放在书架上当电子手办,装置艺术。考虑到单片机上运行的LLM很难解决什么实际问题,后面我不会投入过多的精力在这上面,还是要深度雕琢Nano-Pod。当然啦,我做的所有事情都不是为了解决什么实际问题,归根结底都是行为艺术。就是玩嘛。希望大家都能跟电子鹦鹉玩得开心。

发布于 江苏