saiga_7b_lora / README.md
IlyaGusev's picture
Update README.md
b285ac8 verified
metadata
datasets:
  - IlyaGusev/ru_turbo_alpaca
  - IlyaGusev/ru_turbo_saiga
  - IlyaGusev/ru_sharegpt_cleaned
  - IlyaGusev/oasst1_ru_main_branch
  - IlyaGusev/ru_turbo_alpaca_evol_instruct
  - lksy/ru_instruct_gpt4
language:
  - ru
pipeline_tag: text-generation
license: cc-by-4.0

Saiga 7B, Russian LLaMA-based chatbot

Based on LLaMA 7B.

This is an adapter-only version.

Colab: link

llama.cpp version: link

Training code: link

from peft import PeftModel, PeftConfig
from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig

MODEL_NAME = "IlyaGusev/saiga_7b_lora"
DEFAULT_MESSAGE_TEMPLATE = "<s>{role}\n{content}</s>\n"
DEFAULT_SYSTEM_PROMPT = "Ты — Сайга, русскоязычный автоматический ассистент. Ты разговариваешь с людьми и помогаешь им."

class Conversation:
    def __init__(
        self,
        message_template=DEFAULT_MESSAGE_TEMPLATE,
        system_prompt=DEFAULT_SYSTEM_PROMPT,
        start_token_id=1,
        bot_token_id=9225
    ):
        self.message_template = message_template
        self.start_token_id = start_token_id
        self.bot_token_id = bot_token_id
        self.messages = [{
            "role": "system",
            "content": system_prompt
        }]

    def get_start_token_id(self):
        return self.start_token_id

    def get_bot_token_id(self):
        return self.bot_token_id

    def add_user_message(self, message):
        self.messages.append({
            "role": "user",
            "content": message
        })

    def add_bot_message(self, message):
        self.messages.append({
            "role": "bot",
            "content": message
        })

    def get_prompt(self, tokenizer):
        final_text = ""
        for message in self.messages:
            message_text = self.message_template.format(**message)
            final_text += message_text
        final_text += tokenizer.decode([self.start_token_id, self.bot_token_id])
        return final_text.strip()


def generate(model, tokenizer, prompt, generation_config):
    data = tokenizer(prompt, return_tensors="pt")
    data = {k: v.to(model.device) for k, v in data.items()}
    output_ids = model.generate(
        **data,
        generation_config=generation_config
    )[0]
    output_ids = output_ids[len(data["input_ids"][0]):]
    output = tokenizer.decode(output_ids, skip_special_tokens=True)
    return output.strip()

config = PeftConfig.from_pretrained(MODEL_NAME)
model = AutoModelForCausalLM.from_pretrained(
    config.base_model_name_or_path,
    load_in_8bit=True,
    torch_dtype=torch.float16,
    device_map="auto"
)
model = PeftModel.from_pretrained(
    model,
    MODEL_NAME,
    torch_dtype=torch.float16
)
model.eval()

tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, use_fast=False)
generation_config = GenerationConfig.from_pretrained(MODEL_NAME)
print(generation_config)

inputs = ["Почему трава зеленая?", "Сочини длинный рассказ, обязательно упоминая следующие объекты. Дано: Таня, мяч"]
for inp in inputs:
    conversation = Conversation()
    conversation.add_user_message(inp)
    prompt = conversation.get_prompt(tokenizer)

    output = generate(model, tokenizer, prompt, generation_config)
    print(inp)
    print(output)
    print()
    print("==============================")
    print()

Examples:

