Prhub

#41206 Fix Gemma4 MoE expert weight remapping

原始 PR 作者 Baekpica 合并时间 2026-04-30 15:12 文件变更 1 提交数 9 评论 12 代码增减 +5 / -1

执行摘要

修复 Gemma4 MoE 权重重映射重复 .moe 前缀的 bug

在加载某些Gemma4 NVFP4或AWQ量化检查点时,原有的专家权重重映射逻辑对已经包含.moe.experts前缀的键再次应用替换,产生.moe.moe.experts的错误键名,导致参数查找失败。此修复旨在兼容已包含和不含.moe前缀两种命名模式的检查点,确保权重加载成功。

此PR虽小但修复了一个明确的加载崩溃bug,设计上使用负向lookbehind简洁有效。建议负责模型加载的开发者关注此实现,并在其他类似需要条件替换的场景中复用此模式。

讨论亮点

审查中主要讨论了三个问题:

  • 哪个HF repo受影响:作者提供了具体检查点名并确认问题普遍存在。
  • 是否为breaking change:作者澄清现有模式仍工作,向后兼容。
  • 测试文件存废:reviewer要求移除单独的测试文件,作者遵从并仅保留本地断言验证。
    用户tbooher89在讨论中证实了该bug的存在并支持合并。

实现拆解

  1. 提取重映射逻辑为独立函数:在vllm/model_executor/models/gemma4.py中新增_remap_gemma4_expert_weight_name(name: str) -> str函数,将原有的内联re.sub调用封装成可测试的独立单元。
  2. 使用负向lookbehind避免重复前缀:正则表达式从r"\.experts\.(\d+)\."改为r"(?<!\.moe)\.experts\.(\d+)\.",确保当键中已包含.moe.experts时不再插入.moe前缀。
  3. 替换调用点:在_weight_iterator内,原名称重映射行替换为调用上述新函数,保持其余逻辑不变。
  4. 移除临时测试文件:根据reviewer建议,移除了最初包含的tests/models/test_gemma4.py,但保留了通过py_compile和直接断言进行的本地验证。
文件 模块 状态 重要度
vllm/model_executor/models/gemma4.py 模型加载 modified 6.28

关键符号

_remap_gemma4_expert_weight_name

关键源码片段

vllm/model_executor/models/gemma4.py data-contract

唯一的变更文件,包含核心修复:新增 `_remap_gemma4_expert_weight_name` 函数,并替换 `_weight_iterator` 中的内联替换逻辑,修复重复前缀 bug。

# gemma4.py — 新增的 helper 函数,安全重映射 MoE 专家权重名
# 避免已包含 .moe.experts 前缀的键被重复插入 .moe.def _remap_gemma4_expert_weight_name(name: str) -> str:
    """
    Remap expert weight names to include .moe prefix only once.
    Uses negative lookbehind (?<!\.moe) to avoid double-prefixing
    when the key already contains .moe.experts.
    """
    return re.sub(r"(?<!\.moe)\.experts\.(\d+)\.", r".moe.experts.\1.", name)# 在 _weight_iterator 中,替换原内联 re.sub 为调用此函数:
# 旧代码(有 bug):
# name = re.sub(r"\.experts\.(\d+)\.", r".moe.experts.\1.", name)
# 新代码(修复):
name = _remap_gemma4_expert_weight_name(name)

评论区精华

受影响检查点确认 question

DarkLight1337 询问哪个 HF Hub repo 有问题,Baekpica 提供了 `bg-digitalservices/Gemma-4-26B-A4B-it-NVFP4` 并在另一环境下用 `cyankiwi/gemma-4-26B-A4B-it-AWQ-4bit` 复现。tbooher89 也确认在 v0.20.0 遇到相同错误。

结论:确认问题影响多个 Gemma4 量化变体,包括 NVFP4 和 AWQ 检查点,不限于单一 repo。 · 已解决

变更是否为 breaking change 设计

juhi10071998 询问变更是否破坏现有兼容性,Baekpica 解释如果键没有 `.moe` 则正常添加,如果已有则跳过,因此向后兼容。

结论:确认不是 breaking change,向后兼容。 · 已解决

移除测试文件 测试

Isotr0py 在 review 中要求移除 `tests/models/test_gemma4.py`,Baekpica 在后续提交中移除,并改为通过 `py_compile` 和直接断言验证。

结论:测试文件被移除,作者通过本地验证保证质量。 · 已解决

风险与影响

低风险。修复仅针对已含.moe.experts前缀的键名,对不含该前缀的键名行为完全不变。但该路径是模型加载关键路径,如果仍有其他未覆盖的命名模式(如.moe出现在其他上下文中),可能仍有错误。缺乏集成测试覆盖是潜在风险,但作者提供了本地断言验证。

影响所有使用Gemma4模型(特别是量化变体NVFP4/AWQ)的用户。对于尚未遇到bug的用户,升级后无行为变化;对于受影响的用户,修复后模型可正常加载。无性能影响。

核心路径变更 向后兼容已确认

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论