
你在部署大模型推理时是否遇到过这样的尴尬GPU利用率看起来不高显存带宽却吃满一个token一个token往外蹦用户那边连“正在输入”都要等半天。我做LLM推理调优这两年遇到最多的性能问题还真不是算力不够而是被自回归生成和内存带宽卡住。业界把这口锅叫“内存墙”。而在2025年无损推测解码Lossless Speculative Decoding已经成了打破这堵墙的主流方案之一它能在不改变模型输出分布的前提下把推理速度提上去1.5到3倍而且落地框架已经非常成熟。这篇文章我想从原理到工程把这条链路完整拆一遍帮正在做LLM推理优化、RAG应用加速、或者只是对“为什么能快”好奇的朋友把这块硬骨头啃下来。1. 推理慢的病根自回归与内存墙1.1 串行生成是慢的根源现在主流的大模型基本都是Decoder-only架构生成方式清一色是自回归每一步只能根据已经生成的前文预测下一个token然后把这个token拼到序列末尾再预测下下个。听起来理所当然但代价很残酷——生成N个token就必须串行做N次前向推理。第i1个token永远得等第i个生成完才能开始这玩意儿没办法靠堆GPU并行解决。我举个具体的例子。假如你的聊天机器人收到一个30个token的请求需要生成200个token的回答那推理引擎就得跑200次完整的Transformer前向。每次前向都要过全部几十层网络这个等待时间累积起来就是用户感知到的“一个字一个字蹦出来”。这也是为什么很多人在调RAG时会有个错觉检索都优化到毫秒级了LLM生成还是慢得不行。因为真正的时间大头根本不在检索而在自回归解码本身。1.2 内存墙算力再强也得等带宽再说一个反直觉的事实单次前向生成一个token计算量其实小得可怜真正的时间花在搬运模型权重上。我们来粗算一笔账。一个7B参数的FP16模型权重文件大概14GB。现代数据中心级GPU比如A100或H100的显存带宽大约2-3TB/s。意味着光把模型权重从头到尾读一遍就需要7毫秒上下。而单token的前向计算量大约2×参数量×1也就是14GFLOPs对动辄几百TFLOPs算力的GPU来说计算本身只需要零点几毫秒。也就是说一次解码的时间构成里计算只占零头搬运权重才是大头。这就是典型的“内存墙”算力增长远远快于显存带宽增长导致模型推理被卡在数据的搬运上而不是计算上。我经常用一个比喻解释这件事你的厨房做一道菜只要1分钟但食材仓库在楼下每次做菜都要下楼把所有食材搬一遍来回要10分钟。这时候你请十个厨师也没用瓶颈在搬运。推理优化的核心思路只有两个方向要么减少搬运量量化要么减少搬运次数推测解码、批处理等。2. 推测解码的基本原理小模型探路大模型把关2.1 两阶段流程拆解推测解码的思路其实很朴素既然大模型验证K个token可以并行那我们就让一个小而快的草稿模型先“猜”出一段候选文本再拿给大模型一次性验证。具体流程分五步草稿模型自回归生成K个候选token这K个token构成一个待验证的“草稿序列”。把这K个token拼接在真实上下文后面组成长度为K的新输入。目标大模型对这个序列做一次前向推理。因为K个token都是已知文本不存在逐步依赖所以这一次前向可以同时得到K个位置各自的下一个token概率分布。从第一个候选token开始逐一检查是否满足接受条件。满足就保留继续看下一个一旦遇到不满足的token就用目标模型在该位置的分布重新采样一个token替换上去并把这个token之后的所有候选全部丢弃。把本轮最终保留的token作为新的上下文起点回到第1步继续。这里最核心的突破在第3步。传统解码之所以串行是因为“第i1个token的预测依赖第i个token被采样出来”。但推理引擎内部做前向时只要所有输入token都已经确定那K个位置就是完全独立的可以像处理batch一样并行算完。2.2 为什么能提速多出来的成本由谁付推测解码当然不是凭空变快它多了一个草稿模型生成K个token的成本以及大模型一次验证一整段候选的算力开销。它之所以仍然划算是因为草稿模型通常比目标模型小一个数量级生成K个token的总时间往往只有大模型生成一个token的时间的几分之一而大模型验证清一段长度为K的序列虽然FLOPs比单token多了K倍但受益于权重搬运只做一次整体延时并不会同比上涨。这里引入一个关键指标——接受率α表示草稿模型生成的token被大模型接受的比例。假设每轮验证K个候选平均接受A个再算上被拒绝后重新采样的那1个token这轮实际推进了A1个token。整个过程的代价是“草稿模型生成K个token 大模型一次前向”而传统解码推进A1个token需要A1次大模型前向。只要草稿模型足够快、接受率足够高这笔账就非常划算。举个理想估算假设K8平均每轮接受5个有效推进6个token。原来要6次大模型前向现在变成“草稿模型8次小前向 大模型1次前向”。如果草稿模型生成速度是大模型的10倍那8次小前向约等于0.8次大模型前向总代价约1.8次大模型前向却换来了6个token理论加速比在3倍左右。实际部署中还要考虑kernel调度、显存竞争等损耗达不到这么完美但整体思路没错。我用生活里的场景来类比小模型是前台接待快速按固定模板把申请表格填好大模型是部门经理一次性审核整摞表格。只要表格填得靠谱经理一次签字能放行好几份。草稿模型的质量直接决定了这份表格有多“靠谱”。3. 无损的关键拒绝采样如何保持分布一致3.1 为什么很多加速方法会改输出聊无损之前得先搞清楚一个更容易被忽略的问题为什么其他加速方法很难做到无损简单粗暴的加速方案太多了比如直接用小模型替代大模型、做early exit、或者对Top-K采样做近似剪枝。这些方法都会改变模型在每个位置的输出概率分布。有些改变很细微但放到几百上千token的长文本里可能被逐步放大导致内容质量下降、逻辑漂移甚至行为模式改变。生产环境里这是不能忍的尤其代码补全、结构化生成、内容审核这类对一致性要求极高的场景。“无损”在这个上下文里不是指“两次生成结果逐字相同”而是指一个更强的数学性质加速后模型在任意上下文下采样得到某个token的概率和原始模型完全一致。也就是说输出分布没有引入任何偏差。3.2 接受/拒绝机制的数学细节要理解无损是怎么保证的需要看拒绝采样的核心逻辑。假设目标模型在当前上下文对某个token x的概率是q(x)草稿模型给出的概率是p(x)。候选token x是草稿模型采样出来的那大模型凭什么接受它标准做法是以概率 min(1, q(x)/p(x)) 接受这个token。注意这个概率不是固定值而是跟两个模型在这个token上的概率比值相关。如果草稿模型认为x很靠谱、目标模型也认为x很靠谱那q/p接近1接受概率就高。如果目标模型其实不太认可这个token接受概率就会很低。一旦拒绝不能简单从目标分布q里重新采样而是要从一个修正后的分布中采样这个分布大体上是把q(x)减去p(x)得到正值部分再归一化。整个“接受-拒绝-修正”的过程在统计学里是一套标准的拒绝采样框架它能保证最终每个位置的输出边际分布严格等于目标分布。这才是“无损”的真正根基。当目标模型使用贪心解码temperature0每次取最高概率token时这个机制会退化得更简单接受条件等价于“草稿token恰好等于目标模型在该位置的argmax”。所以你会看到很多框架里assisted decoding的实现就是一个token一个token地比对ID原理上就是拒绝采样在贪心模式下的特例。3.3 “无损”的两层含义第一层是分布一致无论随机采样还是贪心解码最终输出序列的概率分布与原始模型完全一致。第二层是理论可证明这不是“看起来效果差不多”的经验结论而是有数学保证的。只要实现正确不管草稿模型多差、接受率多低输出质量都不会退化。最坏情况不过是全部候选被拒退回原始采样路径。不过这里要提醒一句市面上有些文章把“近似无损”或者“experimentally lossless”也简称为无损比如某些基于Top-K截断的投机变体它们通常只保证“在测试集上输出质量接近”并不保证分布严格一致。选型时一定要看对方的实验设置别被名词带偏。4. 2025年主流无损推测解码方案有哪些演进4.1 经典草稿模型路线的成熟化最早的推测解码论文在2023年由Leviathan和Chen两个团队几乎同时提出核心就是“小模型拒绝采样”。到了2025年这条路线真正走向了工程成熟。这期间最大的变化是草稿模型从“随便找个小的”变成了“认真调教”。很多团队直接用同一模型家族的小尺寸版本做草稿比如70B模型配7B、13B配1B这样学到的语言分布天然贴近接受率明显高于跨家族配对。另一些团队开始对草稿模型做蒸馏让它专门模仿目标模型的输出分布而不是仅仅在通用语料上训练。我在实测中看到过经过蒸馏的草稿模型接受率能提升10到20个百分点整体加速比可能从1.5倍直接拉到2.3倍。这背后的逻辑很直白推测解码的收益由“接受率”和“草稿速度”共同决定。接受率越高大模型一次验证推进的token越多草稿速度越快整个探路过程就越便宜。蒸馏恰好能够同时优化这两个方向因为它让草稿模型更懂目标模型的“脾气”在不大幅增加模型体量的前提下提高接受率。4.2 多头预测与免草稿模型路线额外挂一个草稿模型不是没有代价的显存要多装一套权重部署复杂度也会上升。于是出现了另一条路线——免草稿模型。Medusa系列是其中的代表。思路是在目标模型的最后一层加几个并行的解码头每个头专门负责预测“往后第i位的token”一次前向就能生成多个候选位置。因为候选来自大模型自己的扩展层和模型本体的分布天然一致所以接受率往往不错同时省掉了草稿模型占用的显存。EAGLE方法更进一步把特征层的融合和树结构注意力结合起来让候选生成更贴近目标模型的实际行为。还有一类是Lookahead Decoding思路跟前面完全不同。它不靠模型生成草稿而是在解码过程中维护一个N-gram缓存遇到重复性较强的文本时直接从历史片段里拼出候选。这种方案在代码补全、SQL生成这类重复模式明显的场景效果特别好。4.3 工程化组合量化、批处理和动态K2025年的另一个明显趋势是推测解码不再被孤立使用而是和推理栈的其他优化手段叠加使用。我见到过几类典型组合第一类是和量化配合。目标模型用4-bit或8-bit量化减少单位token的搬运量草稿模型保持16-bit精度避免量化损失导致接受率下降。这样目标模型侧的内存墙压力变小草稿侧的质量也保住了。第二类是和连续批处理配合。当GPU同时处理多个请求时验证阶段可以跨请求合并执行把大模型的前向尽量填满减少GPU空转。批处理叠推测解码需要特别关注batch中每个请求的K值和接受率差异调度起来比单纯批处理复杂不少。第三类是动态K值。固定K8跑全场景通常不是最优解代码补全这类重复性高的任务草稿模型容易猜中K可以给大开放域摘要这类分布发散的任务K给大了后半段几乎全是白猜。现在不少框架支持根据最近几轮接受率动态调整K我的实际体验是打开动态K后整体时延还能再降10%到20%。在框架支持层面vLLM、TensorRT-LLM、SGLang、HuggingFace的assisted decoding都已经内置了推测解码能力。到了2025年做推理优化的人基本不需要自己写草稿前向和拒绝采样的逻辑了更多精力花在选草稿模型、调K值、设计缓存策略上这对想上车的朋友友好很多。5. 落地调优草稿模型、显存和K值的真实权衡5.1 草稿模型选择和“配速”问题草稿模型不是越小越好。我在一个7B主模型上先后试过1B和3B草稿1B的接受率大约0.653B接受率能到0.82看起来很美好但端到端加速比反而下降了。原因是3B草稿模型生成K个token的时间变长已经接近大模型直接解码一次的时间。探路成本上去了省下的验证成本就被吃掉了一大块。所以选草稿模型不要只看接受率要看“每token草稿成本”和“接受率”的比值。我一般会在任务数据上做粗筛同时记录两个指标接受率α衡量草稿和目标的默契度。草稿模型单token生成速度 / 目标模型单token生成速度这个比值最好大于5倍低于3倍基本没有上推测解码的必要。从经验上看7B到13B主模型配0.5B到1B草稿模型K取4到8通常能拿到2倍左右的综合加速。70B量级的大模型配7B左右的草稿模型因为目标模型本身解码成本高加速空间往往更可观。5.2 显存开销需要提前算清楚推测解码不是零成本。草稿模型路线除了要加载草稿模型权重还要给草稿模型准备一份KV Cache以及候选序列的临时缓冲。如果部署在24GB的消费级显卡上本来跑14B模型就很紧张再塞一个1B草稿模型可能勉强但KV Cache空间被压缩并发数就会下降整体吞吐反而可能变差。简单估算一下一个7B FP16草稿模型占14GB显存加上KV Cache和缓冲可能额外要16GB以上。A100 80GB部署70B主模型时放个7B草稿模型没什么压力但小显存场景就得谨慎。Medusa这类免草稿方案的优势在这里体现得很明显不需要额外模型权重只有几个解码头参数显存占用可以忽略。如果你的显存预算很紧又不想牺牲并发优先考虑Medusa或EAGLE路线会更稳妥。5.3 不同场景下的实测参考我整理了几组自己部署时记录的数据。要特别说明这些数字受实现细节、批次大小、任务类型影响很大只能当参考区间看不能当通用基准。主模型草稿方案K接受率实测加速比7B1B同系列草稿80.72.0x13B1B同系列草稿60.651.8x70B7B同系列草稿100.752.4x70BMedusa多头60.61.7x还有一个容易被忽视的现象batch size越大推测解码的相对收益往往越小。原因在于多请求并行时GPU利用率已经很高显存带宽被充分摊薄草稿模型省下的那一步前向被稀释掉了。所以如果你是离线批量处理场景优先考虑加大并发或者做连续批处理如果是在线流式对话单请求延迟敏感推测解码的价值会非常突出。5.4 怎么判断你的服务适不适合上推测解码我的判断标准很简单按顺序看四个问题输出长度长不长如果每个请求只生成十几个token推测解码的验证收益根本攒不起来不如直接用普通解码。延迟敏感还是吞吐敏感流式对话、Agent多轮调用这类场景首token延迟和单请求总延迟很关键适合上离线批量任务更适合优化吞吐。草稿模型有得选吗能不能找到同系列小模型或者显存够不够放草稿模型直接决定走哪条路线。GPU已经满载了吗如果GPU利用率很高推测解码的加速空间会被压缩这时先检查调度和批处理更实际。最后再分享一个操作细节。调K值时不要只看平均接受率我一般会统计“平均接受长度”公式很简单平均接受长度 总推进token数 - 验证轮数/ 验证轮数。如果这个值明显接近K说明K还有调大的空间如果它小于K/2说明K设大了草稿模型后半段几乎全在瞎猜纯属浪费算力。另外一个容易踩的坑是别用固定K跑所有请求。代码补全里重复代码多草稿模型很容易猜中K可以给大开放域问答里token分布很发散接受率低K调小反而稳定。现在很多推理框架已经支持根据上下文熵或历史接受率动态调整K建议上线前把这个开关打开。推测解码在2025年早就不是论文里的花活了它是推理优化工具箱里一把非常趁手的工具。但它也不是万灵药用对场景、选对草稿模型、调好K值才能真正吃到无损加速的红利。如果你正在为LLM推理延迟头疼不妨先从接受率这个指标开始测起跑通一轮再逐步调优这条路大概率不会白走。