跳到主要内容
我第一版把 Needle 2 的图画错了:它不是缩出来的小模型

我第一版把 Needle 2 的图画错了:它不是缩出来的小模型

画唠
画唠

· 阅读约 5 分钟

4500 万参数,14MB 文件,运行时 28MB 内存。第一次看到这三个数字,我脑内唰地画了一张图:把大模型压小嘛——蒸馏、量化、砍层数,一路缩缩缩,缩到塞进手机。

后来发现这张图整个是错的。Needle 2 不是“缩出来的大模型”,它是换了一套骨架重新长的。今天就画这个。

先看我第一版脑内的图:

   大模型 ──蒸馏──► 小模型 ──量化到 2bit──► 14MB 文件

顺,直觉,而且看架构名字里有"Attention",更有理由这么以为。然后我动手扒了一下细节,好几处对不上。

第一处对不上:训练量。Needle 2 预训练 1150 亿 token。LFM2.5 那个 230M 的小模型用了 19 万亿——是它的 120 倍。你见过哪个“缩水版”产品敢用竞争对手百分之一不到的原料?这不是压出来的,这是另一条路:我不靠语料量堆世界知识,我干别的。

干别的指的是那个叫 engram 的东西——一张哈希 n-gram 表,把“世界知识”从参数里挪出去,单独存。推理时每个 token 只查少量几行,内存访问开销压得很低。

打个比方:传统 transformer 是把整本百科全书背下来的学生,考试全靠脑子,所以脑子(参数)必须大;Needle 2 是允许带小抄的学生,脑子只管推理流程,事实去查表。

这个比喻有个地方会漏风,先老实标出来:小抄是死的,脑子是活的。n-gram 表查回来的东西不会跟着上下文“融会贯通”,它就是个查表命中。所以别指望这种架构涌现出什么——它的目标是工具调用这种流程性任务,不是写诗。

第二处对不上:计算量的账。每 token 计算量,Needle 2 约 70 MFLOPs,同形状的传统 transformer 要 164,LFM2.5 是 460,Apple 那个要 6000。差出一个数量级都不止。量化解释不了这个差距——2bit 压的是权重存储,不是每 token 的乘加次数。能解释的只有一件事:架构本身每步要摸的东西就少。Simple Attention Network 加查表,摸的东西确实少。

画张图把这个“少”画出来:

   传统 transformer:
     每 token ──► 全部权重走一遍 ──► 460+ MFLOPs

   Needle 2:
     每 token ──► 少量计算 + 查几行 engram ──► ~70 MFLOPs

所以它能跑到什么程度:树莓派 5 上每秒 500 token,Quest 3S 上 400 到 1500,两百美元不到的三星手机上也有 300 到 700。还有一条我觉得最疯的——峰值内存 28MB,ESP32-S3 这种微控制器都能跑。微控制器。跑 LLM。

等等等等,先别急着兴奋。跑得快不等于跑得好。我特意去扒了基准分,因为“小模型跑分”这种事,宣传口径和真实数字之间往往隔着一个太平洋。

用的是五个公共函数调用基准,标准还挺狠——函数名、调用顺序、所有参数值全对才算过,不是沾边就算的宽松匹配。数字大概这样:

基准Needle 2对比
Mobile Actions63.7%低于 LFM2.5 的 69.1%,高于 Apple FM 的 57.6%
DroidCall17.0%和 FunctionGemma 的 17.5% 基本持平
Seal-Tools 域内32.6%高于两个更大的模型
BFCL v4 单轮42.6明显低于 Apple FM 的 61.7

互有胜负,而且看得出它在哪强哪弱:移动设备操作类的任务真能打,Seal-Tools 域外它 28.7%,比大它好几倍的模型高出一截;但通用函数调用(BFCL)就明显吃瘪。有个数字我盯着看了半天——BFCL 上它格式良好率 93.4%,Python 简单调用 61.2 分,和比它大 6 倍的 FunctionGemma 差不到一个百分点。

也就是说:结构它学得会,广度它给不起。这跟“学生带小抄”完全对得上——流程题小抄学生不吃亏,知识面广的题就露馅。

还有一处我觉得设计得很聪明:KV 缓存。它用 256 token 的滑动窗口,内存占用恒定,聊再长也不会越聊越胖。但系统提示词和工具声明永久驻留,不会被窗口挤出去。

画一下:

   [系统提示 + 工具声明]  ← 永久钉死,不驱逐
   [滑动窗口 256 token]   ← 新的进来,旧的挤出去

这一手很关键。工具调用任务里,工具声明就是“考纲”,考纲被挤出去等于开卷考试忘了带哪本书。普通模型 context window 大,靠蛮力装下一切;Needle 2 窗口小,就靠分区保命。很工程味的解法,我喜欢。

哦对,还有个真实落地:Pebble 的 Index 01 在本地跑 Cactus Needle,语音请求转操作,不联网。本地、离线、隐私——这些词被讲了好几年“即将”,这次是真的有 14MB 的东西塞进手表生态里转起来了。

扯远了。拉回来。

我真正想说的就一句:看 Needle 2 的时候,“多小”是最不重要的数字。4500 万参数、14MB,当谈资可以,当理解框架会把自己带沟里——我第一版就被带进去了。真正值得画开的是“它拿什么换掉了参数”:拿 engram 查表换掉了背知识的参数,拿滑动窗口换掉了无限增长的缓存,拿 70 MFLOPs 的骨架换掉了跑不动的计算量。

一条“缩”的路线,一条“换骨架”的路线,画在一张图上,差别一眼就看出来:

   路线 A:缩   大模型 ──► 蒸馏量化 ──► 小而同构
   路线 B:换   任务定义 ──► 新架构+外挂知识 ──► 小而异构

路线 A 的天花板是“够小的大模型”,路线 B 才可能出现“28MB 跑在微控制器上”这种数字。Needle 2 不是更小的恐龙,它是另一类动物。

当然它现在的分数也就那样,BFCL 上被压着打,训练语料还是专有的——这个我有点膈应,Apache 2.0 开了模型却闭着语料。但方向本身,为设备端、为工具调用这种窄任务重新设计骨架,比“参数又小了多少”有意思得多。

这玩意儿真的太酷了。下期候选:engram 那张哈希表内部到底长什么样,或者画开“滑动窗口 KV 缓存为什么不会把上文忘光”。你挑一个。

画唠
画唠

把被讲玄的概念用图 + 比喻 + 动手实验拆到咔哒扣明白,错的也保留。

查看主页 →