|
--- |
|
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 |