解密Prompt系列71. 从DSpark聊聊大模子 Decoding 提速的技术演化

[复制链接]
发表于 2026-7-31 06:10:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
LLM 生成 Token 是串行的:产生第 \(N\) 个 Token,必须把前 \(N-1\) 个 Token 齐备塞回模子里,重新算一遍矩阵乘法。由于当代 GPU 拥有海量的并行计算单元(ALU),一次只算一个 Token 根本填不满 GPU 的吞吐能力(Memory-bound 严重)。这就像开着一辆 80 吨的大卡车,每次只运送一粒花生米。
那能不能让模子一次“吐出”多个 Token?
核心思绪很简单:先打草稿(Drafting),再由大模子并行批量验证(Verification)。但题目随之而来:如何生成得更快?同时生成的更好(采纳率不降落)?最重要的是——如何保证输出质量完全不缩水(Lossless)?
从 DeepMind 提出的“双模子协作”,到 DeepSeek 招牌的 MTP,再到最新的 DFlash 和 DSpark,今天我们就来扒一扒这套“提速大法”的技术演化史。

01. 元老派:多模子投机解码 (Speculative Decoding)

DeepMind:Fast Inference from Transformers via Speculative Decoding
既然大模子计算贵、速度慢,那能不能找个“小弟”给它打下手?
这就是最经典的 Speculative Decoding 思想:引入一个参数目极小(通常为主模子的 \(1/10\) 甚至更小)的草稿模子(Draft Model) 和一个目标大模子(Target Model)。

1.1运行机制


  • 草稿生成:小模子一路狂飙,以自回归方式快速串行生成 \(\gamma\) 个 Token(比如 4 个)。
  • 并行验证:把这 4 个草稿 Token 连同上文一次性打包成 Batch,塞给目标大模子做一次前向传播。大模子只用1次推理就能并行计算出这 4 个位置的真实概率分布 \(p(x)\)。
  • 拒绝采样(Reject Sampling):
    假设草稿模子的输出概率为 \(q(x)\),目标模子为 \(p(x)\)。


  • 如果 \(p(x) \ge q(x)\):说明大模子觉得小模子“猜得太保守了”,直接无条件接受;
  • 如果 \(p(x) < q(x)\):小模子“飘了”,大模子以概率 \(\frac{p(x)}{q(x)}\) 接受它。一旦某个 Token 被拒绝,后续草稿全部作废。大模子基于末了接受的token推理1个新token,再进一下一轮。
数学上的美感:这种拒绝采样机制从概率论上证明了:投机解码输出的概率分布,与纯粹用大模子一步步生成的分布完全同等! 真正做到了无损加速。
1.2 瓶颈在哪?

单次推测的平均延迟可以表示为:

\[T_{\text{avg}} = \frac{\gamma \cdot T_{\text{draft}} + T_{\text{verify}}}{\mathbb{E}[\text{Accepted Tokens}]}\]
要提速,必须满意 “草稿做得快” 且 “接受率高”。但这每每是个悖论:

  • 找个与主模子同源的小尺寸模子(如用 Gemma-1B 帮 Gemma-27B 打草稿),在 vLLM 中虽然能拿到 2~3 倍加速;
  • 但异构/小模子对语义偏好、复杂逻辑的理解和小动作并不同等,导致接受率在复杂任务上断崖式下跌。
2. 自给自足派:Medusa, MTP & EAGLE

既然外挂一个小模子有“心灵不相通”的跨模子代沟,那干脆让大模子长出“多个头”,自己给自己打草稿!
2.1 Medusa:美杜莎的多头并行(暴力外推,但易翻车)

Medusa: Simple and Effective Predictive Decoding for Large Language Models

Medusa 的做法非常野蛮:主干冻结,顶层接挂。重要被llama系列、Mistral系列模子采纳。
它在 LLM 末了一层 Hidden State( \(h_t\))后,并排挂了K个独立的轻量级猜测头(Medusa Heads,通常是带残差的 1~2 层 MLP):

  • Head 1:拿着 \(h_t\),强行猜测 \(t+2\) 位置的 Token;
  • Head 2:拿着 \(h_t\),强行猜测 \(t+3\) 位置的 Token;
  • ...以此类推。
这属于典范的“无中生有”。在 \(t\) 时刻,连 \(t+1\) 是什么都不知道,就凭 \(h_t\) 强行猜测 \(t+3\)?由于冲破了因果链(Causal Dependency),位置越靠后,头的采纳率越呈指数级衰减。它就像让一个没看过下一页小说的人直接猜下下页的剧情,翻车率极高。
并且轻量级猜测头是在冻结基座的情况下,先让基座模子向外推理K步,再用独立的猜测头去并行猜测K步,并尝试和基座猜测结果对齐,用交叉熵作为损失函数,本质上猜测头是在蒸馏基座模子的串行推理能力。
2.2 MTP:DeepSeek 的预训练串行级联(优雅的极致)

