跳转至

model_initializer.py — mcore 模型初始化器

文件路径

verl/models/mcore/model_initializer.py

文件概述

提供了一组模型初始化器类,用于创建 Megatron-Core 的 GPTModel 实例。使用工厂模式,不同架构有不同的初始化逻辑。

关键代码讲解

基类 BaseModelInitializer

class BaseModelInitializer(ABC):
    def __init__(self, tfconfig: TransformerConfig, hf_config: PretrainedConfig):
        self.tfconfig = tfconfig
        self.hf_config = hf_config

    @abstractmethod
    def get_transformer_layer_spec(self, vp_stage=None):
        """获取 transformer 层的规格说明"""
        pass

    def initialize(self, pre_process=True, post_process=True,
                   share_embeddings_and_output_weights=False, value=False, **extra_kwargs):
        transformer_layer_spec = self.get_transformer_layer_spec()
        model = GPTModel(
            config=self.tfconfig,
            transformer_layer_spec=transformer_layer_spec,
            vocab_size=self.hf_config.vocab_size,
            max_sequence_length=self.hf_config.max_position_embeddings,
            pre_process=pre_process,   # 是否包含 embedding 层
            post_process=post_process, # 是否包含输出层
            position_embedding_type="rope",
            rotary_base=self.hf_config.rope_theta,
        )
        # 如果是 value 模型(critic),替换输出层为单输出
        if post_process and value:
            model.output_layer = LinearForLastLayer(input_size=self.tfconfig.hidden_size, output_size=1)
        return model

关键参数: - pre_process/post_process:流水线并行中,只有第一阶段需要 embedding,最后一阶段需要输出层 - value:PPO 中 critic 模型输出标量价值,不是词表分布

DenseModel -- 密集模型

class DenseModel(BaseModelInitializer):
    def get_transformer_layer_spec(self, vp_stage=None):
        return get_gpt_decoder_block_spec(self.tfconfig, use_transformer_engine=True)

适用于 LLaMA、Qwen2、Qwen3 等标准密集模型。

MoE 模型 -- Qwen2MoEModel / MixtralModel / Qwen3MoEModel

class Qwen2MoEModel(BaseModelInitializer):
    def get_transformer_layer_spec(self, vp_stage=None):
        spec = get_gpt_decoder_block_spec(self.tfconfig, use_transformer_engine=True)
        # 为共享专家添加 gate 参数
        for i in range(len(spec.layer_specs)):
            spec.layer_specs[i].submodules.mlp.submodules.shared_experts.params["gate"] = True
        return spec

    def initialize(self, **kwargs):
        model = super().initialize(**kwargs)
        # 默认冻结 MoE router 权重
        freeze_moe_router = kwargs.get("freeze_moe_router", True)
        if freeze_moe_router:
            for layer in model.decoder.layers:
                layer.mlp.router.weight.requires_grad = False
        return model

重要设计:MoE 模型在 RL 训练中默认冻结 router 权重(requires_grad = False),因为 router 的训练可能不稳定。

DeepseekV3Model -- MLA + MoE

class DeepseekV3Model(BaseModelInitializer):
    def initialize(self, **kwargs):
        # 支持 MTP (Multi-Token Prediction)
        if self.tfconfig.mtp_num_layers > 0:
            mtp_block_spec = get_gpt_mtp_block_spec(self.tfconfig, ...)
            kwargs["mtp_block_spec"] = mtp_block_spec
        model = super().initialize(**kwargs)
        return model

Qwen25VLModel -- VLM

class Qwen25VLModel(BaseModelInitializer):
    def initialize(self, ...):
        # 创建视觉编码器配置和语言模型配置
        vision_transformer_config = get_vision_model_config(...)
        vision_projection_config = get_vision_projection_config(...)
        # 创建完整的 VLM 模型
        qwen25_vl_model = Qwen2_5VLModel(
            language_transformer_config=tfconfig,
            vision_transformer_config=vision_transformer_config,
            vision_projection_config=vision_projection_config,
            # ...
        )

VLM 需要同时创建视觉编码器和语言模型。

核心类列表

类名 适用模型 特殊处理
BaseModelInitializer 基类 通用初始化逻辑
DenseModel LLaMA, Qwen2, Qwen3 标准 decoder
Qwen2MoEModel Qwen2 MoE 共享专家 gate + 冻结 router
MixtralModel Mixtral 可选冻结 router
Qwen3MoEModel Qwen3 MoE 冻结 router
DeepseekV3Model DeepSeek-V3 MLA + MTP
Qwen25VLModel Qwen2.5-VL 视觉编码器 + 语言模型

与其他模块的关系

  • 被 registry.py 的 init_mcore_model() 调用
  • 使用 config_converter.py 产生的 TransformerConfig
  • VLM 初始化器使用 qwen2_5_vl/ 子模块

小结

模型初始化器封装了不同架构的 mcore GPTModel 创建细节,包括 layer spec 获取、MoE router 冻结、MTP 支持和 VLM 视觉编码器创建。