

Русская Sequence2Sequence Model, 737 млн параметров. Модель трансформера для русского языка, состоящая из анкодера и декодера. Модель решает задачу генерацию текстов, а также может быть обучена на широком списке NLP-задач.
Новости
💡 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 вариантах:
- режим кодировки
("mode": "encoding")
- получение векторных представлений текста - режим денойзинга
("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"]