Prhub

#46986 [Bugfix] Fix DeepseekV2Model hidden_size

原始 PR 作者 jeejeelee 合并时间 2026-06-30 00:44 文件变更 1 提交数 2 评论 1 代码增减 +4 / -4

执行摘要

修复 DeepseekV2Model hidden_size 引用错误

DeepseekV2Model 的 init 中多处直接使用 config.hidden_size,但未显式保存为 self.hidden_size,导致子类或后续逻辑若覆盖 hidden_size 时引用不一致。PR body 引用 #46983 说明此问题。

值得合并,属于规范化修复,提升代码一致性和可维护性。建议后续考虑在相似模型中推广此模式。

讨论亮点

Review 中 cjackal 提出了一个建议,指出差分中 self.hidden_size = self.hidden_size 应改为 self.hidden_size = config.hidden_size,但该评论最终未被采纳(实际提交已修正为正确赋值)。此外,yewentao256 批准了该 PR,无其他讨论。

实现拆解

  1. DeepseekV2Model.__init__ 中增加 self.hidden_size = config.hidden_size,将 hidden_size 存储为实例属性。
  2. embed_tokens 的构造参数从 config.hidden_size 改为 self.hidden_size
  3. norm(RMSNorm)的输入维度从 config.hidden_size 改为 self.hidden_size
  4. make_empty_intermediate_tensors 调用中的 hidden_size 参数从 config.hidden_size 改为 self.hidden_size
    以上变更仅涉及 vllm/model_executor/models/deepseek_v2.py,共 +4/-4 行,无测试或配置配套改动。
文件 模块 状态 重要度
vllm/model_executor/models/deepseek_v2.py 模型层 modified 5.02

关键符号

DeepseekV2Model.__init__

关键源码片段

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

唯一变更文件,修复 DeepseekV2Model 中 hidden_size 的引用方式。

class DeepseekV2Model(nn.Module):
    def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
        super().__init__()
        config = vllm_config.model_config.hf_config
        quant_config = vllm_config.quant_config
        self.config = config
        self.device = current_platform.device_type
        # 新增 : 将 hidden_size 存储为实例属性,避免直接引用 config
        self.hidden_size = config.hidden_size
        self.vocab_size = config.vocab_size
        self.is_v32 = hasattr(config, "index_topk")
        if self.is_v32:
            topk_tokens = config.index_topk
            topk_indices_buffer = torch.empty(
                vllm_config.scheduler_config.max_num_batched_tokens,
                topk_tokens,
                dtype=torch.int32,
                device=self.device,
            )
        else:
            topk_indices_buffer = None
​
        if get_pp_group().is_first_rank:
            # 使用 self.hidden_size 替代 config.hidden_size
            self.embed_tokens = VocabParallelEmbedding(
                config.vocab_size,
                self.hidden_size,
                quant_config=quant_config,
                prefix=f"{prefix}.embed_tokens",
            )
        else:
            self.embed_tokens = PPMissingLayer()
        # ... layers creation ...
​
        if get_pp_group().is_last_rank:
            # 使用 self.hidden_size
            self.norm = RMSNorm(self.hidden_size, eps=config.rms_norm_eps)
        else:
            self.norm = PPMissingLayer()
        self.make_empty_intermediate_tensors = make_empty_intermediate_tensors_factory(
            ["hidden_states", "residual"], self.hidden_size
        )
        # ... other attributes ...

评论区精华

self.hidden_size 赋值错误 正确性

cjackal 发现代码中写的是 `self.hidden_size = self.hidden_size`,建议改为 `self.hidden_size = config.hidden_size`。

结论:该评论在后续提交中已修正为正确赋值,PR 已合并。 · 已解决

风险与影响

风险极低:变更仅将 config.hidden_size 的引用方式改为通过 self.hidden_size 间接引用,值完全一致,无逻辑行为改变。但若子类覆盖了 hidden_size 且未正确处理,可能引入不一致,但当前代码无子类覆盖此属性。

直接影响 DeepseekV2 系列模型的初始化流程,但无功能变化。对用户透明,不改变加载行为或推理结果。

低风险 无测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论