推理提速:量化与投机解码
同样一个模型,有人的笔记本能跑,有人的服务器却排长队。秘密在于:大模型生成文字慢,慢的不是「算」,而是「搬」。看懂了这一点,两个最有效的提速技巧就水到渠成。
先搞清楚:生成慢,慢在哪?
提速之前得先找到病根。回想第 32 课:FlashAttention 的关键洞察是「搬数据比算数据贵」。生成文字时,这个矛盾达到了极致——
模型每生成一个 token,都要把全部权重从显存读进计算单元跑一遍。可这一趟里每个权重只被用了很少几次(一个用户、一个 token),读进来就用一下,然后又得读下一个。
显存带宽(H100 级)≈ 3.35 TB/s → 读一遍 ≈ 140 ÷ 3350 ≈ 42 ms → 上限约 24 token/秒
计算量:2 × 70B = 140 GFLOP;算力约 1000 TFLOP/s → 只需 ≈ 0.14 ms
搬运 ÷ 计算 ≈ 300 倍 —— 这叫「内存带宽受限(memory-bound)」
第一条路:量化——用更少的位数存权重
模型训练时通常用 16 位浮点数(FP16 / BF16)存每个权重。可推理时,这么高的精度往往是浪费。量化就是把权重换成更少的位数,比如 8 位、4 位整数,需要计算时再乘回一个缩放因子还原。做法出奇朴素:
缩放因子 s = 最大绝对值 ÷ 7 = 0.90 ÷ 7 ≈ 0.129
量化:q = round(w ÷ s) → [1, −4, 2, 7] 还原:q × s → [0.129, −0.514, 0.257, 0.900]
误差:[0.009, 0.016, 0.053, 0] ——每个权重只偏一点点,但存储从 16 位降到了 4 位
这笔账很划算:70B 模型从 140 GB 缩到 35 GB,要搬的东西少了 4 倍,带宽受限的生成速度也能提高近 4 倍,而且一张消费级显卡也许就装得下了。拖动滑块,亲眼看看「格点变粗」是怎么回事:
量化的坑:离群值,以及怎么绕开它
你可能已经在上面的实验里踩到了坑:点一下「加入离群值」——一个特别大的权重,就能让整张表的缩放因子变大,把其余正常的小权重全部「挤」成 0。
这不是杞人忧天:研究发现大模型里确实存在少数「离群」的权重和激活通道,它们数值巨大,却对结果举足轻重。实用的量化方案都要想办法对付它,最常见的招数是:
位数压得越低,误差越大:8 位通常几乎无损,4 位多数任务还可以接受,2~3 位往往明显退化。而且长链条的推理更「怕」误差累积——第 36 课那种写几千字思考的模型,一路上小误差可能被放大。还有一个好消息:上一课的 KV 缓存也可以量化,让「显存账单」两头一起瘦。
第二条路:投机解码——小模型打草稿,大模型来验收
再看思路二。既然权重反正要整个读一遍,那一次前向传播里,让大模型同时处理很多个 token,几乎不比只处理 1 个花更多时间(算力本来就闲着)。可生成是自回归的——下一个 token 要等上一个出来才知道,怎么并行?
投机解码(Speculative Decoding)的妙招是「先猜、后验」:找一个又小又快的草稿模型,让它先连猜 k 个 token;然后把这 k 个 token 一起交给大模型,一次前向同时检查每个位置——草稿和大模型自己的选择一致就收下,第一个不一致的地方,换成大模型自己的答案,后面的草稿作废。
每轮期望产出 E = (1 − αk+1) / (1 − α) = (1 − 0.8⁵) / 0.2 ≈ 3.36 个 token
每轮成本 = 1 次大模型 + 4 次小模型(每次约 5%)= 1 + 4 × 0.05 = 1.2
加速比 = 3.36 ÷ 1.2 ≈ 2.8 倍
有人担心「让小模型参与」会拉低质量。其实不会:投机解码用一种「拒绝采样」的验收规则,保证最终输出的概率分布与只用大模型完全一致——小模型只是帮忙「猜」,最终拍板的永远是大模型。所以它是一种无损的加速。
还有几招:工程师的工具箱
量化和投机解码是这一课的主角,但推理引擎里还有不少同样重要的招数,思路都是同一个:别让昂贵的显存和算力空转。
总结
大模型生成慢,是因为搬权重比算数更贵(内存带宽受限)。量化让权重更瘦、搬得更少;投机解码让大模型一次验收多个草稿、搬一次干多份活。此外还有 MTP、连续批处理、PagedAttention、前缀缓存等工程手段,目标都是「别让显存和算力空转」。
💡 用大白话梳理:这一课的核心直觉
- 内存墙:70B 模型搬一遍权重约 42 ms,计算只要 0.14 ms,慢在「搬」而不在「算」。
- 量化:w ≈ q × s,位数减半、体积减半、理想速度翻倍;4 位是常见的甜点区。
- 离群值:一个大权重会撑大缩放因子、挤没小权重;用分组量化、PTQ(GPTQ/AWQ)、QAT、微缩放浮点来对付。
- 投机解码:小模型猜 k 个,大模型一次并行验收;E = (1 − α^(k+1))/(1 − α),加速比 = E/(1 + c·k),无损。
- 工具箱:MTP、连续批处理、PagedAttention、前缀缓存——都在想办法让每次搬运多干点活。
学习小测验
动动脑筋:核心直觉小测验(选出你的答案后点击「提交」,即可查看生动通俗的详细解析)
39 多模态大模型:看图、听声、画画
把视觉和声音变成模型可以处理的表示,连接不同模态。