一个 45M 参数的模型,压缩到 14MB 的单一二进制文件,28MB 内存跑完整个推理会话。Cactus Compute 发布的 Needle 2 在树莓派 5 上达到 500 tokens/s 的解码速度,在 Meta Quest 3S 和 Apple Vision Pro 上跑出 400 到 1,500 tokens/s,在 200 美元以下的 Android 手机上稳定 300 到 700 tokens/s。它甚至能在 ESP32 微控制器上运行。

这些数字之所以成立,是因为 Needle 2 从根本上重新定义了"模型需要做什么"。它不写散文,不回答知识问题,不做多轮对话。它只做一件事:把一句自然语言映射到一组带类型参数的函数调用。开灯不需要前沿模型,调空调不需要世界知识。Cactus 把这个问题缩小到 45M 参数能覆盖的范围内,然后用一套全新架构和训练方法将其塞进 14MB。
Simple Attention Network:砍掉 FFN 的 Transformer
Needle 2 的核心架构叫做 Simple Attention Network(SAN),论文见 arXiv:2607.18363。标准 Transformer 中约三分之二的参数存在于前馈网络(FFN/MLP)中。SAN 的设计思路是:如果模型不需要存储世界知识(因为它只做函数调用),FFN 就可以被完全移除。

SAN 用 Hadamard MLP 替代传统的密集 FFN。Walsh-Hadamard 变换是一个固定正交矩阵,以 n log n 时间应用,不消耗任何可学习参数。通道混合操作通过学习对角矩阵(D_k = diag(d_k))与固定 Hadamard 矩阵的乘积实现,将原本需要大量参数的 up/down 投影压缩到几乎为零。
此外,SAN 引入了 engram 记忆系统:世界知识不再存储在权重矩阵中,而是放在散列 n-gram 表中,每个 token 解码时只读取少量行。这种设计在边缘设备上尤其有利,因为每次从闪存读取的字节数直接决定延迟和功耗。
多通道残差流(multi-lane hyper-connections)给一个 27 层、512 宽度的网络提供了远超其实际宽度的路由灵活性,代价仅为每层几个点积运算。
训练与 Cactus Quants:从源头训练 2bit
Needle 2 在专有的 115B token 语料上预训练,在 38B token 上做后训练(含紧凑推理轨迹和精心设计的分布)。作为参照,LFM2.5-230M 在 19 万亿 token 上预训练,约为 Needle 总训练量的 120 倍。
关键的一步是 Cactus Quants(CQ2-bit)。小型模型在事后量化下会崩溃,因此 Needle 2 从预训练到后训练全程针对 Cactus Quants 训练,权重、激活值和 KV cache 统一量化到 2bit。部署时用的 2bit 模型就是训练时的模型本身,没有精度损失。
权重在推理时永远不会解压到 RAM:2-bit 编码在向量寄存器内部展开,融合为整数点积,常驻内存始终保持在 14MB 的 blob 大小,算术路径全程 int8。
有限内存设计:256 token 滑动窗口
注意力机制使用 256 token 的滑动窗口,KV cache 大小有上界,无论会话多长。系统提示和工具声明作为永久 sink 被 pin 住,保证模型永远不会忘记自己有哪些工具可用。这使得总会话内存稳定在 28MB 左右,能够运行在 ESP32-P4(32MB PSRAM)、STM32H7 和 NXP i.MX RT 等微控制器上。
引擎还利用字节级语法做推理优化:语法匹配器在 logit 生成之前就知道哪些 token 合法,引擎只为候选行计算输出分数,在结构化 token 上可跳过高达 98% 的词表投影。这一优化不会改变任何输出,每个 trick 要么是精确等价的,要么是逐 token 验证过的。
Benchmark:5 倍到 70 倍小的模型
在 Google Mobile Actions(961 行,有序严格精确匹配)上,Needle 2 的名称准确率达到 98.3%,高于所有对手:
| 模型 | 准确率 | 名称准确率 | 非空率 | 1-call | 2-call |
|---|---|---|---|---|---|
| LFM2.5 230M (f16) | 69.1 | 93.0 | 98.9 | 76.1 | 55.0 |
| FunctionGemma 270M (f16) | 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 (on-device) | 57.6 | 94.2 | 95.5 | 64.5 | 43.8 |
在 Seal-Tools in-domain(700 行,大候选工具列表,多数为多调用行)上,Needle 2 的优势更明显:
| 模型 | 准确率 | 名称准确率 | 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) | 26.9 | 45.4 | 54.5 | 17.1 | 10.4 |
| FunctionGemma 270M (f16) | 16.3 | 56.0 | 47.0 | 4.5 | 2.1 |
Seal-Tools out-of-domain(654 行,整个工具领域被排除在训练集外,测试 schema 泛化能力):
| 模型 | 准确率 | 名称准确率 | 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) | 17.0 | 35.0 | 42.6 | 13.7 | 9.8 |
| FunctionGemma 270M (f16) | 15.6 | 48.9 | 50.0 | 11.0 | 6.3 |
BFCL v4 单轮(3,641 行)是通用函数调用基准。Needle 在 Python 简单调用上达到 61.2%,仅比六倍大的 FunctionGemma 270M 低一个百分点:
| 类别 | Apple FM | LFM2.5 230M | FunctionGemma 270M | Needle 2 |
|---|---|---|---|---|
| Python Simple | 86.8 | 85.5 | 62.3 | 61.2 |
| Java Simple | 67.0 | 48.0 | 38.0 | 29.0 |
| JavaScript Simple | 66.0 | 56.0 | 44.0 | 32.0 |
| Multiple | 84.0 | 78.5 | 60.0 | 57.0 |
| Relevance | 100.0 | 68.8 | 81.2 | 81.2 |
| Overall | 61.7 | 60.8 | 46.1 | 42.6 |
| Well-formed | 95.0 | 94.2 | 100.0 | 93.4 |
Cactus 明确指出两个不对称性:精度方面,基线模型保留 f16,因为传统事后量化到 2bit 会让非压缩训练的模型崩溃;范围方面,Needle 只训练了 agentic 工具调用,所有基线都是携带聊天、散文和世界知识的通用语言模型。这两点各自有利于不同方,没有干净的方式同时拉平。
计算效率:70 MFLOPs/token
在边缘设备上,从闪存或 DRAM 移动一个字节的功耗比一次乘加运算高几个数量级。Needle 2 的架构同时压缩了两端:
| 模型 | 参数量 | 矩阵活跃参数 | 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 |
Needle 2 每个解码 token 最多读取一次 14MB blob,在结构化 token 上更少。对比 LFM2.5,Needle 的每 token MFLOP 降低 7 倍;对比 Apple FM,降低 85 倍。
生产部署与 Python SDK
Needle 2 以 Apache 2.0 许可证开源,权重托管在 HuggingFace。Python 包安装后即可使用:
import needle
@needle.tool
def set_thermostat(temperature: int, mode: str = "auto"):
"""Set the thermostat.
Args:
temperature: target temperature in Celsius
mode: heating strategy to use
"""
return {"temperature": temperature, "mode": mode}
agent = needle.Needle(tools=[set_thermostat])
agent.run("make it 21 and cool the room")模型返回结构化 JSON 调用,每个响应携带置信度分数。低于阈值的请求返回空调用(即拒绝),应用可以决定重新提问或升级到云端模型。内置工具检索头在每轮只向模型渲染前 5 个工具,配合字节级语法约束,确保输出永远是合法的函数调用。
对于自定义工具词表,45M 参数的模型足够小,可以在本地 Mac/PC 上几分钟到几小时内完成 LoRA 微调。Pebble 的 Index 01 智能戒指已经在生产环境中使用 Needle:戒指没有屏幕,语音指令必须即时转为动作,本地运行消除了对网络连接的依赖。
边缘 AI 的真正战场
Edge AI 的讨论长期聚焦于 Mac 和 PC,但全球有超过 210 亿台连接 IoT 设备,PC 只有约 15 亿台。新兴市场中大多数手机售价低于 200 美元。算上廉价手机、树莓派、微控制器、可穿戴设备、小型机器人和智能家居设备,大约五分之四的边缘设备成本低于 200 美元。这些设备没有 GPU,没有 NPU,只有几百 MB RAM。Needle 2 的目标硬件正是这片被忽视的庞大市场。
Cactus 的赌注是:函数调用不需要世界知识,不需要开放式散文,45M 参数就够了。从结果看,这个赌注在很大程度上成立。Needle 2 在设备控制类 benchmark 上与比它大 5 倍到 70 倍的模型互有胜负,在通用函数调用上虽然落后于 Apple FM,但考虑到前者运行在 ESP32 上、后者运行在 iPhone 上,这种差距有着完全不同的工程含义。
来源:Cactus Compute | HuggingFace | GitHub | 论文 arXiv:2607.18363