

Русская encoder модель. Является языковой моделью (masked LM), может определять вероятности следующего и пропущенного слова, а также эффективно представлять слова и тексты в векторном пространстве.
Новости о модели:
habr (tutorial): ruT5, ruRoBERTa, ruBERT: как мы обучили серию моделей для русского языка ссылка
Github: репозиторий Model-Zoo с примерами ссылка
Информация об использовании модели:
Примеры кода с использованием модели находятся на GitHub
Installation
!pip install datasets transformers[sentencepiece]
Mask Filling
Модель можно дообучить для любой классической задачи NLP, включая классификацию текстов, кластеризацию, генерацию текстов.
Модель на инференсе без обучения выполняет задачу заполнения масок (пропусков), которые можно представить по образцу:
Евгений Понасенков назвал <mask> величайшим маэстро.
Вывод:
'token_str': ' себя'
Пример запуска генерации:
- простой способ - с помощью pipeline
- классический способ - отдельный импорт модели и токенизатора
from transformers import pipeline
unmasker = pipeline("fill-mask", model="sberbank-ai/ruRoberta-large")
unmasker("Евгений Понасенков назвал <mask> величайшим маэстро.", top_k=1)
[{'score': 0.5433019995689392, 'sequence': 'Евгений Понасенков назвал себя величайшим маэстро.', 'token': 830, 'token_str': ' себя'}]
# ruRoberta-large example
from transformers import RobertaForMaskedLM,RobertaTokenizer, pipeline
model=RobertaForMaskedLM.from_pretrained('sberbank-ai/ruRoberta-large')
tokenizer=RobertaTokenizer.from_pretrained('sberbank-ai/ruRoberta-large')
unmasker = pipeline('fill-mask', model=model,tokenizer=tokenizer)
unmasker("Стоит чаще писать на Хабр про <mask>.")
[{'score': 0.09717897325754166, 'sequence': 'Стоит чаще писать на Хабр про это.', 'token': 473, 'token_str': ' это'}, \{'score': 0.055305205285549164, 'sequence': 'Стоит чаще писать на Хабр про ЕР.', 'token': 23461, 'token_str': ' ЕР'}, \{'score': 0.03763661906123161, 'sequence': 'Стоит чаще писать на Хабр про Россию.', 'token': 6533, 'token_str': ' Россию'}, \{'score': 0.03357730060815811, 'sequence': 'Стоит чаще писать на Хабр про космос.', 'token': 17127, 'token_str': ' космос'}, \{'score': 0.03199934586882591, 'sequence': 'Стоит чаще писать на Хабр про Крым.', 'token': 5092, 'token_str': ' Крым'}]
KF Serving
Класс KFServingRuRobertaLargeModel
представлен ниже.
Работа с моделью возможна в 2 вариантах:
- режим кодировки
("mode": "encoding")
- получение векторных представлений текста - режим денойзинга
("mode": "fill-mask")
- заполнение масок-пропусков в тексте:
'Стоит чаще писать на Хабр про <mask>.'
fill-mask
является режимом по умолчанию, если режим не указан в запросе.
Независимо от режима работы, функция predict возвращает словарь вида:
predictions: {‘text’: ‘’, ‘extra_id_..’: ‘’}
class KFServingRuRobertaLargeModel(kfserving.KFModel):
def __init__(self, name: str, model_path="ruRoberta-large/"):
super().__init__(name)
self.name = name
self.ready = False
self.model_path = model_path
def load(self):
self.model = RobertaForMaskedLM.from_pretrained(self.model_path)
self.tokenizer = RobertaTokenizer.from_pretrained(self.model_path)
self.encoder = RobertaModel.from_pretrained(self.model_path)
self.pipeline = pipeline('fill-mask', model=self.model, tokenizer=self.tokenizer)
self.ready = True
def predict(self, request: Dict) -> Dict:
raw_text = request['instances'][0]['text']
top_k = request['instances'][0].get('top_k', 5)
targets = request['instances'][0].get('targets', None)
mode = request['instances'][0].get('mode', 'fill-mask')
if mode=='fill-mask':
pred, error = fill_mask(raw_text, self.pipeline, top_k, targets)
if isinstance(pred, list):
pred = predictions_preprocess(pred, targets)
else:
pred, error = encode(raw_text, self.encoder, self.tokenizer), None
if error is None:
return {"predictions": f"{pred}", "mode": str(mode)}
else:
return {"predictions": f"{pred}", "mode": str(mode), "error_message": error}
Пример работы с моделью
!pip install -r requirements.txt
from kfserving_ruRoberta_large import KFServingRuRobertaLargeModel
model = KFServingRuRobertaLargeModel("kfserving-ruroberta")
model.load()
#fill-mask
model.predict({"instances": [{"text": "Хочу гороскоп для [MASK]", "mode": "fill-mask"}]})
#encoding
res = model.predict({"instances": [{"text": "Её зовут <mask> и она инженерка живущая в Нью-Йорке.", "mode": "encode"}]})
res["predictions"]
'BaseModelOutputWithPoolingAndCrossAttentions(last_hidden_state=tensor([[[ 0.1051, 1.1769, 0.4688, ..., 1.5773, 0.6639, 1.3052],\n [ 0.8490, 1.9830, -0.5466, ..., -1.0148, 1.2527, -0.8721],\n [-0.5115, 1.1794, -0.1421, ..., -1.0312, 0.9621, -0.2927],\n ...,\n [ 1.3692, -0.1108, -0.0316, ..., -0.7292, 0.4907, 0.0433],\n [ 0.1460, 1.2298, 0.5788, ..., 1.6229, 0.6796, 1.3731],\n [-0.1824, 0.1419, 0.5395, ..., 1.0413, 1.2784, -0.4247]]],\n grad_fn=<NativeLayerNormBackward>), pooler_output=tensor([[-0.3749, 0.0878, 0.1834, ..., -0.2257, 0.2097, 0.3587]],\n grad_fn=<TanhBackward>), hidden_states=None, past_key_values=None, attentions=None, cross_attentions=None)'