强草稿模型也得"轻装上阵":给投机解码的草稿端做 KV 压缩,32K 前缀下加速 3.33 倍
你有没有遇到过这种场景:给模型喂了一份几万 token 的长文档,让它做摘要或者接着对话,然后你就盯着屏幕等——一个字一个字往外蹦。上下文越长,蹦得越慢。这不是你的错觉,是 KV cache 在拖后腿:每解码一个 token,都要把前面所有历史的 KV 读一遍,前缀越长,访存越重。
投机解码(Speculative Decoding, SD)本来是治这个病的标准药方:让小草稿模型先猜几个 token,大模型一次性并行验证,猜对了就白赚,输出分布还完全不变。但这帖药方在长上下文场景下有个很拧巴的矛盾——草稿模型自己也要读 KV cache。你用弱草稿(比如 EAGLE 那种单层结构),它跑得快但猜不准,接受长度哗哗往下掉;你换强草稿(比如一个独立的 3B 模型),猜是准了,可它每步也要扫几万 token 的 KV,草稿延迟蹭蹭往上涨。横竖都不痛快。
arXiv 上的这篇 2608.30252(EMNLP 2026 Findings)给了一个我觉得相当对路的解法:既然问题出在草稿侧的 KV 访存上,那就只压缩草稿侧的 KV——目标模型那边一个字节都不动,无损保证原样保留。
核心摘要:这篇论文提出 MASW(Memory-Augmented Sliding-Window)Drafting,给强独立草稿模型配一套"三段式压缩记忆"——attention sink + 精确的局部滑窗 + 周期性物化的 memory slot,让一个 3B/8B 的草稿模型在 32K 前缀下只需保留原来 23%-28% 的 KV 显存。可训练部分只有一套镜像 K/V 投影矩阵(adaptor),主干完全冻结,2B token 就能训出来。效果上,Llama 3.1-8B 目标模型最高加速 2.08 倍,70B 目标最高 3.33 倍。我的判断:这不是底层突破,但工程整合做得很干净,思路对、开销小、可直接落地,是长文本推理加速方向里值得读的一篇。
论文信息 - 标题:Strong Drafts Need Compact Memories: Long-Context Speculative Decoding with Compressed KV Cache - 作者:Tong Yuan, Chengxi Liao, Zeyi Wen - 发表:2026 年 8 月 31 日,EMNLP 2026 Findings - 链接:https://arxiv.org/abs/2608.30252
🎯 为什么长上下文投机解码一直不顺
先把矛盾摆清楚。投机解码的加速比由两个因素决定:每轮接受的草稿 token 数(接受长度 \(L_{acc}\))和草稿步延迟 \(t_d\) 相对验证步延迟 \(t_t\) 的比值。理想情况是 \(L_{acc}\) 大、\(t_d/t_t\) 小。
问题在于,这两个目标在长前缀下直接打架:
- 弱草稿(EAGLE 这类):\(t_d\) 小,但模型容量不够,抓不住长程依赖。论文的动机实验显示,EAGLE 在 Llama 3.1-8B 上的接受长度随上下文变长单调下降——前缀越长猜得越差。
- 强草稿(独立的 3B/8B 模型):容量够了,接受长度稳住了,但它每步要读完整 KV。论文测了一个很能说明问题的数:单 token 解码延迟随前缀长度近线性增长,而且斜率由 KV 访问主导,不是由模型规模主导。也就是说,拖着强草稿跑长上下文,瓶颈在访存带宽,不在算力。
图 1 把这个三难处境画得很直观:

