| """Tag-conditioned diffusion transformer over SAME-L music latents (0.84B params).""" |
|
|
| from __future__ import annotations |
|
|
| import math |
| from pathlib import Path |
|
|
| import torch |
| import torch.nn as nn |
| import torch.nn.functional as F |
| from safetensors.torch import load_file |
|
|
| WEIGHTS = Path(__file__).parent / "audio_dit.safetensors" |
|
|
| CHANNELS = 256 |
| FRAMES = 1024 |
| DIM = 1536 |
| HEADS = 24 |
| HEAD_DIM = 64 |
| MLP_HIDDEN = 4096 |
| NUM_TAGS = 1470 |
| MAX_TAGS = 8 |
| ROPE_THETA = 10000.0 |
|
|
| |
| |
| |
| |
| ENCODER_BLOCKS = 2 |
| MIDDLE_BLOCKS = 20 |
| DECODER_BLOCKS = 2 |
|
|
|
|
| def rms_norm(x: torch.Tensor) -> torch.Tensor: |
| return F.rms_norm(x.float(), (x.shape[-1],), eps=1e-6).to(x.dtype) |
|
|
|
|
| class RMSNorm(nn.Module): |
| def __init__(self, dim: int): |
| super().__init__() |
| self.weight = nn.Parameter(torch.ones(dim)) |
|
|
| def forward(self, x: torch.Tensor) -> torch.Tensor: |
| return rms_norm(x) * self.weight |
|
|
|
|
| def rope_tables() -> tuple[torch.Tensor, torch.Tensor]: |
| freqs = torch.outer( |
| torch.arange(FRAMES).float(), |
| 1.0 / (ROPE_THETA ** (torch.arange(0, HEAD_DIM, 2).float() / HEAD_DIM)), |
| ) |
| return freqs.cos()[None, None], freqs.sin()[None, None] |
|
|
|
|
| def apply_rope(x: torch.Tensor, cos: torch.Tensor, sin: torch.Tensor) -> torch.Tensor: |
| x1, x2 = x.float().chunk(2, dim=-1) |
| return torch.cat([x1 * cos - x2 * sin, x1 * sin + x2 * cos], dim=-1).to(x.dtype) |
|
|
|
|
| class SelfAttention(nn.Module): |
| def __init__(self): |
| super().__init__() |
| self.qkv_x = nn.Linear(DIM, 3 * DIM, bias=False) |
| self.q_norm = RMSNorm(HEAD_DIM) |
| self.k_norm = RMSNorm(HEAD_DIM) |
| self.proj = nn.Linear(DIM, DIM, bias=False) |
|
|
| def forward(self, x: torch.Tensor, cos: torch.Tensor, sin: torch.Tensor) -> torch.Tensor: |
| B, S, _ = x.shape |
| q, k, v = self.qkv_x(x).view(B, S, 3, HEADS, HEAD_DIM).permute(2, 0, 3, 1, 4) |
| q = apply_rope(self.q_norm(q), cos, sin) |
| k = apply_rope(self.k_norm(k), cos, sin) |
| out = F.scaled_dot_product_attention(q, k, v) |
| return self.proj(out.transpose(1, 2).reshape(B, S, DIM)) |
|
|
|
|
| class CrossAttention(nn.Module): |
| def __init__(self): |
| super().__init__() |
| self.q_y = nn.Linear(DIM, DIM, bias=False) |
| self.kv_y = nn.Linear(DIM, 2 * DIM, bias=False) |
| self.q_norm = RMSNorm(HEAD_DIM) |
| self.k_norm = RMSNorm(HEAD_DIM) |
| self.proj_y = nn.Linear(DIM, DIM, bias=False) |
|
|
| def forward(self, x: torch.Tensor, y: torch.Tensor, mask: torch.Tensor) -> torch.Tensor: |
| B, S, _ = x.shape |
| q = self.q_norm(self.q_y(x).view(B, S, HEADS, HEAD_DIM).transpose(1, 2)) |
| k, v = self.kv_y(y).view(B, MAX_TAGS, 2, HEADS, HEAD_DIM).permute(2, 0, 3, 1, 4) |
| out = F.scaled_dot_product_attention(q, self.k_norm(k), v, |
| attn_mask=mask[:, None, None, :]) |
| return self.proj_y(out.transpose(1, 2).reshape(B, S, DIM)) |
|
|
|
|
| class SwiGLU(nn.Module): |
| def __init__(self): |
| super().__init__() |
| self.w12 = nn.Linear(DIM, 2 * MLP_HIDDEN, bias=False) |
| self.w3 = nn.Linear(MLP_HIDDEN, DIM, bias=False) |
|
|
| def forward(self, x: torch.Tensor) -> torch.Tensor: |
| gate, up = self.w12(x).chunk(2, dim=-1) |
| return self.w3(F.silu(gate) * up) |
|
|
|
|
| class Block(nn.Module): |
| """adaLN-single: shared timestep modulation plus a learned per-block offset.""" |
|
|
| def __init__(self): |
| super().__init__() |
| self.attn = SelfAttention() |
| self.mlp = SwiGLU() |
| self.adaLN_offset = nn.Parameter(torch.zeros(6 * DIM)) |
|
|
| def forward(self, x, mod, y, mask, cos, sin): |
| shift1, scale1, gate1, shift2, scale2, gate2 = (mod + self.adaLN_offset).chunk(6, -1) |
| x = x + gate1 * self.attn(rms_norm(x) * (1 + scale1) + shift1, cos, sin) |
| return x + gate2 * self.mlp(rms_norm(x) * (1 + scale2) + shift2) |
|
|
|
|
| class CrossBlock(Block): |
| def __init__(self): |
| super().__init__() |
| self.cross = CrossAttention() |
| self.cross_gate = nn.Parameter(torch.zeros(DIM)) |
|
|
| def forward(self, x, mod, y, mask, cos, sin): |
| shift1, scale1, gate1, shift2, scale2, gate2 = (mod + self.adaLN_offset).chunk(6, -1) |
| x = x + gate1 * self.attn(rms_norm(x) * (1 + scale1) + shift1, cos, sin) |
| x = x + self.cross_gate * self.cross(rms_norm(x), y, mask) |
| return x + gate2 * self.mlp(rms_norm(x) * (1 + scale2) + shift2) |
|
|
|
|
| class Timestep(nn.Module): |
| def __init__(self): |
| super().__init__() |
| self.mlp = nn.Sequential(nn.Linear(256, DIM), nn.SiLU(), nn.Linear(DIM, DIM)) |
|
|
| def forward(self, t: float, batch: int, device) -> torch.Tensor: |
| freqs = torch.exp(-math.log(10000.0) * torch.arange(128, device=device) / 128) |
| args = t * 1000.0 * freqs[None] |
| return self.mlp(torch.cat([args.cos(), args.sin()], dim=-1)).expand(batch, DIM) |
|
|
|
|
| class FinalLayer(nn.Module): |
| def __init__(self): |
| super().__init__() |
| self.adaLN_modulation = nn.Linear(DIM, 2 * DIM) |
| self.linear = nn.Linear(DIM, CHANNELS) |
|
|
| def forward(self, x: torch.Tensor, c: torch.Tensor) -> torch.Tensor: |
| shift, scale = self.adaLN_modulation(F.silu(c)).unsqueeze(1).chunk(2, dim=-1) |
| return self.linear(rms_norm(x) * (1 + scale) + shift) |
|
|
|
|
| class AudioDiT(nn.Module): |
| def __init__(self): |
| super().__init__() |
| self.x_embedder = nn.Linear(CHANNELS, DIM) |
| self.t_embedder = Timestep() |
| self.tag_embedding = nn.Embedding(NUM_TAGS, DIM, padding_idx=0) |
| self.tag_norm = RMSNorm(DIM) |
| self.null_tag = nn.Parameter(torch.zeros(DIM)) |
| self.mask_token = nn.Parameter(torch.zeros(DIM)) |
| self.fusion_proj = nn.Linear(2 * DIM, DIM) |
| self.adaLN_shared = nn.Linear(DIM, 6 * DIM) |
| self.encoder = nn.ModuleList(CrossBlock() for _ in range(ENCODER_BLOCKS)) |
| self.middle = nn.ModuleList( |
| (CrossBlock if i % 2 == 0 else Block)() for i in range(MIDDLE_BLOCKS)) |
| self.decoder = nn.ModuleList(CrossBlock() for _ in range(DECODER_BLOCKS)) |
| self.final_layer = FinalLayer() |
| cos, sin = rope_tables() |
| self.register_buffer("cos", cos, persistent=False) |
| self.register_buffer("sin", sin, persistent=False) |
|
|
| def _condition(self, t: float, tags: torch.Tensor): |
| y = self.tag_norm(self.tag_embedding(tags)) |
| valid = tags != 0 |
| |
| empty = ~valid.any(dim=1) |
| y = torch.where(empty[:, None, None], self.tag_norm(self.null_tag).expand_as(y), y) |
| mask = valid.clone() |
| mask[:, 0] |= empty |
| c = self.t_embedder(t, tags.shape[0], tags.device) |
| return c, self.adaLN_shared(F.silu(c)).unsqueeze(1), y, mask |
|
|
| def _run(self, blocks, x, mod, y, mask): |
| for block in blocks: |
| x = block(x, mod, y, mask, self.cos, self.sin) |
| return x |
|
|
| def _fuse(self, f, g, c, mod, y, mask): |
| h = self.fusion_proj(torch.cat([f, g], dim=-1)) |
| return self.final_layer(self._run(self.decoder, h, mod, y, mask), c).transpose(1, 2) |
|
|
| def forward(self, x: torch.Tensor, t: float, tags: torch.Tensor) -> torch.Tensor: |
| """Velocity at (x, t), for latents (B, 256, 1024) and tag indices (B, 8).""" |
| c, mod, y, mask = self._condition(t, tags) |
| f = self._run(self.encoder, self.x_embedder(x.transpose(1, 2)), mod, y, mask) |
| return self._fuse(f, self._run(self.middle, f, mod, y, mask), c, mod, y, mask) |
|
|
| def shallow(self, x: torch.Tensor, t: float, tags: torch.Tensor) -> torch.Tensor: |
| """Path-drop branch: the middle stack is replaced by [MASK] tokens.""" |
| c, mod, y, mask = self._condition(t, tags) |
| f = self._run(self.encoder, self.x_embedder(x.transpose(1, 2)), mod, y, mask) |
| return self._fuse(f, self.mask_token.expand_as(f), c, mod, y, mask) |
|
|
|
|
| def load_model(device: str = "cuda") -> tuple[AudioDiT, torch.Tensor, torch.Tensor]: |
| """The model plus the per-channel mean/std the training latents were scaled by.""" |
| state = load_file(WEIGHTS, device=device) |
| mean = state.pop("latent_mean").view(1, CHANNELS, 1) |
| std = state.pop("latent_std").view(1, CHANNELS, 1) |
| model = AudioDiT() |
| model.load_state_dict(state) |
| return model.to(device).eval().requires_grad_(False), mean, std |
|
|