

Русская модель-encoder. Модель является языковой моделью, может определять вероятности следующего и пропущенного слова, а также эффективно представлять слова и тексты в векторном пространстве.
Новости о модели:
habr (tutorial): ruT5, ruRoBERTa, ruBERT: как мы обучили серию моделей для русского языка ссылка
Github: репозиторий Model-Zoo с примерами ссылка
Информация об использовании модели:
Примеры кода с использованием модели находятся на GitHub
Installation
!pip install datasets transformers[sentencepiece]
Mask Filling
Модель можно дообучить для любой классической задачи NLP, включая классификацию текстов, кластеризацию, генерацию текстов.
Модель на инференсе без обучения выполняет задачу заполнения масок (пропусков), которые можно представить по образцу:
Снижение цен <extra_id_0> в Москве возможно только при <extra_id_1>.
Вывод:
<extra_id_0> на бензин
<extra_id_1> условии сохранения текущей ситуации
Пример запуска генерации:
- простой способ - с помощью pipeline
- классический способ - отдельный импорт модели и токенизатора
# ruBert-base example
from transformers import BertForMaskedLM,BertTokenizer, pipeline
model=BertForMaskedLM.from_pretrained('sberbank-ai/ruBert-base')
tokenizer=BertTokenizer.from_pretrained('sberbank-ai/ruBert-base', do_lower_case=False)
unmasker = pipeline('fill-mask', model=model,tokenizer=tokenizer)
[i['sequence'] for i in unmasker("Python - это самый [MASK] язык программирования.")]
['Python - это самый популярный язык программирования.', 'Python - это самый современный язык программирования.', 'Python - это самый сложный язык программирования.', 'Python - это самый простой язык программирования.', 'Python - это самый распространённый язык программирования.']
KF Serving
Класс KFServingRuBertLargeModel
представлен ниже.
Работа с моделью возможна в 2 вариантах:
- режим кодировки
("mode": "encoding")
- получение векторных представлений текста - режим денойзинга
("mode": "fill-mask")
- заполнение масок-пропусков в тексте:
'Снижение цен <extra_id_0> в Москве возможно только при <mask>. '
fill-mask
является режимом по умолчанию, если режим не указан в запросе.
При режиме возможно использование как маски вида <mask>
, так и [MASK]
.
В режиме fill-mask
можно ранжировать переданных кандидатов на заполнение маски с помощью списка кандидатов в ключе targets
:
res = model.predict({"instances": [{"text": "Его зовут <mask> и он инженер живущий в Нью-Йорке.", "mode": "fill-mask",
"targets": ["Майкл", "Таня", "Антон", "Джон"]}]})
Независимо от режима работы, функция predict возвращает словарь вида:
predictions: {‘text’: ‘’, ‘extra_id_..’: ‘’}
class KFServingRuBertLargeModel(kfserving.KFModel):
def __init__(self, name: str, model_path="ruBert-large/"):
super().__init__(name)
self.name = name
self.ready = False
self.model_path = model_path
def load(self):
self.model = BertForMaskedLM.from_pretrained(self.model_path)
self.tokenizer = BertTokenizer.from_pretrained(self.model_path, do_lower_case=False)
self.encoder = BertModel.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_ruBert_large import KFServingRuBertLargeModel
model = KFServingRuBertLargeModel("kfserving-rubert-large")
model.load()
#fill-mask
model.predict({"instances": [{"text": "Меня зовут [MASK] и я американский инженер живущий в городе <mask>.", "mode": "fill-mask"}]})
res = model.predict({"instances": [{"text": "Его зовут <mask> и он инженер живущий в Нью-Йорке.", "mode": "fill-mask",
"targets": ["Майкл", "Таня", "Антон", "Джон"]}]})
```[{'sequence': 'Его зовут Джон и он инженер живущий в Нью - Йорке.',
'score': 0.031892772763967514,
'token': 4369,
'token_str': 'Джон'},
{'sequence': 'Его зовут Майкл и он инженер живущий в Нью - Йорке.',
'score': 0.03039882332086563,
'token': 11497,
'token_str': 'Майкл'},
{'sequence': 'Его зовут Антон и он инженер живущий в Нью - Йорке.',
'score': 0.001293725916184485,
'token': 8514,
'token_str': 'Антон'},
{'sequence': 'Его зовут Таня и он инженер живущий в Нью - Йорке.',
'score': 5.728732139687054e-05,
'token': 21756,
'token_str': 'Таня'}]```
#encoding
res = model.predict({"instances": [{"text": "Её зовут Алена и она инженерка живущая в Нью-Йорке.", "mode": "encode"}]})
res["predictions"]