| import torch.nn as nn |
| from models.config import VLMConfig |
| from transformers import AutoModelForCausalLM, AutoConfig |
|
|
| class Decoder(nn.Module): |
| def __init__(self, cfg: VLMConfig, load_backbone: bool): |
| super().__init__() |
| |
| |
| if load_backbone: |
| |
| self.model = AutoModelForCausalLM.from_pretrained(cfg.lm_model_type) |
| else: |
| |
| self.model = AutoModelForCausalLM.from_config(AutoConfig.from_pretrained(cfg.lm_model_type)) |
|
|
| |
| self.hidden_size = self.model.config.hidden_size |
| assert self.hidden_size == cfg.lm_hidden_dim, ( |
| f"{cfg.lm_hidden_dim=} but decoder's {self.hidden_size=}" |
| ) |
|
|
| |
| |
| self.lm_use_tokens = cfg.lm_use_tokens |
|
|
| @property |
| def token_embedding(self): |
| |
| out = self.model.get_input_embeddings() |
| assert out is not None |
|
|
| return out |
|
|
| @property |
| def head(self): |
| |
| out = self.model.get_output_embeddings() |
| assert out is not None |
|
|
| return out |
| |
| @property |
| def base(self): |
| |
| out = self.model.get_decoder() if hasattr(self.model, "get_decoder") else self.model.model |
| assert out is not None |
|
|
| return out |
|
|
| def forward(self, token_embd, attention_mask=None): |
| """ |
| Purpose: |
| Perform a forward pass through the language model |
| |
| Parameters: |
| * token_embd (torch.Tensor) : tensor of shape (B, max_sequence_len, lm_hidden_size) |
| |
| * attention_mask (torch.Tensor) : a batch of padding masks of shape (B, T), 1 for |
| real tokens and 0 for padding; requires the same shape as token_embd when given. |
| Defaults to None, meaning no positions are masked. |
| |
| Returns: |
| A tuple with two elements: |
| * last_hidden_state (torch.Tensor) : tensor of shape (B, max_sequence_len, lm_hidden_size) |
| |
| * None (out has out.last_hidden_state and out.past_key_values. However, they don't matter |
| because this method is used only for training forward passes and KV cache is not |
| used during training) |
| """ |
| |
| out = self.base(inputs_embeds=token_embd, attention_mask=attention_mask) |
| |
| return out.last_hidden_state, None |
| |