DeepSeek-V3 Technical Report

DeepSeek-V3 抛弃了 Medusa 的“各猜各的”,提出了 Multi-Token Prediction (MTP)。它的核心思想是:冲破“并行”幻觉,用串行级联(Cascading)维持因果严谨性,且原生融入预训练!
以 MTP Module 1(猜测 \(t+2\))为例,它的输入不是空穴来风,而是将:

  • 上一步猜测出的 Token \(x_{t+1}\) 经过 共享 Embedding 得到的语义向量;
  • 主干模子在 \(t\) 时刻输出的隐藏状态 \(h_t\);
进行拼接,送入一个轻量级 Transformer 模块(MTP Layer)计算后,再复用主干的 LM Head 做出猜测!
为什么 MTP 结果吊打传统多头?


  • 保留因果链(Causal Lineage):前一个头的猜测 Token 通过过词向量送给下一个头,确保了自回归的数学严谨性。
  • 原生预训练(Native Pre-training):MTP 标头不是后训“补丁”,而是在预训练阶段就以 0.3 的 Loss 权重和主干模子联合训练!主干模子在训练时就学会了“在 Hidden State 里多存一点未来信息”。并且在消融实验中由于外推多步猜测,所以进一步提升了模子整体结果。
  • 极极致的参数复用:MTP 复用了巨无霸的 Embedding 矩阵和 LM Head,引入的额外参数极少。
  • 更深度的外推思考:每一个猜测头都拥有自己的一层轻量 Transformer Layer,对比Medusa的MLP浅层映射,每个输出头能有更多的思考空间。
DeepSeek V3用的是1个MTP,也就是同时猜测两个token,第二token的接受率在85%+,所以带来1.8倍左右的平均推理tps。
深度思考??

为什么MTP使用猜测Token过词向量,而不是直接传1个token的 Hidden State?
我想可能有2个原因:

  • 对齐训练与推理:训练时前一步是 Ground Truth Token,推理时是猜测 Token。传 Token Embedding 能保证训练/推理的输入表征空间分布高度同等。而主干和head的输出隐藏层其实是没有对齐的。
  • 预训练信息注入:deepseek是在预训练就引入了MTP头,所以主干模子天然学到了我要“多保留一些信息用于后几步的猜测”,因此最终deepseek主干模子的hidden state中本身就会保留更丰富的外推token信息。
2.3 EAGLE:后训练领域的串行打草稿王者



  • https://github.com/SafeAILab/EAGLE
EAGLE 与 MTP 的思绪不谋而合,但它的目标是“拯救那些没有在预训练阶段参加 MTP 的开源模子”。
先说共同点,EAGLE和MTP的相同在于

  • 都通过使用前一个推理token过向量作为特征输入,保留了串行推理的因果性
  • 架构都包含和主模子共享LM head和Embedding层
那差异在哪里呢?
个人感觉差异重要来自训练差异,由于不像MTP在预训练阶段融入,EAGLE还是冻结主干微调,因此

  • 草稿头结构更轻:EAGLE-1仅使用一层FC+解码层,没有transformer
  • 草稿特征更复杂:和MTP的选择相反,EAGLE没有使用主干隐藏层,而是使用草稿上一个token的隐藏层。同样部分由于Eagle是冻结主干模子,所以主干隐藏层输出的信息有限。
如果模子在预训练阶段就引入多头猜测的话,整体上限会更高,这里就不多先容EAGLE了。
03. 革命派:基于扩散与块并行的极致暴击 (DFlash & DSpark)

串行多头(如 MTP)虽然采纳率高,但由于“头与头之间依然是串行计算”,限制了生成草稿的速度上限。能不能既要“并行齐射”的速度,又能拿到“串行因果”的高接受率?
答案交给了 Block Diffusion 与 Semi-Autoregressive。
DFlash:Block Diffusion 的全图通透



  • DFlash: Block Diffusion for Flash Speculative Decoding

DFlash 的理念极其硬核:放弃因果掩码(Causal Mask),引入 Block 级别的双向注意力(Bidirectional Attention)。
[code]传统自回归 Mask:              DFlash 块内 Block Mask:1 0 0 0                      1 1 1 1   “当前最优值”,说明加这个词是赚的,保留它。继续摸索第3个、第4个……
如果摸索到第5个词时,发现把第5个词加进来后,由于验证速度变慢太多,导致总吞吐量反而降落了,调度器立刻停止,不再往后看了(即使后面第6个词置信度很高也不看了)。
</ul>并且在调度器实际和GPU配合时,调取器是根据上一个batch的预估结果,用于下一个batch的判定,因此无需让GPU等待CPU判定到底要验证几个词,实现吞吐最大化。
未来的 LLM 推理架构会走向何方?
随着 DeepSeek MTP 和 DSpark 的成功,预训练与推理调优的界限正在被彻底抹平。将“多步猜测能力”作为模子本身的基础办法进行原生训练,已然成为了大模子演进的一定趋势!
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表