llm4career / llm.py
fkonovalenko's picture
first commit
e6dc8c2
import torch
from torch import nn
from transformers import AutoTokenizer, AutoModel, BertConfig
class TransformerRegrModel(nn.Module):
def __init__(self, base_transformer_model: str, num_classes: int):
super().__init__()
self.tr_model = base_transformer_model
self.num = num_classes
self.device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')
if self.tr_model not in ['rubert', 'base']:
raise Exception('unknown model')
elif self.tr_model == 'rubert':
self.tokenizer = AutoTokenizer.from_pretrained("cointegrated/rubert-tiny2")
self.config = BertConfig.from_pretrained("cointegrated/rubert-tiny2", output_hidden_states=True,
output_attentions=True)
elif self.tr_model == 'base':
self.tokenizer = AutoTokenizer.from_pretrained("ai-forever/ruBert-base", model_max_length=512)
self.config = BertConfig.from_pretrained("ai-forever/ruBert-base", output_hidden_states=True,
output_attentions=True)
self.model = AutoModel.from_config(self.config)
self.a1 = nn.ReLU()
self.classifier_1 = nn.Linear(self.model.pooler.dense.out_features, self.num)
# self.classifier_dropout = nn.Dropout(p=0.2)
# self.classifier_2 = nn.Linear(128, self.num)
def forward(self, inputs):
t = self.tokenizer(inputs, padding=True, truncation=True, return_tensors='pt')
tokens = self.tokenizer.convert_ids_to_tokens(t['input_ids'][0])
model_output = self.model(**{k: v.to(self.device) for k, v in t.items()})
attentions = torch.cat(model_output['attentions']).to('cpu')
embeddings = model_output.last_hidden_state[:, 0, :]
embeddings = torch.nn.functional.normalize(embeddings)
outputs = self.a1(embeddings)
outputs = self.classifier_1(outputs)
# outputs = self.classifier_dropout(outputs)
# outputs = self.a1(outputs)
# outputs = self.classifier_dropout(outputs)
# outputs = self.classifier_2(outputs)
return outputs, tokens, attentions