Prhub

#47440 fix: ensure no double load of lm head in nemotron mtp

原始 PR 作者 shaunkotek 合并时间 2026-07-07 20:01 文件变更 1 提交数 3 评论 0 代码增减 +1 / -5

执行摘要

修复 Nemotron MTP 中 lm_head 被重复加载的问题

修复 Nemotron MTP 模型在量化(量化)场景下 lm_head 权重因名称不含 "mtp." 前缀而被跳过,导致加载失败或精度问题。

该 PR 是典型的针对性 bugfix,改动小且风险低,值得快速合并。建议合并后验证 Nemotron 量化模型的精度和 AL 指标。

讨论亮点

该 PR 没有公开的 review 讨论。

实现拆解

  1. 修改文件vllm/model_executor/models/nemotron_h_mtp.py 中的 load_weights 方法。
  2. 核心变更:移除 load_weights 中对 name 是否包含 "lm_head" 的检查条件,使得以 "lm_head" 为名的权重不再被跳过。
  3. 影响分析:该修改仅影响 Nemotron MTP 模型的权重加载阶段,不涉及运行时逻辑。保留了对非 MTP 权重(如 "backbone." 等)的过滤,仅放宽了 "lm_head" 的过滤,确保量化后名称不含 "mtp." 的 lm_head 权重能被正确加载。
文件 模块 状态 重要度
vllm/model_executor/models/nemotron_h_mtp.py 模型执行器 modified 5.8

关键源码片段

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

修复了 MTP 模型权重加载过滤条件,移除了对 lm_head 的跳过逻辑,确保量化后 lm_head 能被正确加载。

# vllm/model_executor/models/nemotron_h_mtp.py (diff 片段 )
for name, loaded_weight in weights:
    # 仅处理 MTP 权重 - 跳过所有非 MTP 权重
    # 注意:移除了 `and "lm_head" not in name` 条件,
    # 因为量化后的 lm_head 可能不含 "mtp." 前缀,
    # 但仍需被加载以确保模型正确
    if not name.startswith("mtp.") and "embeddings" not in name:
        continue
    # 跳过旋转嵌入(计算得来,不加载)
    if "rotary_emb.inv_freq" in name:
        continue

评论区精华

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

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

风险与影响

低风险。修改范围仅限权重加载时的过滤条件,且只移除了一个条件分支(and "lm_head" not in name),不会影响其他非 MTP 权重的加载。原有逻辑中非 MTP 权重(除 lm_head 外)仍被过滤,不会导致权重重复加载或误加载。

用户影响:修复了使用量化(如 FP8)Nemotron MTP 模型时 lm_head 权重未被加载的问题,确保模型正确加载和推理。
系统影响:无性能或稳定性影响。
团队影响:低,单文件微小改动。

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论