import torch from torch.nn import functional as F from transformers import PreTrainedModel from transformers.modeling_outputs import CausalLMOutput from .configuration_kairo import KairoGPTConfig from .kairo_model import KairoGPT, KairoGPTConfig as _InternalCfg class KairoGPTForCausalLM(PreTrainedModel): config_class = KairoGPTConfig def __init__(self, config: KairoGPTConfig): super().__init__(config) internal_cfg = _InternalCfg( vocab_size=config.vocab_size, block_size=config.block_size, n_layer=config.n_layer, n_head=config.n_head, n_embd=config.n_embd, dropout=config.dropout, ) self.transformer = KairoGPT(internal_cfg) def forward(self, input_ids, labels=None, **kwargs): logits, _ = self.transformer(input_ids) loss = None if labels is not None: loss = F.cross_entropy( logits[:, :-1, :].reshape(-1, logits.size(-1)), labels[:, 1:].reshape(-1), ) return CausalLMOutput(loss=loss, logits=logits) def prepare_inputs_for_generation(self, input_ids, **kwargs): return {"input_ids": input_ids[:, -self.config.block_size:]} @torch.no_grad() def generate(self, input_ids, max_new_tokens=400, temperature=0.8, top_k=40, **kwargs): return self.transformer.generate( input_ids, max_new_tokens=max_new_tokens, temperature=temperature, top_k=top_k )