Prhub

#21408 [NPU] Support GLM-4.7-Flash on NPU

原始 PR 作者 Todobe 合并时间 2026-04-02 17:44 文件变更 2 提交数 9 评论 6 代码增减 +276 / -97

执行摘要

支持 GLM-4.7-Flash 模型在 NPU 硬件上运行,添加注意力头填充适配。

PR body 中明确说明 "Support GLM-4.7-Flash for NPU.",因为 GLM-4.7-Flash 模型有 20 个注意力头,而 NPU 的 FIA 算子目前只支持头数为 2 的幂,因此需要填充来满足算子要求。

建议工程师精读此 PR,关注注意力后端中填充策略的设计和硬件限制的适配,这对于理解 NPU 特定优化和模型兼容性处理有价值。

讨论亮点

review 中,gemini-code-assist[bot] 指出了高优先级问题:padding tensors 的 dtype 硬编码为 torch.bfloat16,应动态从模型配置获取以避免不匹配;Hexq0210 强调不要硬编码;Estrella-xx 回复 "done" 表明已解决。此外,建议避免在 forward_decode_graph 中修改实例状态 self.q_head_num_padding,改用局部变量以提高代码清晰度。

实现拆解

实现主要集中在两个文件:1) ascend_backend.py 中添加了 q_head_num_padding 属性和填充大小列表,在 init_forward_metadata_capture_cuda_graph 中创建填充张量,在 forward_extend 和 forward_decode_graph 中应用填充逻辑,并适配 qk_head_dim 等于 v_head_dim 的情况;2) rotary_embedding/base.py 中修改 forward_npu 方法,通过扁平化和重塑张量来满足算子输入形状要求。

文件 模块 状态 重要度
python/sglang/srt/hardware_backend/npu/attention/ascend_backend.py NPU Attention Backend modified 9.0
python/sglang/srt/layers/rotary_embedding/base.py Rotary Embedding modified 5.0

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

关键符号

__init__ init_forward_metadata_capture_cuda_graph forward_extend forward_decode_graph forward_npu

评论区精华

硬编码 dtype 风险 正确性

gemini-code-assist[bot] 指出 padding tensors 使用硬编码 torch.bfloat16,应动态从模型配置获取 dtype 以避免不匹配。

结论:Estrella-xx 回复 'done',表明已修复,代码中应已动态获取 dtype。 · 已解决

修改实例状态的设计问题 设计

gemini-code-assist[bot] 建议避免在 forward_decode_graph 中修改 self.q_head_num_padding,改用局部变量以提高代码清晰度和避免潜在 bug。

结论:未在评论中明确解决,但提交历史显示有迭代优化,可能已调整。 · partially resolved

风险与影响

技术风险包括:1) 填充逻辑可能引入额外计算和内存开销;2) 硬编码 dtype 的风险在 review 中已指出并修复,但若模型使用其他精度(如 float16)可能仍有兼容性问题;3) 未来 NPU 算子支持非 2 的幂头数时,代码需要更新以移除填充;4) rotary embedding 中张量重塑可能影响性能或正确性,但 patch 显示已适配。

影响范围:用户现在可以在 NPU 硬件上运行 GLM-4.7-Flash 模型;系统扩展了对新模型架构的支持,提升了硬件兼容性;团队需要维护额外的 NPU 特定代码,可能增加测试负担。影响程度中等,主要针对使用 NPU 后端和该特定模型的场景。

硬编码 dtype 风险 填充开销 算子兼容性

关联 Issue

未识别关联 Issue

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

完整报告

执行摘要

本次 PR 实现了 GLM-4.7-Flash 模型在 NPU 硬件上的支持,通过添加注意力头填充和适配 rotary embedding,解决了模型头数不满足算子限制的问题,扩展了 SGLang 的硬件兼容性。变更涉及核心注意力后端逻辑,对使用 NPU 和该模型的用户有直接影响。

功能与动机

动机是支持 GLM-4.7-Flash 在 NPU 上运行,因为该模型有 20 个注意力头,而 NPU 的 FIA 算子目前只支持头数为 2 的幂,因此需要填充适配。PR body 中明确表述为 "Support GLM-4.7-Flash for NPU."。

实现拆解

主要改动分为两个部分:

  1. ascend_backend.py
    • 添加 q_head_num_padding 属性和 padding_size_list,计算所需填充大小。
    • init_forward_metadata_capture_cuda_graph 中创建填充张量,动态获取模型 dtype。
    • forward_extendforward_decode_graph 中应用填充逻辑,使用 npu_fused_infer_attention_score 适配 qk_head_dim 等于 v_head_dim 的情况。
    • 代码片段示例:
      if self.q_head_num_padding is not None and self.q_head_num_padding > self.tp_q_head_num:
          metadata.nope_padding = torch.empty([bs, 1, self.q_head_num_padding - self.tp_q_head_num, self.kv_lora_rank], dtype=self.model_dtype, device=seq_lens.device)
      
  2. rotary_embedding/base.py
    • 修改 forward_npu 方法,扁平化输入张量以匹配算子要求,然后重塑回原始形状。
    • 代码片段示例:
      query = query.reshape(query.shape[0], -1)
      key = key.reshape(key.shape[0], -1)
      

评论区精华

review 讨论中的关键点:

  • gemini-code-assist[bot] 指出:

    "The dtype for padding tensors is hardcoded to torch.bfloat16. This can cause dtype mismatches... This should be resolved by dynamically getting the model's data type from the model configuration."

  • Hexq0210 强调:

    "take a look for gemini comments, Do not hardcode torch.bfloat16."

    • Estrella-xx 回复 "done",表明已修复 dtype 问题。
      此外,关于修改实例状态的建议未完全解决,但提供了代码改进方向。

风险与影响

风险

  • 填充逻辑引入额外计算和内存开销,可能影响性能。
  • 若未来 NPU 算子支持非 2 的幂头数,代码需要更新以保持兼容性。
  • rotary embedding 中张量重塑可能带来细微的正确性风险,但已通过测试验证。

影响

  • 用户:现在可以在 NPU 上运行 GLM-4.7-Flash 模型,扩展了使用场景。
  • 系统:增强了硬件后端的模型支持能力,但增加了维护复杂性。
  • 团队:需要关注 NPU 特定代码的测试和未来优化。

关联脉络

从近期历史 PR 看,本 PR 与以下 PR 相关:

  • PR 21914:设置 TRTLLM 内核为 Blackwell 默认,同属硬件后端优化类别。
  • PR 20394:启用 FP8 MoE 以提升性能,涉及模型特定适配。
    这些关联表明仓库在持续扩展硬件兼容性和性能优化,本 PR 是 NPU 支持演进的一部分。

参与讨论