Prhub

#26610 test/registered: cleanup pure model e2e tests (moves, splits, dedup, kit)

原始 PR 作者 hnyls2002 合并时间 2026-05-29 06:41 文件变更 26 提交数 15 评论 1 代码增减 +611 / -816

执行摘要

清理模型 E2E 测试目录结构

为匹配已建立的约定:(1) 纯模型架构 E2E 测试应位于 models_e2e/ 目录;(2) 每个文件只启动一个 server;(3) 特性测试应位于其特性目录。通过清理减少冗余、提高可维护性和 CI 效率。引用 PR body:'Mechanical, behavior-preserving cleanup to match the established conventions'。

值得精读,展示了如何系统性地组织大型测试套件,包括目录约定、server 启动拆分和公共 mixin 提取。对维护大规模测试套件的团队有参考价值。

讨论亮点

无 review 评论。PR 由作者自行合并,说明变更为机械性且已充分验证。

实现拆解

按以下步骤:

  1. 移动纯模型测试文件从 4-gpu-models/、8-gpu-models/、quant/ 等到 models_e2e/,同时重命名以消除冗余标识(如 test_qwen35_fp4_mtp_v2 -> test_qwen35_fp4_mtp)。
  2. 拆分多 server 启动的文件:test_gpt_oss_4gpu.py 拆分为 bf16/mxfp4 两个文件;test_mimo_models.py 拆分为 MiMo-V2 和 V2.5;test_nvidia_nemotron_3_super_bf16.py 拆分为 base 和 mtp;test_deepseek_v32_fp4_mtp_4gpu.py 拆分为 dp 和 tp 变体。
  3. 删除重复文件 test_qwen35_models.py,其与 test_qwen35_fp4_mtp_v2.py 功能重复。
  4. 提取 UnifiedRadixTreeTestMixin 到 python/sglang/test/kits/unified_radix_cache_kit.py,移除原有 TestCase 子类,让 radix_cache 下的各文件从该 mixin 继承并各自管理 server 启动。
  5. 将 test_qwen35_hicache.py 移动到 hicache/ 目录,并更新依赖导入路径。
文件 模块 状态 重要度
test/registered/quant/test_deepseek_v32_fp4_mtp_4gpu.py FP4-MTP removed 7.42
test/registered/4-gpu-models/test_qwen35_models.py Qwen35 removed 7.38
test/registered/models_e2e/test_deepseek_v3_mtp.py DeepSeek-MTP added 7.07
python/sglang/test/kits/unified_radix_cache_kit.py 基数缓存 renamed 7.84
test/registered/models_e2e/test_nvidia_nemotron_3_super_bf16_mtp.py Nemotron renamed 7.19

关键符号

UnifiedRadixTreeTestMixin TestDeepseekV3MTP TestDeepseekV32FP4DPSpec TestDeepseekV32FP4TPSpec TestNvidiaNemotron3SuperBF16 TestNvidiaNemotron3SuperBF16MTP _run_gsm8k

关键源码片段

python/sglang/test/kits/unified_radix_cache_kit.py rename-or-move

提取 UnifiedRadixTreeTestMixin 到公共 kit,被多个 radix_cache 测试文件使用

# 生成随机后缀 token ID 列表
# n: 样本数 , length: 每个后缀长度 , seed: 随机种子
def _random_suffixes(n, length, seed):
    rng = random.Random(seed)
    return [[rng.randint(1, 30000) for _ in range(length)] for _ in range(n)]class UnifiedRadixTreeTestMixin:
    """
    Mixin: 提供 GSM8K、MMLU 和多轮 KL 散度测试的方法
    ,供不同注意力模式(full/mamba/swa)的 TestCase 继承使用。
    """
    # 可被子类覆盖的配置属性
    kl_threshold: float = 0.003
    max_new_tokens: int = 512
    num_groups: int = 3
    branches_per_group: int = 3
    prefix_len: int = 512
    prefill_cache_assert = None
    decode_cache_assert = None
    sampling_temperature: float = 1
    decode_hit_request_batch_size: int | None = None
    decode_hit_inter_batch_delay_s: float = 0
​
    gsm8k_threshold: float = 0.93
    mmlu_threshold: float = 0.8
    num_gsm8k_questions: int = 200
​
    def test_gsm8k(self):
        """少样本 GSM8K 数学推理准确率测试。"""
        from sglang.test.few_shot_gsm8k import run_eval as run_few_shot_gsm8k
​
        url = urlparse(self.base_url)
        args = SimpleNamespace(
            num_shots=10,
            data_path=None,
            num_questions=self.num_gsm8k_questions,
            max_new_tokens=16000,
            parallel=128,
            host=f"http://{url.hostname}",
            port=int(url.port),
        )
        metrics = run_few_shot_gsm8k(args)
        # ...(后续 MMLU 和多轮测试方法省略)

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

风险很低。关键点:(1) 拆分后每个测试文件独立启动 server,CI 资源使用略微变化,但 runner_config 保持不变,影响有限;(2) 测试路由依赖于 register_cuda_ci 注解而非目录,因此移动后 CI 执行路径不变;(3) 若有不正确移动导致测试不被发现,则会在 CI 中遗漏。通过本地运行和 CI 验证已降低风险。

影响范围:主要影响团队测试维护和 CI 执行。正向影响:减少测试文件耦合,提高定位效率;拆分 server 启动可缩短单个测试文件执行时间;删除重复避免混淆。不影响用户和系统功能。

测试文件移动 CI 路由不变 拆分 server 启动可能影响资源

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论