Reference · 对应 vLLM commit 3de4b2bf

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(下一轮)

职责表

源码对象它回答的问题固定链接
SpeculativeConfigMTP 是否复用 target checkpoint 的 draft 结构?speculative.py
use_v2_model_runner本次运行选择 V2 还是回退 V1?vllm.py
init_speculator / MTPSpeculatormethod=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

读源码时的三个边界

  1. 时间边界:spec_token_ids 是上一轮产物,本轮只消费它。
  2. 职责边界:MTP speculator 负责 proposal;target + rejection sampler 负责 verification 和 correction。
  3. 实现边界:V2 是主读路径,但 worker 可能按配置回退到 V1,不要把 V2 文件名当成全局事实。

下一步追踪

第五课停在 RejectionSampler 的入口。继续深入时,沿着它进入 rejection_sampler_utils.py,再看 Triton kernel 如何找到首拒、residual 或 bonus。这是下一课的范围。