资讯详情

资讯详情

从 DSpark 聊聊大模型 Decoding 提速的技术演化

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)DeepMindFast Inference from Transformers via Speculative Decoding既然大模型计算贵、速度慢那能不能找个“小弟”给它打下手这就是最经典的Speculative Decoding思想引入一个参数量极小通常为主模型的 1/10 甚至更小的草稿模型Draft Model和一个目标大模型Target Model。1.1运行机制草稿生成小模型一路狂飙以自回归方式快速串行生成 γ 个 Token比如 4 个。并行验证把这 4 个草稿 Token 连同上文一次性打包成 Batch塞给目标大模型做一次前向传播。大模型只用1次推理就能并行计算出这 4 个位置的真实概率分布 p(x)。拒绝采样Reject Sampling假设草稿模型的输出概率为 q(x)目标模型为 p(x)。如果 p(x)≥q(x)说明大模型觉得小模型“猜得太保守了”直接无条件接受如果 p(x)q(x)小模型“飘了”大模型以概率 p(x)q(x) 接受它。一旦某个 Token 被拒绝后续草稿全部作废。大模型基于最后接受的token推理1个新token再进一下一轮。数学上的美感这种拒绝采样机制从概率论上证明了投机解码输出的概率分布与纯粹用大模型一步步生成的分布完全一致真正做到了无损加速。1.2 瓶颈在哪单次推测的平均延迟可以表示为Tavgγ⋅TdraftTverifyE[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 ModelsMedusa 的做法非常野蛮主干冻结顶层接挂。主要被llama系列、Mistral系列模型采纳。它在 LLM 最后一层 Hidden State ht后并排挂了K个独立的轻量级预测头Medusa Heads通常是带残差的 1~2 层 MLPHead 1拿着 ht强行预测 t2 位置的 TokenHead 2拿着 ht强行预测 t3 位置的 Token...以此类推。这属于典型的“无中生有”。在 t 时刻连 t1 是什么都不知道就凭 ht 强行预测 t3由于打破了因果链Causal Dependency位置越靠后头的采纳率越呈指数级衰减。它就像让一个没看过下一页小说的人直接猜下下页的剧情翻车率极高。并且轻量级预测头是在冻结基座的情况下先让基座模型向外推理K步再用独立的预测头去并行预测K步并尝试和基座预测效果对齐用交叉熵作为损失函数本质上预测头是在蒸馏基座模型的串行推理能力。2.2 MTPDeepSeek 的预训练串行级联优雅的极致DeepSeek-V3 Technical ReportDeepSeek-V3 抛弃了 Medusa 的“各猜各的”提出了Multi-Token Prediction (MTP)。它的核心思想是打破“并行”幻觉用串行级联Cascading维持因果严谨性且原生融入预训练以 MTP Module 1预测 t2为例它的输入不是空穴来风而是将上一步预测出的 Token xt1 经过共享 Embedding得到的语义向量主干模型在 t 时刻输出的隐藏状态 ht进行拼接送入一个轻量级 Transformer 模块MTP Layer计算后再复用主干的LM Head做出预测为什么 MTP 效果吊打传统多头保留因果链Causal Lineage前一个头的预测 Token 通过过词向量送给下一个头确保了自回归的数学严谨性。原生预训练Native Pre-trainingMTP 标头不是后训“补丁”而是在预训练阶段就以 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/EAGLEEAGLE 与 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。DFlashBlock Diffusion 的全图通透DFlash: Block Diffusion for Flash Speculative DecodingDFlash 的理念极其硬核放弃因果掩码Causal Mask引入 Block 级别的双向注意力Bidirectional Attention。传统自回归 Mask: DFlash 块内 Block Mask: 1 0 0 0 1 1 1 1 ── 块内所有 Token 1 1 0 0 1 1 1 1 互相可见 1 1 1 0 1 1 1 1 (双向 Attention) 1 1 1 1 1 1 1 1主干Hidden全面融入DFlash并不只在草稿模型第一层注入主模型特征而是在草稿 Transformer 的每一层都嵌入主干模型的顶层 Hidden State让主干语义彻底贯穿草稿网络。块内双向注意力在打草稿的 8 个或 16 个 Token 区域内Token 之间使用双向 Attention。这让草稿网络在预测第 k 个 Token 时能同时兼顾前后文语义大幅拉升了并行预测的逻辑连贯性。性能表现Block Size 设置为 8 时DFlash 依然能保持约 70% 的高接受率推理速度比 EAGLE-3/MTP 快了 2 倍以上所以如果简单来说最重要的就是相比Medusa的多头独立输出DFlash通过双向注意力使得输出的多个token之间有更好的一致性。DSpark马尔可夫偏置 置信度调度的集大成者DSpark: Confidence-Scheduled Speculative Decoding with Semi-Autoregressive Generation最近爆火的DSpark站在了前人的肩膀上把工程和算法的协同推到了极致。DSpark 意识到并行推测虽然快但 Block 越大缺少邻近 Token 约束的因果性后方预测就越容易发散。怎么解决DSpark 引入了两大杀招杀招一马尔可夫串行头引入局部因果约束DSpark 预测第 k 个未来位置的最终 Logits 分布时采用了如下公式每个token的概率由并行预测的置信度结合T-1 Token 马尔科夫转移概率共同决定。PkSoftmax(UkBk(xk−1))Uk并行骨干 Logits通过类似 DFlash 的并行结构一次性齐射算出来的 Logits代表全局语义上下文。Bk(xk−1)马尔可夫偏置这是一个极其轻量的转移矩阵查表操作。xk−1 是前一个位置刚选出的离散 Token矩阵 Bk瞬间查找出它对当前位置 k 的转移偏置。当然这个V*V(词表大小的巨无霸矩阵也可以通过低秩压缩只存储低秩变量。生动比喻并行骨干算出来第二字可能是“皮”或“肉”各 50%。如果前一个字确定是“苹”查表矩阵 Bk(“苹”) 立即给“果”加 100 分给“皮”加 10 分。零延时的查表操作秒级纠正了并行生成的无序性杀招二置信度剪枝动态草稿长度虽然并行推理很快也能同时推理很大的block size。但是更长的草稿并不一定带来更快的推理Through Put。因为接受率较低会导致后面在校验阶段被大量丢弃在用户高并发请求的场景下会平白浪费显卡资源。DSpark 在顶层挂挂了一个置信度头预测当前 Token 的条件存活概率ck∈(0,1)和前缀联合概率也就是基于概率链式法则整个草稿前缀全被接受的概率ar,j∏i≤jcr,i同时在使用以上概率时DSpark还引入以下两个机制顺序温度缩放 (STS)原始神经网络预测的置信度容易过度自信。DSpark 采用从左到右的温度系数逐位校准修正置信度分布。使得预期接受token的期望值和真实接受token数之间的误差越小越好。杀招三硬件感知的调度器前面的剪枝是用户单条请求下的理想情况但是现实往往有多个用户请求并发因此还需要考虑GPU处理速度和带宽问题因为最终的目标其实是最大化吞吐速度。所以期望验证通过率更高也不一定就能获得最快的推理速度。所以DSPark还有一层异步的调度器调度器会把多个草稿生成的前缀按照置信度进行倒排然后从队列头根据历史估算的GPU吞吐曲SPS线进行预估先只验证第1个词置信度最高。算算当前每秒能产出多少词吞吐量 验证速度 × 期望接受数。记录为“当前最优值”。试探把第2个词也加进来批处理变大了。因为批处理大了验证速度可能变慢一点点但多验证了一个词期望产出的总词数变多了。算一下新的总吞吐量。如果新的吞吐量 “当前最优值”说明加这个词是赚的保留它。继续试探第3个、第4个……如果试探到第5个词时发现把第5个词加进来后因为验证速度变慢太多导致总吞吐量反而下降了调度器立刻停止不再往后看了即使后面第6个词置信度很高也不看了。并且在调度器实际和GPU配合时调取器是根据上一个batch的预估结果用于下一个batch的判断因此无需让GPU等待CPU判断到底要验证几个词实现吞吐最大化。未来的 LLM 推理架构会走向何方随着 DeepSeek MTP 和 DSpark 的成功预训练与推理调优的界限正在被彻底抹平。将“多步预测能力”作为模型本身的基础设施进行原生训练已然成为了大模型演进的必然趋势
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →