执行摘要
- 一句话:注册 Qwen3.6 dSpark 接受率与 GSM8K 回归测试
- 推荐动作:值得精读,特别是数据驱动参数化测试的组织方式与回归阈值设定思路;同时需关注两点:一是 Qwen3.6 参考指标基于单次运行且容差收紧到 5%,建议补充多次测量或放宽容差以避免 CI flaky;二是确认参数化收敛过程中 Gemma4 与 Qwen3 旧用例的参数漂移(FlashInfer sampler 禁用、enforce_eager、attention_backend)是否有意为之,必要时按新配置重新校准参考值。
功能与动机
PR body 明确目标:为 RedHatAI/Qwen3.6-35B-A3B-speculator.dspark 与 RedHatAI/Qwen3.6-35B-A3B-NVFP4 添加 dSpark 接受率与 GSM8K 回归覆盖;并指出 'The existing per-model tests are registered as data-backed parameterized cases, so future target/draft architectures can supply their model, evaluation, and reference-metric settings without duplicating the test flow',即通过数据驱动参数化降低后续架构的测试接入成本。同时 'The GSM8K helper also accepts chat-template kwargs so the Qwen3.6 case can disable thinking',支撑 Qwen3.6 关闭思考模式的评估需求。作者还声明已搜索 open PR 确认无重复,并指出 #47390 仅涉及 Qwen3.5 家族运行时支持、与本 PR 互补。
实现拆解
- 数据驱动重构(
tests/v1/e2e/spec_decode/acceptance_rates/dspark/test_dspark.py):新增 frozen dataclass DSparkCorrectnessConfig,将目标模型、草稿模型、参考指标、采样与 LLM 配置集中为字段;删除原独立函数 test_gemma4_dspark_correctness_and_acceptance_rate、fixture dspark_config 及对应的 Qwen3 独立测试,替换为统一的参数化测试。
- 参数化注册:定义
QWEN3_DSPARK_DEEPSPEC、GEMMA4_DSPARK_DEEPSPEC、QWEN3_6_DSPARK_SPECULATORS 三个配置实例,经 @pytest.mark.parametrize 挂载到 test_dspark_correctness_and_acceptance_rate;断言统一为 实际值 >= 参考值 * REGRESSION_TOLERANCE,容差从旧的 0.9 收紧到 0.95。
- GSM8K 评估辅助扩展(
tests/evals/gsm8k/gsm8k_eval.py):evaluate_gsm8k_offline 新增 chat_template_kwargs 参数并透传给 llm.chat(),使 Qwen3.6 用例可传入 {"enable_thinking": False} 关闭思考模式。
- 新增 Qwen3.6 用例:配置
num_speculative_tokens=8、language_model_only=True、use_chat_completions=True、200 题 GSM8K 子集;实测 accuracy 0.885、acceptance rate 0.41、acceptance length 4.25,单用例约 163 秒。
- 验证配套:pre-commit 指定文件钩子与 pytest
--collect-only 通过,另有参数化后的三用例串行验证。无部署、schema 或配置变更。
关键文件:
tests/v1/e2e/spec_decode/acceptance_rates/dspark/test_dspark.py(模块 dSpark 验证;类别 test;类型 test-coverage;符号 DSparkCorrectnessConfig, test_dspark_correctness_and_acceptance_rate, QWEN3_6_DSPARK_SPECULATORS, QWEN3_DSPARK_DEEPSPEC): 本 PR 核心文件:将独立 DSpark 测试重构为 DSparkCorrectnessConfig 数据驱动参数化注册,新增 Qwen3.6 speculator 用例,并引入更严的 0.95 回归容差。
tests/evals/gsm8k/gsm8k_eval.py(模块 GSM8K 评估;类别 test;类型 test-coverage;符号 evaluate_gsm8k_offline): 为 evaluate_gsm8k_offline 新增 chat_template_kwargs 透传,支撑 Qwen3.6 关闭思考模式的评估需求,是 Qwen3.6 用例可运行的前置条件。
关键符号:test_dspark_correctness_and_acceptance_rate, evaluate_gsm8k_offline
评论区精华
无实质技术讨论。claude[bot] 自动审查因 fork PR 被禁用;维护者 tlrmchlsmth 直接批准。工程要点集中在 PR body:作者声明已完成重复性搜索(确认无重复 open PR)、给出 pre-commit 与单用例运行结果(163.08 秒通过,GSM8K accuracy 0.885、acceptance rate 0.41、acceptance length 4.25),并按项目要求披露了 AI 辅助生成与人工复核声明。
风险与影响
- 风险:
1) 阈值可靠性:Qwen3.6 参考指标来自单次 200 题 GSM8K 测量(body 明确 'Reference from 200 GSM8K questions'),旧用例则基于 5~12 次运行的统计;新断言用 REGRESSION_TOLERANCE=0.95(5% 容差)替代旧的 0.9,acceptance rate 实测 0.41 对比阈值 0.3895 余量极小,temperature=1.0 概率采样下容易 flaky。
2) 行为静默变化:参数化收敛未完全保留旧配置——原 Gemma4 用例设置的 VLLM_USE_FLASHINFER_SAMPLER=0 环境变量丢失(DSparkCorrectnessConfig.disable_flashinfer_sampler 字段在测试体中未被消费),enforce_eager 从 True 变为默认 False;原 Qwen3 用例 attention_backend='FLASH_ATTN' 变为默认 None、gpu_memory_utilization 从 0.9 变 0.92。参考值未按新配置重测,存在断言失真可能。
3) CI 成本:35B 级 checkpoint 下载与加载、单用例 163 秒、三用例串行,CI 时长与磁盘/带宽开销上升。
4) 正确性影响:纯测试变更,不影响运行时路径。
- 影响:用户/运行时:无影响,未触碰 vllm/ 源码。团队:获得 Qwen3.6 dSpark 的持续回归护栏,且数据驱动框架让后续 DSpark 目标/草稿架构接入成本降为新增一个 DSparkCorrectnessConfig 实例。CI:新增 qwen3.6-speculators 用例,带来额外的模型下载(35B NVFP4 + speculator)与约 163 秒/用例的执行时间。测试生态:dspark 测试从单模型独立函数演进为参数化注册,可维护性提升,但容差收紧与旧用例参数漂移需要后续关注。
- 风险标记:参考阈值来自单次运行, 容差收紧至 5%, 旧用例参数静默漂移, CI 时长增加
关联脉络
- PR #47390 Qwen3.5 family dspark runtime support(标题依据 PR body 引用,未在历史列表中): PR body 明确提及 #47390 提供 Qwen3.5 家族的 dSpark 运行时支持但未包含本测试覆盖,本 PR 与之互补而非重复。
- PR #50585 [K3 Perf] Optimize k3 dspark fused kv, 4.5~4.6x kernel performance improvement: 同为 dSpark 功能线的性能优化 PR,说明 vLLM 在 dSpark 运行时能力与回归测试两端并行演进。
参与讨论