GUIDO_test_200M / vathos /Transformers.py
Paerle's picture
Initial upload: GUIDO-small 200M bugfix ckpt + Vathos + modeling + README
d8c733f verified
Raw
History Blame Contribute Delete
8.22 kB
"""Basic Implementation of Famous Transformers Model using Vathos blocks SequenceModel.
serves firstly as an example on how to build with Vathos SequenceModel"""
from Vathos.blocks import *
import torch.nn as nn
from Vathos.functions import *
class GPTTransformer(nn.Module):
def __init__(self, vocab_size, d_model, n_layers, n_heads, max_len, ff_expand=2, activation='gelu', dropout=0.1,
pe='sinu'):
super(GPTTransformer, self).__init__()
self.vocab_size = vocab_size
self.d_model = d_model
self.n_layers = n_layers
self.n_heads = n_heads
self.ff_expand = ff_expand
self.activation = activation
self.dropout = dropout
if pe == 'sinu':
self.pe = True
self.rope = False
elif pe == 'rope':
self.pe = False
self.rope = True
elif self.pe == 'nope':
self.pe = False
else:
raise ValueError('pe={} not recognized'.format(pe))
self.model = SequenceModel(
vocab_size=vocab_size,
d_model=d_model,
n_layers=n_layers,
max_len=max_len,
pos_encoder=self.pe,
rope=self.rope,
spatial_args={"causal": True, "n_heads": n_heads, "rope": self.rope},
channel_args={"expand": ff_expand, "activation": ACTIVS[activation], "depth": 2}
)
def forward(self, x):
return self.model(x)
def __repr__(self):
return self.model.__repr__()
def __str__(self):
return self.model.__str__()
@torch.no_grad()
def generate(self, *args, **kwargs):
return self.model.generate(*args, *kwargs)
def summary(self):
self.model.summary()
class BERTTransformer(nn.Module):
def __init__(self, vocab_size, d_model, n_layers, n_heads, max_len, ff_expand=2, activation='gelu', dropout=0.1,
pe='sinu'):
super(GPTTransformer, self).__init__()
self.vocab_size = vocab_size
self.d_model = d_model
self.n_layers = n_layers
self.n_heads = n_heads
self.ff_expand = ff_expand
self.activation = activation
self.dropout = dropout
if pe == 'sinu':
self.pe = True
self.rope = False
elif pe == 'rope':
self.pe = False
self.rope = True
elif self.pe == 'nope':
self.pe = False
else:
raise ValueError('pe={} not recognized'.format(pe))
self.model = SequenceModel(
vocab_size=vocab_size,
d_model=d_model,
n_layers=n_layers,
max_len=max_len,
pos_encoder=self.pe,
rope=self.rope,
spatial_args={"causal": False, "n_heads": n_heads, "rope": self.rope},
channel_args={"expand": ff_expand, "activation": ACTIVS[activation], "depth": 2}
)
def forward(self, x):
return self.model(x)
def __repr__(self):
return self.model.__repr__()
def __str__(self):
return self.model.__str__()
@torch.no_grad()
def generate(self, *args, **kwargs):
raise NotImplementedError("Yet to Implement")
def summary(self):
self.model.summary()
class DeiTTransformer(nn.Module):
def __init__(self, n_class, img_size, patch_size, d_model, n_layers, n_heads, in_chans=3, ff_expand=2,
activation='gelu', dropout=0.1,
pe='sinu'):
super().__init__()
self.img_size = img_size
self.n_class = n_class
self.d_model = d_model
self.n_layers = n_layers
self.n_heads = n_heads
self.ff_expand = ff_expand
self.activation = activation
self.dropout = dropout
if pe == 'sinu':
self.pe = True
self.rope = False
elif pe == 'rope':
self.pe = False
self.rope = True
elif self.pe == 'nope':
self.pe = False
else:
raise ValueError('pe={} not recognized'.format(pe))
self.model = SequenceModel(
vocab_size=n_class,
d_model=d_model,
n_layers=n_layers,
pos_encoder=self.pe,
rope=self.rope,
embedder=PatchEmbedder,
embedder_args={"d_model": d_model, "img_size": img_size, "patch_size": patch_size, "in_chans": in_chans},
unembedder=ClsHead,
spatial_args={"causal": False, "n_heads": n_heads, "rope": self.rope},
channel_args={"expand": ff_expand, "activation": ACTIVS[activation], "depth": 2}
)
def forward(self, x):
return self.model(x)
def __repr__(self):
return self.model.__repr__()
def __str__(self):
return self.model.__str__()
@torch.no_grad()
def generate(self, *args, **kwargs):
raise NotImplementedError("Yet to Implement")
def summary(self):
self.model.summary()
class ViTTTransformer(nn.Module):
def __init__(self, n_class, img_size, patch_size, d_model, n_layers, n_heads, in_chans=3, ff_expand=2,
activation='gelu', dropout=0.1,
pe='sinu'):
super().__init__()
self.img_size = img_size
self.n_class = n_class
self.d_model = d_model
self.n_layers = n_layers
self.n_heads = n_heads
self.ff_expand = ff_expand
self.activation = activation
self.dropout = dropout
if pe == 'sinu':
self.pe = True
self.rope = False
elif pe == 'rope':
self.pe = False
self.rope = True
elif self.pe == 'nope':
self.pe = False
else:
raise ValueError('pe={} not recognized'.format(pe))
self.model = SequenceModel(
vocab_size=n_class,
d_model=d_model,
n_layers=n_layers,
pos_encoder=self.pe,
rope=self.rope,
embedder=PatchEmbedder,
embedder_args={"d_model": d_model, "img_size": img_size, "patch_size": patch_size, "in_chans": in_chans},
unembedder=MeanClassificationHead,
spatial_args={"causal": False, "n_heads": n_heads, "rope": self.rope},
channel_args={"expand": ff_expand, "activation": ACTIVS[activation], "depth": 2}
)
def forward(self, x):
return self.model(x)
def __repr__(self):
return self.model.__repr__()
def __str__(self):
return self.model.__str__()
@torch.no_grad()
def generate(self, *args, **kwargs):
raise NotImplementedError("Yet to Implement")
def summary(self):
self.model.summary()
class DiTTransformer(nn.Module):
def __init__(self, d_model, n_layers, n_heads, ff_expand=2, activation='gelu', dropout=0.1,
pe='sinu'):
super().__init__()
self.d_model = d_model
self.n_layers = n_layers
self.n_heads = n_heads
self.ff_expand = ff_expand
self.activation = activation
self.dropout = dropout
if pe == 'sinu':
self.pe = True
self.rope = False
elif pe == 'rope':
self.pe = False
self.rope = True
elif self.pe == 'nope':
self.pe = False
else:
raise ValueError('pe={} not recognized'.format(pe))
self.model = SequenceModel(
vocab_size=2,
d_model=d_model,
n_layers=n_layers,
pos_encoder=self.pe,
rope=self.rope,
embedder=Identity,
unembedder=Identity,
spatial_args={"causal": False, "n_heads": n_heads, "rope": self.rope},
channel_args={"expand": ff_expand, "activation": ACTIVS[activation], "depth": 2}
)
def forward(self, x):
return self.model(x)
def __repr__(self):
return self.model.__repr__()
def __str__(self):
return self.model.__str__()
@torch.no_grad()
def generate(self, *args, **kwargs):
raise NotImplementedError("Yet to Implement")
def summary(self):
self.model.summary()