| import torch |
| import torch.nn as nn |
| import torch.nn.functional as F |
|
|
| from lmr.models.lm_base import LMBase |
| from .components import TransformerBlock |
|
|
| class Transformer(LMBase): |
|
|
| def __init__(self, config, train_mode=False): |
| super().__init__() |
| |
| self.config = config |
| self.train_mode = train_mode |
| |
| self.embedding = nn.Embedding(config.vocab_size, config.embed_dim) |
| |
| self.transformer_blocks = nn.ModuleList([TransformerBlock(config) for _ in range(config.n_layers)]) |
| |
| self.ln_out = nn.LayerNorm(config.embed_dim) |
| self.lm_head = nn.Linear(config.embed_dim, config.vocab_size, bias=False) |
| |
| self.apply(self.init_weights) |
| self.lm_head.weight = self.embedding.weight |
| print('Transformer_Bert') |
| def forward(self, input_ids): |
| |
| batch_size, seq_len = input_ids.shape |
| device = input_ids.device |
| |
| x = self.embedding(input_ids) |
| |
| for block in self.transformer_blocks: |
| x = block(x) |
| |
| x = self.ln_out(x) |
| logits = self.lm_head(x) |
| |
| return logits |