Prhub

#42736 [Kernel][Test] Make kernel tests for mamba dual-HW (CUDA + XPU)

原始 PR 作者 adobrzyn 合并时间 2026-06-08 08:22 文件变更 3 提交数 11 评论 1 代码增减 +49 / -14

执行摘要

使 Mamba 混合内核测试可同时在 CUDA 和 XPU 上运行

使 MambaMixer Triton kernel 测试在 Intel XPU 上可运行。底层内核已经是纯 Triton 实现,只在 XPU 上工作,但测试框架硬编码了 'cuda' 设备,导致测试无法在 XPU 上执行。PR body 原文:'Make the MambaMixer Triton kernel tests under tests/kernels/mamba/ runnable on Intel XPU in addition to CUDA/ROCm. The underlying kernels ... are pure Triton and already work on XPU - only the test harness was pinning device="cuda".'

值得快速浏览,展示了 vLLM 平台层进行跨平台测试适配的推荐模式。如果负责 XPU 或多平台测试,可以精读以复用该模式。PR 作者工作规范,测试结果详尽,提交历史清晰,适合作为测试适配的参考范例。

讨论亮点

本 PR 的 review 没有实质性讨论。AndreasKaratzas 和 jikunshang 均直接批准,gemini-code-assist 机器人评论无反馈。

实现拆解

  1. 在每个测试文件中导入 from vllm.platforms import current_platform 并定义 DEVICE = current_platform.device_type
  2. 添加模块级 pytestmark = pytest.mark.skipif(...),确保文件仅在 CUDA-alike 或 XPU 平台上运行,否则跳过并给出明确原因。
  3. 将文件中所有 device="cuda" 的硬编码字面量替换为 device=DEVICE,包括测试辅助函数 generate_random_inputsgenerate_continuous_batched_examples 以及各个测试函数中的 device 变量。
  4. test_mamba_ssm.py 中,为依赖 CUDA-only C++ op ops.selective_scan_fwd 的测试(test_selective_scantest_selective_scan_varlen)添加 @skip_unless_cuda_alike 装饰器,使其在非 CUDA 平台明确跳过而非报错。
  5. 修复 test_causal_conv1d.pytest_causal_conv1d_varlen 函数里遗漏的 cumsum.cuda() 调用,改为 cumsum.to(device),解决 XPU 上“Torch not compiled with CUDA enabled” 断言失败。
  6. 验证结果:在 Intel Battlemage B70(XPU)上完整运行,506 passed,56 skipped,exit code 0。
文件 模块 状态 重要度
tests/kernels/mamba/test_mamba_ssm_ssd.py 测试 modified 5.36
tests/kernels/mamba/test_mamba_ssm.py 测试 modified 5.07
tests/kernels/mamba/test_causal_conv1d.py 测试 modified 4.98

关键符号

generate_random_inputs generate_continuous_batched_examples test_selective_scan test_selective_state_update test_selective_scan_varlen test_causal_conv1d_update test_causal_conv1d_varlen

关键源码片段

tests/kernels/mamba/test_mamba_ssm_ssd.py test-coverage

核心变更,展示了如何为纯 Triton 测试添加 XPU 支持,包括平台导入、DEVICE 定义和模块跳过条件。

# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM projectimport pytest
import torch
import torch.nn.functional as F
from einops import rearrange, repeatfrom vllm.model_executor.layers.mamba.ops.ssd_combined import (
    mamba_chunk_scan_combined_varlen,
)
from vllm.platforms import current_platform # 新增导入,用于获取当前平台类型
from vllm.utils.torch_utils import set_random_seed
from vllm.v1.attention.backends.mamba2_attn import compute_varlen_chunk_metadata# 所有在此文件测试的内核都是纯 Triton 实现,因此可以在任何 vLLM 平台层
# 视为 CUDA-alike 或 XPU 的设备上运行。
DEVICE = current_platform.device_type # 动态获取设备类型,替代硬编码的 "cuda"# 模块级跳过条件:仅当平台是 CUDA-alike 或 XPU 时才运行测试,
# 否则跳过并给出清晰原因。
pytestmark = pytest.mark.skipif(
    not (current_platform.is_cuda_alike() or current_platform.is_xpu()),
    reason="Mamba2 SSD Triton kernels require a CUDA-alike or XPU device.",
)# ...(其余代码,包括 ssd_minimal_discrete 等,未改动)...def generate_random_inputs(batch_size, seqlen, n_heads, d_head, itype, device=DEVICE):
    """生成随机输入,device 参数默认使用全局 DEVICE。"""
    set_random_seed(0)
    A = -torch.exp(torch.rand(n_heads, dtype=itype, device=device))
    dt = F.softplus(
        torch.randn(batch_size, seqlen, n_heads, dtype=itype, device=device) - 4
    )
    X = torch.randn((batch_size, seqlen, n_heads, d_head), dtype=itype, device=device)
    B = torch.randn((batch_size, seqlen, n_heads, d_head), dtype=itype, device=device)
    C = torch.randn((batch_size, seqlen, n_heads, d_head), dtype=itype, device=device)
    return A, dt, X, B, C

评论区精华

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

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

风险与影响

风险极低。变更仅涉及测试代码中的设备选择逻辑,没有修改任何内核、模型或推理路径。CUDA 行为通过 CI 保持不变。XPU 运行结果已完整验证,506 个测试全部通过,56 个预期跳过。唯一可能的风险是若未来平台层 API 变更可能导致测试跳过条件失效,但此类 API(is_cuda_alikeis_xpu)相对稳定。

对最终用户无影响。对开发者:XPU 平台开发者现在可以自动运行这些测试,确保 Mamba 内核正确性。对团队:建立了跨平台测试适配的通用模式,可复用于其他测试套件。影响范围限定在测试基础设施,程度中等。

仅测试变更 XPU 已验证 无核心逻辑改动

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论