# PR #49231 完整报告

- 仓库：`vllm-project/vllm`
- 标题：[CI] Exercise FA3 FP8 attention on SM90
- 合并时间：2026-07-21 10:26
- 原文链接：http://prhub.com.cn/vllm-project/vllm/pull/49231

---

# 执行摘要

- 一句话：启用 H100 上 FA3 FP8 注意力测试覆盖
- 推荐动作：值得合入，作为测试覆盖补强和小型 dtype 处理学习点。建议关注后续 CI 运行结果，验证 H200 上的实际通过情况。

# 功能与动机

根据 PR #43024 的 review 反馈（discussion_r3614823352），H200 CI 迁移时跳过了 SM90 上 `test_online_quantization` 的 `kv_cache_dtype=fp8` 组合，声称 FlashAttention 3 不支持 FP8 attention。但 FA3 实际支持 FP8 query 输入，只是要求输出为 BF16 dtype。因此需要修复 dtype 配置并恢复测试，以填补测试覆盖缺口。

# 实现拆解

1. 在 `tests/quantization/test_fp8.py` 的 `test_online_quantization` 函数中，移除了针对 SM90 + FP8 KV cache 的 `pytest.skip()` 调用。
2. 新增 `model_dtype` 变量，默认值为 `"auto"`；当 `kv_cache_dtype == "fp8"` 且 GPU 计算能力族为 90 时，将 `model_dtype` 设为 `"bfloat16"`。
3. 在 `vllm_runner` 调用中增加 `dtype=model_dtype` 参数，确保 FA3 接收到 BF16 输出张量。
4. 改动仅涉及一个测试文件，通过修改模型 dtype 而非输出张量，保持了 vLLM 主逻辑不变。

关键文件：
- `tests/quantization/test_fp8.py`（模块 测试；类别 test；类型 test-coverage；符号 test_online_quantization）: 唯一变更文件，修改测试的 dtype 配置，移除跳过条件，启用 FA3 FP8 attention 测试覆盖。

关键符号：test_online_quantization

## 关键源码片段

### `tests/quantization/test_fp8.py`

唯一变更文件，修改测试的 dtype 配置，移除跳过条件，启用 FA3 FP8 attention 测试覆盖。

```python
# tests/quantization/test_fp8.py

def test_online_quantization(
    vllm_runner,
    kv_cache_dtype: str,
    force_marlin: bool,
    use_rocm_aiter: bool,
    monkeypatch,
) -> None:
    # 移除了以下跳过逻辑：
    # if kv_cache_dtype == "fp8" and current_platform.is_device_capability_family(90):
    # pytest.skip("FA3 currently rejects FP8 KV cache output dtype on SM90")

    if use_rocm_aiter:
        monkeypatch.setenv("VLLM_ROCM_USE_AITER", "1")

    # `LLM.apply_model` requires pickling a function.
    monkeypatch.setenv("VLLM_ALLOW_INSECURE_SERIALIZATION", "1")

    if force_marlin:
        monkeypatch.setenv("VLLM_TEST_FORCE_FP8_MARLIN", "1")

    # 新增：当 SM90 + FP8 KV cache 时，FA3 要求输出为 BF16
    model_dtype = "auto"
    if kv_cache_dtype == "fp8" and current_platform.is_device_capability_family(90):
        # FA3 requires BF16 output when the query input is FP8.
        model_dtype = "bfloat16"

    with vllm_runner(
        "facebook/opt-125m",
        quantization="fp8",
        dtype=model_dtype,   # 新增参数，传递给模型
        enforce_eager=True,
        kv_cache_dtype=kv_cache_dtype,
    ) as llm:
        # ... 后续校验保持不变
        pass

```

# 评论区精华

无审核评论讨论；仅 `claude[bot]` 自动评论，且 `Isotr0py` 直接批准。

- 暂无高价值评论线程

# 风险与影响

- 风险：风险极低：
 - 变更仅影响测试文件，不涉及生产代码。
 - 仅针对 SM90 + FP8 KV cache 场景，将模型 dtype 从默认 FP16 改为 BF16；BF16 是 FP8 训练 / 推理中常用的 dtype，不会引入精度问题。
 - 测试此前被跳过，因此不存在回归风险。
- 影响：影响范围有限：
 - 仅影响 H100/H200 GPU 上运行 `test_online_quantization` 测试时的 CI 流程。
 - 使得 SM90 上的 FA3 FP8 attention 路径被正常测试，提升 CI 覆盖率。
 - 对用户无直接影响，不改变模型行为。
 - 风险标记：暂无

# 关联脉络

- PR #43024 PR introducing H200 CI migration (reference in PR body): 本 PR 的动机源自该 PR 的 review 反馈（discussion_r3614823352），其中跳过了 SM90 + FP8 KV cache 的测试组合。