Prhub

#54954 [CI][MoE] Moe kernels test cleanup

原始 PR 作者 stefankoncarevic 合并时间 2026-09-03 02:31 文件变更 2 提交数 3 评论 2 代码增减 +54 / -4

执行摘要

优化 MoE 内核测试:移除低效的每测试清理并扩展 AMD 平台测试覆盖。

PR 描述明确指出,当前每个测试后都运行的全局清理(gc.collect() 加清空缓存分配器)成本高于测试本身,尤其在拥有约 1450 个小内核测试的每个分片中累积显著。此外,fused_topk 路由测试因条件判断 is_cuda() 对 ROCm 为 False 而被全部跳过(共 720 个),导致 AMD 平台缺少关键覆盖。

此 PR 是一个高效且低风险的测试基础设施优化。它通过精确配置测试行为(而非修改核心源码)显著提升了性能与覆盖。建议技术管理者关注其展示的“通过 conftest 优化测试性能”模式,并在团队内推广此类最佳实践。对于工程师,值得学习其如何平衡测试隔离与性能、以及如何使用 is_cuda_alike() 统一跨平台测试。

讨论亮点

PR 中没有实质性的技术讨论。自动代码审查机器人(Claude)因 PR 来自 fork 仓库而跳过。最终由仓库维护者 AndreasKaratzas 直接批准并合并,表明变更清晰且经过充分的作者本地测试验证。

实现拆解

  1. 禁用每测试全局清理:在 tests/kernels/moe/conftest.py 中新增 should_do_global_cleanup_after_test fixture,固定返回 False,覆盖了根 conftest.py 中的默认行为,从而跳过对每个测试的昂贵清理。此变更本身不平台相关,影响所有硬件。
  2. 为必要测试提供入口清理:为防止移除全局清理后导致依赖干净状态的测试失败,在同一文件中新增 NEEDS_CLEAN_ENTRY 集合(包含 test_moe_layer.py 等 13 个文件)和 pytest_runtest_setup 钩子。在这些测试执行前,钩子会调用 cleanup_dist_env_and_memory() 进行一次性清理,确保隔离性。
  3. 启用 AMD 平台的 fused_topk 测试:在 tests/kernels/moe/test_fused_topk.py 中,将 test_fused_topk, test_fused_topk_bias, test_fused_topk_nan_inf_clamp, test_fused_topk_bias_nan_inf_clamp 四个测试函数装饰器的 @pytest.mark.skipif 条件,从 not current_platform.is_cuda() 修改为 not current_platform.is_cuda_alike()。此修改与同目录 test_topk_softplus_sqrt.py 保持一致,使这些测试在 CUDA 和 ROCm 平台都能运行。
  4. 测试验证:作者在 MI300X 上执行了完整的分片测试,并确认所有分片通过。清理变更使单个测试文件的执行时间从 78.88 秒降至 3.74 秒。平台条件的修改使通过测试数增加 720 个,跳过数减少 720 个。
文件 模块 状态 重要度
tests/kernels/moe/conftest.py 测试配置 modified 6.49
tests/kernels/moe/test_fused_topk.py 路由测试 modified 4.33

关键符号

should_do_global_cleanup_after_test pytest_runtest_setup

关键源码片段

tests/kernels/moe/conftest.py test-coverage

核心变更文件,实现了禁用每测试全局清理和为特定测试提供入口清理的机制。

# 新增了从 vllm.distributed 导入清理函数
from vllm.distributed import cleanup_dist_env_and_memory
​
# 定义需要在入口处获得干净状态的测试文件集合
NEEDS_CLEAN_ENTRY = frozenset(
    {
        # 这些测试失败除非从干净的分布式和内存状态开始,
        # 之前它们仅通过前一个测试的清理副作用获得此状态。
        "test_moe_layer.py",
        "test_ocp_mx_moe.py",
        "test_zero_expert_moe.py",
        # 在 ROCm 上没有执行过测试,不清楚其行为。
        # 作为预防措施在入口处清理;一旦确认无需清理即可移除。
        "test_batched_deepgemm.py",
        "test_deepep_deepgemm_moe.py",
        # ... 其他文件省略
    }
)
​
# 通过覆盖此 fixture,禁用整个 tests/kernels/moe/ 目录下
# 每个测试后自动执行的 gc.collect() 和缓存分配器清空。
def pytest_runtest_setup(item):
    # 非 tryfirst:跳过插件在 tryfirst 钩子中评估跳过标记,
    # 因此即将被跳过的测试不会到达此钩子,而 fixture 设置仍会随后运行。
    if item.path.name in NEEDS_CLEAN_ENTRY:
        cleanup_dist_env_and_memory() # 仅在需要时调用一次清理

评论区精华

测试清理策略与平台兼容性 测试

PR 直接实施了两项变更,未引发公开讨论。作者在 PR 描述中清晰阐述了禁用全局清理的理由(成本高于测试本身)和扩展平台检查的依据(与同目录测试一致且已在 MI300 验证)。

结论:变更被维护者 AndreasKaratzas 批准并合并,决策基于作者提供的性能数据和测试结果。 · 已解决

风险与影响

  1. 测试隔离性风险:移除全局清理可能破坏对运行环境有严格要求的测试。缓解措施:通过 NEEDS_CLEAN_ENTRY 集合和入口清理钩子,精确识别并维护了这些测试的隔离性需求。后续需关注集合外的测试是否出现偶发失败。
  2. 平台兼容性风险:放宽 fused_topk 测试的平台限制,可能在未充分验证的 AMD 硬件或驱动版本上暴露问题。缓解措施:作者已在 MI300 硬件上验证通过,且该做法与目录内其他测试保持一致。
  1. CI 效率:显著减少了 MoE 内核测试套件的运行时间(单文件测试提速约 20 倍),提升了 CI 资源利用率。
  2. 测试覆盖:为 AMD ROCm 平台新增了 720 个 fused_topk 相关测试的覆盖,增强了该平台的功能验证能力。
  3. 开发者体验:加速了本地和 CI 上的测试反馈循环。
测试隔离性可能受影响 平台兼容性边界扩展

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论