Tempo9 性能测量

同一台 Mac,
明确的测试条件。

English · 中文

评价本地推理运行时,需要分别回答四个问题:多个 Agent 并发时需要等待多久,内存如何随上下文增长,工具调用是否准确,以及处理图像时能否为语言模型保留足够的 GPU 资源。

设备 M5 Pro · 24 GB 主要模型 Qwen3.5-35B-A3B · q3km 系统 默认设置
0.94–0.95 秒TTFT p50 · 四个 Agent · 10K 共享提示词
547–557 MB声明 128K 上下文后的启动内存
85.19%BFCL v4 · Non-Live AST
2.8×带一张图片 · NPU 相对 GPU 的 LLM 解码吞吐

多个 Agent

四个会话并发时,缩短首个 token 的等待

Continuous batching 将新请求加入正在执行的批次;Paged KV 只为实际存在的 token 分配缓存;Prefix cache 则复用多个会话共有的系统提示词和工具历史。以下测量关注 Agent 用户直接感知的指标:首个 token 延迟。

四个 Agent · 数值越低越好

Tempo9 的各组延迟区间均低于对应的比较结果

02467 秒
1.5K 提示词 · p50
Tempo90.56–0.89 秒
llama.cpp1.52–2.29 秒
1.5K 提示词 · p95
Tempo90.92–2.27 秒
llama.cpp4.94–6.52 秒
10K 提示词 · p50
Tempo90.94–0.95 秒
llama.cpp1.60 秒
10K 提示词 · p95
Tempo91.61–1.75 秒
llama.cpp6.32 秒

每格包含两至三轮测试,每轮十二个请求。横轴为首个 token 延迟。

10K 提示词接近 OpenClaw 每轮发送的系统提示词长度。两个引擎读取相同的 GGUF,并保留各自默认的前缀缓存设置。并发解码吞吐尚未达到可公开比较的复现标准,因此不在本页列出。

来源报告:results_p13_serving_retest.md

长上下文

声明的上下文容量不等于预分配的内存

Tempo9 根据实际到达的 token 分配 Paged KV。将上下文上限从 8K 提高到 128K,启动内存仍保持在约 0.55 GB。冷 KV 页面卸载后,数据只位于 GPU 可访问的统一内存或 SSD,不设置额外的主机内存中转层。

KV + 工作内存 · 数值越低越好

从 8K 到 128K,Tempo9 的启动内存基本不变

声明容量后的启动占用

刻度:0–4 GB

8K
Tempo9557 MB
llama.cpp505–573 MB
32K
Tempo9547–558 MB
llama.cpp981–1051 MB
64K
Tempo9536–558 MB
llama.cpp2034–2041 MB
128K
Tempo9547–557 MB
llama.cpp3.6 GB · OOM

填入 token 后的实际占用

刻度:0–2.2 GB

约 4K token
Tempo9约 550 MB
llama.cpp2.03 GB
23.4K token
Tempo9731 MB
llama.cpp2.08 GB
46.8K token
Tempo9927 MB
llama.cpp2.12 GB

左右两栏采用不同刻度。左栏为使用上下文前的启动占用,右栏为 token 实际驻留后的内存。

图中统计 KV 缓存与工作内存,不含文件映射的模型权重。实际驻留的 token 仍然占用内存;分页机制避免的是为尚未使用的容量提前预留内存。

来源报告:results_p4b_boundary.md

工具调用

先验证准确率,再测量生成速度

BFCL 测试覆盖 Agent 实际使用的完整服务链:解析请求与工具定义,执行结构化生成,并通过 OpenAI API 兼容端点返回工具名称和参数。

85.19%Non-Live AST
76.61%Live AST
分类得分
BFCL v4 分类Tempo9
simple (Python)95.25%
multiple94.50%
parallel89.00%
parallel multiple83.50%
Non-Live irrelevance84.17%

结构化输出与投机解码

200 token 以上的工具调用 JSON · 单流

在结构化输出条件下达到 104.9 tok/s

默认 · k=091.8 tok/s
投机 · k=4104.9 tok/s

解码吞吐已扣除 TTFT。投机解码需要显式启用,默认关闭。

使用官方 BFCL v4 evaluator 评测全部 3,641 个已完成的单轮样本。104.9 tok/s 仅适用于结构化 JSON 负载;相同的投机设置在散文生成中没有净收益。

来源报告:results_p11_bfcl_fixed.md · results_p6_mtp.md

从 LLM 到 VLM

同一张图片,视觉计算分别运行在 NPU 与 GPU

Tempo9 可以将视觉 Transformer 部署在 Neural Engine,同时由 GPU 继续执行语言模型。以下测试固定图片和语言模型负载,仅改变视觉计算的位置。

纯文本基线 · 同一张图片 · 仅改变执行位置

处理图片时,NPU 方案为 LLM 保留 2.8 倍解码吞吐

不带图片73.6 tok/s
一张图片 · NPU25.9 tok/s
一张图片 · GPU9.4 tok/s

“不带图片”为纯文本基线。2.8 倍比较的是同一图片负载下 NPU 与 GPU 两种部署方式。

同一套内存机制还使 Qwen3-VL-30B-A3B 能够在这台 24 GB 设备上完成图像问答。对于两个引擎均可运行的较小模型,测试结果并非单向领先:

Tempo9正常完成 · 回答正确
llama.cpp mtmdMetal 内存不足
Gemma 4 12B · 单图Tempo9llama.cpp
图像编码28 ms131 ms
回答解码28.2 tok/s33.9 tok/s

NPU 测试说明的是系统层面的部署收益,不表示 Neural Engine 的孤立性能高于 GPU。Gemma 对比中,两个引擎读取相同的 GGUF 与 mmproj

来源报告:results_p7_power.md · results_p4_p5_tickets_vlm.md

方法与来源

这些数据所对应的测试条件

设备

16 英寸 MacBook Pro,Apple M5 Pro,24 GB 统一内存,macOS Tahoe 26.5。本页全部结果均来自该设备。

系统设置

iogpu.wired_limit_mb 保持系统默认值,没有为任一引擎提高 wired memory 上限。

主要模型

Qwen3.5-35B-A3B q3km,15.98 GiB。引擎对比项目读取相同的 GGUF 文件。

数据解释

每个章节回答不同问题。不同负载下的吞吐、延迟、内存和准确率数值不可直接横向比较。

引擎版本、比较对象版本、测试脚本、原始输出、无效条件和被后续测试取代的结果,均保留在 benchmarks 仓库中。该仓库将在首个公开版本发布时开放。

返回 Tempo9 使用手册