Prhub

#25592 [Diffusion] [NPU] Fix HunyuanVideo crash on NPU

原始 PR 作者 LLThomas 合并时间 2026-05-19 17:40 文件变更 1 提交数 1 评论 3 代码增减 +1 / -1

执行摘要

修复 NPU 上 Tensor.view 非连续张量崩溃

HunyuanVideo 在 Ascend NPU 上执行时崩溃,错误日志显示 view() 调用因张量内存不连续而失败。PR body 说明 NPU 的 Torch SDPA 后端返回非连续张量,需改用 reshape()

这是一个最小化、安全的 bugfix,值得直接合入。无需精读,但可作为 NPU 兼容性修复的示例参考。

讨论亮点

无实质性审查讨论。机器人审查人(gemini-code-assist[bot])确认变更合理。负责人 ping1jing2 直接批准。作者在合并后补充注释,解释 NPU 默认 SDPA 后端与 CUDA Flash Attention 的行为差异。

实现拆解

  1. 定位崩溃点:在 python/sglang/multimodal_gen/runtime/models/dits/hunyuanvideo.pyMMDoubleStreamBlock.forward() 中,img_attn.view(batch_size, image_seq_len, -1) 因张量不连续而抛出 RuntimeError
  2. 替换方法:将 view() 改为 reshape(),二者在连续张量上行为一致,但 reshape() 能自动处理非连续情况。
  3. 无其他文件修改:仅此一行变更,不影响其他逻辑。
文件 模块 状态 重要度
python/sglang/multimodal_gen/runtime/models/dits/hunyuanvideo.py 扩散模型 modified 4.53

关键源码片段

python/sglang/multimodal_gen/runtime/models/dits/hunyuanvideo.py data-contract

唯一修改的文件,将 `view()` 替换为 `reshape()` 以兼容 NPU 上的非连续张量。

# 在 MMDoubleStreamBlock 的 forward 方法中,原代码使用 .view()
# .view() 要求张量内存连续,而 NPU 的 SDPA 后端返回非连续张量
# 改用 .reshape() 自动处理不连续情况,行为在连续时与 .view() 一致
img_attn_out, _ = self.img_attn_proj(
    img_attn.reshape(batch_size, image_seq_len, -1) # 原为 .view(...)
)

评论区精华

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

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

风险与影响

风险极低。reshape() 在连续张量上行为与 view() 相同,不会引入性能或语义回归。但需确认非 NPU 后端(CUDA)的 attn 输出是否可能也为非连续——从 error log 看,CUDA 使用 Flash Attention 返回连续张量,因此无影响。

影响范围局限于 HunyuanVideo 模型在 NPU 上的推理通路。修复后 NPU 用户可正常执行生成。对其他硬件和模型无影响。

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论