Cactus 发布第二代 Needle 模型,14MB、45M 参数、2bit 压缩,在树莓派 5 上达 500 token/s,Meta Quest 3S 上达 1000+ token/s,性能持平 GPT-2 却小 70 倍。
规模–质量前沿:移动级及以下
图1。在面向智能设备、移动及以下场景的最小模型上,以 Mobile-Actions(google/mobile-actions 评估分割,961 行)严格精确匹配为指标,对总参数量进行排序。Needle 2 通过发货的二进制度量端到端性能,部署精度为 CQ2-bit,开启工具检索;基线模型在 vLLM 上运行发布的 checkpoint,Apple FM 在设备端运行。
规模–质量前沿:移动级及以下
将端侧 AI 带入 200 美元以下设备:边缘 AI 近来意味着 Mac 和 PC,但边缘设备大多是廉价硬件:约 21 亿台联网 IoT 设备对比约 15 亿台 PC,在新兴市场大多数手机定价低于 200 美元。算上预算手机、Raspberry Pi、微控制器、可穿戴设备、Reachy Mini 等小型机器人以及联网家居设备,约有五分之四的边缘设备定价低于 200 美元。这就是 Needle 瞄准的硬件:无 GPU、无 NPU、仅有几百 MB 内存。
函数调用与设备控制:开灯不需要前沿模型。手表、家庭、机器人:每一种都已经将其能力暴露为带类型参数的函数,所以唯一的难点就是将混乱的语句映射到它们之上:哪个函数、哪些值。如此界定,问题不需要世界知识,也不需要开放式文本,这就是为什么 45M 参数足够而聊天需要数十亿参数的原因。更小的建模方式是一切的起点。
抽取与结构化输出:schema 就是接口,同样的建模方式也适用于文档:schema 加上一段文字返回类型化字段,enum 字段是一个分类器,array 字段一次调用收集一个列表。我们通过契约而非惯例来强制这一点:每一轮都返回一个调用信封,空调用就是拒绝,而从声明的 schema 编译出的字节级语法约束每一个 token。语法承载了句法,所以所有 45M 参数都用于选择函数和将参数锚定在用户的措辞中。
边缘–云端协作:没有小模型能覆盖一切,所以 Needle 不知道就说不知道:每个响应都带有一个学习到的置信度分数,范围外请求返回空调用。超过你的阈值就行动;低于阈值就重新提问或升级到云端。大多数设备请求是常规控制,所以升级很少发生,默认路径保持私密、即时且免费。
无损 2bit 量化:小模型在事后量化下会崩溃,所以我们从不事后量化:Needle 2 从预训练到后训练全程针对 Cactus Quants 训练,权重、激活值和 KV cache 均是如此。你部署的 2bit 模型就是训练时的模型。这就是如何将 45M 参数塞进 14MB 且在电池上毫无损失的原因。
协同设计模型与推理:每个架构选择都在目标硬件上经过基准测试后才获得其参数,交付物是配对产物而非权重:单个无依赖的 C++ 二进制文件在启动时探测 CPU 并选择其内核,模型、分词器和语法编译器都被密封在内。一个产物从 Cortex-M 到 x86 再到 WebAssembly 都能运行。无需安装,无需下载。
在你的 Mac/PC 上微调:每个产品都有自己的工具词汇,45M 模型小到可以在其运行之处重新训练:仓库和 Python 包在你的电脑上几分钟到几小时内完成微调和测试。交付一个说你的设备工具的 Needle,而不是通用助手。
Needle 已可用于需要最小内存占用、低延迟、隐私和离线可靠性的产品。Pebble——现代可穿戴设备的先驱——在其 Index 01 应用中本地运行它,将语音请求转化为行动,不依赖网络连接。
Pebble Index Ring 没有屏幕。所以当你对它说话时,动作必须每次都发生,无论有没有网络连接。我们在应用内本地运行 Cactus Needle,而不是依赖云端。模型的占用极小,性能从未让我们失望。
简单注意力网络图 2。简单注意力网络。每个块都携带其更新规则。这里 x̂ 是四个残差流的 RMS 规范化展平,H 是正交 Walsh-Hadamard 变换——一个固定矩阵,以 n log n 时间应用,无需读取权重——(kᵢ, vᵢ) 行从哈希 n-gram 表中收集,P 是路由logits A 的双随机规范化,通过 Sinkhorn 迭代计算;a、b、g 和所有 σ 门都是学习的且依赖于输入。注意力残差和 MLP 残差都被夹层规范化并门控,记忆痕迹位点在两层触发,解码受从声明的 schema 编译的字节级语法约束。