图 1:左——浅草稿(1 层)提议 8 个 token 只接受 2 个,容量不足导致接受长度低;中——强草稿接受 6 个,但要全量读写 KV,draft 延迟高;右——本文方案,强草稿配压缩记忆(Compressed Memory),高接受长度和低草稿延迟兼得。
说实话,"压缩草稿侧 KV"这个想法本身不算新鲜——SWA(滑窗注意力)、SnapKV 这些现成的 KV 削减方案谁都会想到直接套用。但这篇论文的实验恰恰说明了为什么简单套用不 work,这才是它真正值钱的地方。我们放到实验部分细说。
🏗️ MASW:给草稿模型装一套"三段式记忆"
一句话讲清楚核心思路:草稿模型不再保留全部历史 KV,而是维护一个由 sink、局部窗口、记忆槽三部分拼起来的工作记忆;目标模型的 full KV cache 完全不碰,验证规则照旧,所以无损性白拿。
形式化地,时刻 \(t\) 的草稿侧记忆是:
三个组件各司其职:
| 组件 | 存什么 | 作用 |
|---|---|---|
| \(\mathcal{M}_{\mathrm{sink}}\) | 前 \(S\) 个 token 的精确 KV | 稳住注意力分布(StreamingLLM 的老经验) |
| \(\mathcal{M}_{\mathrm{local},t}\) | 最近 \(W\) 个 token 的精确原始 KV | 保证近处上下文一字不差 |
| \(\mathcal{M}_{\mathrm{slot},t}\) | 每 \(r\) 个 token 物化一个 memory slot | 承载被驱逐的远距离历史 |
这个设计我最喜欢的点在于:工作集大小随 \(S\)、\(W\) 和 \(\lfloor t/r \rfloor\) 增长,而不是随完整前缀 \(t\) 增长。32K 前缀下,slot 数量也就是几千量级,KV 访存量直接砍掉七成多。
记忆槽是怎么"长"出来的
这是全文最核心的机制。每过 \(r\) 个 token(论文试了 \(r=4\) 和 \(r=8\) 两档),到了压缩边界 \(\tau_m = mr\),草稿模型就往序列里插一个 memory-slot token \(g_m\),让它走一遍正常的 transformer 前向:
注意这个式子的输入:当前局部窗口 + sink + 之前所有 slot。这意味着每个 slot 不只是当前窗口的摘要,它还"读"了之前的压缩记忆——slots 构成一条增量压缩链,信息可以逐段接力传递,而不是各管一段、互不相干。
图 2 展示了物化过程的滚动节奏:

