Prhub

#22266 [NPU] fix qwen3.5 video processor

sgl-project/sglang · 作者 zhaozx-cn · 合并时间 2026-04-08 21:13

分析状态 已生成
文件变更 1提交数 8 · 评论 8
代码增减 +177 / -21
npu bugfix run-ci multimodal

执行摘要

修复 NPU 上 Qwen3.5 视频处理器因超过 8 维 permute 导致的执行失败。

PR body 明确指出:'In the Qwen3VLVideoProcessor, there is a permute operation with more than 8 dimensions which is not supported on the NPU. Following PR #20189, this PR applies a patch to the Qwen3VLVideoProcessor in the transformers to avoid processing data with more than 8 dimensions.' 目的是解决 NPU 上视频模型推理失败的问题。

建议 NPU 开发者和多模态功能维护者仔细阅读此 PR,重点关注维度处理逻辑和 review 中的修正点,以学习硬件适配策略和代码重构模式。对于涉及视频预处理或 NPU 优化的工程师,此 PR 提供了有价值的参考。

讨论亮点

Review 中,gemini-code-assist[bot] 指出两个关键问题:置换顺序错误(应交换 channel 和 temporal_patch_size 维度)和 size 参数访问方式(需处理 None 情况并改用括号访问)。xiaobaicxy 建议提取公共函数提升代码复用。提交历史显示作者通过合并主分支和提取函数来响应反馈,修正了这些问题。

实现拆解

主要变更集中在文件 'python/sglang/srt/hardware_backend/npu/modules/qwen_vl_processor.py':

  1. 新增 transform_patches_to_flatten 函数,将补丁张量通过视图和置换操作重构,避免超过8维的 permute。
  2. 修改 _preprocess 函数调用新函数,替换原有高维处理逻辑。
  3. 添加 npu_wrapper_video_preprocess 包装器,覆盖视频预处理方法,处理 size 参数访问和修正置换顺序。
文件 模块 状态 重要度
python/sglang/srt/hardware_backend/npu/modules/qwen_vl_processor.py hardware_backend/npu modified 8.0

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

关键符号

transform_patches_to_flatten npu_wrapper_video_preprocess _preprocess

评论区精华

置换顺序错误 正确性

gemini-code-assist[bot] 指出代码中 patches.permute(0, 1, 4, 3, 2, 5, 6) 应改为 (0, 1, 4, 2, 3, 5, 6),以正确交换 channel 和 temporal_patch_size 维度,否则会导致视频模型输入错误。

结论:建议修正置换顺序,提交历史显示代码可能已更新。 · 已解决

size 参数访问问题 正确性

gemini-code-assist[bot] 指出 size 是 SizeDict,应使用括号访问如 size['shortest_edge'],并处理 None 情况以避免 AttributeError。

结论:建议添加条件检查,提交历史中可能已修正。 · 已解决

提取公共函数建议 设计

xiaobaicxy 评论 'Please extract a common function',旨在提升代码复用性和可维护性。

结论:提交历史显示作者添加了提取提交,实施了该建议。 · 已解决

风险与影响

技术风险包括:置换逻辑修正可能引入新 bug,需确保与原始实现一致;size 参数处理不当可能导致运行时 AttributeError;变更集中于 NPU 后端,可能影响其他硬件的兼容性;PR body 中未添加单元测试,存在测试覆盖不足风险。

直接影响 NPU 平台上的 Qwen3.5 视频模型推理,修复了因高维操作导致的执行失败,使用户能在 NPU 上使用视频输入进行多模态推理。对系统,提升了 NPU 后端的稳定性和功能完整性,增强了跨硬件支持。影响范围限于 NPU 相关模块,程度中等。

核心路径变更 缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

执行摘要

本 PR 修复了 NPU 平台上 Qwen3.5 视频处理器因超过8维张量置换操作导致的推理失败问题。通过重构预处理逻辑、提取公共函数并修正关键 bug,确保了视频输入在 NPU 上的正确处理,提升了多模态功能的稳定性和跨硬件兼容性。

功能与动机

动机源于 NPU 硬件对张量维度数的限制:Qwen3VLVideoProcessor 中的 permute 操作超过8维,在 NPU 上不受支持,导致视频推理失败。PR body 引用 issue 或相关 PR #20189,明确指出目标是“避免处理超过8维的数据”。此修复使 NPU 用户能够正常使用视频输入进行多模态推理。

实现拆解

主要改动在文件 python/sglang/srt/hardware_backend/npu/modules/qwen_vl_processor.py

  • 新增函数 transform_patches_to_flatten:将补丁张量通过视图和置换重构,避免高维操作。
    python def transform_patches_to_flatten(patches, batch_size, grid_t, ...): patches = patches.view(...) patches = patches.permute(...) return flatten_patches
  • 修改 _preprocess 函数:调用新函数替换原有高维 permute 逻辑,简化代码结构。
  • 添加 npu_wrapper_video_preprocess 包装器:覆盖视频预处理方法,处理 size 参数访问(如 size['shortest_edge'])并修正维度顺序。

评论区精华

Review 讨论聚焦于代码正确性和设计优化:

  • gemini-code-assist[bot] 指出置换顺序错误:> “The permutation order (0, 1, 4, 3, 2, 5, 6) swaps the channel and temporal_patch_size dimensions... This swap will lead to incorrect model inputs.” 建议改为 (0, 1, 4, 2, 3, 5, 6) 以确保输入正确。
  • gemini-code-assist[bot] 强调 size 参数处理:> “size is a SizeDict... should be accessed using bracket notation... handle the case where it is None.” 避免运行时错误。
  • xiaobaicxy 建议代码重构:> “Please extract a common function” 以提升复用性,提交历史显示作者响应并实施。

风险与影响

  • 技术风险:置换逻辑修正可能引入新 bug,需确保与原始实现一致性;size 参数处理不当可能导致 AttributeError;变更集中于 NPU 后端,可能影响其他硬件兼容性;PR 未添加单元测试,存在覆盖不足风险。
  • 影响分析:直接影响 NPU 平台的 Qwen3.5 视频模型推理,修复了执行失败问题,用户现可正常使用视频输入。对系统,增强了 NPU 后端稳定性和多模态功能完整性,影响范围限于特定硬件模块。

关联脉络

从历史 PR 看,本 PR 与 #21692(NPU 上 Qwen3.5 量化修复)相关,共同构成 NPU 平台对 Qwen3.5 模型的全面支持。近期 PR 如 #22292 和 #22346 聚焦 CI 优化,而本 PR 延续了硬件适配趋势,揭示了 sglang 项目在跨平台兼容性(如 NPU、AMD)和多模态扩展上的持续演进。

参与讨论