Prhub

#26573 [NPU] fix model llava-onevision-qwen2-7b-ov torch compiles error in npu case

原始 PR 作者 ZeyuanChen2000 合并时间 2026-05-30 17:10 文件变更 1 提交数 2 评论 9 代码增减 +4 / -2

执行摘要

修复 NPU 环境下 torch.compile 导致图执行错误

当在 NPU 上部署模型 lmms-lab/llava-onevision-qwen2-7b-ov 时,apply_scaling_penalties 函数中的 @torch.compile 导致图执行错误(附截图)。需要禁用该函数的编译以恢复正常执行。

该 PR 是低风险的必要修复,可快速合并。值得关注的是后续是否需要对 NPU 平台上的 torch.compile 进行更精细的配置(例如仅禁用某些后端),而非完全禁用。

讨论亮点

代码风格讨论:机器人 reviewer gemini-code-assist[bot] 建议将 _is_npu 全局变量替换为直接传递 is_npu()disable 参数,以减少模块命名空间污染。但另一位 reviewer Hexq0210 则要求保持一致的写法,并给出了与当前实现一致的示例(即仍使用 _is_npu)。PR 最终未采纳机器人的建议,保持了 _is_npu 全局变量的写法。

实现拆解

  1. 导入扩展:在 python/sglang/srt/sampling/penaltylib/repetition_penalty.py 中从 sglang.srt.utils 额外导入 is_npu 函数。
  2. 添加平台检测变量:在模块级别添加 _is_npu = is_npu(),一次性缓存检测结果。
  3. 条件禁用编译:将 @torch.compile 装饰器的 disable 参数设为 _is_npu,使得在 NPU 平台上完全跳过编译,直接使用 eager 模式执行。
文件 模块 状态 重要度
python/sglang/srt/sampling/penaltylib/repetition_penalty.py 惩罚采样 modified 5.35

关键符号

apply_scaling_penalties

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

评论区精华

是否应内联 is_npu() 而非使用全局变量 style

gemini-code-assist[bot] 建议直接传递 `is_npu()` 给 `disable` 参数以减少命名空间污染;Hexq0210 则要求保持当前一致的写法(使用 `_is_npu` 全局变量)。

结论:PR 保持了 `_is_npu` 全局变量的写法,未采纳内联建议。 · 已解决

风险与影响

风险极低:变更仅涉及一行装饰器参数和一行导入,不会影响非 NPU 平台的行为(is_npu() 返回 Falsetorch.compile 正常启用)。仅在 NPU 平台下回退到 eager 模式,可能带来轻微性能损失,但保证了正确性。

影响范围小:仅影响 NPU 平台上使用 apply_scaling_penalties 的场景(即需要重复惩罚采样的模型推理)。修复后 llava-onevision-qwen2-7b-ov 等模型可在 NPU 上正常执行而不出现编译错误。

缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论