Prhub

#49664 [XPU] [Linear] add torch as xpu linear backend

原始 PR 作者 zufangzhu 合并时间 2026-08-03 14:30 文件变更 5 提交数 8 评论 3 代码增减 +15 / -8

执行摘要

XPU 新增 torch 作为 FP8 linear backend 选项

PR body 仅给出用法示例(vllm serve ... --quantization fp8 --linear-backend torch),未附 issue 或明确动机说明。从变更内容推断,目标是让 XPU 上的 FP8 线性层有除自定义 XPU kernel 之外的 torch 原生实现可供选择,便于调试、性能对比或在自定义 kernel 不可用时兜底。文档明确指出 --linear-backend torch 会强制 W8A8 但走 torch._scaled_mm,可见该选项定位为与 --linear-backend xpu 平行的替代执行路径。

这是一个小而清晰的平台扩展 PR,适合对 XPU 或 quantization 内核选择机制感兴趣的开发者精读。重点看 TorchFP8ScaledMMLinearKernel.is_supported 的平台门槛写法,以及 _POSSIBLE_FP8_KERNELS 的优先级注册方式;同时注意该 PR 没有新增单元测试,仅靠 CI 示例命令覆盖,后续可考虑补充针对平台判断与方案选择的单测。

讨论亮点

PR 本身几乎没有技术讨论。唯一有信息量的是 jikunshang 在合并前评论 'intel/ci fixed in https://github.com/vllm-project/vllm/pull/50807',说明本 PR 的 Intel CI 问题依赖外部 PR #50807 修复;mergify 曾提示合并冲突并要求 rebase,提交历史中的两次 Merge branch 'main' 表明冲突已通过同步 main 解决。claude[bot] 因 fork 来源跳过自动 review,最终由 jikunshang 直接 approve。

实现拆解

  1. 平台门槛扩展vllm/model_executor/kernels/linear/scaled_mm/pytorch.pyTorchFP8ScaledMMLinearKernel.is_supported() 在原 is_cuda_alike() or is_cpu() 基础上加入 current_platform.is_xpu(),并将错误信息改为 requires ROCm, CUDA, CPU or XPU.。这使得 torch 系列 FP8 scaled-MM 内核在 XPU 上通过准入检查;compute_capability < 89 的限制仅对真实 GPU 生效。
  2. 量化方案判定更新vllm/model_executor/layers/quantization/compressed_tensors/compressed_tensors.py_get_scheme_from_parts() 在 XPU 分支中,把 config.kernel_config.linear_backend in ("xpu", "torch") 作为启用 W8A8 FP8 linear kernel 的条件;未显式选择时仍回退 W8A16,保证 --linear-backend torch 的模型正确映射到 CompressedTensorsW8A8Fp8 方案。
  3. 内核注册表登记vllm/model_executor/kernels/linear/__init__.py_POSSIBLE_FP8_KERNELS[PlatformEnum.XPU] 候选列表末尾追加 PerTensorTorchFP8ScaledMMLinearKernelChannelWiseTorchFP8ScaledMMLinearKernel,使内核自动选择也能把 torch 实现作为 XPU 的低优先级候选。
  4. CI 冒烟覆盖.buildkite/intel_jobs/test-intel.yaml 的 "XPU W8A8 FP8 Linear Examples" 步骤新增两条 --linear-backend torch 的推理示例(Llama-3.1-8B FP8 与 Llama-3.2-1B dynamic FP8),保证该路径在 Intel GPU CI 上持续可运行。
  5. 文档同步docs/features/quantization/online.md 明确说明 --linear-backend torch 在 XPU 上同样强制 W8A8,但 GEMM 走 torch._scaled_mm 而非自定义 XPU kernel。

说明:本次变更没有新增单元测试文件,回归保障主要依赖上述 CI 示例命令;block-wise 的 torch kernel 被作者拆到另一个 PR 实现,本 PR 只覆盖非 block FP8 路径。

文件 模块 状态 重要度
vllm/model_executor/kernels/linear/scaled_mm/pytorch.py 线性内核 modified 5.88
vllm/model_executor/layers/quantization/compressed_tensors/compressed_tensors.py 量化层 modified 5.64
vllm/model_executor/kernels/linear/__init__.py 内核注册 modified 4.73
.buildkite/intel_jobs/test-intel.yaml CI 配置 modified 3.08
docs/features/quantization/online.md 量化文档 modified 1.52

关键符号

TorchFP8ScaledMMLinearKernel.is_supported _get_scheme_from_parts

关键源码片段

vllm/model_executor/kernels/linear/scaled_mm/pytorch.py platform-gate

核心平台门槛扩展:让 torch 系列 FP8 scaled-MM 内核在 XPU 上通过准入检查,是本 PR 的功能入口。

