vLLM 并行起草(PARD)投机解码:配置、在线离线用法与源码实现详解

📅 发布时间:2026/9/7 14:23:41
vLLM 并行起草(PARD)投机解码:配置、在线离线用法与源码实现详解
vLLM 并行起草PARD投机解码配置、在线离线用法与源码实现详解【免费下载链接】vllmA high-throughput and memory-efficient inference and serving engine for LLMs项目地址: https://gitcode.com/GitHub_Trending/vl/vllm本文以 vLLM 的parallel_drafting并行起草投机解码功能为主线围绕 PARDParallel Draft Models方案完整讲解其离线与在线服务的配置方法、关键参数的源码语义、调度器槽位分配规则以及并行起草在 vLLM 内部的工作机制。读完本文你将能够正确启用 PARD 投机解码并理解其相比自回归式 draft model 的架构差异与适用前提。1. PARD 是什么从串行起草到并行起草vLLM 的投机解码speculative decoding核心思路是用一个轻量的 draft草稿模型先生成若干候选 token再由目标模型target model一次前向并行验证从而在保持采样分布一致性的前提下减少解码步数。在methoddraft_model的传统形态下draft 模型是自回归式的它逐个 token 地串行生成 K 个投机 tokendraft 阶段本身需要 K 次小模型前向。PARDParallel Draft Models则把起草过程改造为并行式draft 模型以掩码/噪声 token 填充 K 个草稿位置在一次前向中同时给出全部 K 个投机 token 的预测。vLLM 通过speculative_config中的parallel_drafting: true开启该模式并要求 draft 模型在训练时就支持并行起草。这一模式在 vLLM 配置层有明确定义见 vllm/config/speculative.py# Alternative drafting strategies parallel_drafting: bool False Enable parallel drafting, where all speculative tokens are generated in parallel rather than sequentially. This can improve performance but requires the speculative model be trained to support parallel drafting. Only compatible with EAGLE and draft model methods.从这段字段文档可以看到三条硬约束所有投机 token 并行生成而非串行生成投机模型必须经过专门训练以支持并行起草PARD 权重即属此类仅与 EAGLE 和 draft model 两种 method 兼容——本文聚焦draft_model parallel_drafting的 PARD 组合。2. 调度器槽位PARD 为什么需要 K 个额外位置并行起草不只是快一点的优化它对 vLLM 调度器的每请求槽位预算slot budget提出了不同要求。vLLM 源码在max_num_new_slots_for_drafting的文档字符串中给出了一张算法对照表见 vllm/config/speculative.pyAlgorithmMethodParallelAdditional slotsEAGLE3eagle3No0P-EAGLEeagle3YesK - 1DFlashdflashYesKDSparkdsparkYesK - 1MTPmtpNo0N-gramngramNo0Draft modeldraft_modelNo1PARDdraft_modelYesK其中 K 为num_speculative_tokens。实现逻辑可以归纳为普通自回归 draft modeldraft 输入保留一个未切分的 token只需 1 个额外槽位PARDparallel_drafting draft_model由于 PARD 不滑动shift已有输入全部 K 个查询位置都需要额外槽位因此返回num_draft_tokensK 个其余并行方法如 P-EAGLE复用已有查询位置只需 K-1 个新槽位。理解这张表的意义在于配置num_speculative_tokens: 12时调度器会为每个请求额外预留 12 个 draft 槽位max_num_batched_tokens、KV cache 等预算都会据此计算。若你对投机解码的接受率与吞吐权衡感兴趣可继续阅读 docs/features/speculative_decoding/README.md 与 docs/features/speculative_decoding/acceptance_metrics.md。3. 离线模式Python API 配置示例以下示例来自 vLLM 官方文档 docs/features/speculative_decoding/parallel_draft_model.md配置 vLLM 使用 PARDamd/PARD-Qwen3-0.6B作为草稿模型对Qwen/Qwen3-8B做离线批量生成from vllm import LLM, SamplingParams prompts [The future of AI is] sampling_params SamplingParams(temperature0.8, top_p0.95) llm LLM( modelQwen/Qwen3-8B, tensor_parallel_size1, speculative_config{ model: amd/PARD-Qwen3-0.6B, num_speculative_tokens: 12, method: draft_model, parallel_drafting: True, }, ) outputs llm.generate(prompts, sampling_params) for output in outputs: prompt output.prompt generated_text output.outputs[0].text print(fPrompt: {prompt!r}, Generated text: {generated_text!r})各参数要点model: amd/PARD-Qwen3-0.6B草稿模型权重。该 PARD 模型与 Qwen3 系列同词表满足后文第 6 节的词表一致性校验num_speculative_tokens: 12每次投机验证最多提出 12 个候选 token按第 2 节规则这将为每个请求增加 12 个 draft 槽位method: draft_model以独立草稿模型作为提议器proposerparallel_drafting: True开启并行起草使 draft 模型单次前向产出全部 12 个投机 token。4. 在线模式vllm serve 启动命令同一套配置也可以通过--speculative-configJSON 字符串传给在线服务官方文档给出的命令如下vllm serve Qwen/Qwen3-4B \ --host 0.0.0.0 \ --port 8000 \ --seed 42 \ -tp 1 \ --max-model-len 2048 \ --gpu-memory-utilization 0.8 \ --speculative-config {model: amd/PARD-Qwen3-0.6B, num_speculative_tokens: 12, method: draft_model, parallel_drafting: true}参数解读--speculative-configJSON 形式的投机解码配置键名与离线LLM(speculative_config{...})完全一致注意 JSON 中布尔值为小写true-tp 1/--max-model-len 2048/--gpu-memory-utilization 0.8单卡部署、2048 上下文、80% 显存预算是 4B 目标模型加 0.6B PARD 草稿模型的小型化演示配置实际容量请依据目标模型与 PARD 权重的显存需求调整--seed 42固定随机种子便于复现实验。启动后即为标准 OpenAI 兼容 API 服务客户端无需任何额外改动即可享受投机解码加速——验证与拒绝逻辑在引擎内部完成输出分布与不使用投机解码保持一致。5. 源码透视PARD 的掩码 token 与单次前向机制parallel_drafting开启后vLLM 的提议器proposer会执行若干关键初始化。5.1 从草稿模型 config.json 解析掩码 token并行起草要求 draft 模型在推理时把 K 个草稿位置填充为特定掩码 token。vLLM 在 _init_parallel_drafting_params 中按优先级依次探测草稿模型 HuggingFace configdflash_config.mask_token_idDFlash 专用顶层mask_token_iddspark_noise_token_idDSparkpard_tokenPARD 专用ptd_token_idPTD。若均缺失则抛出ValueError提示必须在 config.json 中指定上述字段之一。PARD 权重携带pard_token字段因此能被自动识别——这也是必须使用训练好的 PARD 权重的落地检查点。5.2 额外槽位与单次前向在同一提议器中vllm/v1/spec_decode/llm_base_proposer.pyextra_slots_per_request被设为num_speculative_tokens并行起草时与非并行时的 1 形成对比与第 2 节的调度器槽位表相互印证。此外在 llm_base_proposer.py 附近可以看到only_one_forward_pass is_graph_capturing or self.parallel_drafting即开启parallel_drafting时draft 阶段确实只需一次前向传播即可产出全部 K 个候选 token这正是 PARD 相对自回归 draft modelK 次串行前向的核心性能收益来源。6. 适用前提与限制条件从源码可以确认以下使用前提配置 PARD 前建议逐项核对词表一致性verify_equal_vocab_size_if_draft_model 会在初始化时校验目标模型与草稿模型的词表大小必须相同否则抛出ValueError不同 tokenizer 会导致投机解码时的越界错误。PARD 权重与对应目标模型同系列天然满足该条件M-RoPE 不支持llm_base_proposer.py 中明确对投机解码 draft model / 并行起草 M-RoPE组合抛出NotImplementedError即多模态 M-RoPE 目标模型暂不能搭配该模式方法兼容性parallel_drafting仅与 EAGLE 和 draft model 方法兼容字段文档见第 1 节权重要求草稿模型必须为训练支持并行起草的 PARD 类权重其 config.json 需包含pard_token等掩码 token 字段否则初始化即失败。7. 预训练 PARD 权重与延伸阅读官方文档列出 AMD 维护的预训练 PARD 权重集合Hugging Face 上的amd/pard集合其中包含本文示例使用的amd/PARD-Qwen3-0.6B适配 Qwen3 系列目标模型。相关仓库内文档与测试便于进一步深入docs/features/speculative_decoding/README.md投机解码总览与各方法选型docs/features/speculative_decoding/draft_model.md自回归 draft model 用法可与本文 PARD 对照tests/v1/e2e/spec_decode/draft_model/test_draft_model.pydraft model / PARD 的端到端测试vllm/v1/spec_decode/llm_base_proposer.py统一承载 EAGLE、draft model 与并行起草的提议器实现。小结PARD 通过speculative_config中的parallel_drafting: true在draft_model方法上启用将 K 次串行的起草前向压缩为 1 次并行前向代价是调度器需为每请求额外分配 K 个 draft 槽位且草稿权重必须是训练支持并行起草的 PARD 模型。离线LLM(...)与在线vllm serve --speculative-config两种用法共享同一套 JSON 配置键读者可直接复用本文第 3、4 节的完整示例并结合第 2、5 节的源码证据槽位表、掩码 token 解析、单次前向标志来核对部署行为是否符合预期。【免费下载链接】vllmA high-throughput and memory-efficient inference and serving engine for LLMs项目地址: https://gitcode.com/GitHub_Trending/vl/vllm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考