图 2:黄色块是已物化的 memory slot(\(g_4, g_8, \dots\)),蓝色块是局部窗口内的 raw token。每推进 \(r\) 个 token,窗口右缘的 raw token 被压缩进新的 slot(通过专用的 \(W_{K/V,g}^{(l)}\) 投影),滑出窗口的 raw KV 随即被驱逐。上下两行展示了连续两轮"物化—驱逐"的滚动过程。
可训练参数:只有一套镜像投影
这里有个挺精巧的设计。如果让 slot token 和 raw token 共用同一套 K/V 投影,那"聚合信息"和"写入 cache"两件事就耦合在一起了,学起来别扭。作者的解法是镜像投影(Mirrored Projection):在每一层 \(l\),给 memory-slot 状态单独配一套投影矩阵:
raw token 继续用原来的 \(W_{K,r}^{(l)}\)、\(W_{V,r}^{(l)}\),而且冻结不动。镜像矩阵从主干对应权重拷贝初始化,这就是 adaptor 的全部可训练参数。整个草稿主干一个参数都不动——训练成本被压到了最低。
位置编码的处理也值得一提:每个 slot 和它紧随的 raw token 共享 RoPE position ID,产生重复位置但不移动后续 token 的位置。这个细节保证了压缩操作不扰乱原始位置结构,也是后面"8K 训练能外推到 32K"的关键之一。
跟投机解码怎么拼起来
流程上几乎无侵入:
- Prefill:目标模型正常 prefill 建 full KV;草稿模型对同一前缀做一次带结构化掩码的前向,slot KV 在这个过程中直接生成并缓存,不需要单独的压缩 pass。而且因为草稿 prefill 比目标 prefill 快,两者并行时 \(T_{\mathrm{prefill}}=\max(P_d,P_t)=P_t\)——压缩记忆的额外开销被完全掩盖,TTFT 一毫秒都不增加。
- Decoding:草稿基于压缩记忆提议 token,目标模型照常并行验证。
- Rollback:验证拒绝时,草稿丢掉被拒块的 local KV 和其间新建的 slot,靠 16 token 的回滚窗口恢复局部上下文。
还有一点对工程落地很友好:压缩记忆是连续且 append-only 的——新 slot 物化后直接追加,从不原地更新旧条目。这意味着它跟现有 KV cache 服务系统(分页、连续批处理那套)天然兼容。
训练:2B token、8K 上下文就够
训练目标就是最朴素的 next-token 预测损失,只是条件换成了压缩记忆:
slot 位置不计入损失——它们是压缩载体,不是预测目标。训练配方是两阶段:RedPajama 上采 2B token 预训练,再用 LongAlpaca + BookSum 做 SFT,所有序列截断到 8K。
配置汇总(原文超参数):
| 项目 | 取值 |
|---|---|
| 局部窗口 \(W\) / sink 数 \(S\) | 128 / 128 |
| 回滚窗口 | 16 token |
| 名义压缩比 | 4×、8×(分开训 adaptor) |
| 草稿主干 | Llama 3.2-3B / Llama 3.1-8B(冻结) |
| 目标模型 | Llama 3.1-8B / 70B Instruct |
| 每轮提议 | 5 个 draft token,greedy 解码 |
| 硬件 | 单节点 8×H100 |
📊 实验:压缩七成显存,接受长度几乎不掉
评测用 LongBench-v1 的三个摘要任务(GovReport、QMSum、MultiNews),按 8K/16K/24K/32K 四档前缀长度分组。指标有三个:Tok./Iter(每轮投机迭代平均输出 token 数)、tok/s、相对自回归的 Speedup。
主实验:越长越能拉开差距
8B 目标模型下的关键数据(Speedup 列):
| 方法 | 8K | 16K | 24K | 32K |
|---|---|---|---|---|
| EAGLE | 1.08× | 0.59× | 1.05× | 1.04× |
| EAGLE-3 | 0.92× | 0.96× | 1.01× | 1.06× |
| SWA | 0.92× | 0.37× | 0.49× | 0.52× |
| SnapKV | 0.90× | 1.03× | 1.46× | 1.31× |
| SD L3B(不压缩) | 1.18× | 0.98× | 0.91× | 0.98× |
| Ours 8× L8B | 1.30× | 1.71× | 2.06× | 1.94× |
| Ours 4× L3B | 1.24× | 1.46× | 1.85× | 2.08× |
70B 目标模型下(验证器更贵,压缩草稿的性价比更高):
| 方法 | 8K | 16K | 24K | 32K |
|---|---|---|---|---|
| EAGLE | 0.64× | 0.69× | 0.67× | 0.77× |
| SWA | 0.59× | 0.47× | 0.61× | 0.63× |
| SnapKV | 0.97× | 1.05× | 1.26× | 1.38× |
| SD L8B(不压缩) | 2.28× | 2.11× | 1.89× | 2.08× |
| Ours 4× L8B | 2.89× | 3.33× | 2.91× | 2.76× |
| Ours 8× L8B | 3.03× | 2.77× | 2.70× | 2.82× |
几个让我印象深刻的观察:
EAGLE 在长上下文基本失效。 70B@8K 只有 0.64×——越加速越慢。单层草稿抓不住长程依赖,这个短板在短上下文时不明显,一到 16K 以上就藏不住了。
SWA 是最脆弱的基线。 直接砍窗口,8B@16K 掉到 0.37×,比不用投机解码还慢一多半。你想想看,摘要任务的信息本来就分布在整个文档里,把远端 KV 一扔,草稿直接变瞎。这反过来证明了 MASW 里 memory slot 的价值——远端信息不能丢,只能压缩。
不压缩的强草稿(SD L3B/L8B)在长前缀下加速比持续衰减,8B 目标下从 8K 的 1.18× 掉到 32K 的 0.98×——KV 流量把草稿延迟吃掉了。这正是论文要解决的痛点,数据上完全成立。
MASW 的曲线形状最健康:8B 目标下随上下文变长加速比一路上行(1.30→2.08),因为它把"前缀越长草稿越慢"这个矛盾直接解掉了。
压缩代价到底多小
Table 3 是我觉得全文最有说服力的表(70B 目标、32K 前缀):
| 草稿 | 额外峰值显存 | Tok./Iter | 延迟 |
|---|---|---|---|
| 3B full-KV | 17.21 GB | 4.05 | 41.34 ms |
| Ours 3B 8× | 3.98 GB | 3.43 | 12.39 ms |
| 8B full-KV | 18.02 GB | 4.82 | 54.92 ms |
| Ours 8B 8× | 4.55 GB | 3.77 | 14.02 ms |
显存砍掉约 77%,延迟砍到原来的三分之一,而接受长度只从 4.82 掉到 3.77。这个交换比非常划算——压缩损失的是每轮约 1 个 token 的接受量,换来的是草稿步延迟 3-4 倍的下降。净效果就是主实验里那 2-3 倍的端到端加速。
消融里有几个反直觉的点
8K 训练反而比 32K 训练好。 Table 5 显示,同样 2B token 预算,8K 序列训出的 adaptor 在所有评测长度(包括 32K)上 Tok./Iter 都更高(32K 评测:3.77 vs 3.58)。作者的解释是 MASW 学到的是"相对的物化操作"而非绑定绝对位置,短序列在固定预算下还提供了更多样本。这个结论对工程实践很友好——不需要为长推理准备长训练数据。
初始化不是小事。 随机初始化的镜像投影训了 300 步,损失还到不了 copy-weight 初始化第 0 步的水平。直接拷贝主干权重这条近路必须走。
两阶段训练缺一不可。 PT+SFT 在 16K 下拿到 5.34 Tok./Iter(L8B 8×),SFT-only 只有 3.01——监督数据本身教不会 adaptor 形成鲁棒的压缩表示,通用语料预训练打底是必须的。
🤔 我的判断
这篇论文最值钱的地方,是把一个大家都隐约感觉到、但没人认真解决的矛盾讲透了:投机解码的加速瓶颈正在从猜得准不准转向草稿读 KV 快不快,而解法不是牺牲草稿容量(EAGLE 路线),也不是粗暴丢上下文(SWA 路线),而是给强草稿配一套可学习的压缩记忆。
批判性地说几句。第一,评测只覆盖了摘要类任务(LongBench 的三个数据集都是摘要),这类任务对远端信息的需求是"松散聚合"型的,memory slot 的压缩表示天然适配;换成需要逐字检索远端的任务(比如"第 237 页提到的那个人名是什么"),压缩记忆还能不能保住接受长度,论文没测,我持保留态度。第二,32K 的上限在今天看不算特别长,128K+ 场景下 slot 数量会涨到 1.6 万量级,压缩比是否还能守住是个开放问题。第三,只训镜像投影这个设计够轻量,但作者自己也承认这可能限制单个 slot 的信息容量。
不过这些更多是"还能走多远"的问题,不影响它现在就有用。如果你在做长文本推理服务,这套方案有几个直接可抄的点:草稿侧压缩、目标侧不动的切分方式保证了无损性零风险;append-only 的记忆结构对 serving 系统友好;adaptor 只需 2B token 训练,成本完全在可接受范围。甚至不做投机解码的团队,"强草稿 + 压缩记忆"这个组合本身也值得想想——说到底,KV 压缩和投机解码本来就是解决同一个访存瓶颈的两条腿,这篇论文算是把它们真正缝到了一起。
参考文献 - Yuan, T., Liao, C., & Wen, Z. (2026). Strong Drafts Need Compact Memories: Long-Context Speculative Decoding with Compressed KV Cache. arXiv:2608.30252. https://arxiv.org/abs/2608.30252
觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我