Модель
ruBERT large

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

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

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

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

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

Untitled

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