LOL-EVE / modeling_loleve.py
cshearer's picture
Upload folder using huggingface_hub
8371fea verified
"""
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
# Initialize a simple transformer model for demonstration
# In practice, this would load the actual trained LOL-EVE model
from transformers import CTRLConfig, CTRLLMHeadModel
# Create CTRL configuration
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
)
# Initialize model
self.model = CTRLLMHeadModel(model_config)
# Initialize weights
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
# Use the underlying transformer model
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)
# Register the model with transformers
from transformers import AutoConfig, AutoModelForCausalLM
# Register the config
AutoConfig.register("loleve", LOLEVEConfig)
# Register the model
AutoModelForCausalLM.register(LOLEVEConfig, LOLEVEForCausalLM)