评测 / 2026-10-17
LLM 推理性能的评测口径:为什么 token/s 会骗人
结论 / TAKEAWAY
性能数字不可比的根源通常不是硬件,而是口径:不写清输入输出长度、并发方式、预热状态与分位数的 token/s,只能当参考,不能当结论。
为什么口径比硬件更重要
同一张加速卡、同一个模型,只改三个变量,token/s 就能差出一倍以上:
- 输出长度从 128 token 改成 1024 token(固定开销被摊薄,数字变好看);
- 单流改成 64 并发(吞吐上升,但单请求延迟变差);
- 是否开前缀缓存、是否把首次加载算进去。
所以看到“某卡每秒多少 token”时,先别比较,先问一句:输入多长、输出多长、几路并发、预热了吗、看的是平均还是 P99?
必须写清楚的五个字段
- 输入长度:均值、P50/P95,以及是否共享前缀。
- 输出长度:固定生成还是
max_tokens截断;两者不可混比。 - 采样参数:
temperature、top_p、是否贪心解码;非确定性采样会让延迟波动。 - 并发与批量:单流、固定并发、阶梯并发,或者固定到达率;必须与吞吐一起报。
- 预热与缓存:首次请求(含模型加载/编译)与稳态请求分开;prefix cache 命中率单独说明。
五个核心指标
| 指标 | 定义 | 容易踩的坑 |
|---|---|---|
| TTFT | 请求到首 token 的时间 | 非流式接口可能把总耗时填进 TTFT |
| TPOT | 首 token 后每个 token 的平均间隔 | 只报平均,掩盖长尾 |
| E2E | 整条请求总耗时 | 与 TTFT/TPOT 的换算没交代 |
| 吞吐 | 每秒请求数或输出 token 数 | 不写并发,数字没有意义 |
| P95 / P99 | 延迟分位数 | 生产 SLA 要看长尾,不是平均值 |
流式场景可以用一个近似关系做交叉校验:
E2E ≈ TTFT + (输出 token 数 - 1) × TPOT
示例:输出 512 token、TTFT 0.35 s、TPOT 22 ms,则 E2E ≈ 0.35 + 511 × 0.022 ≈ 11.6 s。 这只是公式演示,不是任何真实设备的测试结果。
六个最常见的错误
- 只报 token/s,不报长度与并发——最常见的“不可比”来源。
- 把首次加载混进稳态数据——模型编译、显存分配、cache 冷启动会显著拉高首轮。
- 用平均值代替 P99——平均值漂亮、P99 崩掉,是生产环境最常见的翻车。
- 把编排层瓶颈算到硬件头上——连接池、序列化、日志、队列都可能先于 GPU/NPU 成为瓶颈。
- 跨 tokenizer 比较 token/s——不同分词器切分粒度不同,必要时同时给出字符级速率。
- 不同框架/版本混在一张表里——框架版本、驱动版本、模型精度必须逐项列出。
一份最小可复现报告清单
- 硬件型号与数量(可做角色化脱敏,但需说明类别与显存)
- 驱动 / 框架 / 模型精度 / 模型版本
- 输入与输出长度分布
- 并发模型(单流 / 固定并发 / 阶梯)
- 预热策略与缓存开关
- 至少 3 轮重复,报告 P50 与 P99
- 原始数据与复现脚本
- 利益披露:设备来源、是否收费、是否送测
本站所有评测都会按这套口径执行,详见 评测方法论。
- 可复现等级
- C · 仅方法可复现
- 内容许可
- CC BY 4.0(署名即可转载)
- 复现包
- 环境清单、脚本与数据见 GitHub
利益披露:本文为个人研究,未使用任何公司数据与设备,未接受厂商赞助;数据与脚本见文末复现包。
最后更新:2026-10-17评测方法论 →