Prhub

#27361 Fix dual-chunk sparse fallback index overflow

原始 PR 作者 yh0903 合并时间 2026-06-08 14:15 文件变更 5 提交数 6 评论 14 代码增减 +597 / -205

执行摘要

修复 dual-chunk 稀疏回退索引缓冲区溢出

Dual-chunk sparse prefill can hit an empty local sparse selection after global vertical/slash top-k indices are split into intra, successor, and inter chunk stages. The existing fallback for empty selections sampled roughly five indices with torch.arange(..., k_len / 5), independent of the per-head sparse buffer capacity. For sub-window sparse configs such as vertical_size=4, this could produce five fallback indices for a four-slot buffer and fail during vertical_buffer.copy_().

该PR值得精读,尤其是_sparse_fallback_indices的设计和测试独立参考的实现方式。展示了如何通过提取辅助函数和完善测试来安全修复边界条件。

讨论亮点
  1. 冗余torch.cat问题:gemini-code-assist[bot]指出,当已验证变量为空时,无需torch.cat直接赋值即可。该建议在后续提交中被采纳。
  2. 测试覆盖询问:ch-wan询问KNOWN_FAILURES中移除的条目是否已被测试覆盖。yh0903确认新的子窗口测试覆盖了该回退溢出场景。
  3. 增强正确性测试:Jiminator建议增加更严格的正确性测试,不仅检查形状和NaN,还应验证与独立参考的一致性。yh0903在后续提交中增加了完整的独立参考比较(包括选择索引和稀疏输出)。
  4. 审核与合并:ch-wan最终批准了PR,但需要CODEOWNER中attention路径的审核。yh0903请求了相关审核者。

实现拆解

  1. dual_chunk_flashattention_backend.py中新增静态辅助函数_sparse_fallback_indices(seq_len, max_count, device),根据max_count(即每个头的vertical_sizeslash_size)生成均匀间隔的回退索引,确保不超过缓冲区容量。
  2. 将原有在intra/succ/inter三个阶段中vertical和slash空选择时的内联torch.arange回退全部替换为调用_sparse_fallback_indices,并补充原本缺失的intra-slash空选择回退。
  3. 在测试工具dual_chunk_attention.py中实现参考回退函数_dual_chunk_sparse_fallback_indices_reference和完整的稀疏阶段选择数据结构_DualChunkSparseStageSelection,用于独立验证生产后端的索引生成结果。
  4. 新增make_dual_chunk_sparse_sub_window_casesrun_dual_chunk_sparse_sub_window_case,配置vertical_size=4, slash_size=4, seq_len=128,既验证后端正確性(与独立参考对比),又验证稀疏输出与使用相同块元数据的torch稀疏参考的一致性。
  5. 更新test_dual_chunk_flash_attn.py,激活test_sparse_dual_chunk_sub_window_cases测试方法;更新README.mdKNOWN_FAILURES.md,移除已解决的回退溢出和内核非法地址条目。
文件 模块 状态 重要度
python/sglang/srt/layers/attention/dual_chunk_flashattention_backend.py 注意力后端 modified 7.62
python/sglang/test/kits/attention_unittest/attention_methods/dual_chunk_attention.py 测试工具 modified 7.81
test/registered/attention/unittests/dual_chunk/test_dual_chunk_flash_attn.py 单元测试 modified 5.9
test/registered/attention/unittests/dual_chunk/README.md 文档 modified 3.81
test/registered/attention/unittests/KNOWN_FAILURES.md 文档 modified 2.3

关键符号

_sparse_fallback_indices make_dual_chunk_sparse_sub_window_cases _dual_chunk_sparse_fallback_indices_reference _DualChunkSparseStageSelection run_dual_chunk_sparse_sub_window_case test_sparse_dual_chunk_sub_window_cases

关键源码片段

test/registered/attention/unittests/dual_chunk/test_dual_chunk_flash_attn.py test-coverage

测试用例文件:激活 `test_sparse_dual_chunk_sub_window_cases` 方法,导入子窗口运行函数。

# 导入新增的用例生成和运行函数
from sglang.test.kits.attention_unittest.attention_methods.dual_chunk_attention import (
    ...
    make_dual_chunk_sparse_sub_window_cases,
    run_dual_chunk_sparse_sub_window_case,
)class TestDualChunkFlashAttentionBackendCorrectness(CustomTestCase):
    # 原有的 CASES, SPARSE_CASES, SPARSE_THRESHOLD_GATED_CASES
    SPARSE_SUB_WINDOW_CASES = make_dual_chunk_sparse_sub_window_cases(
        "dual_chunk_flash_attn"
    )
​
    def test_sparse_dual_chunk_sub_window_cases(self):
        for case in self.SPARSE_SUB_WINDOW_CASES:
            with self.subTest(case=case.name, backend=case.backend):
                run_dual_chunk_sparse_sub_window_case(self, case)

评论区精华

冗余 `torch.cat` 问题 style

gemini-code-assist[bot] 指出当变量已知为空时,直接赋值即可,无需 `torch.cat`。

结论:作者在后续提交中采纳了建议,改为直接赋值。 · 已解决

测试覆盖是否充分 question

ch-wan 询问 KNOWN_FAILURES 中移除的条目是否已被测试覆盖。yh0903 确认新子窗口测试覆盖了回退溢出场景。

结论:确认覆盖,弃用已知失败条目。 · 已解决

增强正确性测试 测试

Jiminator 建议增加更严格的正确性测试,不仅检查形状和 NaN,还应验证与独立参考的一致性。yh0903 随后增加了完整的独立参考比较(包括选择索引和稀疏输出)。

结论:测试已增强,包含参考比较。 · 已解决

风险与影响

  1. 核心路径变更:修改了dual_chunk_flashattention_backend.py中的稀疏注意力回退逻辑,影响所有使用该后端的模型推理,但仅在稀疏选择为空时触发,正常路径不变。
  2. 测试覆盖充分:新增了子窗口正确性测试和独立参考实现,可捕获未来退化。
  3. 兼容性_sparse_fallback_indices函数为模块内部静态函数,无外部依赖;签名简单,影响有限。
  4. 性能:回退路径仅在空选择时调用,开销可忽略。
  1. 用户:修复了在vertical_size ≤ 5且稀疏选择为空时可能出现的RuntimeError,提升稀疏注意力稳定性。
  2. 系统:无性能回退,为后续子窗口稀疏测试铺平道路。
  3. 团队:提取清晰辅助函数,降低维护成本;测试参考实现可作为后续类似修复的范例。
核心路径变更 仅空选择触发 测试覆盖充分

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论