from typing import List, Optional import torch import torch.nn as nn import torch.distributed as dist from transformers.modeling_utils import PreTrainedModel from transformers.utils import logging try: from .configuration_mimo_v2_pro import MiMoV2ProConfig except ImportError: from configuration_mimo_v2_pro import MiMoV2ProConfig logger = logging.get_logger(__name__) class FakeRMSNorm(nn.Module): def __init__(self, hidden_size, eps=1e-6): super().__init__() self.weight = nn.Parameter(torch.empty(hidden_size)) def forward(self, x): raise NotImplementedError("This is a fake model and does not support forward pass.") class FakeMLP(nn.Module): def __init__(self, config: MiMoV2ProConfig, is_expert=False): super().__init__() if is_expert: self.intermediate_size = config.moe_intermediate_size else: self.intermediate_size = config.intermediate_size self.hidden_size = config.hidden_size self.gate_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) self.up_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) self.down_proj = nn.Linear(self.intermediate_size, self.hidden_size, bias=False) def forward(self, x): raise NotImplementedError("This is a fake model and does not support forward pass.") class FakeMoEGate(nn.Module): def __init__(self, config: MiMoV2ProConfig): super().__init__() self.weight = nn.Parameter( torch.empty((config.n_routed_experts, config.hidden_size), dtype=torch.float32) ) if config.topk_method == "noaux_tc": self.e_score_correction_bias = nn.Parameter( torch.empty((config.n_routed_experts), dtype=torch.float32) ) def forward(self, hidden_states): raise NotImplementedError("This is a fake model and does not support forward pass.") class FakeMoE(nn.Module): def __init__(self, config: MiMoV2ProConfig): super().__init__() self.experts = nn.ModuleList( [FakeMLP(config, is_expert=True) for _ in range(config.n_routed_experts)] ) self.gate = FakeMoEGate(config) def forward(self, hidden_states): raise NotImplementedError("This is a fake model and does not support forward pass.") class FakeFullAttention(nn.Module): """Fake Attention for full attention layers (hybrid_layer_pattern == 0).""" def __init__(self, config: MiMoV2ProConfig): super().__init__() q_size = config.num_attention_heads * config.head_dim k_size = config.num_key_value_heads * config.head_dim v_size = config.num_key_value_heads * config.v_head_dim o_size = config.num_attention_heads * config.v_head_dim self.qkv_proj = nn.Linear( config.hidden_size, q_size + k_size + v_size, bias=config.attention_bias ) self.o_proj = nn.Linear(o_size, config.hidden_size, bias=False) if getattr(config, "add_full_attention_sink_bias", False): self.attention_sink_bias = nn.Parameter( torch.empty(config.num_attention_heads) ) def forward(self, *args, **kwargs): raise NotImplementedError("This is a fake model and does not support forward pass.") class FakeSWAAttention(nn.Module): """Fake Attention for SWA layers (hybrid_layer_pattern == 1).""" def __init__(self, config: MiMoV2ProConfig): super().__init__() q_size = config.swa_num_attention_heads * config.swa_head_dim k_size = config.swa_num_key_value_heads * config.swa_head_dim v_size = config.swa_num_key_value_heads * config.swa_v_head_dim o_size = config.swa_num_attention_heads * config.swa_v_head_dim self.qkv_proj = nn.Linear( config.hidden_size, q_size + k_size + v_size, bias=config.attention_bias ) self.o_proj = nn.Linear(o_size, config.hidden_size, bias=False) if getattr(config, "add_swa_attention_sink_bias", False): self.attention_sink_bias = nn.Parameter( torch.empty(config.swa_num_attention_heads) ) def forward(self, *args, **kwargs): raise NotImplementedError("This is a fake model and does not support forward pass.") class FakeDecoderLayer(nn.Module): def __init__(self, config: MiMoV2ProConfig, layer_idx: int): super().__init__() self.input_layernorm = FakeRMSNorm(config.hidden_size, eps=config.layernorm_epsilon) self.post_attention_layernorm = FakeRMSNorm( config.hidden_size, eps=config.layernorm_epsilon ) is_moe = ( getattr(config, "n_routed_experts", None) is not None and config.moe_layer_freq[layer_idx] ) self.mlp = FakeMoE(config) if is_moe else FakeMLP(config) is_swa = config.hybrid_layer_pattern[layer_idx] == 1 self.self_attn = FakeSWAAttention(config) if is_swa else FakeFullAttention(config) def forward(self, *args, **kwargs): raise NotImplementedError("This is a fake model and does not support forward pass.") class FakeMTPLayer(nn.Module): def __init__(self, config: MiMoV2ProConfig): super().__init__() self.eh_proj = nn.Linear(2 * config.hidden_size, config.hidden_size, bias=False) self.enorm = FakeRMSNorm(config.hidden_size, eps=config.layernorm_epsilon) self.hnorm = FakeRMSNorm(config.hidden_size, eps=config.layernorm_epsilon) self.final_layernorm = FakeRMSNorm(config.hidden_size, eps=config.layernorm_epsilon) self.input_layernorm = FakeRMSNorm(config.hidden_size, eps=config.layernorm_epsilon) self.pre_mlp_layernorm = FakeRMSNorm(config.hidden_size, eps=config.layernorm_epsilon) self.self_attn = FakeSWAAttention(config) self.mlp = FakeMLP(config) def forward(self, *args, **kwargs): raise NotImplementedError("This is a fake model and does not support forward pass.") class MiMoV2ProModel(PreTrainedModel): config_class = MiMoV2ProConfig def __init__(self, config: MiMoV2ProConfig): super().__init__(config) self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size) self.layers = nn.ModuleList( [FakeDecoderLayer(config, i) for i in range(config.num_hidden_layers)] ) self.norm = FakeRMSNorm(config.hidden_size, eps=config.layernorm_epsilon) self.mtp = nn.ModuleDict( {"layers": nn.ModuleList([FakeMTPLayer(config)])} ) def forward(self, *args, **kwargs): raise NotImplementedError("This is a fake model and does not support forward pass.") class MiMoV2ProForCausalLM(PreTrainedModel): config_class = MiMoV2ProConfig _keys_to_ignore_on_load_unexpected = [ r"model.layers\.\d+\.self_attn\.rotary_emb\.inv_freq" ] def __init__(self, config: MiMoV2ProConfig): super().__init__(config) self.model = MiMoV2ProModel(config) self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) def forward(self, *args, **kwargs): raise NotImplementedError("This is a fake model and does not support forward pass.")