Prhub

#5901 [model, fsdp] fix: Fix modeling_qwen2_5_vl missing attribute 'Qwen2RMSNorm'

原始 PR 作者 ZhuYajun-AI 合并时间 2026-05-13 17:26 文件变更 1 提交数 2 评论 3 代码增减 +4 / -1

执行摘要

修复 Qwen2.5-VL RMSNorm 属性缺失

Issue #5788 报告了在 transformers 5.3.0 下 FSDP 训练时,NPU 补丁因 modeling_qwen2_5_vl 没有 Qwen2RMSNorm 属性而全部失效。PR 作者在 body 中说明需要添加版本检查来解决此问题。

值得精读,是一个典型且优秀的兼容性修复范例。重点关注如何通过 hasattr 而非版本号比较来解决模型属性变更问题。

讨论亮点

AI 审查者 gemini-code-assist[bot] 指出初始提交中使用的字符串版本比较(transformers_version <= "5.1.0")不可靠,因为 Python 的字符串比较会按字典序,例如 "10.0.0" < "5.1.0" 为真。建议改用 hasattr 进行更健壮的检查。该建议被采纳,最终提交使用了 hasattr 方案。

实现拆解

  1. 修改文件:verl/models/transformers/npu_patch.py,位于 "Patches for Qwen2.5-VL Model" 区域。
  2. 原代码:直接赋值 modeling_qwen2_5_vl.Qwen2RMSNorm.forward = rms_norm_forward_npu,在 transformers >=5.2.0 时该属性不存在。
  3. 修改方式:使用 hasattr 检查 modeling_qwen2_5_vl 模块中是否存在 Qwen2RMSNorm 属性。如果存在(老版本),则 patching 它;否则(新版本),patching 重命名后的 Qwen2_5_VLRMSNorm。
  4. 优势:避免了不可靠的版本字符串比较,直接通过属性存在性判断,更健壮。
  5. 影响范围:仅该文件中一段代码 4 行替换,不影响其他模型补丁。
文件 模块 状态 重要度
verl/models/transformers/npu_patch.py NPU 补丁 modified 5.85

关键源码片段

verl/models/transformers/npu_patch.py data-contract

核心修改文件,修复了 Qwen2.5-VL 模型 NPU 补丁的属性缺失问题。

# 位于 verl/models/transformers/npu_patch.py
# 修改后的补丁区域:Qwen2.5-VL Model
​
# Patches for Qwen2.5-VL Model
# 使用 hasattr 检查属性存在性,避免版本字符串比较的陷阱
if hasattr(modeling_qwen2_5_vl, "Qwen2RMSNorm"):
    # 旧版本 transformers(如 4.57.0)使用 Qwen2RMSNorm
    modeling_qwen2_5_vl.Qwen2RMSNorm.forward = rms_norm_forward_npu
else:
    # 新版本 transformers(如 5.3.0)使用重命名后的 Qwen2_5_VLRMSNorm
    modeling_qwen2_5_vl.Qwen2_5_VLRMSNorm.forward = rms_norm_forward_npu
​
# MLP 补丁保持不变
modeling_qwen2_5_vl.Qwen2_5_VLMLP.forward = silu_forward_npu

评论区精华

版本号字符串比较的可靠性 正确性

AI 审查者 `gemini-code-assist[bot]` 指出使用 `transformers_version <= "5.1.0"` 进行版本判断是不可靠的,因为 Python 的字符串比较是字典序的,例如 `"10.0.0" < "5.1.0"` 会返回 true,导致逻辑错误。建议使用 `hasattr` 检查属性存在性。

结论:采纳建议,最终提交使用 `hasattr(modeling_qwen2_5_vl, "Qwen2RMSNorm")` 代替版本字符串比较。 · 已解决

风险与影响

风险极低。变更仅涉及一个条件判断,不存在回归风险。但需确认 Qwen2_5_VLRMSNorm 在所有新版本 transformers 中都存在,否则仍需额外 fallback。

影响范围仅限于使用 transformers 新版本(>=5.2.0)并启用 NPU 补丁的用户。修复后这些用户可以正常进行 FSDP 训练,不会影响旧版本用户或其他模型补丁。

低风险 核心路径变更

关联 Issue

#5788 Failed to apply NPU patches: module 'transformers.models.qwen2_5_vl.modeling_qwen2_5_vl' has no attribute 'Qwen2RMSNorm'

完整报告

参与讨论