Prhub

#31231 Fix gate stride for 4D decode layouts

原始 PR 作者 merrymercy 合并时间 2026-07-15 11:06 文件变更 1 提交数 1 评论 2 代码增减 +3 / -1

执行摘要

修复 4D decode 布局下门控张量的步长错误

修复 4D decode 布局下 gate 张量的 stride 计算错误。在 KDA decode 路径中,gate 张量 a 的 shape 为 [B, T, H, K],属于 4D 布局,而原有代码 a.stride()[-2] 获取的是 head 维度的步长,导致在 Triton kernel 中索引 token 数据时出错。

建议精读此 PR,理解 4D 张量步长计算的细微差别。该修复虽小,但涉及 Triton kernel 中张量步长的正确使用,对类似数据布局问题有参考价值。

讨论亮点

该 PR 无 review 讨论。

实现拆解

fused_sigmoid_gating_delta_rule_update 函数中,修改 stride_a 的计算逻辑:

  1. 检查 a 的维度 a.ndim
  2. 若为 4D(即 [B, T, H, K]),则使用 a.stride()[1],对应 token 维度的步长。
  3. 否则(2D 或 3D 布局),仍然使用 a.stride()[-2],保持原有行为。
    该修改仅影响了该函数的第 284 行(从 stride_a = a.stride()[-2] 变为条件赋值)。
文件 模块 状态 重要度
python/sglang/srt/layers/attention/fla/fused_sigmoid_gating_recurrent.py 注意力 modified 6.21

关键符号

fused_sigmoid_gating_delta_rule_update

关键源码片段

python/sglang/srt/layers/attention/fla/fused_sigmoid_gating_recurrent.py core-logic

核心文件,修改了 stride_a 的计算逻辑,修复了 4D decode 布局下的 gate 步长错误。

    # Both paths (KDA/GDN) advance p_a once per token, so use the token-axis stride.
    # For 2D a ([T, ...]) this is stride(0); for 3D a ([B, T, ...]) this is stride(1).
    # Using stride()[-2] covers GDN [T, HV] and KDA layouts ([T, HV*K] / [B, T, HV*K]).
    # KDA decode also passes 4-D [B, T, H, K], where [-2] is the head stride, not the
    # token stride; take dim 1 explicitly for that layout.
    stride_a = a.stride()[1] if a.ndim == 4 else a.stride()[-2]

评论区精华

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

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

风险与影响

风险很低:改动仅一行核心逻辑,且通过条件分支明确区分了 4D 和非 4D 情况,不影响原有 2D/3D 路径。但缺少针对 4D decode 布局的单元测试,回归风险在于未来若添加新的张量布局(如 5D),当前的条件判断可能不覆盖。

直接影响使用 4D decode 布局的 KDA 路径,修复了 gate 步长错误导致的计算结果错误。不影响 2D/3D 布局的现有逻辑。对用户而言,该修复使得 4D decode 模式可以正常工作。

缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论