Prhub

#22293 [fix] [whisper] ensure inputs are moved to the correct device before processing.

原始 PR 作者 AgainstEntropy 合并时间 2026-04-08 23:45 文件变更 1 提交数 3 评论 4 代码增减 +4 / -0

执行摘要

修复 Whisper 模型输入特征未正确转移到 GPU 设备导致的运行时错误。

根据PR body描述,Whisper模型未覆盖#22038引入的延迟设备转移机制,导致输入特征可能未转移到正确设备。这在使用CUDA图时会导致运行时错误:"RuntimeError: Expected all tensors to be on the same device, but got weight is on cuda:0, different from other tensors on cpu"。手动测试test_whisper_cuda_graph.py可复现此问题。

该PR值得快速浏览以了解设备同步问题的典型修复模式。重点关注:1)如何确定正确的目标设备;2)review中提到的更稳健设备获取方案为何未被采纳;3)可结合#22038理解延迟设备转移机制的背景。

讨论亮点

review中只有一条来自mickqian的评论,建议使用device=next(self()).device替代self.conv1.weight.device以获得更稳健的设备获取方式。但作者未采纳此建议,最终代码仍使用原方案。没有其他设计争议或未解决疑虑。

实现拆解

仅修改了python/sglang/srt/models/whisper.py文件的forward方法,在卷积操作前添加4行代码:1)获取self.conv1.weight.device作为目标设备;2)将input_features移动到该设备;3)将position_ids移动到该设备;4)然后执行原有的卷积和激活操作。这是一个最小化的设备同步修复。

文件 模块 状态 重要度
python/sglang/srt/models/whisper.py models/whisper modified 8.0

关键符号

forward

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

评论区精华

设备获取方式的稳健性讨论 设计

mickqian 建议使用 `device=next(self()).device` 替代 `self.conv1.weight.device` 以获得更稳健的设备获取方式

结论:作者未采纳建议,保持使用 conv1.weight.device 的方案 · 已解决

风险与影响

风险较低:1)变更范围极小,仅添加设备转移逻辑;2)可能引入微小性能开销(额外的to()调用),但在CUDA图捕获场景下这是必要的;3)如果模型有其他未考虑的设备依赖,可能存在遗漏,但当前修复针对具体错误点;4)缺少单元测试覆盖此修复场景。

影响范围有限但关键:1)仅影响Whisper模型用户,特别是使用CUDA图优化的场景;2)解决了设备不匹配导致的运行时崩溃,提升模型稳定性;3)对系统其他部分无影响;4)团队需要关注类似模型是否也存在相同设备转移问题。

缺少测试覆盖 设备同步逻辑

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论