Prhub

#28098 Add DeepSeek V4 MTP acceptance length checks

原始 PR 作者 Fridge003 合并时间 2026-06-13 09:53 文件变更 6 提交数 9 评论 15 代码增减 +36 / -3

执行摘要

为 DeepSeek V4 添加 MTP 接受长度检查

确保 DeepSeek V4 的多步推测解码(MTP)在 CI 运行中持续维持预期性能,避免因模型、算子或配置变更导致的性能退化被忽略。PR body 明确说明:add a reusable MTP acceptance-length/speed smoke test mixinset initial acc_length thresholds

值得精读的文件是 sglang/test/kits/spec_decoding_kit.py(如果其定义可见),以理解 Mixin 的实现方式。本 PR 的批量混入模式可作为后续为其他模型添加性能断言的样板。建议维护一份阈值基线文档,定期验证阈值的有效性。

讨论亮点

Review 中无外部争议。PR 作者(Fridge003)自行在 6 处 Review 评论中建议将 1-step 测试的 accept_length_thres 从初始值 1.6 上调至 1.8,并主动提交 suggestion。最终合并时所有 1-step 测试均采用 1.8 阈值,表明作者基于初步运行结果进行了细粒度校准。

实现拆解

  1. 导入可复用混入类:在 6 个测试文件中添加 from sglang.test.kits.spec_decoding_kit import SpecDecodingMixin 导入语句。

  2. 混入测试类:在每个测试类的继承列表中将 SpecDecodingMixin 置于第一位(或适当位置),例如 class TestDSV4FlashFP4B200(SpecDecodingMixin, BasicDecodeCorrectnessMixin, ...)

  3. 设置阈值属性:在每个测试类中定义 accept_length_thres(接受长度阈值)和 bs_1_speed_thres(batch=1 速度阈值)两个类属性,根据推测步数调整——3-step 配置(如 LowLatency 配方)阈值设为 2.6~2.8,1-step 配置(Balanced 配方)阈值设为 1.8。

  4. 调整解聚测试:在 test/registered/disaggregation/test_disaggregation_dsv4.py 中,除了混入 SpecDecodingMixin 并设置阈值外,还移除了父类已定义的冗余属性 gsm8k_accuracy_thres,并重新对齐继承顺序。

  5. CI 注册确认:所有受影响的测试文件均已通过 register_cuda_ci 注册到 CI 流水线,本次变更不改变其 stage 和 runner_config,确保新断言在现有 CI 框架中生效。

文件 模块 状态 重要度
test/registered/disaggregation/test_disaggregation_dsv4.py 解聚测试 modified 4.93
test/registered/models_e2e/test_deepseek_v4_flash_fp4_b200.py B200 FP4 modified 4.9
test/registered/models_e2e/test_deepseek_v4_flash_fp4_h200.py H200 FP4 modified 4.9
test/registered/models_e2e/test_deepseek_v4_flash_fp4_megamoe_b200.py MegaMoE B200 modified 4.9
test/registered/models_e2e/test_deepseek_v4_flash_fp8_h200.py H200 FP8 modified 4.62
test/registered/cp/test_deepseek_v4_flash_fp4_b200_cp.py B200 CP modified 4.55

关键符号

TestDisaggregationDSV4

关键源码片段

test/registered/disaggregation/test_disaggregation_dsv4.py test-coverage

该文件新增了 SpecDecodingMixin 的使用,调整了测试类继承结构,并删除了冗余属性,是变更最综合的文件。

import unittestfrom sglang.test.ci.ci_register import register_cuda_ci
from sglang.test.kits.eval_accuracy_kit import GSM8KMixin
from sglang.test.kits.spec_decoding_kit import SpecDecodingMixin # 新增:接受长度与速度混入
from sglang.test.server_fixtures.disaggregation_fixture import (
    PDDisaggregationServerBase,
)
from sglang.test.test_utils import (
    DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH,
    popen_launch_pd_server,
    try_cached_model,
)register_cuda_ci(est_time=500, stage="base-c", runner_config="deepep-8-gpu-h200")# ... 常量定义省略 ...# 变更后:混入 SpecDecodingMixin,设置阈值
class TestDisaggregationDSV4(SpecDecodingMixin, PDDisaggregationServerBase, GSM8KMixin):
    gsm8k_accuracy_thres = 0.93
    accept_length_thres = 1.8 # 1-step MTP 接受长度阈值(原 suggestion 从 1.6 上调整至 1.8)
    bs_1_speed_thres = 140 # batch=1 速度阈值(tok/s)
​
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        cls.model = try_cached_model(DSV4_FLASH_MODEL)
        cls.start_prefill()
        cls.start_decode()
        cls.wait_server_ready(cls.prefill_url + "/health", process=cls.process_prefill)
        cls.wait_server_ready(cls.decode_url + "/health", process=cls.process_decode)
        cls.launch_lb()

评论区精华

调整 1-step MTP 接受长度阈值 测试

PR 作者在 Review 中提交 6 条 suggestion,建议将各个 1-step 测试的 accept_length_thres 从 1.6 改为 1.8,认为初始值偏低,可能导致 CI 告警过于敏感。

结论:作者自行采纳建议,合并时所有 1-step 测试阈值均为 1.8。 · 已解决

风险与影响

风险较低,但阈值设定存在两个潜在问题:

1) 阈值可能过于严格或宽松,导致 CI 频繁失败(假阳性)或掩盖真实回归(假阴性);
2) 当前阈值基于特定硬件(H200/B200)和软件版本测得,环境升级后可能需要重新校准。此外,测试覆盖率不包括所有可能的推测参数组合(如不同 topk 或 draft token 数),因此阈值可能无法反映全貌。

直接影响:对 DeepSeek V4 相关的 6 个 CI 测试增加了性能断言,确保 MTP 接受长度和单 batch 速度不退化。间接影响:为项目中其他模型或模拟场景提供了 SpecDecodingMixin 可复用模式,降低后续添加类似检查的成本。对用户无感知,对内部 CI 稳定性有正面作用。

阈值需长期校准 测试覆盖不全所有配置

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论