User: Почему трава зеленая? 
Saiga: Зелень в цветении растений является результатом фотосинтеза, процесса, при котором растительные клетки превращают углекислый газ в кислород и энергию. Когда растение производит больше энергии, чем она потребляет, оно выделяет ее в виде красного или желтого цвета листьев. Однако, когда растение не получает достаточно света и воды, оно может изменить свой цвет на зеленый, чтобы сохранить свои запасы энергии для будущих потребностей. Зелень также может быть связана с защитой от ультрафиолетовых лучей, которые могут повредить растения.
User: Сочини длинный рассказ, обязательно упоминая следующие объекты. Дано: Таня, мяч
Saiga: Таня любила футбол с детства. Она играла на улице со своими друзьями и мечтала стать профессиональным футболистом. Когда ей исполнилось 12 лет, она начала тренироваться в футбольной школе. Она была очень талантливой и упорной, и вскоре ей удалось попасть в молодежную команду.
Однажды в лесу жил маленький медвежонок по имени Таня. Она была очень игривой и любила играть со своими друзьями - медведями. Однажды она решила провести время на свежем воздухе и отправилась в лес, чтобы играть с мячом. 
Мяч был ее лучшим другом, который всегда находился рядом. Он был невероятно упрямым и не давал себя взять за руку. Но Таня никогда не сдавалась и продолжала пытаться его вытянуть из-под коры. 
В лесу Таня встретила своего старого знакомого - медведя по имени Макс. Он был очень сильным и мощным, но он также любил играть с мячом. Их игра была так же веселой и приключенческой, как и у других медведей. 
Но однажды, когда они играли, Таня заметила что-то необычное. В лесу началось грозить шторм, и она стала беспокоиться за своих друзей. Она решила вернуться домой, чтобы защитить их от грозового облака. 
Когда Таня вернулась домой, она увидела, что все медведи были уже дома. Они говорили о том, что шторм прошел мимо, и они все остались живы. Таня была очень рада, что ее друзья остались в безопасности, и она поняла, что без мяча она была бы не такая веселая. 
Так что Таня решила, что она должна найти свой самый лучший друг и вернуться к своим друзьям. Она начала искать его во всех местах, где он мог быть. Наконец, она нашла его под корнем дерева, где он был спрятан. 
Таня была очень рада, что её лучший друг находится здесь, и она взяла его в руки. Она понимала, что без него она была бы совсем другой. Так что она поцеловала мяч и сказала ему, что она никогда не забудет его. 
Так что теперь Таня и ее друзья играют вместе, и они всегда будут держать мяч в руках, чтобы сохранить свою дружбу и веселую атмосферу в лесу.

v5:

  • revision 7712a061d993f61c49b1e2d992e893c48acb3a87
  • wandb link
  • 7 datasets: ru_turbo_alpaca, ru_turbo_saiga, ru_sharegpt_cleaned, oasst1_ru_main_branch, gpt_roleplay_realm, ru_turbo_alpaca_evol_instruct (iteration 1/2), ru_instruct_gpt4
  • Datasets merging script: create_chat_set.py
  • saiga7b_v5 vs saiga7b_v2: 94-9-73

v4:

  • revision fecf442c3d39d962df565fb40f2b84b4432af9d3
  • wandb link
  • 6 datasets: ru_turbo_alpaca, ru_turbo_saiga, ru_sharegpt_cleaned, oasst1_ru_main_branch, gpt_roleplay_realm, ru_turbo_alpaca_evol_instruct (iteration 1)
  • Datasets merging script: create_chat_set.py

v3:

  • revision 30a126e9632dd5e18876d089706c71df670adf09
  • wandb link
  • 5 datasets: ru_turbo_alpaca, ru_turbo_saiga, ru_sharegpt_cleaned, oasst1_ru_main_branch, gpt_roleplay_realm
  • Datasets merging script: create_chat_set.py
  • System prompt: custom system prompt is supported now, a default one: "Ты — Сайга, русскоязычный автоматический ассистент. Ты разговариваешь с людьми и помогаешь им."

v2:

  • revision e31ce5f2b15d8e0c275336f4af44ff5bd367b864
  • wandb link
  • 4 datasets: ru_turbo_alpaca, ru_turbo_saiga, ru_sharegpt_cleaned, oasst1_ru_main_branch
  • Datasets merging script: create_chat_set.py
  • Loss: 0.942
  • Context length: 2000
  • Conversational template: "<s>{role}\n{content}</s>"
  • Possible roles: ["system", "user", "bot"]
  • System prompt: "Ты — Сайга, русскоязычный автоматический ассистент. Ты разговариваешь с людьми и помогаешь им."

v1:

  • revision 1ad1cb364e3e245a7a376884111e107cfc013911
  • wandb link
  • 3 datasets: ru_turbo_alpaca, ru_turbo_saiga, ru_sharegpt_cleaned
  • Loss: 0.883
  • Context length: 2000
  • Conversational template: "<start>{role}\n{content} <end>\n"
  • Possible roles: ["system", "user", "bot"].
  • System prompt: "Ты — Сайга, русскоязычный автоматический ассистент. Ты разговариваешь с людьми и помогаешь им."