Prhub

#36170 [NPU] [BugFix] Fix discontinuous input for FIA operator in GLM4.7‑Flash

原始 PR 作者 silencejade 合并时间 2026-08-29 15:03 文件变更 1 提交数 3 评论 6 代码增减 +1 / -1

执行摘要

修复 NPU FIA 算子因非连续输入导致的运行时报错

PR 描述指出,GLM4.7-Flash 在调用 FIA 算子时,k_rope / k_value / v_value 张量可能不连续,而新版算子已移除内部的 AutoContiguous 逻辑,需要调用方保证输入张量连续性,否则会引起算子运行时失败。此修复正是为恢复该场景的正常推理。

建议精读该 PR,了解 FIA 算子对输入连续性的要求以及 NPU 后端对张量布局的处理方式。虽然变更很小,但体现了硬件后端适配中常见的连续性约束问题,值得记录。

讨论亮点

本 PR 的 review 评论为空,仅有一个自动 bot 的批准,因此没有实质性的技术讨论记录。

实现拆解

  1. 定位问题:在 ascend_backend.pyforward_extend 方法中,FIA 算子的调用路径上,v 张量通过切片 v[None, q_len_offset : q_len_offset + q_len] 传入,该切片视图不保证连续。
  2. 应用补丁:对该切片视图调用 .contiguous() 方法后再传入 FIA 算子,确保输入张量满足新版本算子的连续性要求。
  3. 配套测试:本次变更未包含新增单元测试,但后续通过 CI 和 review 确认修复有效,且未引入回归。
文件 模块 状态 重要度
python/sglang/srt/hardware_backend/npu/attention/ascend_backend.py NPU 后端 modified 4.54

关键源码片段

python/sglang/srt/hardware_backend/npu/attention/ascend_backend.py core-logic

核心修复文件,对 FIA 算子的 v 输入追加 contiguous() 调用,解决非连续输入导致的运行失败。

# python/sglang/srt/hardware_backend/npu/attention/ascend_backend.py
# 调用 FIA 算子时,v 张量经切片后可能不连续,需保证传入算子的张量连续
attn_output[q_len_offset : q_len_offset + q_len] = (
    torch.ops.npu.npu_fused_infer_attention_score(
        q[None, q_len_offset : q_len_offset + q_len],
        k[None, q_len_offset : q_len_offset + q_len],
        # 关键修复:对 v 的切片追加 .contiguous(),满足新版 FIA 算子对输入连续性的要求
        v[None, q_len_offset : q_len_offset + q_len].contiguous(),
        num_heads=layer.tp_q_head_num,
        num_key_value_heads=layer.tp_k_head_num,
        input_layout="BSND", # 注意:TND 布局不支持 q_heads != k_heads
        atten_mask=self.fia_mask.unsqueeze(0),
        sparse_mode=3 if q_len != 1 else 0,
        scale=layer.scaling,
        next_tokens=0,
    )[0]
)

评论区精华

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

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

风险与影响

风险较低。变更仅对传递给 FIA 算子的 v 张量追加 contiguous() 调用,该操作在 v 已是连续张量时几乎零开销。但需要注意,当前仅对 v 做了处理,而 PR 描述中提到 k_rope / k_value 也可能不连续,若后续需要,可能需同步处理。另外,由于缺少单元测试,如果未来重构该调用路径,可能回归此问题。

影响范围限于 NPU 硬件后端上运行 GLM4.7-Flash 模型时的 extend 阶段,修复了算子运行失败问题,使该场景恢复可用。对 CPU、CUDA 等其他后端无影响,也不影响 decode 路径。

缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论