# vllm/model_executor/kernels/linear/scaled_mm/pytorch.py
class TorchFP8ScaledMMLinearKernel(FP8ScaledMMLinearKernel):
    """基于 torch 的 FP8 scaled-MM 线性内核基类。"""
​
    @classmethod
    def is_supported(
        cls, compute_capability: int | None = None
    ) -> tuple[bool, str | None]:
        # 平台门槛:CUDA 类(含 ROCm)、CPU、XPU 均可走 torch 路径;
        # 新增 is_xpu() 是本 PR 的核心,让 torch._scaled_mm 在 Intel GPU 上可用。
        if not (
            current_platform.is_cuda_alike()
            or current_platform.is_cpu()
            or current_platform.is_xpu()
        ):
            return False, "requires ROCm, CUDA, CPU or XPU."
​
        # 仅对真实 GPU 的 compute capability 做门槛;
        # CPU / XPU 通常传入 None,因此会跳过该检查。
        if compute_capability is not None and compute_capability < 89:
            return False, "requires compute capability 89 and above."
​
        return True, None
vllm/model_executor/layers/quantization/compressed_tensors/compressed_tensors.py data-contract

决定 XPU 上 FP8 W8A8 方案是否启用:把 torch 纳入可触发 W8A8 的 backend 集,影响量化方案选择的契约。

# vllm/model_executor/layers/quantization/compressed_tensors/compressed_tensors.py
if act_quant_format and self._is_fp8_w8a8(weight_quant, input_quant):
    if current_platform.is_xpu():
        # XPU 上默认回退到 W8A16;
        # 只有显式选择 xpu 或 torch backend 时才启用 W8A8 FP8 linear kernel。
        config = get_current_vllm_config_or_none()
        is_fp8_w8a8_supported = config is not None and (
            config.kernel_config.linear_backend in ("xpu", "torch")
        )
    else:
        # 非 XPU 平台按 compute capability 判断是否支持 W8A8。
        is_fp8_w8a8_supported = self._check_scheme_supported(
            CompressedTensorsW8A8Fp8.get_min_capability(), error=False
        )
    if is_fp8_w8a8_supported:
        return CompressedTensorsW8A8Fp8(
            weight_quant=weight_quant,
            is_static_input_scheme=(input_quant and not input_quant.dynamic),
        )
    # 不支持 W8A8 时回退到 W8A16;input_quant 仅用于加载期判断。
    return CompressedTensorsW8A16Fp8(
        weight_quant=weight_quant,
        is_static_input_scheme=not input_quant.dynamic,
    )

评论区精华

合并冲突需 rebase 才能合并 other

mergify[bot] 提示 'This pull request has merge conflicts that must be resolved before it can be merged. Please rebase the PR'。随后提交历史中出现两次 'Merge branch main',说明冲突已通过同步 main 解决。

结论:通过同步 main 分支解决冲突,PR 最终被合并。 · 已解决

Intel CI 依赖外部 PR #50807 修复 other

jikunshang 在评论中指出本 PR 的 Intel CI 问题已在 https://github.com/vllm-project/vllm/pull/50807 修复。

结论:CI 修复落地后该 PR 通过审批合并。 · 已解决

fork 来源 PR 自动 review 被禁用 other

claude[bot] 说明来自 fork 的 PR 自动 review 被禁用,需要维护者手动触发一次性 review。

结论:最终由维护者 jikunshang 人工 approve。 · closed

风险与影响

  1. 自动内核选择行为变化__init__.py 将 torch 内核加入 XPU 候选列表后,即使不指定 --linear-backend,内核自动选择也可能在特定条件下回落到 torch 路径(优先级在 XPU 原生内核之后);若 torch._scaled_mm 在 XPU 上性能或数值行为不如预期,可能影响未显式选择 backend 的用户。
  2. 缺少单元测试:本次仅新增 CI 冒烟命令,没有针对 is_supported 与方案判定的单元测试,平台组合(CPU/XPU/ROCm)回归主要依赖硬件 CI。
  3. scheme 选择的连带影响--linear-backend torch 现在会触发 W8A8 方案,若用户对不支持 FP8 的模型使用该选项,行为可能从原先的 W8A16 回退变为报错或错误方案,需要关注边界。
  4. 依赖 torch 版本:XPU 上 torch._scaled_mm 的可用性与性能受 torch 版本影响,属于外部依赖风险。

影响范围:主要影响 Intel GPU(XPU)上使用 FP8 量化的用户;新增了一个可选的 linear backend,不影响 CUDA/ROCm 默认路径;CI 耗时略有增加,文档为量化特性补充说明了新选项。对团队而言,这是 XPU 内核选择体系的一次小扩展,后续可基于同一框架继续添加其他平台或内核变体。

缺少单元测试 自动内核选择行为变化 依赖 torch._scaled_mm 版本行为 量化方案选择边界变化

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论