Prhub

#43307 [Kernel][Test] Extend lightning_attn and awq_triton kernel tests to XPU

原始 PR 作者 adobrzyn 合并时间 2026-06-05 02:26 文件变更 3 提交数 6 评论 5 代码增减 +37 / -19

执行摘要

扩展 Lightning/AWQ Triton 测试到 XPU

Lightning Attention 和 AWQ Triton 底层内核是纯 Triton 实现,已在 Intel XPU 上验证通过。但测试套件将设备硬编码为 "cuda",导致无法在 XPU 上运行。PR 旨在消除这一限制,使覆盖范围从 CUDA/ROCm 扩展到 XPU,无需修改内核代码。

该 PR 是低风险、高收益的平台扩展,值得合并。设计决策(使用 current_platform 代替硬编码设备字符串)已被多个历史 PR 采用,是 vLLM 平台抽象层的良好实践。测试团队可参考此模式为其他 Triton 内核添加多平台覆盖。

讨论亮点

评论者 AndreasKaratzas 对源码修改提出疑问:“为什么要这样做?” 作者 adobrzyn 解释:如果不加判断,torch.cuda.get_device_capability() 每次 forward 时都会执行,在 XPU(以及其他非 CUDA 构建)上会抛出 AssertionError: Torch not compiled with CUDA enabled,因此需要添加 current_platform.is_cuda() 守卫。该解释已被接受,PR 最终获得批准。

实现拆解

  1. 测试文件适配:在两个测试文件 tests/kernels/attention/test_lightning_attn.pytests/kernels/quantization/test_awq_triton.py 中:
    • 导入 vllm.platforms.current_platform,并定义 DEVICE = current_platform.device_type
    • 添加模块级 pytestmark,当平台既不是 is_cuda_alike() 也不是 is_xpu() 时跳过整个测试文件。
    • 将所有 device="cuda"torch.set_default_device("cuda") 替换为 DEVICE
  2. 源码层修复:在 vllm/model_executor/layers/lightning_attn.py_attention.forward 中,将原来的无条件 torch.cuda.get_device_capability() 调用包装在 if current_platform.is_cuda(): 条件内,防止非 CUDA 环境调用 CUDA API 时崩溃。
  3. 测试验证:在 Intel Battlemage B70(XPU)上运行 370 passed,在 CUDA/ROCm 上行为不变(依赖于现有 CI)。
文件 模块 状态 重要度
vllm/model_executor/layers/lightning_attn.py 注意力层 modified 6.77
tests/kernels/attention/test_lightning_attn.py Lightning 测试 modified 5.2
tests/kernels/quantization/test_awq_triton.py AWQ 测试 modified 4.77

关键源码片段

vllm/model_executor/layers/lightning_attn.py compat-fix

修复了在非 CUDA 环境下无条件调用 CUDA API 的问题,是保证 XPU 兼容性的关键改动。

# vllm/model_executor/layers/lightning_attn.py (class _attention.forward)# 检查 CUDA 计算能力(Ampere+ 是 flash attention 路径的前提条件)。
# 其他加速器(ROCm、XPU)依赖各自的 Triton 后端支持,跳过此检查。
if current_platform.is_cuda():
    capability = torch.cuda.get_device_capability()
    if capability[0] < 8:
        raise RuntimeError(
            "Flash attention currently only supported",
            "for compute capability >= 80",
        )
tests/kernels/attention/test_lightning_attn.py test-coverage

将测试设备从硬编码 CUDA 改为平台感知的 DEVICE,并添加平台跳过标记,使得 Lightning Triton 测试可在 XPU 上运行。

# tests/kernels/attention/test_lightning_attn.py 头部from vllm.platforms import current_platformDEVICE = current_platform.device_type# 仅在 CUDA/ROCm 或 XPU 上运行该类测试
pytestmark = pytest.mark.skipif(
    not (current_platform.is_cuda_alike() or current_platform.is_xpu()),
    reason="Lightning attention Triton kernels require CUDA/ROCm or XPU.",
)
tests/kernels/quantization/test_awq_triton.py test-coverage

与 Lightning 测试相同,将 AWQ Triton 测试设备硬编码改为平台感知,并添加跳过标记。

# tests/kernels/quantization/test_awq_triton.py 头部from vllm.platforms import current_platform# 仅在 CUDA/ROCm 或 XPU 上运行该类测试
pytestmark = pytest.mark.skipif(
    not (current_platform.is_cuda_alike() or current_platform.is_xpu()),
    reason="AWQ Triton kernels require CUDA/ROCm or XPU.",
)device = current_platform.device_type

评论区精华

为什么需要在 lightning_attn.py 添加 current_platform.is_cuda() 守卫 正确性

AndreasKaratzas 询问添加该守卫的必要性。adobrzyn 解释:在非 CUDA 构建上调用 `torch.cuda.get_device_capability()` 会引发 `AssertionError: Torch not compiled with CUDA enabled`,因此需要用 `current_platform.is_cuda()` 保护。

结论:添加守卫是正确的,避免了 XPU 等平台上的崩溃。 · 已解决

风险与影响

  • 回归风险(低):CUDA 路径仅增加了 if 条件检查,行为完全一致;非 CUDA 路径现在跳过了 capability 检查,但对于非 CUDA 平台该检查本就不适用。
  • 兼容性风险(低):仅测试和源码层添加了平台抽象,未改动内核或数据结构。若未来有新的平台(如 HPU)需要支持,需在 current_platform 中添加相应判断。
  • 性能影响(无):仅在 forward 调用中增加一次 current_platform.is_cuda() 布尔检查,开销可忽略。
  • 对用户:Intel XPU 用户现在可以在 vLLM 中运行 Lightning Attention 和 AWQ Triton 的测试套件,确保这些 Triton 内核的正确性。
  • 对系统lightning_attn.py 的修改使得在 XPU 或 ROCm(不含 CUDA)环境下也能正确初始化,不再因 CUDA API 调用而崩溃。
  • 对团队:为未来更多平台(如 HPU、Ascend)支持提供了可复用的模式(使用 current_platform 抽象)。
兼容性修复 测试覆盖扩展

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论