File size: 12,045 Bytes
949d4e4 4a4e09a 949d4e4 4a4e09a bea32b1 4a4e09a bea32b1 4a4e09a f73cb67 55b2ab4 4a4e09a efa36ac 4a4e09a efa36ac 4a4e09a 6fb1717 4a4e09a 6fb1717 |
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 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 |
---
library_name: transformers
tags:
- reasoning
license: apache-2.0
datasets:
- d0rj/gsm8k-ru
language:
- ru
base_model:
- attn-signs/Zariman-R-7b-v0
---
# Zariman 7B Reason (V1)
- [EN]
Reasoning model adapted for russian text generation.
**Based on Watari-7B-v1 -> Zariman-R-7B-v0**
- [RU]
Модель рассуждений, адаптированная для генерации русскоязычного текста.
**Построена на Watari-7B-v1 -> Zariman-R-7B-v0**
## Model Details / Детализация модели
- [EN]
**Reinforced GRPO version** to invoke reasoning capabilities on a specific system prompt.
May be instable (especially when large context size is used), may enter infinite loops.
Model is designed for deep understanding of various tasks.
- [RU]
**Версия обучения с подкреплением (GRPO)** для возможностей размышления и глубокого понимания запроса на конкретный системный промпт.
Может быть нестабильна (особенно при больших контекстных окнах), может входить в бесконечные циклы рассуждений.
Модель создана для решения задач и глубоких размышлений
### Model Description / Описание модели
- **Developed by:** [Reisen Raumberg (Attention Signs team)]
- **Language(s) (NLP):** [RU/EN]
- **Reinforced from model:** [Zariman-R-7b-v0]
Utilized HF.Accelerator
**GPU hours**: ~34h of NVIDIA A100
Для обучения использовался HuggingFace Accelerator
**GPU часы**: ~34 часа NVIDIA A100
### Training Framework
**Zariman was trained using MyLLM framework (by Attention Signs):**
--==[MyLLM](https://github.com/Raumberg/myllm)==--
(GRPO scripts are now stable, dev branch merged)
### Model configuration (MyLLM Framework)
```toml
[model]
model_name_or_path = "attn-signs/Zariman-R-7b-v0"
[datasets]
dataset = "d0rj/gsm8k-ru"
problem_field = "question"
solution_field = "answer"
dataloader_num_workers = 2
test_size = 0.1
extract_hash = true
[run]
run_name = "rl-zariman-7"
report_to = "wandb"
logging_first_step = true
logging_steps = 1
save_strategy = "steps"
save_steps = 100
save_total_limit = 5
output_dir = "models/attn-signs-zariman-7"
project_name = "rl-zariman"
[training]
num_train_epochs = 1
per_device_train_batch_size = 4
learning_rate = 0.00005
bf16 = true
seed = 42
use_peft = true
[grpo]
# use_vllm = true
# vllm_gpu_memory_utilization = 0.25
num_generations = 4
max_completion_length = 1024
num_iterations = 4 # https://github.com/huggingface/trl/releases/tag/v0.16.0
scale_rewards = false
beta = 0.0 # do not load reference model, do not minimize KL-div. Great memory saving opportunity.
epsilon_high = 0.28 # Increasing upper bound epsilon leads to higher entropy during generation, promoting better exploration
[lora]
lora_target_modules = [
"k_proj",
"v_proj",
"q_proj",
"o_proj",
"gate_proj",
"up_proj",
"down_proj",
]
lora_r = 32
lora_alpha = 64
[fusion]
use_liger = true
[tokenizer]
system_prompt = "Ты Зариман, полезный ИИ-ассистент. Ты ведёшь диалог с пользователем и стараешься решить его задачу, рассуждая о каждом шаге. Чтобы помочь себе, ты можешь писать диаграммы. Диаграммы могут выглядеть произвольным образом, например: <diagram> Постановка задачи в LaTeX -> Решение -> Проверка -> Окончательный ответ </diagram>. Отвечай, сохраняя следующую структуру: <thought> твои мысли и рассуждения <diagram> твои диаграммы или то, что может помочь решить задачу </diagram> </thought> <answer> твой конечный ответ </answer>"
assistant_message_template = "<|im_start|>assistant<|im_sep|>"
pad_token = "<|endoftext|>"
eos_token = "<|im_end|>"
chat_template = "{% set loop_messages = messages %}{% for message in loop_messages %}{% set content = '<|im_start|>' + message['role'] + '<|im_sep|>'+ message['content'] | trim + '<|im_end|>' %}{{ content }}{% endfor %}{% if add_generation_prompt %}{{ '<|im_start|>assistant<|im_sep|>' }}{% endif %}"
force_chat_template = true
added_special_tokens = ["<|im_sep|>"]
```
### Using the model / Как запустить?
> [!IMPORTANT]
> To invoke **Reasoning**, the specific prompt is used. Consider using the system prompt in the example below.
> Для того, чтобы использовать режим рассуждений, модель использует специальный промпт. Пожалуйста, обратите внимание на системный промпт в примере ниже.
```python
repo = 'attn-signs/Zariman-R-7b-v1'
model = AutoModelForCausalLM.from_pretrained(repo)
tokenizer = AutoTokenizer.from_pretrained(repo)
device = 'cuda' if torch.cuda.is_available() else 'cpu'
model.to(device)
user_prompt = '''
У уравнений x**2 + 2019ax + b = 0 и x**2 + 2019bx + a = 0 есть один общий корень. Чему может быть равен этот корень, если известно, что a != b?
'''
system_prompt = "Ты Зариман, полезный ИИ-ассистент. Ты ведёшь диалог с пользователем и стараешься решить его задачу, рассуждая о каждом шаге. Чтобы помочь себе, ты можешь писать диаграммы. Диаграммы могут выглядеть произвольным образом, например: <diagram> Постановка задачи в LaTeX -> Решение -> Проверка -> Окончательный ответ </diagram>. Отвечай, сохраняя следующую структуру: <thought> твои мысли и рассуждения <diagram> твои диаграммы или то, что может помочь решить задачу </diagram> </thought> <answer> твой конечный ответ </answer>"
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_prompt}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
generated_ids = model.generate(
**model_inputs,
max_new_tokens=4096
)
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)
```
```
<thought>
Пусть x является общим корнем обоих уравнений.
Тогда x удовлетворяет обоим уравнениям, поэтому: x^2 + 2019a*x + b = 0 и x^2 + 2019b*x + a = 0.
Вычитая второе уравнение из первого, получаем: (x^2 + 2019a*x + b) - (x^2 + 2019b*x + a) = 0,
что упрощается до (2019a - 2019b)*x + (b - a) = 0. Учитывая, что a != b, коэффициент при x не равен нулю,
и мы можем разделить обе части на (2019a - 2019b), чтобы найти x: x = (a - b)/(2019a - 2019b).
Упрощая это выражение, получаем x = 1/2019.
</thought>
<answer> 1/2019 </answer> # real answer
```
Another interesting answer for mathematical task (the model used brute force):
```
<thought>
Допустим, \( p + 25 = q^7 \), где \( q \) — простое число.
Так как \( q \) — простое, то \( q \) может принимать значения
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
61, 67, 71, 73, 79, 83, 89, 97, \dots \).
Тогда \( p \) будет \( q^7 - 25 \).
Мы можем вычислить значения для маленьких значений \( q \):
если \( q = 2 \), то \( p = 2^7 - 25 = 128 - 25 = 103 \), что является простым.
Если \( q = 3 \), то \( p = 3^7 - 25 = 2187 - 25 = 2162 \), что не является простым.
Если \( q = 5 \), то \( p = 5^7 - 25 = 78125 - 25 = 78100 \), что не является простым.
Если \( q = 7 \), то \( p = 7^7 - 25 = 823543 - 25 = 823518 \), что не является простым.
Если \( q = 11 \), то \( p = 11^7 - 25 = 1977326743 - 25 = 1977326718 \), что не является простым.
Если \( q = 13 \), то \( p = 13^7 - 25 = 283982496913 - 25 = 283982496898 \), что не является простым.
Если \( q = 17 \), то \( p = 17^7 - 25 = 241985796879377 - 25 = 241985796879352 \), что не является простым.
Если \( q = 19 \), то \( p = 19^7 - 25 = 17921601234819001 - 25 = 17921601234818976 \), что не является простым.
Если \( q = 23 \), то \( p = 23^7 - 25 = 31195827261968693843 - 25 = 31195827261968693818 \), что не является простым.
Если \( q = 29 \), то \( p = 29^7 - 25 = 172498763096596639029 - 25 = 172498763096596638999 \), что не является простым.
Если \( q = 31 \), то \( p = 31^7 - 25 = 2555986304490614120451 - 25 = 2555986304490614119999 \), что не является простым.
Если \( q = 37 \), то \( p = 37^7 - 25 = 207595713368696296252843 - 25 = 207595713368696296252818 \), что не является простым.
Если \( q = 41 \), то \( p = 41^7 - 25 = 21435888364136139953749 - 25 = 21435888364136139953724 \), что не является простым.
Если \( q = 43 \), то \( p = 43^7 - 25 = 238437797905281614641107 - 25 = 238437797905281614641082 \), что не является простым.
Если \( q = 47 \), то \( p = 47^7 - 25 = 23900545565555220610319 - 25 = 23900545565555220610294 \), что не является простым.
Если \( q = 53 \), то \( p = 53^7 - 25 = 28979783356188772415695 - 25 = 28979783356188772415670 \), что не является простым.
Если \( q = 59 \), то \( p = 59^7 - 25 = 24856338334343939013565 - 25 = 24856338334343939013540 \), что не является простым.
Если \( q = 61 \), то \( p = 61^7 - 25 = 2296928999603225975974377 - 25 = 229692899960322597597412 \), что не является простым.
Если \( q = 67 \), то \( p = 67^7 - 25 = 20974559751103254416877 - 25 = 20974559751103254416852 \), что не является простым.
Если \( q = 71 \), то \( p = 71^7 - 25 = 30613666817478553328142 - 25 = 30613666817478553328117 \), что не является простым.
Если \( q = 73 \), то \( p = 73^7 - 25 = 313722378383673202839681 - 25 = 313722378383673202839656 \), что не является простым.
Если \( q = 79 \), то \( p = 79^7 - 25 = 215295631866572589232641 - 25 = 215295631866572589232616 \), что не является простым.
Если \( q = 83 \), то \( p = 83^7 - 25 = 285316874646988736086111 - 25 = 285316874646988736086086 \), что не является простым.
Если \( q = 89 \), то \( p = 89^7 - 25 = 593995322254419739684961 - 25 = 593995322254419739684936 \), что не является простым.
Если \( q = 97 \), то \( p = 97^7 - 25 = 899229957796953459631497 - 25 = 899229957796953459631472 \), что не является простым.
Таким образом, единственное простое значение \( p \) — это 103.
</thought>
<answer> 103 </answer> # real answer |