Prhub

#47671 [Bugfix] Fix int32 overflow in triton_decode_attention page offsets

原始 PR 作者 ivanium 合并时间 2026-07-06 22:36 文件变更 1 提交数 1 评论 0 代码增减 +2 / -2

执行摘要

修复 triton_decode_attention 中 int32 溢出导致 CUDA 非法内存访问

在 Kimi-Linear-48B-A3B 等混合模型(Hybrid model)中,所有 layer group 共享一个 block pool,当 KV 缓存达 90GB 时页数超过 16.3 万。Triton 解码 attention kernel 在页号超过约 7.7k 时会产生 int32 溢出,导致负偏移和 CUDA 非法内存访问。该错误是异步的,通常被误报为不相关的后续 kernel 崩溃,极难排查。

建议所有使用 vLLM v1 版 Triton 解码注意力的用户尽快合并此修复。该 PR 虽小,但解决了一个难排查的异步崩溃问题,值得关注。设计上采用与其他 kernel 一致的 int64 类型转换,是安全的防御性编程实践。

讨论亮点

该 PR 无 review 评论。PR body 详细分析了溢出条件和验证结果:Kimi-Linear-48B-A3B 固定种子请求循环在 block id 达到约 7767 时确定性崩溃,修复后循环通过,GSM8k 5-shot greedy 精度恢复至基线水平(0.8704 vs 0.8711,0 请求错误)。该修改与 C++ 缓存 kernel 和 CUTLASS_MLA 保持一致。

实现拆解

  1. vllm/v1/attention/ops/triton_decode_attention.py 中,修改 _fwd_kernel_stage1 函数:将 load 后的 kv_page_number 加上 .to(tl.int64) 显式转换为 int64。
  2. _fwd_grouped_kernel_stage1 函数进行相同的修改。
  3. 确保后续乘法操作(kv_page_number * stride_buf_kpbs 等)在 int64 空间进行,避免溢出。
文件 模块 状态 重要度
vllm/v1/attention/ops/triton_decode_attention.py 注意力 kernel modified 3.79

关键符号

_fwd_kernel_stage1 _fwd_grouped_kernel_stage1

关键源码片段

vllm/v1/attention/ops/triton_decode_attention.py bugfix

包含两个 Triton kernel 的 int32 溢出修复,是本次变更的唯一文件。

# 修改位置:_fwd_kernel_stage1 函数内,约第 133 行
# 修复前:直接使用 int32 类型的 kv_page_number,当页号 * 步长超过 2^31 时产生负偏移
# 修复后:显式转换为 int64,避免溢出
kv_page_number = tl.load(
    kv_page_number_start + offs_n // PAGE_SIZE,
    mask=offs_n < split_kv_end,
    other=0
).to(tl.int64) # 关键修复:转换为 int64,防止后续乘法溢出kv_in_page = offs_n % PAGE_SIZE
# 现在乘法在 int64 空间进行,不会溢出
offs_buf_k = (
    kv_page_number * stride_buf_kpbs +
    kv_in_page * stride_buf_kbs
).to(tl.int32) # 如果需要可再转换回 int32

# 修改位置:_fwd_grouped_kernel_stage1 函数内,约第 375 行
# 相同修复:确保 kv_page_number 为 int64
kv_page_number = tl.load(
    kv_page_number_start + offs_n // PAGE_SIZE,
    mask=offs_n < split_kv_end,
    other=0,
    cache_modifier=".ca",
).to(tl.int64) # 转换为 int64# 后续乘法安全执行
kv_off_k = (
    kv_page_number * stride_buf_kpbs +
    (offs_n % PAGE_SIZE) * stride_buf_kbs
)

评论区精华

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

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

风险与影响

风险极低:仅将 Triton kernel 内部局部变量从 int32 转换为 int64,不改变任何外部接口或数据结构。由于 Triton 会自动处理类型提升,该修改不会引入性能退化或新 bug。已通过 GSM8k 评估验证无回归。

影响范围有限但重要:仅影响使用 Triton 解码注意力后端的混合模型(如 Kimi-Linear-48B-A3B)在大 KV 缓存场景下的稳定性。修复后消除了 CUDA 非法内存访问错误,提升大型 Hybrid 模型在长上下文或大批量推理时的可靠性。

核心路径变更

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论