File size: 8,311 Bytes
22b5c01
 
 
 
 
 
 
 
 
 
 
d7c13be
22b5c01
d7c13be
 
 
22b5c01
3d3da94
d7c13be
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
---
datasets:
- IlyaGusev/ru_turbo_alpaca
- IlyaGusev/ru_turbo_saiga
- IlyaGusev/oasst1_ru_main_branch
- IlyaGusev/ru_sharegpt_cleaned
language:
- ru
pipeline_tag: conversational
---

# Saiga 30B, Russian LLaMA-based chatbot

Based on [LLaMA 30B](https://huggingface.co/huggyllama/llama-30b).

* This is an adapter-only version.

Colab: [link](https://colab.research.google.com/drive/1zvF0I52NJ7ngAk_zWzEA_QOYOMCdITZN?usp=sharing)

Training code: [link](https://github.com/IlyaGusev/rulm/tree/master/self_instruct)

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

MODEL_NAME = "IlyaGusev/saiga_30b_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,
    device_map="auto"
)
model = PeftModel.from_pretrained(model, MODEL_NAME)
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
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: Однажды летом, когда все дети уже вышли из школы и начали проводить время на улице, Таня решила поиграть в футбол со своими друзьями. Она взяла свой любимый мяч и отправилась к парку, где они обычно играют.
Когда она пришла туда, ее друзья уже были готовы к игре. Они разделились на две команды и начали играть. Таня была очень энергичной и активной, она бежала по полю, прыгала и ловила мяч.
Но однажды, когда она пыталась заблокировать удар соперника, мяч ударился ей прямо в лицо. Она упала на землю и не могла двигаться. Ее друзья сразу же подобрали ее и провели медицинскую помощь.
Так как Тане было больно, они решили не продолжать игру и вернуться домой. Но Таня не хотела пропустить возможность играть в футбол, поэтому она решила найти другой способ.
Она купила себе новый мяч и начала тренироваться дома. Она старалась делать упражнения каждый день, чтобы улучшить свою технику и скорость. Вскоре она стала лучшей футболисткой в своей команде.
Ее друзья были поражены ее умением играть в футбол и часто приглашали ее на матчи. Таня была очень горда своей новой профессией и никогда не переставала тренироваться.
В конце концов, благодаря своим усилиям, она стала настоящей звездой футбола и даже получила предложение от известного клуба. Она приняла его и начала играть на профессиональном уровне.
Таким образом, мяч стал для Тани не только игрушкой, но и источником ее успеха и счастья.
```

```
User: Реши уравнение 4x + 5 = 21
Saiga: Для решения этого уравнения нужно найти значение переменной x. Для этого нужно вычесть из левой части уравнения 5, чтобы получить 4x = 16. Далее, делим обе стороны на 4, чтобы получить x = 4. Таким образом, x равно 4.
```

```
User: Заполни пропуски в предложении. Дано: Я пытался ____ от маньяка, но он меня настиг
Saiga: Я пытался убежать от маньяка, но он меня настиг.
```

v1:
- revision 3d3da94b0491cc4b72548e113c39060f228054cb
- wandb [link](https://wandb.ai/ilyagusev/rulm_self_instruct/runs/x2c19kfk)
- 4 datasets: ru_turbo_alpaca, ru_turbo_saiga, ru_sharegpt_cleaned, oasst1_ru_main_branch
- Datasets merging script: [create_chat_set.py](https://github.com/IlyaGusev/rulm/blob/ef58f3d82d6e7b3784d42167ff69188d3766ab61/self_instruct/src/data_processing/create_chat_set.py)
- Loss: 0.822
- Context length: 2000
- Conversational template: `"<s>{role}\n{content}</s>"`
- Possible roles: `["system", "user", "bot"]`
- System prompt: `"Ты — Сайга, русскоязычный автоматический ассистент. Ты разговарив