Cactus:为手机和手表设计的端云混合推理引擎
Quantization, kernels, runtime and inference engine for mobiles, wearables, smart home and robots.
秒懂
- 它是什么?
- Cactus 是一套面向移动端、可穿戴设备和机器人的量化、内核、运行时与推理引擎,主打自研旋转量化 CQ 和零拷贝计算图。它提供 OpenAI 兼容 API,并支持按置信度自动切换到云端模型。
- 适合谁用?
- Cactus 适合需要在手机、手表或机器人上运行 LLM、VLM 或语音识别,且能接受闭源许可的团队。它不适合要求完全本地离线、不能依赖云端回退的场景,也不适合需要极低比特量化下保持推理能力的任务,因为 CQ2 在 GSM8K 上几乎失效。
- 能商用吗?
- 请先确认。这个仓库使用的许可证不在我们自动归类的范围内,商用前请阅读仓库里的 LICENSE 文件。
- 还在维护吗?
- 在维护。仓库最近一次提交在 7 天前。
- 用什么语言写的?
- 主要是 C++(依据 GitHub 的语言统计)。
以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。
开源项目深度解析
它解决什么问题
Cactus 解决的是在资源受限设备上运行大模型的问题。手机、手表、智能家居设备没有数据中心级别的内存和散热,直接跑 FP16 模型不现实。Cactus 的定位是混合边缘云引擎,它不只做量化,还提供从内核到运行时再到 API 的完整栈。目标用户是需要在端侧跑文本、语音或视觉任务的开发者,尤其是那些希望保留云端兜底能力的人。它支持 HuggingFace 模型转换,但特别测试的是 Liquid、Gemma、Whisper、Parakeet 和 Qwen 家族,这意味着其他模型可能能跑,但稳定性没有保证。
端云混合的触发机制
Cactus 的一个独特设计是 cloud_handoff。当本地模型生成结果时,响应 JSON 里带有 confidence 字段和 confidence_threshold 字段。如果置信度低于阈值,引擎会自动把请求路由到云端模型。README 中的示例显示,阈值是模型相关的,不是全局固定值。这意味着开发者不需要自己写路由逻辑,引擎内部根据置信度做决策。这个机制对工具调用场景尤其有用,比如 Needle 模型做函数调用时,如果本地不确定,就让云端处理。代价是必须有网络连接,而且云端延迟会叠加到总时间上。文档没有说明如何自定义阈值或关闭这个功能,但 C 接口里 cactus_init 的第三个参数是 false,可能控制 RAG 的开关,不一定控制 handoff。
Cactus Graph 的零拷贝设计
Cactus Graph 是一个计算图层,它暴露了类似 PyTorch 的算子接口,但强调零拷贝。代码示例里 graph.input 可以指定精度,比如 FP16 和 INT8,然后 set_input 时用 float 数组但指定精度为 FP16。这说明图内部会处理精度转换,而不是强制用户提供特定格式。graph.execute() 之后可以直接 get_output 拿到指针。硬重置方法 hard_reset() 存在,暗示图对象可以复用,但需要手动清状态。这个层适合对内存布局有严格要求的开发者,比如需要把多个算子融合到一次执行里的场景。不过,文档没有提供图执行时的内存分配细节,零拷贝的具体实现方式需要看源码才能确认。
Cactus Quants:旋转加码本的量化方案
Cactus 没有用常见的 GPTQ 或 AWQ,而是自研了基于旋转和码本的量化技术,称为 CQ。它提供 CQ4、CQ3.26、CQ2.54 和 CQ2 等格式,其中 CQ3.26 和 CQ2.54 是混合精度,CQ2、CQ3、CQ4 是均匀量化。精度表格显示,CQ4 在多数任务上与 FP16 相当,比如 ARC-E 从 73.80 变到 73.73,HellaSwag 甚至略高。但 CQ2 在 GSM8K 上从 73.67 掉到 0.40,HumanEval 掉到 1.02,基本不可用。这说明 CQ2 只适合对推理质量要求极低的场景。混合精度格式 CQ3.26 在 ARC-E 上甚至超过 FP16,达到 74.20,但 GPQA 和 GSM8K 有明显下降。量化方法的具体数学原理在 docs/cactus_quants.md 里,但 README 只给了结论,没有给公式。
性能数据与实测限制
README 提供了多设备的基准测试表,涵盖 Mac M5 Max 到 iPhone 15 Pro。LLM 测试用的是 Gemma-4-E2B-CQ4,1k 上下文预填加 100 token 解码,没有投机解码。M5 Max 上预填 2964 tps,解码 154 tps;iPhone 15 Pro 上预填 517 tps,解码 26 tps。这些数字是项目方自己公布的,没有第三方验证。注意 RAM 占用从 M5 Max 的 1348MB 到 iPhone 15 Pro 的 633MB,说明 1k 上下文下内存压力不小,对 4GB 内存的旧手机会很紧张。另一个限制是这些数据只覆盖 Apple 芯片和部分安卓设备,README 提到内核支持 Apple、Samsung、Pixel,但没给出具体安卓机型的数据。如果你用其他 SoC,比如联发科或麒麟,性能可能完全不同。
安装与运行:从 brew 到命令行
在 Mac 上安装很简单,执行 brew install cactus-compute/cactus/cactus,然后运行 cactus run 就能启动一个交互会话。cactus run 后面可以跟 HuggingFace 模型名,比如 cactus run Cactus-Compute/needle,如果本地没有模型,它会先下载或转换。转换命令是 cactus convert [HF-Name],但 README 明确说这个功能是实验性的。cactus download 可以直接拉取项目方预转换的模型。C 接口的用法在 README 中有完整示例,cactus_init 接受权重文件夹路径和文本路径用于自动 RAG,cactus_complete 接受 JSON 格式的 messages 和 options,返回结果包含 token 统计和内存用量。这些命令和 API 都是文档中明确写出的,实际使用时建议先跑 cactus benchmark 看看设备性能。
许可证与维护成本
这个仓库的许可证标记为 NOASSERTION,意味着 GitHub 无法识别许可证类型。这对企业采用是个大问题,因为你无法确定能否商用、能否修改、能否闭源分发。README 没有提供任何许可证文本,也没有说明商业许可的获取方式。维护节奏看,v2.2.0 在 2026 年 9 月发布,v2.1.0 在 8 月,v2.0.1 在 7 月,一个月一个 minor 版本,说明开发很活跃。但活跃也意味着 API 可能不稳定,升级时可能需要改动代码。绑定层覆盖 Swift、Kotlin、Flutter、React Native、Python 和 Rust,但 README 没有说明这些绑定的维护状态或版本同步策略。如果项目要长期依赖,建议先锁版本并测试升级路径。
替代方案与差异
最直接的替代是 llama.cpp,它同样支持移动端推理,但采用 GGUF 量化格式,没有端云混合路由。llama.cpp 是 MIT 许可,社区庞大,模型支持广泛,但你需要自己实现置信度判断和云端回退逻辑。Cactus 的差异化在于它把量化、内核、图执行和混合路由打包成一个产品,而 llama.cpp 更接近一个推理库。另一个替代是 MLC-LLM,它基于 TVM 编译栈,可以针对不同硬件生成优化代码,但学习曲线陡峭。Cactus 的 C 接口更简单,适合快速集成到现有应用。如果你的核心需求是离线运行且不想依赖任何闭源组件,llama.cpp 是更稳妥的选择;如果你需要开箱即用的端云切换,Cactus 的 confidence 机制能省不少开发时间。
编辑结论
Cactus 适合需要在手机、手表或机器人上运行 LLM、VLM 或语音识别,且能接受闭源许可的团队。它不适合要求完全本地离线、不能依赖云端回退的场景,也不适合需要极低比特量化下保持推理能力的任务,因为 CQ2 在 GSM8K 上几乎失效。采用前应先验证三点:确认目标模型能否通过 cactus convert 成功转换,检查 CQ3.26 等混合精度格式在自有数据集上的精度损失,以及测试 cloud_handoff 触发时网络延迟是否可接受。若你的项目必须使用 MIT 或 Apache 2.0 许可,Cactus 的 NOASSERTION 状态是一个必须解决的障碍。
社区笔记