| """
|
| Hyperloop Segment v0.7 — Per-Loop LoRA + RoDE for Gated DeltaNet-2.
|
|
|
| Each loop iteration = [1 Wide + 4 Narrow] layers, with:
|
| 1. RoDE: Rotary depth signal on Q/K inside attention
|
| 2. Per-loop LoRA on all projections (Q/K/V/O + MLP gate/up/down)
|
| 3. Stochastic depth for robustness
|
|
|
| Two phase types:
|
| Phase1: WideA(16h, MLP6144) + NarrowA×4(8h, MLP6144)
|
| Phase2: NarrowB×4(8h, MLP12288) + WideB(16h, MLP12288)
|
| """
|
|
|
| import torch
|
| import torch.nn as nn
|
| from typing import Optional, Dict
|
|
|
|
|
| class PerLoopLoRA(nn.Module):
|
| """Per-loop low-rank adaptation for all projections."""
|
|
|
| def __init__(self, num_loops: int, proj_shapes: Dict[str, tuple], rank: int = 16):
|
| super().__init__()
|
| self.num_loops = num_loops
|
| self.rank = rank
|
| self.proj_names = list(proj_shapes.keys())
|
|
|
| for name, (out_dim, in_dim) in proj_shapes.items():
|
| a_tensors = nn.ParameterList([
|
| nn.Parameter(torch.zeros(out_dim, rank))
|
| for _ in range(num_loops)
|
| ])
|
| b_tensors = nn.ParameterList([
|
| nn.Parameter(torch.zeros(rank, in_dim))
|
| for _ in range(num_loops)
|
| ])
|
| setattr(self, f"lora_A_{name}", a_tensors)
|
| setattr(self, f"lora_B_{name}", b_tensors)
|
|
|
| def get_delta(self, proj_name: str, loop_idx: int) -> torch.Tensor:
|
| A = getattr(self, f"lora_A_{proj_name}")[loop_idx]
|
| B = getattr(self, f"lora_B_{proj_name}")[loop_idx]
|
| return A @ B
|
|
|
|
|
| class HyperloopPhase(nn.Module):
|
| """
|
| Multi-iteration loop with [Wide + Narrow×4] pattern per iteration.
|
|
|
| Each iteration:
|
| 1. Forward through shared_wide (1 pass)
|
| 2. Forward through shared_narrow × 4 (4 passes)
|
| Total per iteration: 5 passes
|
| """
|
|
|
| def __init__(
|
| self,
|
| config,
|
| shared_narrow: nn.Module,
|
| shared_wide: nn.Module,
|
| num_loops: int,
|
| narrow_num_heads: int,
|
| narrow_kv_heads: int,
|
| narrow_head_dim: int,
|
| narrow_intermediate: int,
|
| wide_num_heads: int,
|
| wide_kv_heads: int,
|
| wide_head_dim: int,
|
| wide_intermediate: int,
|
| wide_first: bool = True,
|
| ):
|
| super().__init__()
|
| self.shared_narrow = shared_narrow
|
| self.shared_wide = shared_wide
|
| self.num_loops = num_loops
|
| self.drop_path_rate = config.drop_path_rate
|
| self.wide_first = wide_first
|
| H = config.hidden_size
|
|
|
|
|
| narrow_proj_shapes = {
|
| "q_proj": (narrow_num_heads * narrow_head_dim, H),
|
| "k_proj": (narrow_kv_heads * narrow_head_dim, H),
|
| "v_proj": (narrow_kv_heads * narrow_head_dim, H),
|
| "o_proj": (H, narrow_num_heads * narrow_head_dim),
|
| "gate_proj": (narrow_intermediate, H),
|
| "up_proj": (narrow_intermediate, H),
|
| "down_proj": (H, narrow_intermediate),
|
| }
|
|
|
| wide_proj_shapes = {
|
| "q_proj": (wide_num_heads * wide_head_dim, H),
|
| "k_proj": (wide_kv_heads * wide_head_dim, H),
|
| "v_proj": (wide_kv_heads * wide_head_dim, H),
|
| "o_proj": (H, wide_num_heads * wide_head_dim),
|
| "gate_proj": (wide_intermediate, H),
|
| "up_proj": (wide_intermediate, H),
|
| "down_proj": (H, wide_intermediate),
|
| }
|
|
|
|
|
| self.narrow_lora = PerLoopLoRA(num_loops, narrow_proj_shapes, config.lora_rank)
|
| self.wide_lora = PerLoopLoRA(num_loops, wide_proj_shapes, config.lora_rank)
|
|
|
| def forward(
|
| self,
|
| hidden_states: torch.Tensor,
|
| attention_mask: Optional[torch.Tensor] = None,
|
| position_ids: Optional[torch.Tensor] = None,
|
| ) -> torch.Tensor:
|
|
|
| for i in range(self.num_loops):
|
|
|
| if self.training and self.drop_path_rate > 0:
|
| drop_prob = self.drop_path_rate * (i + 1) / self.num_loops
|
| if torch.rand(1).item() < drop_prob:
|
| continue
|
|
|
|
|
| narrow_deltas = {
|
| name: self.narrow_lora.get_delta(name, i)
|
| for name in self.narrow_lora.proj_names
|
| }
|
| wide_deltas = {
|
| name: self.wide_lora.get_delta(name, i)
|
| for name in self.wide_lora.proj_names
|
| }
|
|
|
| if self.wide_first:
|
|
|
| hidden_states = self.shared_wide(
|
| hidden_states, attention_mask=attention_mask,
|
| position_ids=position_ids, loop_idx=i, lora_deltas=wide_deltas,
|
| )
|
| for _ in range(4):
|
| hidden_states = self.shared_narrow(
|
| hidden_states, attention_mask=attention_mask,
|
| position_ids=position_ids, loop_idx=i, lora_deltas=narrow_deltas,
|
| )
|
| else:
|
|
|
| for _ in range(4):
|
| hidden_states = self.shared_narrow(
|
| hidden_states, attention_mask=attention_mask,
|
| position_ids=position_ids, loop_idx=i, lora_deltas=narrow_deltas,
|
| )
|
| hidden_states = self.shared_wide(
|
| hidden_states, attention_mask=attention_mask,
|
| position_ids=position_ids, loop_idx=i, lora_deltas=wide_deltas,
|
| )
|
|
|
| return hidden_states
|
|
|