Модель
ruRoBERTa large

Русская encoder модель. Является языковой моделью (masked LM), может определять вероятности следующего и пропущенного слова, а также эффективно представлять слова и тексты в векторном пространстве.

Лицензия
Apache 2.0
Размер файлов
1.6 GB
Версия
0.1
Бесплатно
Подключить
Категории
NLPRoBERTapytorchruRoBERTa
Разработчик
SberDevices
ОписаниеХарактеристики

Новости о модели:

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 вариантах:

  1. режим кодировки ("mode": "encoding") - получение векторных представлений текста
  2. режим денойзинга ("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)'

Untitled

Основные
Размер файлов1.6
Версия0.1
Обновлено11/9/2021