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

关键符号

__init__ init_forward_metadata_capture_cuda_graph forward_extend forward_decode_graph forward_npu

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

评论区精华

硬编码 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 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论