Evo1-1-7B-131K / layers.py
Taykhoom's picture
Initial release
9e26fe9
Raw
History Blame Contribute Delete
2.98 kB
# Copyright (c) Together
# Apache 2.0 - Author: Michael Poli
# Adapted for the minimal Evo1 HF port.
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch import Tensor
def grab_first_if_tuple(x):
if x.__class__.__name__ == "tuple":
return x[0]
return x
class RMSNorm(torch.nn.Module):
def __init__(self, config):
super().__init__()
self.eps = config.eps
self.hidden_size = config.hidden_size
self.scale = torch.nn.Parameter(torch.ones(self.hidden_size))
self.register_parameter("scale", self.scale)
self.use_flash_rmsnorm = config.get("use_flash_rmsnorm", False)
if self.use_flash_rmsnorm:
from flash_attn.ops.rms_norm import rms_norm as rmsnorm_func
self.rmsnorm_func = rmsnorm_func
def forward(self, x):
if self.use_flash_rmsnorm:
return self.rmsnorm_func(x, self.scale, self.eps)
y = x / (x.norm(2, dim=-1, keepdim=True) * self.hidden_size ** (-1.0 / 2) + self.eps)
return self.scale * y
class ParallelGatedMLP(nn.Module):
def __init__(self, config):
super().__init__()
multiple_of = config.get("inner_size_multiple_of", 64)
self.act_type = config.get("mlp_activation", "silu")
if self.act_type == "gelu":
self.act = F.gelu
elif self.act_type == "silu":
self.act = F.silu
else:
raise NotImplementedError(f"Unknown mlp_activation: {self.act_type}")
self.multiple_of = multiple_of * config.model_parallel_size
inner_size = int(2 * config.hidden_size * 4 / 3)
inner_size = self.multiple_of * ((inner_size + self.multiple_of - 1) // self.multiple_of)
if config.get("inner_mlp_size", None) is not None:
inner_size = config.inner_mlp_size
self.l1 = nn.Linear(config.hidden_size, inner_size, bias=False)
self.l2 = nn.Linear(config.hidden_size, inner_size, bias=False)
self.l3 = nn.Linear(inner_size, config.hidden_size, bias=False)
def forward(self, z):
z1, z2 = self.l1(z), self.l2(z)
z1, z2 = grab_first_if_tuple(z1), grab_first_if_tuple(z2)
y = self.l3(self.act(z1) * z2)
return grab_first_if_tuple(y)
class VocabParallelEmbedding(nn.Embedding):
"""Single-process variant of the original VocabParallelEmbedding.
The original supports tensor-parallel embedding sharding. We keep the
naming so existing checkpoints load directly, but drop all distributed
paths since this minimal port runs on a single device.
"""
def __init__(self, config):
vocab_size = config.vocab_size
padding_idx = config.get("padding_idx", None)
super().__init__(vocab_size, embedding_dim=config.hidden_size, padding_idx=padding_idx)
def embed(self, x: Tensor) -> Tensor:
return self.forward(x)
def unembed(self, u: Tensor) -> Tensor:
return u @ self.weight.T