File size: 8,900 Bytes
fc8f1e8
 
 
 
 
 
 
 
 
 
 
 
 
 
341a490
fc8f1e8
 
 
63c0e44
 
3f862b5
fc8f1e8
b212070
 
 
fc8f1e8
a759d2b
 
 
fc8f1e8
319770c
453bb1d
fc8f1e8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b3268e5
fc8f1e8
 
 
 
b3268e5
 
 
 
 
 
 
 
fc8f1e8
 
 
 
 
 
 
5a4e538
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
149
150
151
---
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: conversational
license: cc-by-4.0
---

# Saiga2 7B, Russian LLaMA2-based chatbot

Based on [LLaMA-2 7B HF](https://huggingface.co/meta-llama/Llama-2-7b-hf).

This is an adapter-only version.

Llama.cpp version: [link](https://huggingface.co/IlyaGusev/saiga2_7b_ggml).

Colab: [link](https://colab.research.google.com/drive/1Iw2TROpW0EjagyckyP-I-OWhLnLr7v2k).

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

**WARNING 1**: Run with the development version of `transformers` and `peft`!

**WARNING 2**: Avoid using V100 (in Colab, for example). Outputs are much worse in this case.

**WARNING 3**: You can use the [Llama-2-7B-fp16](https://huggingface.co/TheBloke/Llama-2-7B-fp16) base model instead.

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

MODEL_NAME = "IlyaGusev/saiga2_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: Жила-была девочка по имени Таня. Она была очень активной и любила играть в футбол со своими друзьями. Однажды она купила новый мяч, который был еще более красивым и качественным, чем все остальные. Он был настолько же красочен, что казалось, будто он сам играет!
Однако, когда Танечка начала играть с ним, то заметила, что мяч не так уж и легкий, как она думала. Вместо того чтобы лететь высоко вверх, он падал на землю, и Таня чувствовала себя очень грустной. Но она решила, что это просто ее плохая игровая форма, и продолжила играть.
Но уже через несколько минут после того, как Таня бросала мяч в воздух, он завис над головой и начал медленно кружить вокруг. Таня стала беспокойна и испуганна - что случилось? Как ее мяч стал таким тяжелым?
В этот момент, Таня услышала шум из ближайшего парка. Она поспешно отправилась туда, чтобы узнать, что происходит. Когда она подошла к парку, она увидела маленького мальчика, который сидел на дереве и плевал на свой мяч.
"Что ты делаешь?" - спросила Таня. Мальчик повернулся к ней и показал ей свой мяч. "Этот мяч мне нравится больше всего", - говорил он. "Я хочу, чтобы он был такой же, как твой".
Таня поняла, что её мяч перестал быть для нее только игровым предметом, но и символом дружбы и общения. Она решила вернуться домой и взять его с собой.
Когда они пришли домой, Таня дала своему другу мяч и объяснила ему, что теперь их два мяча будут лучше вместе, чем один. Именно так, благодаря дружбе и сотрудничеству, Таня и ее новый друг стали лучшими командами. Их мячи стали играть вместе, и каждый из них становился еще лучше и быстрее благодаря друг другу.
Итак, Таня научилась, что настоящая дружба - это не только общительность и веселость, но и помощь и поддержка друг друга в трудных ситуациях. Благодаря своей новому другу, Таня научилась ценить своих товарищей и находить радость в том, что можно учиться у других людей.
```

v1:
- dataset code revision 7712a061d993f61c49b1e2d992e893c48acb3a87
- wandb [link](https://wandb.ai/ilyagusev/rulm_self_instruct/runs/innzu7g8)
- 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](https://github.com/IlyaGusev/rulm/blob/e4238fd9a196405b566a2d5838ab44b7a0f4dc31/self_instruct/src/data_processing/create_chat_set.py)
- saiga7b_v5 vs saiga2_7b: 78-8-90