# PR #50322 完整报告

- 仓库：`vllm-project/vllm`
- 标题：Add FlashMLA H100 tests to CI, fix them after #32810
- 合并时间：2026-07-30 13:06
- 原文链接：http://prhub.com.cn/vllm-project/vllm/pull/50322

---

# 执行摘要

- 一句话：为 FlashMLA H100 测试修复并添加 CI
- 推荐动作：此 PR 属于常规测试维护，不需要精读，但值得关注其 CI 配置模式，以便在类似场景中复用。

# 功能与动机

作者发现本地 H100 上 FlashMLA 测试因 #32810 接口变更而损坏，且未被 CI 覆盖，因此修复测试并加入 CI，以预防回归。

# 实现拆解

1. **修复 `tests/kernels/attention/test_flashmla.py`**：更新 import 语句以添加新函数 `flash_mla_with_kvcache_fp8` 和 `get_mla_metadata_dense_fp8`；调整测试逻辑，在 FP8 路径中使用新的 API 调用，并将 `descale_q/descale_k` 参数仅传递给 FP8 分支。
2. **修复 `tests/kernels/attention/test_mla_cross_layer_kernel_equivalence.py`**：将 `test_flashmla_dense_fp8_decode_unified_slot_view` 测试中的 query 初始化改为 `torch.float8_e4m3fn`，以匹配量化 KV 缓存场景下 FP8 密集 MLA 核心对输入 dtype 的要求。
3. **新增 Buildkite CI 步骤**：在 `.buildkite/test_areas/kernels.yaml` 中添加 `Kernels FlashMLA Test (H100)` 步骤，设置超时 25 分钟，指定 H100 设备，配置源文件依赖关系，并运行三个测试文件。
4. **配置项调整**：无其他配置修改。

关键文件：
- `tests/kernels/attention/test_flashmla.py`（模块 内核测试；类别 test；类型 test-coverage）: 核心测试文件，修复了因 #32810 接口变更导致的 FP8 路径问题，并调整了 import 和调用逻辑。
- `.buildkite/test_areas/kernels.yaml`（模块 CI 配置；类别 config；类型 configuration）: 新增了 FlashMLA H100 测试的 CI 步骤，是防止回归的关键配置变更。
- `tests/kernels/attention/test_mla_cross_layer_kernel_equivalence.py`（模块 内核测试；类别 test；类型 test-coverage）: 修复了 FP8 decode 测试中 query 的 dtype 问题，确保与量化 KV 缓存一致。

关键符号：test_flash_mla, test_flashmla_dense_fp8_decode_unified_slot_view

## 关键源码片段

### `tests/kernels/attention/test_flashmla.py`

核心测试文件，修复了因 #32810 接口变更导致的 FP8 路径问题，并调整了 import 和调用逻辑。

```python
# 新增导入：flash_mla_with_kvcache_fp8 和 get_mla_metadata_dense_fp8
from vllm.v1.attention.ops.flashmla import (
    flash_mla_with_kvcache,
    flash_mla_with_kvcache_fp8,   # 新增
    get_mla_metadata,
    get_mla_metadata_dense_fp8,   # 新增
    is_flashmla_dense_supported,
)

# 在 test_flash_mla 函数中，根据 use_fp8 分支调用不同 API
if use_fp8:
    tile_scheduler_metadata, num_splits = get_mla_metadata_dense_fp8(
        cache_seqlens, s_q * h_q // h_kv, h_kv
    )
else:
    tile_scheduler_metadata, num_splits = get_mla_metadata(
        cache_seqlens, s_q * h_q // h_kv, h_kv
    )

# 并在 flash_mla 内部函数中同样区分
if use_fp8:
    return flash_mla_with_kvcache_fp8(
        q, blocked_k, block_table, cache_seqlens, dv,
        tile_scheduler_metadata, num_splits,
        causal=causal, descale_q=descale_q, descale_k=descale_k,
    )
return flash_mla_with_kvcache(
    q, blocked_k, block_table, cache_seqlens, dv,
    tile_scheduler_metadata, num_splits,
    causal=causal,
    # 注意：descale_q/descale_k 不再传入原始函数
)

```

# 评论区精华

只有一个评论：作者担心新 CI 步骤的 `timeout_in_minutes: 25` 可能过于宽松，因为测试本地运行不到 5 分钟。未引起进一步讨论，已合并。

- CI 超时时间设置 (other): 未修改，保留 25 分钟作为安全余量。

# 风险与影响

- 风险：风险极低。仅修改了测试文件和 CI 配置，不影响核心运行时逻辑。新增 CI 步骤可能增加少量排队时间，但影响可控。
- 影响：对用户无直接影响。对开发者：FlashMLA 相关代码在 H100 上的回归将被 CI 捕获，提高代码质量。
- 风险标记：暂无

# 关联脉络

- PR #32810 [Interface] Refactor FlashMLA API: 本 PR 修复了 #32810 引入的接口变更导致的测试损坏。