"""OmniMythos v3 — dense backbone with interleaved Mamba3 + GDN2 recurrent core. Recurrent inner loop pattern: M3 → GDN2 → M3 → MLA → GDN2 → M3 → GDN2 → MLA """ import math import torch import torch.nn as nn import torch.nn.functional as F from dataclasses import dataclass from fla.layers.mamba3 import Mamba3 from gdn2 import GatedDeltaNet2 @dataclass class MythosConfig: vocab_size: int = 32000 dim: int = 2048 n_heads: int = 16 max_seq_len: int = 1_000_000 kv_lora_rank: int = 512 q_lora_rank: int = 1536 qk_rope_head_dim: int = 64 qk_nope_head_dim: int = 128 v_head_dim: int = 128 prelude_attn_layers: int = 2 coda_attn_layers: int = 2 max_loop_iters: int = 32 act_threshold: float = 0.99 audio_vocab: int = 1024 audio_n_codebooks: int = 8 image_vocab: int = 8192 audio_encoder_dim: int = 1280 vision_encoder_dim: int = 1152 rope_theta: float = 500000.0 lora_rank: int = 64 # MoE upscale at the mla_exit FFN site only. Disabled by default -- # dense backbone trains with plain FFN everywhere. Flip moe_enabled # to True to swap in MoEFFN at that one site. moe_enabled: bool = False moe_n_experts: int = 8 moe_expert_dim: int = 1024 moe_top_k: int = 2 ffn_mult: float = 1.333 tie_embeddings: bool = True mamba_headdim: int = 64 mamba_d_state: int = 128 class RMSNorm(nn.Module): def __init__(self, dim, eps=1e-6): super().__init__() self.eps = eps self.weight = nn.Parameter(torch.ones(dim)) def forward(self, x): rms = x.float().pow(2).mean(-1, keepdim=True).add(self.eps).rsqrt() return (x * rms * self.weight).to(x.dtype) class FFN(nn.Module): def __init__(self, dim, hidden): super().__init__() self.gate = nn.Linear(dim, hidden, bias=False) self.up = nn.Linear(dim, hidden, bias=False) self.down = nn.Linear(hidden, dim, bias=False) def forward(self, x): return self.down(F.silu(self.gate(x)) * self.up(x)) class MoEFFN(nn.Module): """MoE upscale for the mla_exit FFN site. Disabled by default (cfg.moe_enabled=False) -- the dense backbone trains with plain FFN. When enabled, swaps in N experts (each a standard SwiGLU FFN at expert_dim) with top-k routing. """ def __init__(self, cfg): super().__init__() self.n_experts = cfg.moe_n_experts self.top_k = cfg.moe_top_k self.router = nn.Linear(cfg.dim, cfg.moe_n_experts, bias=False) self.experts = nn.ModuleList([ FFN(cfg.dim, cfg.moe_expert_dim) for _ in range(cfg.moe_n_experts) ]) def forward(self, x): B, T, D = x.shape x_flat = x.view(B * T, D) router_logits = self.router(x_flat) router_weights = F.softmax(router_logits, dim=-1, dtype=torch.float32) top_weights, top_idx = router_weights.topk(self.top_k, dim=-1) top_weights = (top_weights / top_weights.sum(dim=-1, keepdim=True)).to(x.dtype) out = torch.zeros_like(x_flat) for k in range(self.top_k): idx = top_idx[:, k] w = top_weights[:, k].unsqueeze(-1) for e in range(self.n_experts): mask = idx == e if mask.any(): out[mask] += w[mask] * self.experts[e](x_flat[mask]) return out.view(B, T, D) def make_ffn(cfg): return FFN(cfg.dim, int(cfg.dim * cfg.ffn_mult)) def make_ffn_mla(cfg): """FFN factory specifically for the mla_exit site -- the one place the original design called out for MoE upscaling. Everywhere else (M3/GDN2 blocks) always uses plain make_ffn(), regardless of cfg.moe_enabled. """ if cfg.moe_enabled: return MoEFFN(cfg) return make_ffn(cfg) def precompute_freqs_cis(head_dim, max_len, theta): inv = 1.0 / (theta ** (torch.arange(0, head_dim, 2).float() / head_dim)) t = torch.arange(max_len).float() freqs = torch.outer(t, inv) return torch.polar(torch.ones_like(freqs), freqs) def apply_rope(x, freqs_cis): B, H, T, D = x.shape xc = torch.view_as_complex(x.float().reshape(B, H, T, D // 2, 2)) xc = xc * freqs_cis.view(1, 1, T, D // 2) return torch.view_as_real(xc).reshape(B, H, T, D).to(x.dtype) class SoftmaxAttention(nn.Module): def __init__(self, cfg): super().__init__() self.n_heads = cfg.n_heads self.head_dim = cfg.dim // cfg.n_heads self.wq = nn.Linear(cfg.dim, cfg.dim, bias=False) self.wk = nn.Linear(cfg.dim, cfg.dim, bias=False) self.wv = nn.Linear(cfg.dim, cfg.dim, bias=False) self.wo = nn.Linear(cfg.dim, cfg.dim, bias=False) def forward(self, x, freqs_cis): B, T, D = x.shape q = self.wq(x).view(B, T, self.n_heads, self.head_dim).transpose(1, 2) k = self.wk(x).view(B, T, self.n_heads, self.head_dim).transpose(1, 2) v = self.wv(x).view(B, T, self.n_heads, self.head_dim).transpose(1, 2) q = apply_rope(q, freqs_cis) k = apply_rope(k, freqs_cis) out = F.scaled_dot_product_attention(q, k, v, is_causal=T > 1) return self.wo(out.transpose(1, 2).contiguous().view(B, T, D)) class SoftmaxBlock(nn.Module): def __init__(self, cfg): super().__init__() self.norm1 = RMSNorm(cfg.dim) self.attn = SoftmaxAttention(cfg) self.norm2 = RMSNorm(cfg.dim) self.ffn = make_ffn(cfg) def forward(self, x, freqs_cis): x = x + self.attn(self.norm1(x), freqs_cis) x = x + self.ffn(self.norm2(x)) return x class MLAttention(nn.Module): def __init__(self, cfg): super().__init__() self.n_heads = cfg.n_heads self.nope = cfg.qk_nope_head_dim self.rope = cfg.qk_rope_head_dim self.v_dim = cfg.v_head_dim self.qk_dim = self.nope + self.rope self.wq_a = nn.Linear(cfg.dim, cfg.q_lora_rank, bias=False) self.q_norm = RMSNorm(cfg.q_lora_rank) self.wq_b = nn.Linear(cfg.q_lora_rank, cfg.n_heads * self.qk_dim, bias=False) self.wkv_a = nn.Linear(cfg.dim, cfg.kv_lora_rank + self.rope, bias=False) self.kv_norm = RMSNorm(cfg.kv_lora_rank) self.wkv_b = nn.Linear(cfg.kv_lora_rank, cfg.n_heads * (self.nope + self.v_dim), bias=False) self.wo = nn.Linear(cfg.n_heads * self.v_dim, cfg.dim, bias=False) self.kv_lora_rank = cfg.kv_lora_rank def forward(self, x, freqs_cis): B, T, _ = x.shape H = self.n_heads q = self.wq_b(self.q_norm(self.wq_a(x))).view(B, T, H, self.qk_dim).transpose(1, 2) q_nope, q_pe = q.split([self.nope, self.rope], dim=-1) q_pe = apply_rope(q_pe, freqs_cis) kv = self.wkv_a(x) c_kv, k_pe = kv.split([self.kv_lora_rank, self.rope], dim=-1) k_pe = apply_rope(k_pe.unsqueeze(1), freqs_cis) kv = self.wkv_b(self.kv_norm(c_kv)).view(B, T, H, self.nope + self.v_dim).transpose(1, 2) k_nope, v = kv.split([self.nope, self.v_dim], dim=-1) q = torch.cat([q_nope, q_pe], dim=-1) k = torch.cat([k_nope, k_pe.expand(-1, H, -1, -1)], dim=-1) out = F.scaled_dot_product_attention(q, k, v, is_causal=T > 1) return self.wo(out.transpose(1, 2).contiguous().view(B, T, H * self.v_dim)) class MLADenseBlock(nn.Module): def __init__(self, cfg): super().__init__() self.norm1 = RMSNorm(cfg.dim) self.attn = MLAttention(cfg) self.norm2 = RMSNorm(cfg.dim) self.ffn = make_ffn_mla(cfg) def forward(self, x, freqs_cis): x = x + self.attn(self.norm1(x), freqs_cis) x = x + self.ffn(self.norm2(x)) return x class Mamba3Block(nn.Module): def __init__(self, cfg): super().__init__() self.norm1 = RMSNorm(cfg.dim) self.mixer = Mamba3( hidden_size=cfg.dim, state_size=cfg.mamba_d_state, head_dim=cfg.mamba_headdim, expand=1, n_groups=1, is_mimo=False, chunk_size=64, ) self.norm2 = RMSNorm(cfg.dim) self.ffn = make_ffn(cfg) def forward(self, x): x = x + self.mixer(self.norm1(x))[0] x = x + self.ffn(self.norm2(x)) return x class GDN2Block(nn.Module): def __init__(self, cfg): super().__init__() self.norm1 = RMSNorm(cfg.dim) self.mixer = GatedDeltaNet2( hidden_size=cfg.dim, head_dim=cfg.mamba_headdim, num_heads=cfg.dim // cfg.mamba_headdim, mode="chunk", ) self.norm2 = RMSNorm(cfg.dim) self.ffn = make_ffn(cfg) def forward(self, x): x = x + self.mixer(self.norm1(x))[0] x = x + self.ffn(self.norm2(x)) return x class LTIInjection(nn.Module): def __init__(self, dim): super().__init__() self.log_A = nn.Parameter(torch.zeros(dim)) self.gate_e = nn.Parameter(torch.zeros(dim)) def forward(self, h, e, block_out): decay = torch.exp(-F.softplus(self.log_A)) return decay * h + torch.sigmoid(self.gate_e) * e + block_out class LoopEmbedding(nn.Module): def __init__(self, dim, max_loops): super().__init__() self.emb = nn.Embedding(max_loops, dim) nn.init.normal_(self.emb.weight, std=0.02) def forward(self, h, t): return h + self.emb.weight[t].to(h.dtype) class LoRADepthAdapter(nn.Module): def __init__(self, dim, rank, max_loops): super().__init__() self.down = nn.Linear(dim, rank, bias=False) self.up = nn.Linear(rank, dim, bias=False) self.loop_gate = nn.Embedding(max_loops, rank) nn.init.zeros_(self.up.weight) nn.init.ones_(self.loop_gate.weight) def forward(self, x, t): return self.up(self.down(x) * self.loop_gate.weight[t].to(x.dtype)) class ACTHalting(nn.Module): def __init__(self, dim): super().__init__() self.halt = nn.Linear(dim, 1) nn.init.zeros_(self.halt.weight) nn.init.constant_(self.halt.bias, -2.0) def forward(self, h): return torch.sigmoid(self.halt(h)).squeeze(-1) class RecurrentDenseBlock(nn.Module): def __init__(self, cfg): super().__init__() self.cfg = cfg # Pattern: (M3 -> GDN2 -> MLA) x 1, looped max_loop_iters times via forward() self.m3_0 = Mamba3Block(cfg) self.gdn_0 = GDN2Block(cfg) self.mla_0 = MLADenseBlock(cfg) self.injection = LTIInjection(cfg.dim) self.act = ACTHalting(cfg.dim) self.lora = LoRADepthAdapter(cfg.dim, cfg.lora_rank, cfg.max_loop_iters) self.loop_emb = LoopEmbedding(cfg.dim, cfg.max_loop_iters) self.norm = RMSNorm(cfg.dim) def inner(self, x, freqs_cis, t): x = self.m3_0(x) x = self.gdn_0(x) x = self.mla_0(x, freqs_cis) return x + self.lora(x, t) def forward(self, h, e, freqs_cis, n_loops=None): n_loops = n_loops or self.cfg.max_loop_iters B, T, D = h.shape x = h halted = torch.zeros(B, T, device=h.device, dtype=torch.bool) cumulative_p = torch.zeros(B, T, device=h.device, dtype=torch.float32) h_out = torch.zeros(B, T, D, device=h.device, dtype=torch.float32) for t in range(n_loops): x = self.loop_emb(x, t) x = self.injection(x, e, torch.zeros_like(x)) x = self.norm(x) block_out = self.inner(x, freqs_cis, t) x = x + block_out h_cur = x p = self.act(h_cur) still = (~halted).float() remainder = (1.0 - cumulative_p).clamp(min=0) last = t == n_loops - 1 weight = torch.where( (cumulative_p + p >= self.cfg.act_threshold) | last, remainder, p ) * still h_out = h_out + weight.unsqueeze(-1) * h_cur.float() cumulative_p = cumulative_p + p * still halted = halted | (cumulative_p >= self.cfg.act_threshold) if bool(halted.all()) and not self.training: break return h_out.to(e.dtype) class CrossAttention(nn.Module): def __init__(self, dim, encoder_dim, n_heads): super().__init__() self.n_heads = n_heads self.head_dim = dim // n_heads self.wq = nn.Linear(dim, dim, bias=False) self.wk = nn.Linear(encoder_dim, dim, bias=False) self.wv = nn.Linear(encoder_dim, dim, bias=False) self.wo = nn.Linear(dim, dim, bias=False) def forward(self, x, encoder_out): B, T, _ = x.shape S = encoder_out.shape[1] q = self.wq(x).view(B, T, self.n_heads, self.head_dim).transpose(1, 2) k = self.wk(encoder_out).view(B, S, self.n_heads, self.head_dim).transpose(1, 2) v = self.wv(encoder_out).view(B, S, self.n_heads, self.head_dim).transpose(1, 2) out = F.scaled_dot_product_attention(q, k, v) return self.wo(out.transpose(1, 2).contiguous().view(B, T, -1)) class ModalityBlock(nn.Module): def __init__(self, cfg, encoder_dim): super().__init__() self.norm1 = RMSNorm(cfg.dim) self.cross_attn = CrossAttention(cfg.dim, encoder_dim, cfg.n_heads) self.norm2 = RMSNorm(cfg.dim) self.ffn = make_ffn(cfg) def forward(self, x, encoder_out): x = x + self.cross_attn(self.norm1(x), encoder_out) x = x + self.ffn(self.norm2(x)) return x class OmniMythosDense(nn.Module): def __init__(self, cfg: MythosConfig): super().__init__() self.cfg = cfg self.embed = nn.Embedding(cfg.vocab_size, cfg.dim) # Modality encoders (prelude cross-attention) self.audio_encoder = ModalityBlock(cfg, cfg.audio_encoder_dim) self.vision_encoder = ModalityBlock(cfg, cfg.vision_encoder_dim) self.prelude_attn = nn.ModuleList([SoftmaxBlock(cfg) for _ in range(cfg.prelude_attn_layers)]) self.recurrent = RecurrentDenseBlock(cfg) self.coda_attn = nn.ModuleList([SoftmaxBlock(cfg) for _ in range(cfg.coda_attn_layers)]) # Modality decoders (coda cross-attention) self.audio_decoder = ModalityBlock(cfg, cfg.audio_encoder_dim) self.vision_decoder = ModalityBlock(cfg, cfg.vision_encoder_dim) self.norm_f = RMSNorm(cfg.dim) self.lm_head = nn.Linear(cfg.dim, cfg.vocab_size, bias=False) if cfg.tie_embeddings: self.lm_head.weight = self.embed.weight # MoE upscale points self.audio_head = nn.Linear(cfg.dim, cfg.audio_vocab * cfg.audio_n_codebooks) self.image_head = nn.Linear(cfg.dim, cfg.image_vocab, bias=False) head_dim = cfg.dim // cfg.n_heads self.freqs_softmax = precompute_freqs_cis(head_dim, 8192, cfg.rope_theta) self.freqs_mla = precompute_freqs_cis(cfg.qk_rope_head_dim, 8192, cfg.rope_theta) nn.init.normal_(self.embed.weight, std=0.02) nn.init.normal_(self.audio_head.weight, std=0.02) nn.init.zeros_(self.audio_head.bias) nn.init.normal_(self.image_head.weight, std=0.02) def _freqs(self, buf, T, device): if buf.shape[0] < T: head_dim = buf.shape[1] * 2 buf = precompute_freqs_cis(head_dim, min(2 * T, self.cfg.max_seq_len), self.cfg.rope_theta) if buf.device != device: buf = buf.to(device) return buf[:T], buf def forward(self, input_ids, audio_features=None, vision_features=None, n_loops=None): B, T = input_ids.shape x = self.embed(input_ids) fs, self.freqs_softmax = self._freqs(self.freqs_softmax, T, x.device) fm, self.freqs_mla = self._freqs(self.freqs_mla, T, x.device) for blk in self.prelude_attn: x = blk(x, fs) if audio_features is not None: x = self.audio_encoder(x, audio_features) if vision_features is not None: x = self.vision_encoder(x, vision_features) e = x x = self.recurrent(x, e, fm, n_loops) for blk in self.coda_attn: x = blk(x, fs) if audio_features is not None: x = self.audio_decoder(x, audio_features) if vision_features is not None: x = self.vision_decoder(x, vision_features) x = self.norm_f(x) return self.lm_head(x), self.audio_head(x), self.image_head(x)