Bases: Module, Module
Wrapper of Decoder Transformer for use in MEDS with triplet token embeddings.
This model handles both forward passes and generation with different budget types.
Examples:
>>> # Setup mock configuration and model components
>>> import torch
>>> from omegaconf import OmegaConf
>>> from x_transformers import TransformerWrapper, Decoder
>>> from hydra.utils import instantiate
>>> from enum import Enum
>>> # Mock configuration
>>> B, S, L = 2, 5, 8 # batch_size, seq_len, dim
>>> max_seq_len = 7
>>> vocab_size = 4
>>> cfg = instantiate({
... 'token_dim': L,
... 'vocab_size': vocab_size,
... 'max_seq_len': max_seq_len,
... 'get_last_token': True,
... 'temperature': 1.0,
... 'token_emb': None,
... 'max_tokens_budget': 10,
... 'model': {
... '_target_': 'x_transformers.TransformerWrapper',
... 'num_tokens': vocab_size,
... 'max_seq_len': max_seq_len,
... 'use_abs_pos_emb': False,
... 'attn_layers': {
... '_target_': 'x_transformers.Decoder',
... 'dim': L,
... 'depth': 2,
... 'heads': 2,
... 'rotary_pos_emb': True,
... }
... }
... })
>>> # Initialize model
>>> model = TransformerDecoderModel(cfg)
>>> # Test basic forward pass
>>> prompts = torch.randint(0, vocab_size, (B, S))
>>> mask = torch.ones(B, S, dtype=torch.bool)
>>> get_time = lambda x: torch.ones(B, dtype=torch.float)
>>> get_value = lambda x: torch.ones(B, dtype=torch.float)
>>> batch = {INPUT_ENCODER_TOKENS_KEY: torch.ones((B,4)),
... INPUT_ENCODER_MASK_KEY: torch.ones((B,4), dtype=torch.bool)}
>>> output = model.forward(batch)
>>> output[BACKBONE_TOKENS_KEY].shape
torch.Size([2, 4, 4])
>>> output[BACKBONE_EMBEDDINGS_KEY].shape
torch.Size([2, 8])
Source code in meds_torch/models/components/transformer_decoder.py
| class TransformerDecoderModel(torch.nn.Module, Module):
"""Wrapper of Decoder Transformer for use in MEDS with triplet token embeddings.
This model handles both forward passes and generation with different budget types.
Examples:
>>> # Setup mock configuration and model components
>>> import torch
>>> from omegaconf import OmegaConf
>>> from x_transformers import TransformerWrapper, Decoder
>>> from hydra.utils import instantiate
>>> from enum import Enum
>>> # Mock configuration
>>> B, S, L = 2, 5, 8 # batch_size, seq_len, dim
>>> max_seq_len = 7
>>> vocab_size = 4
>>> cfg = instantiate({
... 'token_dim': L,
... 'vocab_size': vocab_size,
... 'max_seq_len': max_seq_len,
... 'get_last_token': True,
... 'temperature': 1.0,
... 'token_emb': None,
... 'max_tokens_budget': 10,
... 'model': {
... '_target_': 'x_transformers.TransformerWrapper',
... 'num_tokens': vocab_size,
... 'max_seq_len': max_seq_len,
... 'use_abs_pos_emb': False,
... 'attn_layers': {
... '_target_': 'x_transformers.Decoder',
... 'dim': L,
... 'depth': 2,
... 'heads': 2,
... 'rotary_pos_emb': True,
... }
... }
... })
>>> # Initialize model
>>> model = TransformerDecoderModel(cfg)
>>> # Test basic forward pass
>>> prompts = torch.randint(0, vocab_size, (B, S))
>>> mask = torch.ones(B, S, dtype=torch.bool)
>>> get_time = lambda x: torch.ones(B, dtype=torch.float)
>>> get_value = lambda x: torch.ones(B, dtype=torch.float)
>>> batch = {INPUT_ENCODER_TOKENS_KEY: torch.ones((B,4)),
... INPUT_ENCODER_MASK_KEY: torch.ones((B,4), dtype=torch.bool)}
>>> output = model.forward(batch)
>>> output[BACKBONE_TOKENS_KEY].shape
torch.Size([2, 4, 4])
>>> output[BACKBONE_EMBEDDINGS_KEY].shape
torch.Size([2, 8])
"""
def __init__(self, cfg: DictConfig):
super().__init__()
self.cfg = cfg
self.model = cfg.model
if cfg.token_emb:
self.model.token_emb = cfg.token_emb
def forward(self, batch):
input_data, mask = batch[INPUT_ENCODER_TOKENS_KEY], batch[INPUT_ENCODER_MASK_KEY]
output, embeddings = self.model(input_data, mask=mask, return_logits_and_embeddings=True)
if self.cfg.get_last_token:
embeddings = get_last_token(embeddings, ~mask)
batch[BACKBONE_TOKENS_KEY] = output
batch[BACKBONE_EMBEDDINGS_KEY] = embeddings
return batch
|