2026-04-28 · 碎片
32
碎片 · 2026-04-28

那个 tok/s 数字在撒谎

某天你看到一张benchmark图表:Cerebras 969 tok/s,vLLM 770 tok/s,某个闭源方案声称 1200 tok/s。数字看起来很像 apples-to-apples,其实完全是两个物种。

这不是"参数不同导致差异"的问题,而是"将六维曲面投影到一维轴上再假装可以还原"的欺骗。你把六个自由度的参数压扁成一个数字,然后当别人问"你用的是什么配置"时,你才开始补全那些"隐藏参数"。这时候,原来的数字已经不再诚实。

六个被藏起来的参数

  1. 模型大小:405B和26B在同一台机器上不会跑到同一个 tok/s。Cerebras的数字是405B单流,4090上是26B。不同产品卖不同东西,一个卖低延迟巨型模型,一个卖高吞吐小模型。

  2. 提示长度 vs 输出长度:prefill是算力瓶颈,decode是内存瓶颈。128提示+128输出几乎全是decode;8000提示+256输出几乎全是prefill。两者在同一硬件上呈现截然不同的数字。多数agent工作负载是prefill重的,因为prompt要承载工具、上下文和超长system message。

  3. 输出长度:KV cache随着输出填满而拖慢decode。32token输出从未有时间减速,4000token输出则越跑越慢。以短输出平均的数字会美化硬件;Chen et al. 2024的Sequoia直接记录了这一非线性:稳态数字低于爆发窗口。

  4. 并发度:最被隐瞒的一个参数。我给出的770 aggregate是在并发8下得出的;折算到单流是96 tok/s。而Cerebras的969是并发1。同一硬件可以选择任意一个数字来讲述给不同的听众听。

  5. KV cache预算:PagedAttention(Kwon et al., 2023)在这里是基础变化。vLLM暴露权衡:--gpu-memory-utilization、--max-num-seqs、--max-model-len。厂商benchmark很少公布比率,导致你无法复现,也无法判断图表是否在production-realistic的context length下得出。

  6. decode vs prefill混比:Zhong et al., 2024的DistServe干脆把两个阶段拆到不同硬件上,因为瓶颈不同。合在一起报一个数字,是在两个物理机制之间做平均。两个系统同样报出"200 tok/s"的headline,但其中可能有完全不同的prefill-tail延迟。

你把它们全部钉住,比较才变得可读。留任何一个自由,图表就变成装饰。

为什么厂商不告诉你

因为那张漂亮的、大得离谱的数字是用来卖货的。如果告诉你"这是在并发1、128提示、32输出下测出的",你会觉得"这不是我需要的";如果告诉你"这是在prefill-only的短输出下跑出来的",你会问"我的长对话怎么办?"。隐瞒参数是营销的一部分。

不是"我们没测过其他配置",而是"我们测了,但那些数字不好看,所以不放在宣传册上"。这是正常的市场行为。但问题是:大多数人把marketing当成了engineering,把可操纵的数字当成了客观真理。

我如何审视任何 tok/s 声称

我有一个快速质询清单,用来在相信任何数字之前问厂商:

如果厂商给不出这六个,那个数字就不是测量,是销售道具。

更进一步,我会要求他们给出"在生产并发度(比如16或32)下的数字"。大多数人会突然换一张看起来不那么炫但更有用的图表。这说明他们知道真相,只是选择不放在封面。

aggregate和per-stream不是"同一个指标的不同缩放",而是"共享单位的两个不同指标"。把latency和bandwidth拿来比较,仅仅因为分母里都有"时间",是同样的范畴错误。

结论

一个没有run配置的tok/s数字不是benchmark,是宣传册。

作为CTO,我关心的是生产环境下的真实性能:当16个agent同时发起请求时,当prompt是8000 token时,当需要稳定输出4000 token时,系统的表现如何?这些数字很少出现在marketing slide上,但它们是唯一对工程决策有意义的信息。

下一次看到"969 tok/s"或"1200 tok/s"的大标题时,先问一句:这六个参数被钉住了吗?如果没有,那就是装饰,不是数据。


参考文献

—— https://www.80aj.com

目录 最新
← 左侧翻上一屏 · 右侧翻下一屏 · 中间唤出菜单