Модель для генерации русского текста Bormotuha

Описание модели

Это модель для каузального языкового моделирования (causal language modeling), созданная на основе архитектуры GPT-2 и обученная на выборке русских текстов из Wikipedia и синтетических данных. Модель предназначена для генерации связного текста на русском языке.

Ключевая особенность: модель имеет нестандартную для обычного GPT-2 архитектуру. При стандартной глубине (12 слоев) в моей модели используется 42 слоя трансформера, что делает ее значительно глубже, но с меньшей размерностью эмбеддингов (256) и меньшим словарем.

Предполагаемое использование (Intended uses & limitations)

  • Использование: Генерация текста, продолжение промптов, исследовательские цели в области NLP для русского языка.
  • Ограничения: Модель обучена на ограниченном наборе данных. Качество генерации может быть нестабильным на темах, не представленных в обучающей выборке. Может генерировать предвзятый или некорректный контент, так как это свойственно всем языковым моделям.

Как использовать (How to use)

Модель обучена на следующих шаблонах:

  1. Ответить на вопрос [кратко/развёрнуто/с использованием контекста][]ВопросОтвет
  2. Написать заметку, эссе по плану [от первого лица]План из трёх пунктовТекст
  3. Определить объект [с акцентом на следующие аспекты][аспект1, аспект2,..]ОбъектОпределение
  4. Поддержать диалогРепликаРеплика...до 5 шагов
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer,  TextIteratorStreamer, StoppingCriteria, StoppingCriteriaList
from threading import Thread
checkpoint_path = "./Bormotuha-H0"

model = AutoModelForCausalLM.from_pretrained(
    checkpoint_path,
    device_map="cuda", #cuda
    dtype="float16" #auto
).half()
tokenizer = AutoTokenizer.from_pretrained(checkpoint_path, use_fast=True)
if tokenizer.pad_token is None:
    tokenizer.pad_token = tokenizer.eos_token

class StopOnTokens(StoppingCriteria):
    def __init__(self, stop_token_ids_list):
        self.stop_token_ids_list = stop_token_ids_list

    def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor, **kwargs) -> bool:
        # Проверяем каждый набор стоп-токенов
        for stop_ids in self.stop_token_ids_list:
            # Убеждаемся, что сгенерировано достаточно токенов для сравнения
            if len(input_ids[0]) >= len(stop_ids):
                if input_ids[0][-len(stop_ids):].tolist() == stop_ids:
                    return True
        return False

stop_words = ["</answer>"]
stop_ids_list = [tokenizer.encode(word, add_special_tokens=False) for word in stop_words]
stopping_criteria = StoppingCriteriaList([StopOnTokens(stop_ids_list)])
streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, skip_special_tokens=False)

test_input=[]        

# Краткие ответы 
test_input.append("<system>Ответить на вопрос кратко</system><newline><question>Чем знаменит Аристотель?</question><newline><answer>")

# Подробные ответы 
test_input.append("<system>Ответить на вопрос</system><newline><question>Что такое русский космизм и есть ли связь между ним и космической программой СССР?</question><newline><answer>")

for i, prompt in enumerate(test_input):

   question=prompt.split("</system>")[1].split("</")[0]
   question=question.replace("<question>","").replace("<newline>","\n")   

   print(f"\n\nЗадание {i}: {question}\n")

   processed_input = "▁" + prompt.lstrip().replace(" ", "▁").replace("\n", "<newline>")
   inputs = tokenizer(
       processed_input,
       return_tensors="pt",
       add_special_tokens=False,
   ).to(model.device)

   generation_kwargs = dict(
       inputs,
       streamer=streamer,        
       max_new_tokens=1024,
       do_sample=True,
       #temperature=0.5, 
       top_p=0.6,
       top_k=40, 
       repetition_penalty=1.3,
       pad_token_id=tokenizer.pad_token_id,
       eos_token_id=tokenizer.eos_token_id,
       stopping_criteria=stopping_criteria
   )

   thread = Thread(target=model.generate, kwargs=generation_kwargs)
   thread.start()

   full_response = ""
   for new_text in streamer:
       # Ваша специфичная постобработка для каждого кусочка текста
       decoded_chunk = new_text.replace("▁", " ").replace("<newline>", "\n").replace("<space>", "  ")
       if decoded_chunk in stop_words:
          break

       print(decoded_chunk, end="", flush=True)    

Архитектура и гиперпараметры

Модель реализована на основе класса GPT2LMHeadModel со следующими ключевыми параметрами: Архитектура: GPT-2 (трансформер-декодер) Функция активации: gelu_new Количество слоев (n_layer): 42 Размер эмбеддингов (n_embd): 256 Количество голов внимания (n_head): 8 Размер внутреннего слоя FFN (n_inner): 1024 Максимальный контекст (n_ctx / n_positions): 1536 токенов Размер словаря (vocab_size): 6002 Dropout (attn_pdrop, embd_pdrop, resid_pdrop): 0.1 для регуляризации Инициализация (initializer_range): 0.02

Данные для обучения Источники: Русскоязычные тексты из Wikipedia, CullturaX, IlyaGusev/gazeta и синтетические данные полученные обработкой исходных данных пакетом NLTK и с помощью LLM yandex/YandexGPT-5-Lite-8B-instruct

Downloads last month
68
Safetensors
Model size
35.1M params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support