有人丢来一条跑分:单张消费旗舰卡,27B 稠密模型,batch 1,2048 个 token 在 0.969 秒里出完,2103.6 tok/s。
同卡同模型的正常速度大概是 79。这条快了 26 倍。
我没有那张卡,也不打算为了反驳一条跑分去买一张。但三个除法就够了——每个都能在一分钟内算完,每个单独成立就足以下判决。第二章那个除法是全文最短的一条,你现在就能记住;第六章是我自己在同一套方法上翻的车,那章决定你要不要信前面五章。
只想拿判据,就看第 2 章;另外两条独立反证在第 3、4 章。想看我怎么翻车去第 6 章,只要检查单就跳到第 8 章。
1. 他什么都没藏
先说清楚:这条跑分的作者不是骗子。
启动命令、量化格式、投机解码参数、运行时的自述备注,全部公开可查。如果按「配置有没有藏起来」这条老判据去审,它能全票通过。
钉子恰恰在他自己写的备注里:
--speculative-num-draft-tokens 56
--speculative-dflash-block-size 56
"width 56 speculative window with N-gram primary fill
(100% acceptance, AL=56.0)"
投机解码是这么回事:让一个小模型先猜后面几个词,大模型一次性验证这几个猜测,猜对的白赚,猜错的从错的地方丢掉重来。数学上无损,贪心解码下输出跟大模型逐个吐是一样的。
窗口设成 56,意思是小模型一次猜 56 个。而 AL(接受长度,平均每轮真正被采纳几个)报的是 56.0,接受率 100%。
他如实汇报了一个没有意义的测量。
2. 第一个除法:接受长度除以窗口宽度
全文最值钱的一行:
AL / num_draft_tokens → 越接近 1.0,这个数字越不可外推
代进去:
56.0 / 56 = 1.000
一次都没猜错。 连续 2048 个 token,小模型每一次预测全部命中。
为什么这是红灯?拿同一个投机解码方法的官方数据当尺子:
| 任务 | 官方 AL | 对应加速比 |
|---|---|---|
| GSM8K | 5.46 | 3.43×(单请求) |
| MATH-500 | 5.28 | — |
| MBPP | 4.79 | — |
| HumanEval | 4.39 | — |
真实任务落在 4 到 6 之间。除以窗口 56 就是 0.078 到 0.098——猜 56 个,能用的大约 5 个。
100% 命中意味着输出已经退化成能被整段预测的序列:数数、复读、套模板、格式化枚举。N-gram 填充直接从前文抄,当然全中。
这时候投机解码在干的事是:跑一次大模型前向,吐出 56 个早就知道的 token。它量的是 N-gram 命中率,跟模型生成速度没关系。
可迁移的形状:任何指标恰好等于它的理论上界,先怀疑它是喂进去的而不是跑出来的。真实负载的 AL 一定是个带小数的散值,恰好等于窗口宽度就是「分母被喂饱了」的确诊签名。同族的还有接受统计写成 383/383、767/767 这种分子分母完全相等的,一律红灯。
3. 第二个除法:功耗,最难伪造的旁证
第 2 章那条要求你知道官方 AL 基线。不知道呢?
同一张卡、同一个 27B 模型:
| 跑法 | 功耗 |
|---|---|
| 真实稠密解码 | 574–576 W(该卡 TDP 575,满载) |
| 这批「记录」 | 99–100 W |
99 除以 575 等于 0.172。
GPU 在用 17% 的电产出 26 倍的速度。 它大部分时间没在算。
功耗是三条里最好用的,因为它跟你要验证的那个数字完全无关——作者没有动机去伪造它,跑分平台也只是被动记录。一个满载的加速器功耗应该贴着 TDP 走,明显低于 TDP 就说明它在等,不在算。
4. 第三个除法:roofline
生成每个 token 至少要把权重完整读一遍显存。所以:
batch-1 生成速度上限 = 显存带宽 ÷ 权重体积
这不是什么经验规律,就是一个除法。代进去:
27B 稠密模型(不是 MoE,别按激活参数算)
NVFP4 权重 ≈ 27.8e9 × 0.5 字节 = 13.9 GB
该卡带宽 = 512 bit ÷ 8 × 28 Gbps = 1792 GB/s
上限 = 1792 ÷ 13.9 = 129 tok/s
对账:
| 数字 | 相对上限 |
|---|---|
| 同机真实自回归解码 79 tok/s | 0.61× ✅ 合理 |
| 声称的 2103.6 | 16.3× |
| 同批更宽窗口的 4691 | 36.4× |
79 拿到理论上限的 61%,这是个正常达成率。2103.6 是上限的 16 倍。
有人会说投机解码本来就能突破这个上限——对,它一次前向出多个 token。但按官方 AL 5.46 反推,诚实的数字该落在 300 到 700。两千是另一个量级。
5. 这批数据自己把曲线画出来了
前三条都是外部反证。第四个证据不需要任何外部知识,只要把作者自己提交的那批记录按窗口宽度排开:
| 窗口 | AL | tok/s |
|---|---|---|
| 512 | 231–292 | 4691 |
| 256 | 174–240 | 4547 |
| 56 | 56.0(100%) | 2104 |
| 24 | 未报 | 1074 |
tok/s 跟着窗口宽度单调涨,AL 亦步亦趋。 它量的是窗口宽度。
最讽刺的一条在最下面:窗口 24 那条方法最规范——temperature 设 0、六次取最优、每次之间冷却 15 秒——它也最慢。规范度和数字大小成反相关,这个反相关本身就是信号。
顺带一提,2103.6 那条的首字延迟字段是空的,备注写着预填充走了缓存。连输入处理的成本都没进分母。
6. 我在同一套方法上翻过的车
上面五章看着挺利落。诚实起见,列一下我自己栽过的地方——这几条决定你该给前面的数字打几折。
这次没有复现,全是旁证。 我没那张卡,没跑那条配置。所有反证来自同一个公开数据库里的其他字段,加上我自己机器上的同类实测。旁证足以证伪,不足以给出真值:我能说「2103 不可能」,说不出「它真实应该是多少」。第 4 章那个 300–700 是按官方 AL 反推的,不是测出来的。
roofline 用的是理论带宽。 1792 GB/s 是规格书数字,真实可达带宽永远低一截,所以 129 这个上限本身偏乐观。
这一条我栽得最难看。之前算一个达成率,分母用了个来路不明的 1493,得出 67%;后来我「修正」成 1133,宣布达成率 109%、根本没有缺口。两个数都是错的——1133 是在限功耗且没预热的条件下单次测出来的。老实重测的真值是 1674,达成率 74%,缺口存在,只是还没归因。
拿历史数字当分母之前,先把那个数字重算一遍。一个听起来合理的机制配一个没复核的历史常数,足够推出一个方向完全相反的结论。
那个 79 tok/s 的对照组不严格同配置。 它是另一种量化格式跑的,权重字节数跟 NVFP4 那份不同。够格当量级参照,不够格当精确基线。
官方 AL 基线来自模型卡,不是我自己跑的。 第 2 章那张 4–6 的表我复核过跟公开报告一致,但没在自己机器上重跑那四个任务。
我还犯过一次方向相反的错。 同一天我捡到同型号硬件上的另一份公开数字(65–74 tok/s),拿它去质疑一份 212.7 的跑分,结论是「212 可疑」。
被一句话拽回来:那两份数字四个旋钮全不一样——投机解码方法、上下文长度、前缀缓存开关、KV 数据类型。而我自己同口径实测是 185–193,跟 212 只差 9%。
该被质疑的是我的比较。同型号硬件的两份公开数字互相打架时,默认结论是「不可比」,先列差异表再说话。
7. 判死不等于拿到知识
上面这套能把一个数字判死,但判死之后还得真去测。
同一份 212.7 的跑分,我把该问的都问完,得到「跟我们差 13%,候选原因三项」。然后逐项做单变量实测:
| 变量 | 实测贡献 |
|---|---|
| 量化格式 INT8 vs FP8 | −6.5%(反向) |
| 草稿模型量化 W4A16 vs bf16 | +4.2% |
| 引擎版本与功耗档 | 剩余 9.1% 未归因 |
那个 13% 看着像一个整体,拆完发现里面有一项是负的。不拆就会把功劳记给错的地方——这次差点记给量化格式,而量化格式实际是拖后腿的那个。
推断出的候选清单是实验计划,不是结论。
还有一条:把「机制是真的」和「倍数是刷的」分开讲。被拆穿的这个投机解码方法本身是扎实东西,开源协议明确,数学上无损,2.7 到 4.6 倍的加速有据可查。不要因为一条跑分刷分就否定方法,也不要因为方法是真的就接受那个数字。
8. 下次照着问
第一,原帖里有证据吗。 通常没有——正文写着数字,配图是一张显卡照片。最便宜的一步,也最容易跳过。
第二,真配置在哪个页面。 爆款帖子常常只是某个跑分站的引流,真配置在那边。这类站点往往有公开 JSON 接口,一次能拉全上百条含完整启动命令和自述备注的记录,比开浏览器快一个数量级。落盘再解析,别在管道里直接解析——备注字段常含控制字符,经过 shell 往返会被破坏。
第三,它报的是哪一格。 batch 1 单流的数字进不了多用户服务的结论。同一个草稿模型在高并发下可能从加速变成净亏。
第四,引擎是不是私有分支。 版本号带后缀就是硬信号,里面还有什么你不知道。
第五,算 AL 除以窗口宽度。 逼近 1.0 就停,不用往下看了。
第六,看功耗。 明显低于 TDP 的满载跑分,GPU 没在算。
第七,算 roofline。 带宽除以权重体积,跟声称值比个倍数。
第八,前七条全过了,去测。 差异清单是实验计划,实测的账经常跟清单长得不一样。
八条答完之前,那个数字只是个数字。
写这篇的动力一半来自「有人在网上晒了个假数字」,另一半来自第 6 章——那里面每一条都是我自己算错的账。