简单注意力网络
Needle 2 在专有的 115B token 语料库上预训练,在 38B token 上后训练,包含紧凑推理轨迹和精心的数据集分布设计。从规模角度:LFM2.5-230M 在 19 万亿 token 上预训练,大约是 Needle 总量的 120 倍,下面的评估显示两者互有胜负。每个组件的存在都是为了在不增加带宽的情况下购买能力。Hadamard MLP 用固定的 Walsh 变换和学习的对角线替代了通常的密集上下投影,因此主导小模型权重读取的通道混合几乎不需要任何参数。记忆将世界知识从堆栈中移出,放入哈希 n-gram 表中,每个 token 只读取几行:在解码时几乎免费的容量,这在设备上非常重要,因为从闪存读取的每一 MB 都是延迟和电池。多车道残差流赋予 27 层、512 宽的网络比宽得多的网络的路由灵活性,代价是每层几个点积,而不是更多的注意力或 MLP 容量。
内存系统从固定 RAM 设备反向设计。注意力使用 256 token 滑动窗口,因此无论会话运行多长,KV cache 都有界,系统提示和工具声明作为永久接收器固定,因此工具调用模型永远不能忘记的东西——它的工具——在结构上无法被驱逐。Cache 本身用 QAT 训练,权重以每权重平均 2bit 的混合位数存储在 Cactus Quants 中。结果是质量决策和部署决策保持解耦:一个训练好的模型,专为目标设备能承受的任何精度和窗口而特化。
引擎从它拒绝计算的东西中获得速度。权重从不解压缩到 RAM:2-bit 码在向量寄存器中扩展,融合为整数点积,因此驻留内存保持在 blob 大小,算术路径全程 int8——激活值、KV cache 和车道路由表均是如此。语法是一个优化,不仅仅是保证:因为匹配器在 logit 存在之前就知道哪些 token 是合法的,引擎只为候选行计算输出分数,在结构 token 上跳过最多 98% 的词汇投影,并在输出已被强制的步骤上完全跳过它。一个通用二进制文件在启动时探测 CPU 并自我选择其内核层级——SDOT、NEON、AVX2、RISC-V 向量、wasm SIMD 或标量——线程池在 token 的短串行部分中穿行而不是休眠,这一项几乎使解码速度翻倍。所有这些都不改变任何单个输出:每个技巧要么是精确的,要么相对于参考路径经过逐 token 验证的。
这一切最终是一个能源论证。在设备硅上,从闪存或 DRAM 移动一个字节的成本比乘累加高出几个数量级,所以真正重要的预算是 FLOP 每 token 和 bytes 每 token。架构削减了第一个:Needle 宽度和深度的传统 transformer 每个 token 花费 164 MFLOPs,即使压缩到 Needle 参数量的 transformer 也花费 87,因为它的每个参数都必须通过 matmul 来执行。Needle 花费 70,并将其五分之一的参数保留为聚集内存,根本不花费算术。 binary 削减了第二个,正如引擎部分所示:没有东西被重新实例化,算术全程 int8,语法直接剪枝计算,所以解码一个 token 最多只读取 14MB blob 一次,在结构 token 上读取量更有意义地更少。这就是电池续航的构成。即使在高端手机上,始终在线的助手也生活在一个功率预算内;每一个 MFLOP 都是毫瓦时,Needle 每 token 花费的 FLOP 比基准模型少 7 倍到 85 倍。
每 token 算量
模型
参数量
Matmul 活跃
MFLOPs / token
Needle 2
45M
35M
70
同形状 transformer,密集 MLP
82M
82M
164
参数量匹配的 transformer
43M
43M
87
LFM2.5 230M
230M
230M
460
FunctionGemma 270M
270M
270M
540
Apple FM
~3B
~3B
~6,000
每个 matmul 活跃参数计数乘累加 2 FLOPs,所有行的嵌入绑定;注意力项在匹配的上下文上各行相等并排除。两列之间的差距是记忆:8M 参数通过 gather 读取,不花费算术。基线行将每个参数计为 matmul 活跃,这对两者都是精确的:LFM2.5 的八个短卷积块将其参数保存在密集门和投影 matmul 中,每个 token 都运行——深度卷积核本身可以忽略不计——而短卷积节省的是上下文相关的注意力项,已对每行排除。绑定嵌入在输出头计一次。FunctionGemma 的 540 由该头主导:其 270M 参数中的 170M 是一个 262k-token 嵌入表。
有界的会话内存使微控制器成为可能。由于滑动窗口限制状态,Needle 2 的 RAM 是一个确定的 28MB 上限,而不是随会话长度增长的曲线。这适用于带外部 RAM 的 MCU 级器件,如 ESP32-P4(带 32MB PSRAM)、STM32H7 和 NXP i.MX RT 板(带 SDRAM)。引擎为裸机编译单线程,作为静态库提供给 Cortex-M4、M7 和 M55。
我们在五个公开函数调用基准上评估:Google 的 Mobile Actions、DroidCall、Seal-Tools 域内和域外测试,以及 BFCL v4 单轮。评分是有序严格精确匹配:只有函数名、调用顺序和每个参数值都匹配时一行才通过。所有 Needle 2 数字都通过发货的 C++ 引擎在其生产配置下端到端度量:CQ2-bit 权重、开启工具检索、256-token 滑动 KV 窗口。基准测试没有放松任何条件;数字反映的是设备运行的精确引擎,包括窗口驱逐。基线模型在 vLLM 上以完整上下文运行发布的 checkpoint,Apple FM 在设备端运行。
两种不对称使这个比较变得困难,我们先声明这两点。精度:基线模型故意保持在 f16,因为传统后训练量化到 2 bit 会崩溃从未为激进压缩训练过的模型,而 Cactus Quants 从头到尾融入 Needle 的训练。这对基线有利。范围:Needle 专门为代理工具调用而训练,没有其他目的,而每个基线模型都是通用语言模型,除了工具调用还携带聊天、散文和世界知识。这对 Needle 有利。没有干净的方法将两者同时拉平,所以我们不尝试。表格回答一个狭义问题:哪个模型在设备内预算内正确执行工具调用。我们接受这种倾斜;它仍然描绘了我们想要的画面。
Mobile Actions(961 行)
模型
准确率
名称匹配
非空
1-call
2-call
LFM2.5 230M(f16,vLLM)
69.1
93.0
98.9
76.1
55.0
FunctionGemma 270M(f16,vLLM)
64.0
87.3
98.9
73.0
46.2
Needle 2(CQ2-bit)
63.7
98.3
99.4
71.3
48.4
Apple FM(设备端)
57.6
94.2
95.5
64.5
43.8
Google Mobile Actions 评估分割,有序严格精确匹配;函数名、调用顺序和每个参数必须匹配。
Mobile Actions(961 行)
DroidCall 测试分割(200 行)
模型
准确率
名称匹配
非空
1-call
2-call
FunctionGemma 270M(f16,vLLM)
17.5
37.5
59.5
22.7
0.0
Needle 2(CQ2-bit)
17.0
36.5
47.5
22.1
0.0
LFM2.5 230M(f16,vLLM)
11.0
21.5
22.5
14.3
0.0
Android intent 风格函数调用,有序严格精确匹配;1-call 行 n=154,2-call 行 n=24。
DroidCall 测试分割(200 行)
Seal-Tools 域内(700 行)
模型
准确率
名称匹配
1-call
2–3-call
4+-call
Needle 2(CQ2-bit)
32.6
64.9
63.0
21.8
14.6
LFM2.5 230M(f16,vLLM)
26.9
45.4
54.5
17.1
10.4
FunctionGemma 270M(f16,vLLM)
16.3
56.0
47.0
4.5
2.1
大型候选工具列表,多数为多调用行。
Seal-Tools 域内(700 行)
Seal-Tools 域外(654 行)
模型
准确率
名称匹配
1-call
2–3-call
4+-call
Needle 2(CQ2-bit)
28.7
58.7
56.4
27.1
15.4
LFM2.5 230M(f16,vLLM)
17.0
35.0
42.6
13.7
9.8
FunctionGemma 270M(f16,vLLM)
15.6
48.9
50.0
11.0
6.3
整个工具域从训练中保留,测试 schema 泛化。
Seal-Tools 域外(654 行)
Needle 没有为通用函数调用而训练:其语料是消费级设备动作——智能家居、移动、可穿戴设备、电视、汽车——加上结构化抽取,而 BFCL 的通用和企业级 API surface,包括 Java 和 JavaScript SDK 类别,完全在其分布之外。尽管如此它仍然能泛化:在 Python 简单调用上,它与 FunctionGemma(一个六倍大、专门为此任务训练的模型)相差不到一个点,并在所有 3641 行上保持了 93.4 的格式良好率。差距集中在她从未训练过的地方:Java、JavaScript 和并行多调用类别。
BFCL v4 单轮(3641 行)
类别
Apple FM
设备端
LFM2.5 230M
f16 · vLLM
FunctionGemma 270M
f16 · vLLM
Needle 2
CQ2-bit
简单
73.3
63.2
48.1
40.8
—
Python
86.8
85.5
62.3
61.2
—
Java
67.0
48.0
38.0
29.0
—
JavaScript
66.0
56.0
44.0
32.0
—
多个
84.0
78.5
60.0
57.0
—
并行
65.0
64.0
36.5
30.0
—
并行多个
52.0
51.5
30.5
22.5
—
实时简单
70.5
45.0
33.7
36.8
—
实时多个
45.9
47.8
25.2
27.9
—
实时并行
50.0
43.8
18.8
25.0
—
实时并行多个
58.3
45.8
25.0
29.2
—
相关性
100.0
68.8
81.2
81.2
—
不相关
28.3
77.7
72.1
60.8
—
总体
61.7
60.8
46.1
42.6
—
格式良好率
95.0
94.2
100.0
93.4
—
官方 BFCL v4 单轮评分器。总体是所有 13 个原始类别的收集者无权重均值;粗体值标记每行最佳结果。
BFCL v4 单轮(3641 行)