Prhub

#33611 [Test] Replace NVFP4 MoE runner backend e2e matrix with a layer-level unit test

原始 PR 作者 hnyls2002 合并时间 2026-08-05 07:03 文件变更 4 提交数 3 评论 2 代码增减 +233 / -234

执行摘要

用层单元测试替换 NVFP4 MoE e2e 矩阵,CI 提速

PR body 明确指出现有覆盖方式成本过高:每个 backend 需要起一个 server 并跑完整 GSM8K 评测(nightly 约 900s、extra 约 960s),且 cutass/cutedsl 的 e2e 测试高度重复。作者希望“覆盖 per-backend weight prep(TRTLLM shuffle、CUTLASS swizzle、CuteDSL v2 interleave + MMA blockscales)与 runner dispatch,在几秒内完成”,同时保留 EP=4 分布式维度的 e2e 覆盖。

值得精读,尤其是 _torch_moe_reference 如何通过镜像 kernel 的 NVFP4 量化往返(两次 fp4_quantize)来控制参考误差,以及 runtime_context override 机制让单测无需起 server 即可驱动不同 MoE runner backend。该测试可作为 NVFP4 相关 kernel 回归测试的模板。建议后续补充 EP 分布式路径的最小化验证,避免完全依赖单测。

讨论亮点

该 PR 无 review 评论。仅有的交互是 issue 评论中的 /rerun-test 请求:作者请求重跑新增单元测试,github-actions 机器人反馈 4-gpu-b200 上运行结果为 ❌(workflow run #30958545651),但未提供失败日志,无法判断是测试失败还是基础设施抖动。

实现拆解

  1. 新增 test/registered/unit/layers/quantization/test_nvfp4_moe_backends.py:通过 runtime_contextget_context()/get_flags()/get_parallel() override 机制,在单进程内构造 FusedMoE 层,手动填充 NVFP4 checkpoint 格式的量化权重与 scale,调用 process_weights_after_loading 后执行 forward;参考端用 dequant_nvfp4(内含 break_fp4_bytesconvert_swizzled_to_linear 两个辅助函数)重建浮点权重,并在 _torch_moe_reference 中镜像 kernel 的两次 NVFP4 量化往返(输入与 GEMM1→GEMM2 中间激活),同时处理 up_first 的 w13 顺序差异;断言输出形状与余弦相似度 > 0.99。注册 CI:register_cuda_ci(est_time=120, stage="base-b", runner_config="4-gpu-b200"),并 skipIf(get_device_sm() < 100) 限制在 Blackwell。
  2. 删除 test/registered/backends/test_deepseek_v3_fp4_cutlass_moe.py(nightly 900s)与 test/registered/quant/test_deepseek_v3_fp4_4gpu_extra.py(extra 960s,且与前者近乎重复),理由是该后端数值已在单测覆盖。
  3. 修改 test/registered/backends/test_deepseek_v3_fp4_cutedsl_moe.py:移除 EP=1 的 TestDeepseekV3FP4CuteDSLMoE 类,仅保留 EP=4 的 TestDeepseekV3FP4CuteDSLMoEEP4est_time 从 900 降至 450;文件 docstring 明确说明单测覆盖单 GPU 后端数值,e2e 保留分布式 EP 维度。
  4. 无源码、配置或部署配套改动,纯测试资产调整;提交历史为三个 commit:新增单测、删除 e2e 矩阵、精简注释。
文件 模块 状态 重要度
test/registered/unit/layers/quantization/test_nvfp4_moe_backends.py 单元测试 added 7.73
test/registered/quant/test_deepseek_v3_fp4_4gpu_extra.py E2E 测试 removed 6.78
test/registered/backends/test_deepseek_v3_fp4_cutlass_moe.py E2E 测试 removed 6.72
test/registered/backends/test_deepseek_v3_fp4_cutedsl_moe.py E2E 测试 modified 6.43

关键符号

_init_single_process_dist convert_swizzled_to_linear break_fp4_bytes dequant_nvfp4 _run_backend _torch_moe_reference TestNvFp4MoeBackends.setUpClass

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

CI 重跑请求 test_nvfp4_moe_backends.py question

PR 作者通过 /rerun-test 请求重跑新增单元测试,github-actions 机器人在 4-gpu-b200 上执行 test/registered/unit/layers/quantization/test_nvfp4_moe_backends.py,结果为 ❌。

结论:未提供失败日志,无法判断是测试本身失败还是 CI 基础设施抖动;当前 PR 的 base-b 与 extra 状态均为 ❌,需关注后续重跑结果。 · unresolved

风险与影响

  1. e2e 覆盖缩减:cutlass 与 trtllm 在 EP=4 分布式场景下的完整 server + GSM8K 精度验证被完全移除,单测只覆盖 tp=ep=1,若未来分布式路径(如 all-reduce、A2A、NVFP4 all-gather)出现回归,存在漏检风险。
  2. 参考实现假设:_torch_moe_referenceup_first 的处理直接依赖 load_up_proj_weight_firstenable_flashinfer_trtllm_moe 两个属性,若 kernel 侧顺序约定变化而测试未同步,可能产生假通过或无效对比。
  3. 数值阈值的脆弱性:固定 seed 与固定形状(M=32、H=I=1024)覆盖有限,对非对齐 shape 或极端 scale 的路径不敏感;余弦相似度 0.99 对个别 outlier 有一定容错。
  4. CI 状态:当前 base-b 与 extra 的 CI 均为 ❌,虽可能是环境问题,但新增测试能否稳定通过尚未确认,存在阻塞合并的潜在风险。

影响范围集中在 CI 与测试维护:显著降低 B200 上的 GPU 时间占用(合计节省约 1860s+450s,新增 120s),缩短 nightly 反馈周期;测试资产从重 server 启动转为轻量单测,便于本地复现与快速定位后端数值问题。对用户与运行时零影响,因为未改动任何产品代码。团队收益是更快的 NVFP4 MoE 后端迭代验证,但需接受 e2e 精度覆盖的收窄。

e2e 覆盖缩减 CI 失败未定位 依赖参考实现镜像 kernel 行为

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论