mimo / modeling_mimo_v2_pro.py
WeJ520's picture
Add files using upload-large-folder tool
e342a13 verified
Raw
History Blame Contribute Delete
7.27 kB
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.")