Prhub

#51624 [Hardware][Power] Unqualized MoE Backend for Power (VSX)

原始 PR 作者 Akashcodes732 合并时间 2026-08-13 10:56 文件变更 6 提交数 25 评论 6 代码增减 +500 / -6

执行摘要

为 Power 架构添加 VSX 未量化 MoE 后端

根据 PR body,当前 vLLM 中 grouped GEMM 不支持 Power 架构,因此引入 Power/VSX 特定未量化 CPU 后端,以利用 Power10 MMA 指令提升性能。作者测试表明,相比 main 分支,预填充阶段 TTFT 有 35% 左右的提升。

值得精读,特别是 cpu_micro_gemm_vsx.hpp 中的 MMA 指令使用和优化过程(25 个提交中有大量性能调优)。关注其如何在统一接口下插入架构特定实现,以及如何在测试中启用。

讨论亮点

bigPYJ1151 在 review 中指出,ArmCPUUnquantizedExpertsis_supported_config 实现应保留,并为 PowerCPUUnquantizedExperts 重复该逻辑。作者已回复“Addressed this, apologies on my end for this.”并修正。这条评论体现了对基类结构一致性的关注。

实现拆解

  1. 新增 csrc/cpu/micro_gemm/cpu_micro_gemm_vsx.hpp,实现 TileGemmVSX 模板,基于 Power10 MMA 指令(如 __builtin_mma_xvbf16ger2pp)提供 8-16-16 模式的 GEMM 计算,并包含 M<=4 的 VSX 回退路径。
  2. 扩展 csrc/cpu/utils.hppISA 枚举,新增 VSX 类型,并支持 "vsx" 字符串解析。
  3. csrc/cpu/cpu_fused_moe.cpp 中,通过 __powerpc64__ 条件编译添加 VSX 分发宏,使 CPU fused MoE 能够调用 VSX 微内核。
  4. vllm/model_executor/layers/fused_moe/experts/cpu_moe.py 中新增 PowerCPUUnquantizedExperts 类,设置对齐参数并定义设备支持检查,作为后端选择入口。
  5. vllm/model_executor/layers/fused_moe/oracle/unquantized.py 中接入 PowerCPUUnquantizedExperts 到后端选择列表。
  6. 测试配套:更新 tests/kernels/moe/test_cpu_fused_moe.py,在 ISA 列表和专家类映射中加入 VSX。
文件 模块 状态 重要度
csrc/cpu/micro_gemm/cpu_micro_gemm_vsx.hpp CPU 内核 added 8.65
vllm/model_executor/layers/fused_moe/experts/cpu_moe.py MoE 专家 modified 8.0
csrc/cpu/cpu_fused_moe.cpp 内核分发 modified 5.95
csrc/cpu/utils.hpp 工具层 modified 5.77
vllm/model_executor/layers/fused_moe/oracle/unquantized.py 后端路由 modified 4.89
tests/kernels/moe/test_cpu_fused_moe.py MoE 测试 modified 4.73

关键符号

TileGemmVSX::gemm TileGemmVSX::gemm_micro TileGemmVSX::gemm_micro_vsx_fallback PowerCPUUnquantizedExperts._supports_current_device PowerCPUUnquantizedExperts.is_supported_config

关键源码片段

vllm/model_executor/layers/fused_moe/experts/cpu_moe.py data-contract

新增 `PowerCPUUnquantizedExperts` 类,定义后端选择逻辑和设备支持检查

class PowerCPUUnquantizedExperts(CPUUnquantizedExperts):
    """PowerPC VSX grouped-gemm unquantized MoE experts."""
​
    # 标识使用的 ISA 类型,用于运行时选择
    isa = "vsx"
    # 输出对齐:16 字节,满足 VSX 向量访问要求
    output_alignment = 16
    # 归约对齐:2 表示 BF16 的字节宽度
    reduction_alignment = 2
​
    @staticmethod
    def _supports_current_device() -> bool:
        # 仅在 PowerPC 架构的 CPU 上启用此后端
        return (
            current_platform.is_cpu()
            and current_platform.get_cpu_architecture() == CpuArchEnum.POWERPC
        )
​
    @staticmethod
    def is_supported_config(
        cls: type[mk.FusedMoEExperts],
        moe_config: FusedMoEConfig,
        weight_key: QuantKey | None,
        activation_key: QuantKey | None,
        activation_format: mk.FusedMoEActivationFormat,
    ) -> tuple[bool, str | None]:
        # 先调用基类的通用检查,确保基本配置合法
        supported, reason = mk.FusedMoEExperts.is_supported_config(
            cls, moe_config, weight_key, activation_key, activation_format
        )
        if not supported:
            return supported, reason
        # 此内核仅支持 bfloat16 激活
        if moe_config.in_dtype != torch.bfloat16:
            return False, "kernel requires bfloat16 activations"
        # 复用 CPU 未量化专家的 grouped-gemm 支持检查
        cpu_cls = cast(type[CPUUnquantizedExperts], cls)
        return cpu_cls._supports_grouped_gemm(moe_config)

评论区精华

ArmCPUUnquantizedExperts 结构保持 设计

bigPYJ1151 指出,`is_supported_config` 的逻辑应保留在 `ArmCPUUnquantizedExperts` 中,并为 `PowerCPUUnquantizedExperts` 重复,而不是共用。

结论:作者已修正,将 `is_supported_config` 重复到新的 `PowerCPUUnquantizedExperts` 类中,保持基类结构不变。 · 已解决

风险与影响

新增架构特定代码,但通过条件编译和 _supports_current_device 限制,其他架构不受影响。性能调优复杂(25 个提交中有多次优化与回退),且仅在 Power10 上验证,其他 Power 型号(如 POWER9)可能未覆盖。测试仅在 CPU 架构上运行,Power 架构的 CI 覆盖可能缺失。

对 Power 用户的预填充性能提升显著,对非 Power 用户无影响。团队需维护额外的架构特定代码,但通过模块化设计降低了侵入性。

架构特定实现 缺少 Power CI 验证 性能调优复杂

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论