Модель
ruT5 large

Русская Sequence2Sequence Model, 737 млн параметров. Модель трансформера для русского языка, состоящая из анкодера и декодера. Модель решает задачу генерацию текстов, а также может быть обучена на широком списке NLP-задач.

Лицензия
Apache 2.0
Размер файлов
2.7 GB
Версия
0.1
Бесплатно
Подключить
Категории
T5NLPruT5pytorchnatural language generation
Разработчик
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
  • классический способ - отдельный импорт модели и токенизатора
# ruT5-base example

from transformers import pipeline

generator = pipeline("text2text-generation", model="sberbank-ai/ruT5-base")
generator(
    "Текст: С мая 2021 в России "
)

# ruT5-large example 
from transformers import T5ForConditionalGeneration,T5Tokenizer

model=T5ForConditionalGeneration.from_pretrained('sberbank-ai/ruT5-large')

tokenizer=T5Tokenizer.from_pretrained('sberbank-ai/ruT5-large',)
input_ids = tokenizer('Снижение цен <extra_id_0> в Москве возможно только при <extra_id_1>. Это условие названо в аналитической заметке агентства <extra_id_2>, поступившей в редакцию <extra_id_3>', return_tensors='pt').input_ids

out_ids=model.generate(input_ids=input_ids,
                        max_length=30,
                        eos_token_id=tokenizer.eos_token_id, 
                        early_stopping=True)

tokenizer.decode(out_ids[0][1:])

#<extra_id_0> на бензин<extra_id_1> условии сохранения текущей ситуации<extra_id_2> ТАСС<extra_id_3>.</s>

Возможные примеры работы с затравками:

  • zero-shot - подается только начало текста (затравка), которое модели нужно продолжить
  • one-shot - подается пример 1 затравки, спецтокен и корректного продолжения, через новую строку - целевая затравка, которую нужно продолжить
  • few-shot - несколько примеров затравок и ихкорректных продолжений, затем целевая затравка.

Совет: чтобы улучшить качество работы систем one-shot и few-shot, ознакомьтесь со спецтокенами модели в словаре токенизатора. Такие токены, как <pad>,<|endoftext|>,<s>,</s>, вы можете использовать для форматирования своих примеров.

KF Serving

Класс KFServingRuT5LargeModel представлен ниже.

Работа с моделью возможна в 2 вариантах:

  1. режим кодировки ("mode": "encoding") - получение векторных представлений текста
  2. режим денойзинга ("mode": "denoising") - заполнение масок-пропусков в тексте:

'Снижение цен <extra_id_0> в Москве возможно только при <extra_id_1>. Это условие названо в аналитической заметке агентства <extra_id_2>, поступившей в редакцию <extra_id_3>'

denoising является режимом по умолчанию, если режим не указан в запросе.

Независимо от режима работы, функция predict возвращает словарь вида:

     predictions: {‘text’: ‘’, ‘extra_id_..’: ‘’}
class KFServingRuT5LargeModel(kfserving.KFModel):
    def __init__(self, name: str, model_path="ruT5-large/"):
        super().__init__(name)
        self.name = name
        self.ready = False
        self.model_path = model_path
        self.model = T5ForConditionalGeneration.from_pretrained(self.model_path)
        self.tokenizer = T5Tokenizer.from_pretrained(self.model_path)
        self.encoder = T5EncoderModel.from_pretrained(self.model_path)

    def load(self):
        self.ready = True

    def predict(self, request: Dict) -> Dict:
        raw_text = request['instances'][0]['text']
        mode = request['instances'][0].get('mode', 'denoising')
        skip_special_tokens = request['instances'][0].get('skip_special_tokens', True)
        postprocess = request['instances'][0].get('postprocess', False)
        if mode == 'denoising':
            pred, error_msg = generate(
                raw_text, self.model, self.tokenizer,
                skip_special_tokens, postprocess
            )
        else:
            pred, error_msg = encode(raw_text, self.encoder, self.tokenizer), None
        if error_msg is None:
            return {"predictions": pred, "mode": str(mode)}
        else:
            return {"predictions": pred, "mode": str(mode), "error_message": error_msg}

Пример работы с моделью

!pip install -r requirements.txt
from kfserving_ruT5_large import KFServingRuT5LargeModel

model = KFServingRuT5LargeModel("kfserving-rut5-large")
model.load()

#denoising
model.predict({"instances": [{"text": "Хочу гороскоп на <extra_id_0> для овнов.", 
                              "mode": "denoising", "skip_special_tokens": True}]})

#encoding
res = model.predict({"instances": [{"text": "Снижение цен <extra_id_0> в Москве возможно только при <extra_id_1>. Это условие названо в аналитической заметке агентства <extra_id_2>, поступившей в редакцию <extra_id_3>", "mode": "encode"}]})
res["predictions"]

Untitled

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