Prhub

#49394 [XPU] Enable QK Norm + RoPE fusion pass on XPU

原始 PR 作者 chaojun-zhang 合并时间 2026-07-27 11:22 文件变更 3 提交数 7 评论 0 代码增减 +24 / -3

执行摘要

XPU 启用 QK Norm + RoPE 融合编译 pass

XPU 平台此前缺少对 QK Norm + RoPE 融合 pass 的支持,导致该优化被强制禁用。PR body 中的基准测试表明启用后吞吐量提升 11.7%,TTFT 降低约 10%,且准确率与 eager 模式相当,因此需要将融合 pass 扩展到 XPU。

值得精读并合并。设计清晰且安全:将条件从 is_cuda_alike 扩展到 is_cuda_alike or is_xpu,同时将两个 pass 一起移入,保持了平台间的对称性。基准测试数据扎实,证明了性能收益和精度无损。

讨论亮点

无实质技术讨论。审核人 jikunshang 仅评论了 cc @Yejing-Lai,随后批准;claude[bot] 自动回复因来自 fork 无法执行审查。

实现拆解

  1. 调整编译 pass 注册条件:在 vllm/compilation/passes/pass_manager.py 中,将 QKNormRoPEFusionPass 的导入从 if current_platform.is_cuda_alike(): 块移动到 if current_platform.is_cuda_alike() or current_platform.is_xpu(): 块,同时将 SplitCoalescingPass 也一同移入,使得这些 pass 在 XPU 上可用。
  2. 移除 XPU 禁用列表条目:在 vllm/platforms/xpu.pycheck_and_update_config 方法中,从 fusion_passes_to_disable 字典中删除了 "enable_qk_norm_rope_fusion": "QK Norm + RoPE fusion" 条目,从而允许用户启用该 pass。
  3. 新增 CI 测试任务:在 .buildkite/intel_jobs/misc_intel.yaml 中添加名为 Fusion Unit Tests 的 CI 步骤,自动运行 tests/compile/passes/test_qk_norm_rope_fusion.py 测试,确保融合 pass 在 XPU 上正确性。
文件 模块 状态 重要度
vllm/compilation/passes/pass_manager.py 编译 Pass modified 5.75
vllm/platforms/xpu.py 平台配置 modified 4.75
.buildkite/intel_jobs/misc_intel.yaml CI 配置 modified 4.18

关键源码片段

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

核心变更加载逻辑:将 QKNormRoPEFusionPass 和 SplitCoalescingPass 的导入从 `is_cuda_alike` 块扩展为 `is_cuda_alike or is_xpu`,使 XPU 可注册这些 pass。

# vllm/compilation/passes/pass_manager.py ( 部分 )# 原代码:仅 is_cuda_alike 时导入
# 新代码:is_cuda_alike 或 is_xpu 时都导入
if current_platform.is_cuda_alike() or current_platform.is_xpu():
    # QK Norm + RoPE fusion pass —— 核心变更:从下面的 is_cuda_alike 块移到这里
    from .fusion.qk_norm_rope_fusion import QKNormRoPEFusionPass
    # Sequence parallelism pass —— 保持原有位置不变
    from .fusion.sequence_parallelism import SequenceParallelismPass
    # Split coalescing pass —— 同样从 is_cuda_alike 块移到这里
    from .utility.split_coalescing import SplitCoalescingPass# 下面的只剩下 NVIDIA 独有的 pass,XPU 不会走这里
if current_platform.is_cuda_alike():
    from .fusion.act_quant_fusion import ActivationQuantFusionPass
    # ... 其他 NVIDIA 专有 pass 保持不变
vllm/platforms/xpu.py core-logic

移除禁用列表中的 `enable_qk_norm_rope_fusion` 条目,允许 XPU 用户启用该 pass。

# vllm/platforms/xpu.py (check_and_update_config 方法片段 )# 该字典列出 XPU 上尚不支持的融合 pass,会被强制禁用
fusion_passes_to_disable = {
    "fuse_gemm_comms": "Async TP",
    "fuse_allreduce_rms": "AllReduce + RMSNorm fusion",
    "fuse_attn_quant": "Attention + quant fusion",
    "fuse_act_padding": "Activation + padding fusion",
    "fuse_rope_kvcache": "RoPE + KV cache fusion",
    "fuse_rope_kvcache_cat_mla": "RoPE + KV cache + MLA fusion",
    # 删除以下行 —— enable_qk_norm_rope_fusion 现在已支持
    # "enable_qk_norm_rope_fusion": "QK Norm + RoPE fusion",
}

评论区精华

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

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

风险与影响

低风险。变更仅涉及条件导入和配置列表调整,核心融合 pass 逻辑本身未改动。CI 中新增的单元测试提供了基本覆盖,但缺少集成/端到端测试验证实际模型推理准确率。XPU 上其他融合 pass(如 ActivationQuantFusionPass、RMSNormQuantFusionPass)的注册保持不变。

影响范围较小,仅针对 Intel XPU 平台。启用后用户可通过 --compilation-config '{"pass_config":{"enable_qk_norm_rope_fusion":true}}' 获得性能提升(吞吐量+11.7%,TTFT-10%)。对 NVIDIA/AMD 平台无影响,因导入条件仍然包含它们。新增 CI 任务会增加少许 XPU 测试资源消耗。

缺少集成测试覆盖 仅依赖单元测试

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论