Prhub

#32555 [Nemotron] Fix decode track-save reading the stale tail of the CUDA-graph track buffer

原始 PR 作者 sshleifer 合并时间 2026-07-30 10:03 文件变更 2 提交数 2 评论 6 代码增减 +70 / -4

执行摘要

修复 Mamba2 CUDA 图回放跟踪缓冲区尾部脏读

Mamba2 混合模型(如 NemotronH)在启用 CUDA graphs、mamba_track_interval 边界跨越后,decoded 请求的跟踪状态被错误写入 radix 树,导致后续 cache-hit 重新评分出现 KL ~1.55 的静默精度偏差(禁用 CUDA graphs 时 KL ~0.002)。PR body 明确指出问题:No crash, no assert — silent corruption。

此修复定位精准、改动最小、测试充分,建议合并。开发者在合并前应确认所有相关 CI 通过。

讨论亮点

无 review 评论。PR 被 alexnails 直接批准,CI rerun 请求均成功。

实现拆解

  1. 修复核心逻辑:在 python/sglang/srt/layers/attention/hybrid_linear_attn_backend.py_replay_metadata 方法中,将 track_buf = self.mamba_track_indices_buf 改为 self.mamba_track_indices_buf[:bs],确保回放时只传递已刷新的前 bs 个元素,避免 Mamba2 后端切片 [-num_decodes:] 时读取未刷新的尾部。同时添加 len(mamba_track_indices) >= bs 断言,防止传入的跟踪索引不足。

  2. 新增回归测试:在 test/registered/radix_cache/test_mamba2_extra_buffer_kl.py 中创建 TestMamba2ExtraBufferKL 类,使用 Nemotron-Nano-9B-v2 模型和 extra_buffer 策略,设置 kl_div_thres=0.005 检测 decode-seeded cache-hit 的 KL 偏差。测试注册为 extra-a 阶段 CI。

  3. 测试参数调优:设置 --mamba-track-interval 128(默认减半),确保 512-token 的 decode 序列能跨越跟踪边界,触发修复场景。

文件 模块 状态 重要度
python/sglang/srt/layers/attention/hybrid_linear_attn_backend.py 注意力后端 modified 6.06
test/registered/radix_cache/test_mamba2_extra_buffer_kl.py Mamba2 测试 added 6.32

关键符号

_replay_metadata

关键源码片段

python/sglang/srt/layers/attention/hybrid_linear_attn_backend.py core-logic

核心修复文件,仅修改一行关键逻辑(track_buf 切片),附带断言保护。

# python/sglang/srt/layers/attention/hybrid_linear_attn_backend.py
# _replay_metadata 方法中跟踪缓冲区处理部分(CUDA graph 回放路径)
​
        # 刷新静态跟踪目标缓冲区(已翻译);捕获的 track-save kernel
        # 读取该缓冲区,保留传入的 InputBuffer 槽位为只读。
        # 仅返回已刷新的 [:bs] 前缀 —— Mamba2 的 track-save 切片
        # [-num_decodes:],若传递完整 max_bs 缓冲区会绑定陈旧的尾部。
        track_buf = None
        if mamba_track_indices is not None:
            assert (
                len(mamba_track_indices) >= bs
            ), f"{len(mamba_track_indices)=} < {bs=}"
            track_buf = self.mamba_track_indices_buf[:bs]
            track_buf.copy_(self._translate_mamba_indices(mamba_track_indices[:bs]))
test/registered/radix_cache/test_mamba2_extra_buffer_kl.py test-coverage

新增的回归测试文件,使用 Nemotron-Nano-9B-v2 模型验证修复正确性,注册为 CI。

# test/registered/radix_cache/test_mamba2_extra_buffer_kl.py
import unittestfrom sglang.test.ci.ci_register import register_cuda_ci
from sglang.test.kits.kl_divergence_kit import KLDivergenceMixin
from sglang.test.server_fixtures.default_fixture import DefaultServerBaseregister_cuda_ci(est_time=600, stage="extra-a", runner_config="1-gpu-large")
​
​
class TestMamba2ExtraBufferKL(KLDivergenceMixin, DefaultServerBase):
    """NemotronH (Mamba2) + extra_buffer: cache-hit logprobs match cold recompute."""
​
    # 使用 Mamba2 架构模型触发尾部分片错误
    model = "nvidia/NVIDIA-Nemotron-Nano-9B-v2"
​
    # decode-seeded 重用是回归触发源(图回放 track-save);
    # 损坏路径 KL ~1.5,阈值 0.005 可明确区分
    kl_div_thres = 0.005
    kl_div_thres_prefill = 0.01
    kl_div_max_samples = 16
​
    # extra_buffer 策略 + 降低 track-interval 确保边界跨越
    other_args = [
        "--max-mamba-cache-size", "256",
        "--mem-fraction-static", "0.8",
        "--mamba-scheduler-strategy", "extra_buffer",
        "--mamba-track-interval", "128", # 默认 256 减半,确保 > mamba chunk size
    ]
​
​
if __name__ == "__main__":
    unittest.main()

评论区精华

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

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

风险与影响

修复范围仅限 CUDA graph 回放路径中跟踪缓冲区的切片操作,对 eager 路径无影响(原有逻辑正确),对 GDN/KDA 等前端索引架构无影响。断言 len(mamba_track_indices) >= bs 可能捕获先前未暴露的编码错误,不会导致静默回归。主要风险是 _replay_metadata 的其他调用点未传递足够的 mamba_track_indices,但代码中该参数由调用方保证。

直接影响 Mamba2 架构的混合模型(如 NemotronH、Nemotron-3-Super-120B)在 CUDA graphs 下的 decode 精度和 cache 命中率,修复前静默错误可能导致用户获得错误 logprobs 或生成质量下降。对其他模型无影响。

CUDA graphs 路径变更 涉及 Mamba2 架构 新增断言可能暴露新问题

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论