Prhub

#25023 [NemotronH] V3 Omni wrapper: WeightsMapper + config round-trip

原始 PR 作者 Kh4L 合并时间 2026-05-27 04:34 文件变更 2 提交数 5 评论 2 代码增减 +17 / -0

执行摘要

修复 NemotronH V3 Omni NVFP4 权重加载

解决 Nemotron-3-Nano-Omni NVFP4 检查点在加载时由于 quantized_layers 的键前缀 language_model.backbone. 在 sglang 中未正确映射而失败的问题;以及 to_dict() 后恢复配置时丢失 raw_vision_config 的问题。

建议检查并合并,属于 bugfix,逻辑清晰,影响范围小。

讨论亮点

PR 没有公开的 review 讨论。

实现拆解

  1. 添加 WeightsMapper:在 NemotronH_Nano_VL_V2 类上定义 hf_to_sglang_mapper,将 language_model.backbone. 前缀映射为 language_model.model.,修复量化层配置加载。
  2. 配置往返修复:在 NemotronH_Nano_VL_V2_Config.__init__ 中,当 vision_config 为 None 时,从 kwargs 中弹出 raw_vision_config 赋值给 vision_config,确保 to_dict() / from_dict() 往返不丢失视觉配置。
文件 模块 状态 重要度
python/sglang/srt/models/nano_nemotron_vl.py 模型定义 modified 6.12
python/sglang/srt/configs/nano_nemotron_vl.py 配置 modified 5.4

关键符号

NemotronH_Nano_VL_V2.__init__ NemotronH_Nano_VL_V2_Config.__init__

关键源码片段

python/sglang/srt/models/nano_nemotron_vl.py data-contract

为主要模型类添加了 WeightsMapper,修复量化层名称映射。

# 导入 WeightsMapper
from sglang.srt.models.utils import WeightsMapperclass NemotronH_Nano_VL_V2(EVS):
    # 外层的 mapper 用于将量化配置中的层名从 language_model.backbone.
    # 转换为 runtime 使用的 language_model.model. 前缀
    hf_to_sglang_mapper = WeightsMapper(
        orig_to_new_prefix={
            "language_model.backbone.": "language_model.model.",
        },
    )
python/sglang/srt/configs/nano_nemotron_vl.py core-logic

在配置类中支持 vision_config 与 raw_vision_config 的别名,修复配置往返。

class NemotronH_Nano_VL_V2_Config(PretrainedConfig):
    def __init__(
        self,
        vision_config=None,
        llm_config=None,
        sound_config=None,
        # ... 其他参数 ...
        **kwargs,
    ):
        # 当 vision_config 为 None 时,尝试从 kwargs 中取出 raw_vision_config(V2 存储名称),
        # 以支持 V3->V2 配置往返:to_dict() 生成 raw_vision_config,
        # 而 from_dict() 通过 vision_config 参数重建。
        if vision_config is None:
            vision_config = kwargs.pop("raw_vision_config", None)
​
        super().__init__(**kwargs)
​
        if llm_config is not None:
            self.llm_config = NemotronHConfig(**llm_config)
            assert isinstance(vision_config, dict), "vision_config must be a dictionary"
            self.raw_vision_config = vision_config
        else:
            assert vision_config is None
            self.llm_config = NemotronHConfig()
            self.raw_vision_config = {}

评论区精华

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

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

风险与影响

风险较低:变更仅影响 NemotronH V3 Omni 模型加载路径,不影响其他模型;增加了导入依赖 WeightsMapper,但该模块已存在。没有测试覆盖,但改动简单清晰。

直接影响使用 NVFP4 量化格式的 Nemotron-3-Nano-Omni 模型加载;不影响现有其他模型或推理路径。

缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论