File size: 4,596 Bytes
f06808e
 
 
 
 
 
 
 
 
498ea79
f06808e
498ea79
f06808e
498ea79
f06808e
 
 
 
0a56d7a
f06808e
e94af5f
 
f06808e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
---
license: mit
datasets:
- Egor-AI/Russian_thinking_dataset
language:
- ru
- en
base_model:
- evilfreelancer/o1_gigachat-20b-a3b_lora
pipeline_tag: question-answering
tags:
- chat
- o1
- cot
- thinking
- reflection
---

# Russian o1 / GigaChat 20B-A3B Instruct GGUF

https://huggingface.co/evilfreelancer/o1_gigachat-20b-a3b_lora

LoRA-адаптер для модели [GigaChat-20B-A3B](https://huggingface.co/ai-sage/GigaChat-20B-A3B-instruct-bf16) обученный на
датасете [Egor-AI/Russian_thinking_dataset](https://huggingface.co/datasets/Egor-AI/Russian_thinking_dataset) (машинный
перевод на русский язык
датасета [BintangFortuna/OpenO1-SFT-EN-SY](https://huggingface.co/datasets/BintangFortuna/OpenO1-SFT-EN-SY)).

Обученная модель способна имитировать логические размышлению на русском языке по аналогии с тем, как
это делает `o1` от `OpenAI`.

Необходимо использовать следующего вида системный промт:

```
Вы — ИИ-помощник. Отформатируйте свои ответы следующим образом: <Thought> Ваши мысли (понимание, рассуждения) </Thought> <output> Ваш ответ </output>
```

W&B отчёт: https://api.wandb.ai/links/evilfreelancer/nlec8bt8

Обучение производилось при помощи утилиты [impruver](https://github.com/EvilFreelancer/impruver) используя конфигурацию
[GigaChat/20B-A3B_lora_o1](https://github.com/EvilFreelancer/impruver/blob/main/recipes/configs/GigaChat/20B-A3B_lora_o1.yaml).

На всё про всё ушло примерно 117 часов на RTX 4090, при этом понадобилось 23Гб видеопамяти.

```yaml
output_dir: ./models/GigaChat_20B-A3B_lora_thinking
train_path: ./train.GigaChat_20B-A3B_lora_thinking.jsonl
val_path: ./val.GigaChat_20B-A3B_lora_thinking.jsonl

datasets:
  - name: Egor-AI/Russian_thinking_dataset
    converter: impruver.instruction_to_messages
    mapping:
      system: system
      instruction: prompt
      output: response

model:
  class: custom.gigachat.DeepseekForCausalLM
  name: ai-sage/GigaChat-20B-A3B-instruct-bf16
  attn_implementation: flash_attention_2
  load_in_4bit: true
  load_in_8bit: false
  dtype: bf16

lora:
  r: 8
  lora_alpha: 32
  lora_dropout: 0.1
  bias: none
  target_modules: [ q_proj, v_proj, k_proj, o_proj, gate_proj, down_proj, up_proj ]
  task_type: CAUSAL_LM

tokenizer:
  class: transformers.AutoTokenizer
  name: ai-sage/GigaChat-20B-A3B-instruct
  max_tokens_count: 1500
  special_tokens:
    pad_token_id: 1
    pad_token: <s>
    bos_token_id: 1
    bos_token: <s>
    eos_token_id: 128001
    eos_token: <|message_sep|>
  chat_template: >
    {% if messages[0]['role'] == 'system' -%}
        {%- set loop_messages = messages[1:] -%}
        {%- set system_message = bos_token + messages[0]['content'] + additional_special_tokens[1] -%}
    {%- else -%}
        {%- set loop_messages = messages -%}
        {%- set system_message = bos_token + '' -%}
    {%- endif -%}
    {%- for message in messages %}
        {%- if message['role'] == 'system' -%}
            {{ system_message -}}
        {%- endif -%}
        {%- if message['role'] == 'user' -%}
            {{ message['role'] + additional_special_tokens[0] + message['content'] + additional_special_tokens[1] -}}
            {{ 'available functions' + additional_special_tokens[0] + additional_special_tokens[2] + additional_special_tokens[3]  + additional_special_tokens[1] -}}
        {%- endif -%}
        {%- if message['role'] == 'assistant' -%}
            {{ message['role'] + additional_special_tokens[0] + message['content'] + additional_special_tokens[1] -}}
        {%- endif -%}
        {%- if loop.last and add_generation_prompt -%}
            {{ 'assistant' + additional_special_tokens[0] -}}
        {%- endif -%}
    {%- endfor %}

trainer:
  eval_strategy: steps
  save_strategy: steps
  eval_steps: 100
  save_steps: 100
  per_device_train_batch_size: 1
  per_device_eval_batch_size: 1
  gradient_accumulation_steps: 8
  logging_steps: 1
  learning_rate: 0.0004
  num_train_epochs: 2
  lr_scheduler_type: cosine
  warmup_steps: 16
  optim: adamw_torch_4bit
  metric_for_best_model: eval_loss
  load_best_model_at_end: true
  save_total_limit: 2
  seed: 42
  remove_unused_columns: false
  max_grad_norm: 1.0
  weight_decay: 0.08
  torch_compile: false
```