vLLM MTP 源码调用链
这张地图只记录一轮 speculative decoding 如何跨过 scheduler、V2 GPU runner、rejection sampler 和 EngineCore。
vLLM commit 3de4b2bf3c477513afff4a58680eb00d557bb53a。链接使用 commit 固定 URL,避免 main 漂移。
一轮数据流
上一轮 draft
request.spec_token_ids
↓
scheduler.scheduled_spec_decode_tokens
↓
V2 InputBatch: num_draft_tokens_per_req / logits_indices
↓
target model.compute_logits
↓
RejectionSampler
↓
num_sampled / num_rejected
↓
speculator.propose
↓
DraftTokensHandler
↓
EngineCore.post_step
↓
request.spec_token_ids(下一轮)
职责表
| 源码对象 | 它回答的问题 | 固定链接 |
|---|---|---|
SpeculativeConfig | MTP 是否复用 target checkpoint 的 draft 结构? | speculative.py |
use_v2_model_runner | 本次运行选择 V2 还是回退 V1? | vllm.py |
init_speculator / MTPSpeculator | method=mtp 时创建哪个 proposer? | factory · MTP |
| scheduler | 上一轮 draft 怎样成为本轮输入? | schedule |
V2 InputBatch | 哪些位置需要 target logits? | model_runner.py |
sample / RejectionSampler | 如何把 target logits 和 draft logits 变成接受/拒绝结果? | sample · sampler |
sample_tokens / propose | 验证后如何生成下一轮 draft? | sample_tokens · propose |
EngineCore.post_step / update_draft_token_ids | 下一轮从哪里取回 draft? | post_step · update |
读源码时的三个边界
- 时间边界:
spec_token_ids是上一轮产物,本轮只消费它。 - 职责边界:MTP speculator 负责 proposal;target + rejection sampler 负责 verification 和 correction。
- 实现边界:V2 是主读路径,但 worker 可能按配置回退到 V1,不要把 V2 文件名当成全局事实。
下一步追踪
第五课停在 RejectionSampler 的入口。继续深入时,沿着它进入 rejection_sampler_utils.py,再看 Triton kernel 如何找到首拒、residual 或 bonus。这是下一课的范围。