# PR #40961 完整报告

- 仓库：`vllm-project/vllm`
- 标题：[BugFix] Preserve max_seq_len in ubatch metadata during CUDA graph capture
- 合并时间：2026-05-05 12:29
- 原文链接：http://prhub.com.cn/vllm-project/vllm/pull/40961

---

# 执行摘要

- 一句话：修复 SWA 模型 CUDA graph 捕获时内核选择错误
- 推荐动作：值得快速合并，修复简单且关键。建议阅读 `_make_metadata_with_slice` 函数以理解 CUDA graph 捕获时的元数据兼容性设计。

# 功能与动机

SWA 模型在 CUDA graph 捕获时，由于 `seqlen` 被误设为 1，导致错误地选择了全注意力内核。PR body 指出："the current code would incorrectly select full attention kernels for SWA layers since the seqlen seen at cudagraph capture was 1"。

# 实现拆解

在 `vllm/v1/worker/ubatch_utils.py` 文件的 `_make_metadata_with_slice` 函数中，将 `max_seq_len` 的计算从 `int(seq_lens_cpu_upper_bound.max())` 改为 `max(int(seq_lens_cpu_upper_bound.max()), attn_metadata.max_seq_len)`。这样在 CUDA graph 捕获的虚拟运行期间，即使 `seq_lens_cpu_upper_bound` 的值为 1，`attn_metadata.max_seq_len` 中保存的原始最大序列长度也会被保留，从而确保注意力后端能正确选择 SWA 内核。

关键文件：
- `vllm/v1/worker/ubatch_utils.py`（模块 worker；类别 source；类型 core-logic；符号 _make_metadata_with_slice）: 修复核心所在：在 `_make_metadata_with_slice` 函数中修改 `max_seq_len` 的计算方式。

关键符号：_make_metadata_with_slice


# 评论区精华

无实质讨论。LucasWilkinson 评论 "Make sense; thanks for the fix!"。

- 暂无高价值评论线程

# 风险与影响

- 风险：风险极低：改动仅 1 行，逻辑清晰，仅影响 CUDA graph 捕获时的元数据构建，不会影响正常推理。
- 影响：影响范围极其有限：仅修复 SWA 模型在 CUDA graph 捕获时的内核选择错误，不影响其他模型或非 CUDA graph 场景。
- 风险标记：核心路径变更

# 关联脉络

- 暂无明显关联 PR