|
|
""" |
|
|
LOL-EVE model implementation for Hugging Face Transformers. |
|
|
|
|
|
This module provides the LOLEVEForCausalLM model class that can be loaded |
|
|
via transformers.AutoModelForCausalLM using your actual LOLEVE model. |
|
|
""" |
|
|
|
|
|
import torch |
|
|
import torch.nn as nn |
|
|
from transformers import PreTrainedModel, PretrainedConfig |
|
|
from transformers.modeling_outputs import CausalLMOutputWithPast |
|
|
from typing import Optional, Tuple, Union, List |
|
|
|
|
|
class LOLEVEConfig(PretrainedConfig): |
|
|
"""Configuration class for LOLEVE model.""" |
|
|
|
|
|
model_type = "loleve" |
|
|
|
|
|
def __init__( |
|
|
self, |
|
|
num_layers=12, |
|
|
num_embd=768, |
|
|
num_heads=12, |
|
|
max_positional_embedding_size=1007, |
|
|
position_embedding_type="adaptive", |
|
|
use_control_codes=1, |
|
|
vocab_size=None, |
|
|
pad_token_id=0, |
|
|
bos_token_id=1, |
|
|
eos_token_id=2, |
|
|
unk_token_id=3, |
|
|
sep_token_id=4, |
|
|
mask_token_id=5, |
|
|
**kwargs |
|
|
): |
|
|
self.num_layers = num_layers |
|
|
self.num_embd = num_embd |
|
|
self.num_heads = num_heads |
|
|
self.max_positional_embedding_size = max_positional_embedding_size |
|
|
self.position_embedding_type = position_embedding_type |
|
|
self.use_control_codes = use_control_codes |
|
|
self.vocab_size = vocab_size |
|
|
self.pad_token_id = pad_token_id |
|
|
self.bos_token_id = bos_token_id |
|
|
self.eos_token_id = eos_token_id |
|
|
self.unk_token_id = unk_token_id |
|
|
self.sep_token_id = sep_token_id |
|
|
self.mask_token_id = mask_token_id |
|
|
|
|
|
super().__init__(**kwargs) |
|
|
|
|
|
class LOLEVEForCausalLM(PreTrainedModel): |
|
|
""" |
|
|
LOLEVE model for causal language modeling on genomic sequences. |
|
|
|
|
|
This is a simplified wrapper for the LOL-EVE model that can be loaded |
|
|
via Hugging Face Transformers. |
|
|
""" |
|
|
|
|
|
config_class = LOLEVEConfig |
|
|
|
|
|
def __init__(self, config: LOLEVEConfig): |
|
|
super().__init__(config) |
|
|
|
|
|
self.config = config |
|
|
|
|
|
|
|
|
|
|
|
from transformers import CTRLConfig, CTRLLMHeadModel |
|
|
|
|
|
|
|
|
model_config = CTRLConfig.from_pretrained( |
|
|
"ctrl", |
|
|
vocab_size=config.vocab_size or 39378, |
|
|
n_layer=config.num_layers, |
|
|
n_embd=config.num_embd, |
|
|
n_head=config.num_heads, |
|
|
n_positions=config.max_positional_embedding_size, |
|
|
output_attentions=True, |
|
|
use_cache=True |
|
|
) |
|
|
|
|
|
|
|
|
self.model = CTRLLMHeadModel(model_config) |
|
|
|
|
|
|
|
|
self.init_weights() |
|
|
|
|
|
def forward( |
|
|
self, |
|
|
input_ids: Optional[torch.LongTensor] = None, |
|
|
attention_mask: Optional[torch.FloatTensor] = None, |
|
|
position_ids: Optional[torch.LongTensor] = None, |
|
|
past_key_values: Optional[List[torch.FloatTensor]] = None, |
|
|
inputs_embeds: Optional[torch.FloatTensor] = None, |
|
|
labels: Optional[torch.LongTensor] = None, |
|
|
use_cache: Optional[bool] = None, |
|
|
output_attentions: Optional[bool] = None, |
|
|
output_hidden_states: Optional[bool] = None, |
|
|
return_dict: Optional[bool] = None, |
|
|
token_type_ids: Optional[torch.LongTensor] = None, |
|
|
**kwargs |
|
|
) -> Union[Tuple, CausalLMOutputWithPast]: |
|
|
""" |
|
|
Forward pass through the model. |
|
|
""" |
|
|
return_dict = return_dict if return_dict is not None else self.config.use_return_dict |
|
|
|
|
|
|
|
|
outputs = self.model( |
|
|
input_ids=input_ids, |
|
|
attention_mask=attention_mask, |
|
|
position_ids=position_ids, |
|
|
past_key_values=past_key_values, |
|
|
inputs_embeds=inputs_embeds, |
|
|
labels=labels, |
|
|
use_cache=use_cache, |
|
|
output_attentions=output_attentions, |
|
|
output_hidden_states=output_hidden_states, |
|
|
return_dict=return_dict, |
|
|
) |
|
|
|
|
|
return outputs |
|
|
|
|
|
def get_input_embeddings(self): |
|
|
"""Get input embeddings.""" |
|
|
return self.model.get_input_embeddings() |
|
|
|
|
|
def set_input_embeddings(self, value): |
|
|
"""Set input embeddings.""" |
|
|
self.model.set_input_embeddings(value) |
|
|
|
|
|
def get_output_embeddings(self): |
|
|
"""Get output embeddings.""" |
|
|
return self.model.get_output_embeddings() |
|
|
|
|
|
def set_output_embeddings(self, new_embeddings): |
|
|
"""Set output embeddings.""" |
|
|
self.model.set_output_embeddings(new_embeddings) |
|
|
|
|
|
|
|
|
from transformers import AutoConfig, AutoModelForCausalLM |
|
|
|
|
|
|
|
|
AutoConfig.register("loleve", LOLEVEConfig) |
|
|
|
|
|
|
|
|
AutoModelForCausalLM.register(LOLEVEConfig, LOLEVEForCausalLM) |
|
|
|