File size: 9,456 Bytes
7bb8205
 
 
 
77e9e49
7bb8205
 
 
68a898f
 
dcd342e
 
 
 
 
 
1ad1cb3
 
dcd342e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42fa2e9
 
 
 
 
 
 
 
dcd342e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ad08461
dac7454
ad08461
 
 
 
 
 
 
 
 
68a898f
d0b3244
68a898f
 
 
 
7f7ca3e
 
 
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
146
147
148
---
datasets:
- IlyaGusev/ru_turbo_alpaca
- IlyaGusev/ru_turbo_saiga
- IlyaGusev/ru_sharegpt_cleaned
language:
- ru
pipeline_tag: conversational
---

# Saiga 7B trained, Russian LLaMA-based chatbot

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

* This is an adapter-only version.

Colab: [link](https://colab.research.google.com/drive/1IBh4FMJPOGZAkX7DYWnIKdav_ZcKatlP)

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_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,
        role_mapping=None,
        start_token_id=1,
        bot_token_id=9225
    ):
        self.message_template = message_template
        self.role_mapping = role_mapping or {}
        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:
```
Почему трава зеленая? 
Зелень в цветении растений является результатом фотосинтеза, процесса, при котором растительные клетки превращают углекислый газ в кислород и энергию. Когда растение производит больше энергии, чем она потребляет, оно выделяет ее в виде красного или желтого цвета листьев. Однако, когда растение не получает достаточно света и воды, оно может изменить свой цвет на зеленый, чтобы сохранить свои запасы энергии для будущих потребностей. Зелень также может быть связана с защитой от ультрафиолетовых лучей, которые могут повредить растения.
```

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

```

v2:
- revision bef2597753a8f93c10422bf900e4c5bf7e0d186e
- wandb [link](https://wandb.ai/ilyagusev/rulm_self_instruct/runs/8p3nfjqv/overview)
- 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.942
- Context length: 2000
- Conversational template: `"<s>{role}\n{content}</s>"`
- Possible roles: `["system", "user", "bot"]`
- System prompt: `"Ты — Сайга, русскоязычный автоматический ассистент. Ты разговариваешь с людьми и помогаешь им."`

v1:
- revision 1ad1cb364e3e245a7a376884111e107cfc013911
- wandb [link](https://wandb.ai/ilyagusev/rulm_self_instruct/runs/kx2uytey/overview)
- 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: `"Ты — Сайга, русскоязычный автоматический ассистент. Ты разговариваешь с людьми и помогаешь им."`