Prhub

#42486 [XPU][UT]Enable ut qk_norm_rope_fusion

原始 PR 作者 Yejing-Lai 合并时间 2026-07-01 15:38 文件变更 2 提交数 3 评论 3 代码增减 +10 / -7

执行摘要

XPU 启用 qk_norm_rope_fusion 测试并解耦 CUDA

PR body 明确说明 Removed ut qk_norm_rope_fusion cuda hard code, added xpu support,目的是在 XPU (Intel GPU) 上启用 QK Norm + RoPE 融合的单元测试,消除对 CUDA 的硬编码依赖,提升编译后端的跨平台兼容性。

变更清晰、目标明确,但改动量小,属于常规维护型 PR。值得关注的是 current_platform 抽象的使用模式,可作为同类设备解耦的参考。推荐阅读 vllm_inductor_pass.py 中辅助方法的修改,以统一后续跨设备支持的编码风格。

讨论亮点

审核者 jikunshangvllm_inductor_pass.py 的 diff hunks 上评论 we can follow change like this https://github.com/vllm-project/vllm/blob/main/tests/test_config.py#L38,意在建议采用与已有代码库一致的平台抽象方式。贡献者采纳了该建议,最终提交中使用了 current_platform.device_type。此外,Mergify 机器人提示存在合并冲突,要求 rebase,后由 jikunshang 执行分支合并(merge commit)解决。

实现拆解

  1. 导入平台抽象:在 vllm/compilation/passes/vllm_inductor_pass.py 中新增 from vllm.platforms import current_platform 导入,并定义模块级常量 DEVICE_TYPE = current_platform.device_type,作为所有辅助张量创建的设备来源。
  2. 替换设备硬编码:将 VllmFusionPatternMatcherPass 内所有静态辅助方法(emptyempty_bf16empty_fp16empty_fp32empty_i32)的 device="cuda" 参数统一替换为 device=DEVICE_TYPE,使模式匹配的示例张量在任意支持设备上创建,无需手动切换。
  3. 扩展测试平台条件:在 tests/compile/passes/test_qk_norm_rope_fusion.py 中,将 @pytest.mark.skipif 条件从 not current_platform.is_cuda_alike() 改为 not (current_platform.is_cuda_alike() or current_platform.is_xpu()),允许在 XPU 平台上执行该测试。
  4. 动态默认设备:将测试函数内的 torch.set_default_device("cuda") 改为 torch.set_default_device(current_platform.device_type),确保张量创建在正确的设备上。
  5. 无其他配置或部署配套变更:PR 改动仅涉及上述两文件,无新增依赖或 CI 配置调整。
文件 模块 状态 重要度
vllm/compilation/passes/vllm_inductor_pass.py 编译后端 modified 5.99
tests/compile/passes/test_qk_norm_rope_fusion.py 融合测试 modified 3.83

关键符号

empty empty_bf16 empty_fp16 empty_fp32 empty_i32 test_qk_norm_rope_fusion

关键源码片段

vllm/compilation/passes/vllm_inductor_pass.py dependency-wiring

核心源码文件,导入平台抽象并替换所有辅助张量创建方法的设备硬编码,是跨平台支持的关键改动。

# vllm/compilation/passes/vllm_inductor_pass.pyfrom vllm.platforms import current_platform # 新增:导入平台抽象DEVICE_TYPE = current_platform.device_type # 新增:模块级常量,值为当前运行时设备类型class VllmFusionPatternMatcherPass(...):
    # Helpers for get_inputs: uninitialized tensors of common dtypes.
    @staticmethod
    def empty(*args, **kwargs) -> torch.Tensor:
        # 原为 device="cuda",现使用动态 DEVICE_TYPE,支持 xpu 等平台
        return torch.empty(*args, device=DEVICE_TYPE, **kwargs)
​
    @staticmethod
    def empty_bf16(*args, **kwargs) -> torch.Tensor:
        return torch.empty(*args, dtype=torch.bfloat16, device=DEVICE_TYPE, **kwargs)
​
    @staticmethod
    def empty_fp16(*args, **kwargs) -> torch.Tensor:
        return torch.empty(*args, dtype=torch.float16, device=DEVICE_TYPE, **kwargs)
​
    @staticmethod
    def empty_fp32(*args, **kwargs) -> torch.Tensor:
        return torch.empty(*args, dtype=torch.float32, device=DEVICE_TYPE, **kwargs)
​
    @staticmethod
    def empty_i32(*args, **kwargs) -> torch.Tensor:
        return torch.empty(*args, dtype=torch.int32, device=DEVICE_TYPE, **kwargs)
tests/compile/passes/test_qk_norm_rope_fusion.py test-coverage

测试文件,修改 skipif 条件和默认设备设置,确保 XPU 上可执行并正确设置设备上下文。

# tests/compile/passes/test_qk_norm_rope_fusion.py# 修改 skipif 条件:允许在 xpu 上运行
@pytest.mark.skipif(
    not (current_platform.is_cuda_alike() or current_platform.is_xpu()),
    reason="Only test on cuda, rocm, or xpu platform",
)
def test_qk_norm_rope_fusion(eps, is_neox, enable_rms_norm_custom_op,
                              enable_rope_custom_op, dtype, scattered_split):
    # ... 确保 fused_qk_norm_rope 自定义算子存在
    # 将硬编码 "cuda" 替换为动态设备类型
    torch.set_default_device(current_platform.device_type)
    # ... 后续测试逻辑不变

评论区精华

设备抽象方式 设计

jikunshang 在 review 中建议参考 `tests/test_config.py` 中 `L38` 的用法,暗示当前 `current_platform.device_type` 的使用方式应保持一致。

结论:贡献者采纳建议,最终提交使用了 `current_platform.device_type`。 · 已解决

风险与影响

风险较低。变更的核心是替换设备字符串,逻辑不变。潜在风险包括:

  • current_platform.device_type 返回值为空或非预期设备字符串,可能导致 torch.empty 异常,但 current_platform 已有完善的 fallback 机制,风险极低。
  • 测试 skipif 条件扩展后,若 XPU 端缺少 fused_qk_norm_rope 自定义操作,测试会通过 pytest.skip 跳过,不会失败;但可能导致误以为测试正常通过而实际未覆盖核心逻辑。
  • 无性能或安全影响。

影响范围小:仅影响两个文件,无功能变更。

  • 对用户:无直接影响;Intel GPU 用户现在可以在 XPU 上运行该单元测试以验证融合算子。
  • 对系统:降低了编译后端对 CUDA 的隐式依赖,提升了可移植性。
  • 对团队:为后续 XPU 支持奠定了测试基础,但需注意跨设备测试环境的一致性。
测试跳过可能隐藏未覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论