Prhub

#40550 [AMD][CI][BugFix] Override normalize_e4m3fn_to_e4m3fnuz for fnuz machines in test_moe_layer_no_parallel

原始 PR 作者 rasmith 合并时间 2026-04-22 10:21 文件变更 1 提交数 3 评论 2 代码增减 +27 / -0

执行摘要

修复 AMD MI300 等 FP8 FNUZ 平台 MOE 层测试的断言错误。

根据PR body描述,在MI300等使用e4m3fnuz FP8数据类型的机器上,MOE层创建时权重已为FNUZ格式,导致测试中调用normalize_e4m3fn_to_e4m3fnuz函数时触发断言错误(assert weight.dtype == torch.float8_e4m3fn)。该函数在FNUZ平台上实际无需执行任何操作,因此需要绕过以避免测试失败。

该PR值得快速浏览,特别是对于在AMD或使用FNUZ FP8格式平台上工作的开发者。关注点在于如何通过平台检测和函数覆盖来处理硬件特定的测试差异,这是一种实用的测试适配模式。

讨论亮点

review中仅有一次关于代码风格的讨论:gemini-code-assist[bot]建议将import vllm.model_executor.layers.quantization.utils.w8a8_utils移到文件顶部以符合PEP 8。作者rasmith回复称预提交脚本未将其置于顶部,且该导入并非所有运行此测试的平台都需要,因此保持原样。最终维护者tjtanaa批准了PR。

实现拆解

  1. 导入依赖:在测试文件顶部添加对vllm.model_executor.layers.quantization.utils.w8a8_utils的导入,以便后续覆盖其函数。
  2. 定义mock函数:新增mock_normalize_e4m3fn_to_e4m3fnuz函数,直接返回输入参数,模拟无操作行为。
  3. 定义覆盖函数:新增override_normalize_e4m3fn_to_e4m3fnuz函数,将w8a8_utils模块中的normalize_e4m3fn_to_e4m3fnuz替换为mock函数。
  4. 条件调用覆盖:在test_moe_layer_no_parallel_parallel_worker函数中,通过current_platform.is_fp8_fnuz()检测当前平台是否为FNUZ格式,若是则调用覆盖函数。
  5. 测试配套:此变更仅影响测试逻辑,不涉及生产代码,确保MOE层测试在FNUZ平台上能正确执行。
文件 模块 状态 重要度
tests/kernels/moe/test_moe_layer.py MOE 层 modified 5.62

关键符号

mock_normalize_e4m3fn_to_e4m3fnuz override_normalize_e4m3fn_to_e4m3fnuz test_moe_layer_no_parallel _parallel_worker

关键源码片段

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

唯一变更文件,包含修复 FNUZ 平台 MOE 测试断言错误的核心逻辑。

import vllm.model_executor.layers.quantization.utils.w8a8_utils # 导入 w8a8_utils 模块,以便后续覆盖其函数def mock_normalize_e4m3fn_to_e4m3fnuz(
    weight: torch.Tensor,
    weight_scale: torch.Tensor,
    input_scale: torch.Tensor | None = None,
):
    # 在 FNUZ 平台上,权重已为 e4m3fnuz 格式,无需转换,直接返回原参数
    return weight, weight_scale, input_scaledef override_normalize_e4m3fn_to_e4m3fnuz():
    # 将 w8a8_utils 模块中的 normalize_e4m3fn_to_e4m3fnuz 函数替换为 mock 函数
    # 注意:由于并行工作进程,无法使用 monkeypatch,因此采用直接覆盖方式
    vllm.model_executor.layers.quantization.utils.w8a8_utils.normalize_e4m3fn_to_e4m3fnuz = mock_normalize_e4m3fn_to_e4m3fnuzdef test_moe_layer_no_parallel(
    m: int,
    n: int,
    k: int,
    num_experts: int,
    top_k: int,
    quantization: str | None,
    use_shared_experts: bool,
    use_gate: bool,
    use_routed_input_transform: bool,
    monkeypatch,
):
    """Test MoE layer without parallelism (dp_size=1, tp_size=1, use_ep=False)."""
    if os.environ.get("VLLM_LOGGING_LEVEL") is None:
        monkeypatch.setenv("VLLM_LOGGING_LEVEL", "ERROR")
​
    # 仅在 FNUZ 平台上调用覆盖函数,因为权重已为 e4m3fnuz 格式,无需测试 normalize_e4m3fn_to_e4m3fnuz
    if current_platform.is_fp8_fnuz():
        override_normalize_e4m3fn_to_e4m3fnuz()
​
    # 后续测试逻辑 ...

评论区精华

导入位置是否符合 PEP 8 style

gemini-code-assist[bot] 建议将导入移到文件顶部以符合 PEP 8 风格指南。作者 rasmith 回复称预提交脚本未将其置于顶部,且该导入并非所有平台都需要。

结论:作者决定保持导入在原位,未做调整。 · 已解决

风险与影响

风险较低,因为变更仅限于测试文件,不涉及生产代码。主要风险是mock函数可能掩盖了实际测试意图,如果normalize_e4m3fn_to_e4m3fnuz函数在FNUZ平台上有其他副作用,mock可能无法完全模拟。但根据PR描述,该函数在FNUZ平台上确实无需执行任何操作,因此风险可控。

对用户和系统无直接影响,仅影响测试执行。对于使用AMD MI300等FNUZ FP8数据平台的开发者,修复了MOE层测试的断言错误,确保测试套件能完整运行。这有助于提升跨平台测试的稳定性和开发体验。

测试逻辑覆盖 平台特定适配

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论