按“原理论文 → 推理算法 → 工程实现 → 你现在 VERL/vLLM-Ascend 里为什么这样写”的顺序整理,会告诉你每篇看什么、和你调的 MTP 接受率/权重同步有什么关系。
按“MTP 训练目标 → speculative decoding 验证机制 → vLLM/vLLM-Ascend 实现 → veRL rollout 权重同步”这条线学。这样会明白为什么你之前一直纠结的drafter 权重、target 权重、acceptance rate、enable_train/enable_rollout、num_speculative_tokens会互相影响。
我最推荐的学习顺序
| 顺序 | 资料 | 你重点看什么 | 和你现在问题的关系 |
|---|---|---|---|
| 1 | Better & Faster LLMs via Multi-token Prediction | MTP 最原始的思想:一个主干模型,同时预测未来多个 token | 解释“为什么训练侧要多一个 MTP loss” |
| 2 | DeepSeek-V3 Technical Report | DeepSeek 式 MTP module 结构、共享 embedding/head、MTP 可用于 speculative decoding | 最贴近 Qwen3.5/Qwen3.6 这类原生 MTP 模型 |
| 3 | Speculative Decoding / Speculative Sampling 论文 | proposer 先猜,target 再验证,为什么理论上不改变输出分布 | 解释“为什么接受率高才会加速,为什么 target 仍然要跑” |
| 4 | EAGLE / EAGLE-2 / Medusa | 不同 drafter 的设计差异 | 帮你区分 MTP、EAGLE、Medusa、draft model |
| 5 | vLLM MTP 文档 | method=mtp、num_speculative_tokens、native MTP 模型 | 解释 vLLM 里为什么不一定需要独立 draft model |
| 6 | vLLM-Ascend speculative decoding 文档 | proposer-verifier、rejection sampler、Ascend 上的限制 | 解释 vLLM-Ascend 里为什么有 proposer、sampler、ACLGraph、token 数限制 |
| 7 | veRL MTP 文档 | mtp.enable_train、enable_rollout、吞吐为什么可能不升反降 | 解释你训练中“接受率上去了但吞吐不一定升”的现象 |
第一篇:MTP 原始论文,先理解“为什么要预测多个 token”
最基础的是Better & Faster Large Language Models via Multi-token Prediction。它的核心非常简单:传统 LLM 每个位置只预测下一个 token;MTP 让同一个位置预测未来多个 token,例如同时预测t+1、t+2、t+3。论文描述的是:在每个位置,让模型通过共享主干和多个独立输出头预测接下来的 n 个 token,从而提高样本效率。
你读这篇时,只抓三个点:
第一,MTP 本质上先是训练目标,不是推理技巧。也就是说,模型训练时多学一个“看远一点”的辅助任务。
第二,MTP head / MTP module 不是主模型本体必须依赖的东西。主模型照样可以只做 next-token prediction。
第三,MTP 能用于推理加速,是因为它可以充当 drafter/proposer:先快速猜未来 token,然后主模型验证。
这能解释你之前很多困惑:为什么enable_train=True和enable_rollout=True是两个开关。前者是训练 MTP 辅助目标,后者是推理 rollout 阶段拿 MTP 做 speculative decoding。
第二篇:DeepSeek-V3,最像你现在要理解的“原生 MTP 模型”
DeepSeek-V3 Technical Report是我最建议你精读的,因为它讲的是工程上真实落地的 MTP。它明确说 MTP 既能提升模型效果,也能用于 speculative decoding 加速推理。
DeepSeek-V3 里的 MTP module 很关键:每个 MTP module 包含共享 embedding、共享 output head、一个 Transformer block,以及 projection matrix。 这正好解释你之前在 vLLM-Ascend/veRL 里看到的现象:embed/lm_head 往往不是单独给 drafter 重新造一套,而是和 target 共享或复用。
DeepSeek-V3 还明确说,推理时可以直接丢弃 MTP modules,主模型仍可独立正常工作;也可以把 MTP modules 拿来做 speculative decoding。 这句话非常重要,它解释了:
不开推理 MTP:target 正常生成 开推理 MTP:MTP module / drafter 先猜 token,target 验证 训练 MTP:多一个辅助 loss 不训练 MTP:主 next-token loss 仍然可以正常训练DeepSeek-V3 报告里还提到它的 MTP depthD=1,也就是除了精确 next token 外,每个 token 额外预测一个 future token。 这能解释为什么很多生产配置更倾向从MTP-1开始,而不是一上来num_speculative_tokens=3/4。
第三篇:Speculative Decoding,理解“为什么 target 还要验证”
读Fast Inference from Transformers via Speculative Decoding和Accelerating Large Language Model Decoding with Speculative Sampling。前者讲“用并行计算多个 token 来减少串行 decoding 次数,而且不改变输出”;后者讲 draft model 先生成短候选序列,再由 target model 并行打分和 rejection sampling,从而保持目标模型分布。
这里你要建立一个核心心智模型:
普通解码: target 生成 token1 target 生成 token2 target 生成 token3 target 生成 token4 speculative decoding: drafter 一次猜 token1 token2 token3 target 一次并行验证 token1 token2 token3 token4 接受几个,就少跑几次 target decode所以acceptance rate 是核心指标。
如果 drafter 猜得准,target 一次验证能接受多个 token,就加速。
如果 drafter 猜得不准,target 验证后大量拒绝,反而多了 drafter 开销、通信开销、graph shape 开销,吞吐可能下降。
这也解释你之前的现象:接受率从 0 修到非零,只说明权重链路没完全坏;但吞吐是否提升,还取决于硬件、batch、并发、verify 开销、graph capture、prefix cache、通信开销。
第四篇:EAGLE / Medusa,用来分清“不同 drafter 到底差在哪”
EAGLE的核心不是原生 MTP head,而是基于 feature-level autoregression 的 draft model。论文说它在 second-to-top-layer feature 层做预测,并引入 advanced-one-token 的序列来降低 feature 预测的不确定性。
EAGLE-2又进一步提出 context-aware dynamic draft tree,因为 draft token 的接受率不仅和位置有关,也和上下文有关;它利用 draft model 的置信度近似 acceptance rate,并报告 EAGLE-2 比 EAGLE-1 快 20%-40%。
Medusa则是另一种思路:给 LLM 加多个 decoding heads,并用 tree-based attention 同时构造和验证多个候选 continuation。
你可以这样区分:
MTP: 模型原生带未来 token 预测能力,常共享 embedding/head。 EAGLE: 训练一个 feature-level drafter,用 hidden state/feature 来猜。 Medusa: 在模型上加多个 decoding heads,tree attention 验证候选。 draft model: 外部小模型猜,大模型验证。这对你看 vLLM/vLLM-Ascend 很有用,因为配置里method=mtp/eagle/eagle3/draft_model/medusa背后不是一个东西。
第五篇:vLLM MTP 文档,理解method=mtp为什么不是普通 draft model
vLLM 官方文档明确说:MTP 是一种 speculative decoding 方法,要求 target model 原生支持 MTP;不同于 draft-model-based 方法,它不需要单独提供一个 draft model。
这句话对你现在最关键。它解释了为什么你之前看 vLLM 路径时会有这种感觉:
standalone vLLM: HF checkpoint ↓ vLLM native loader ↓ target + MTP proposer/drafter ↓ 接受率正常因为 vLLM native loader 知道这个模型的 MTP 权重该怎么加载、怎么命名、怎么切、怎么和 target 共用部分结构。
但 veRL hybrid rollout 里是另一条路:
HF checkpoint ↓ MindSpeed-Bridge / Megatron-Bridge ↓ 训练侧 local shard ↓ runtime update / direct-copy ↓ vLLM-Ascend drafter这时一旦权重名、QKV layout、TP shard、expert shard、MTP block 映射不一致,程序可能还能跑,但 acceptance rate 会掉。这就是你之前一直查qkv_proj.weight、MTP hidden、expert 权重同步的根本原因。
第六篇:vLLM-Ascend speculative decoding 文档,最贴近你现在调的 NPU 场景
vLLM-Ascend 文档说它的 speculative decoding 是proposer-verifier architecture:vllm_ascend/spec_decode/里的 proposer 生成 draft tokens,vllm_ascend/sample/里的 rejection sampler 用 target 输出验证 draft tokens。
它还列出mtp是 “Multi-Token Prediction with shared embedding head”。 这就能解释你之前为什么看到一些实现要共享 target 的 embedding/lm_head:这不是随便省事,而是 MTP 结构本身就是这么设计的。
vLLM-Ascend 还有两个你必须记住的限制:
第一,Ascend NPU 的 fused attention decode round 有 token 数上限,文档说(num_speculative_tokens + 1)必须满足限制。
第二,DeepSeek MTP 由于只暴露单层 MTP 权重,num_speculative_tokens > 1,尤其大于等于 3 时,准确性和性能不一定有保证。
这正好对应你之前遇到的:
num_speculative_tokens=1/3 表现差异大 2 有时不支持或不稳定 接受率上去但吞吐不升 graph/cudagraph/ACLGraph shape 很敏感第七篇:veRL MTP 文档,解释为什么 rollout MTP 不一定带来吞吐收益
veRL 的 MTP 文档非常值得你看,因为它直接讲 RL rollout 场景。文档里写到:启用 MTP 可以让 rollout acceptance rate 提升大约 14%,但在 H20 GPU 上整体吞吐没有提升,甚至略降;并且以 H20 + SGLang + mimo-7B 为例,启用 MTP speculative decoding 后 rollout throughput 下降约 50%,当前建议暂时不要在推理阶段启用 MTP 加速。
这句话非常适合解释你之前的实验结论:acceptance rate 高,不等于 end-to-end throughput 一定高。
原因是 RL rollout 不是单请求低并发聊天,它有这些额外成本:
1. actor 训练完要同步权重到 rollout engine 2. rollout engine 可能要 sleep/wake up 3. vLLM/SGLang 要处理大 batch、多 response、长序列 4. speculative decode 会扩展 verify token 数 5. NPU graph shape / communication / prefix cache 都会影响收益 6. drafter 本身也有计算和调度开销所以你看指标时不能只看:
acceptance_rate还要一起看:
perf/throughput timing_s/gen timing_s/update_weights response_length/max training/rollout_probs_diff_mean training/rollout_actor_probs_pearson_corrveRL Ascend 文档也列出了 MTP 配置项:mtp.enable、mtp.enable_train、mtp.enable_rollout、mtp.detach_encoder、mtp.mtp_loss_scaling_factor、mtp.method、mtp.num_speculative_tokens等。 你可以按下面方式理解:
mtp.enable: 总开关,表示这个模型/流程考虑 MTP。 mtp.enable_train: 训练时是否计算 MTP auxiliary loss。 mtp.enable_rollout: rollout 推理时是否启用 speculative decoding。 mtp.method: 推测方法,常见为 mtp / auto / eagle 等具体实现路径。 mtp.num_speculative_tokens: 每轮想让 drafter 额外猜几个 token。你现在最该形成的“一句话理解”
MTP 不是一个单独的加速按钮,而是“模型结构/训练目标 + 推理 speculative proposer + target verifier + 权重同步链路 + 硬件调度”共同成立才有收益。
更具体地说:
训练侧 MTP: 让模型多学会预测未来 token。 对应 veRL:enable_train、mtp_loss、labels、loss_scaling_factor。 推理侧 MTP: 让 MTP module 作为 drafter/proposer 先猜 token。 对应 vLLM/vLLM-Ascend:speculative_config method=mtp。 验证侧: target model 对 draft tokens 做并行验证。 对应 vLLM-Ascend:rejection sampler、block verify、entropy verify。 收益侧: 接受 token 数 > drafter/verify/通信/graph 额外成本,才会变快。 对应你的实验:acceptance rate、throughput、timing_s/gen、update_weights。我建议你实际阅读时这样安排
第一天只看三篇:
Better & Faster LLMs via MTP、DeepSeek-V3 的 2.2 MTP 部分、Speculative Decoding 论文。目标是能画出“drafter 猜,target 验”的流程图。
第二天看工程文档:
vLLM MTP 文档、vLLM-Ascend speculative decoding 文档、veRL MTP 文档。目标是把论文里的词对应到代码里的词:proposer、verifier、rejection_sampler、speculative_config、num_speculative_tokens、enable_rollout。
第三天再回到你的代码:
重点看 veRL 的 rollout 权重更新逻辑、vLLM-Ascend 的spec_decode/mtp、Qwen3.5 的 MTP weight loader。你之前踩的坑基本都在这里:standalone vLLM 是 native loader,veRL hybrid 是 runtime direct-copy local shard,二者权重路径不同,所以接受率可能完全不同。