Prhub

#26604 [CP] Add back qwen 30b test

原始 PR 作者 Fridge003 合并时间 2026-05-29 05:34 文件变更 1 提交数 1 评论 3 代码增减 +132 / -0

执行摘要

恢复误删的 Qwen3-30B CP 测试

该测试文件在 #23269 中被误删除,需要恢复以保持对 Qwen3-30B 模型在 context parallelism 模式下的回归测试覆盖。PR body 明确指出 'it was deleted by mistake in #23269'。

该 PR 是简单的测试恢复操作,不值得深入阅读。但可以作为恢复误删文件的标准操作范例:确认原始内容、直接还原、并在 PR body 说明原因。

讨论亮点

评论中仅有一条来自 Fridge003 的 /rerun-test test_qwen3_30b.py 命令触发 CI 重跑,以及 gemini-code-assist 的配额提醒。没有深入 review 讨论。

实现拆解

  1. test/registered/cp/ 下完全新增 test_qwen3_30b.py 文件(+132 行)。
  2. 定义模型路径为 Qwen/Qwen3-30B-A3B-FP8,GSM8K 准确率基线为 0.85。
  3. 实现 TestQwen330B 类(基础配置):启动 4-GPU 服务,TP=4,MoE-DP=2,EP=2,启用 prefill context parallel,禁用 piecewise CUDA graph,运行 200 条 GSM8K 样本。
  4. 实现 TestQwen330BCP 类(CP 配置):与基础配置类似,但 MoE-DP=1,EP=4,强调 expert parallelism 而非 data parallelism,更聚焦 context parallelism 效果。
  5. 通过 register_cuda_ci 注册为 CI 阶段 extra-b,使用 4-gpu-h100 runner,预估耗时 261 秒。
文件 模块 状态 重要度
test/registered/cp/test_qwen3_30b.py 测试 added 6.95

关键符号

TestQwen330B.setUpClass TestQwen330B.tearDownClass TestQwen330B.test_gsm8k TestQwen330BCP.setUpClass TestQwen330BCP.tearDownClass TestQwen330BCP.test_gsm8k

关键源码片段

test/registered/cp/test_qwen3_30b.py test-coverage

PR 的唯一变更文件,完全新增,恢复被误删的 CP 测试。

import unittest
from types import SimpleNamespacefrom sglang.test.ci.ci_register import register_cuda_ci
from sglang.test.run_eval import run_eval
from sglang.test.test_utils import (
    DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH,
    DEFAULT_URL_FOR_TEST,
    CustomTestCase,
    kill_process_tree,
    popen_launch_server,
)# 注册为 CI 阶段 extra-b,使用 4 卡 H100,预计耗时 261 秒
register_cuda_ci(est_time=261, stage="extra-b", runner_config="4-gpu-h100")QWEN3_30B_MODEL_PATH = "Qwen/Qwen3-30B-A3B-FP8"
GSM8K_BASELINE_ACCURACY = 0.85
​
​
class TestQwen330BCP(CustomTestCase):
    """测试 Qwen3-30B 在 context parallelism 下的 GSM8K 准确性"""
​
    @classmethod
    def setUpClass(cls):
        # 4-GPU 配置:TP=4, MoE-DP=1, EP=4, 启用 prefill CP
        cls.model = QWEN3_30B_MODEL_PATH
        cls.base_url = DEFAULT_URL_FOR_TEST
        cls.process = popen_launch_server(
            cls.model,
            cls.base_url,
            timeout=DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH,
            other_args=[
                "--tp-size", "4",
                "--moe-dp-size", "1",
                "--ep-size", "4",
                "--attn-cp-size", "2",
                "--enable-prefill-context-parallel",
                "--cuda-graph-max-bs", "32",
                "--max-running-requests", "32",
                "--trust-remote-code",
                "--disable-piecewise-cuda-graph",
                "--model-loader-extra-config",
                '{"enable_multithread_load": true, "num_threads": 64}',
            ],
        )
​
    @classmethod
    def tearDownClass(cls):
        kill_process_tree(cls.process.pid)
​
    def test_gsm8k(self):
        # 使用 5-shot GSM8K,采样 200 条,最大生成长度 16000 tokens
        args = SimpleNamespace(
            model=self.model,
            eval_name="gsm8k",
            num_shots=5,
            num_examples=200,
            max_tokens=16000,
            num_threads=128,
            repeat=1,
            temperature=0.6,
            top_p=0.95,
            top_k=20,
            base_url=self.base_url,
            host="http://127.0.0.1",
            port=int(self.base_url.split(":")[-1]),
        )
        metrics = run_eval(args)
        print(f"{metrics=}")
        # 确保 GSM8K 准确率不低于基线 0.85
        self.assertGreaterEqual(metrics["score"], GSM8K_BASELINE_ACCURACY)
​
​
if __name__ == "__main__":
    unittest.main()

评论区精华

触发 CI 重跑测试 other

Fridge003 使用 /rerun-test 命令触发 test_qwen3_30b.py 的 CI 运行。

结论:CI 运行成功,测试通过。 · 已解决

风险与影响

无技术风险:变更仅涉及测试文件恢复,不影响任何推理代码、依赖或配置。但需确保 CI runner 能正常分配 4-GPU H100 实例以执行该测试。

对用户:无直接影响。对系统:增加了 CI 回归测试覆盖,确保 Qwen3-30B 在 context parallelism 下的正确性持续被验证。对团队:恢复了不必要的测试遗漏,属于维护性修复。

低风险,仅为测试恢复 需要 4-GPU CI runner

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论