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 视觉编码器创建。