Prhub

#49451 Revert "[MRV2] Always build attn metadata at capture time" (#49364)

原始 PR 作者 vllm-agent 合并时间 2026-07-24 00:51 文件变更 2 提交数 1 评论 1 代码增减 +21 / -35

执行摘要

回滚导致 GPU coredump 的 attn metadata 构建变更

Nightly CI 构建 #79322 中的 V1 Sample + Logits 任务(5 个测试用例)全部因 RuntimeError: Engine core initialization failed 失败,根因为原 PR #49364 移除了 skip_attn 保护,使 CUDA graph 捕获阶段 PIECEWISE 模式下 FlashAttention Sm90 内核触发 GPU coredump(非法地址异常)。

该 PR 值得精读,因为它揭示了一个重要的设计约束:在 CUDA graph 捕获中,FlashAttention Sm90 内核在 eager 模式下对模拟输入敏感,不能简单移除 skip_attn 保护。后续如果要重新引入该特性,需要更稳健的条件判断。

讨论亮点

njhill 批准了该 PR,并就失败了 1 个 job(5 个测试用例)。没有其他深入的讨论。

实现拆解

  1. 恢复 skip_attn 参数:在 vllm/v1/worker/gpu/cudagraph_utils.py 中,将 prepare_inputs_to_capture 函数的参数从 full_cudagraph: bool 改为 skip_attn: bool = False,调用点传入条件 desc.cg_mode == CUDAGraphMode.PIECEWISE and not self.use_breakable_cg
  2. 恢复注意力元数据构建逻辑:当 skip_attn=True 时,attn_metadata 被设为 None,不再调用 model_state.prepare_attn,避免触发 FlashAttention 内核。
  3. 添加断言检查:在 forward_fn 的 PIECEWISE 分支中添加 assert (attn_metadata is not None) == self.use_breakable_cg,确保元数据存在性与可中断 CUDA graph 模式一致。
  4. 同步修改推测解码路径:在 vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py 中,同样将 prepare_inputs_to_capture 调用中的 full_cudagraph 替换为 skip_attn,保持行为一致。
文件 模块 状态 重要度
vllm/v1/worker/gpu/cudagraph_utils.py cudagraph 工具 modified 6.45
vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py 推测解码 cudagraph modified 5.13

关键符号

prepare_inputs_to_capture

关键源码片段

vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py core-logic

同步修改推测解码的 CUDA graph 捕获路径,与主路径保持一致。

# vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py
# 在 SpecDecodeWorkerCUDAGraphRunner 的 capture 方法中def create_forward_fn(desc, warmup):
    # ...
    attn_metadata, slot_mappings = prepare_inputs_to_capture(
        num_reqs,
        num_tokens,
        model_state,
        input_buffers,
        block_tables,
        attn_groups,
        kv_cache_config,
        # 原 : full_cudagraph=desc.cg_mode == CUDAGraphMode.FULL
        skip_attn=(
            desc.cg_mode == CUDAGraphMode.PIECEWISE
            and not self.use_breakable_cg
        ),
    )
    return lambda cg_mode: forward_fn(
        num_reqs, num_tokens, attn_metadata, slot_mappings, ...
    )

评论区精华

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

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

风险与影响

低风险。此 PR 是回滚到已知稳定的状态,仅恢复了一个此前引发显式回归的特性。主要风险是注意力的行为依赖假设(如 Inkling sconv、DSV4 compressor)在回滚后不再成立,但该回滚本身就是恢复到此前已有测试覆盖的状态。

影响范围限于 CUDA graph 捕获(特别是 PIECEWISE 模式)。回滚后,非可中断 PIECEWISE 图捕获期间将跳过注意力元数据构建,恢复到原状,修复了 Hopper GPU 上的 EngineCore 初始化崩溃。用户无需任何操作。

回滚操作

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论