[EN]
Qwen2.5-based model, adapted for russian text generation tasks.
The model has extended tokenizer and proper adapted chat template.
The model was trained using LoRA adapters.
[RU]
Finetune версия Qwen2.5, адаптированная для генерации русского текста.
Модель имеет расширенный токенайзер и правильный адаптированный чат темплейт (произведена работа над ошибками).
Модель была обучена с использованием низкоранговых адаптеров LoRA.
Previous models (considering parameters):
Watari-7b-v1
Model Details / Детализация модели
[EN]
LoRA supervised finetuning version was performed on 2xA100 NVIDIA GPUs for ~5 days for 0.6 epochs on dataset:
GrandMaster [Vikhrmodels/GrandMaster-PRO-MAX]
The model has extended tokenizer based on arxiv paper and works of RefalMachine (RuAdapt / Moscow State University). Huge thanks to Mikhail Tikhomirov for hard scientific work and tokenizer extension methods developed.
The model generation in russian is 60% more cheaper and faster due to the extended tokenizer (see the research at the end).
[RU]
SFT LoRA обучение было выполнено на двух NVIDIA A100, обучение длилось около 5 дней.
Прогон ~0.6 эпохи датасета GrandMaster [Vikhrmodels/GrandMaster-PRO-MAX]
Модель имеет расширенный токенайзер, метод основан на arxiv статье и работах RefalMachine (RuAdapt / Московский Государственный Университет). Выражаю большое уважение Михаилу Тихомирову за его научные работы и методы расширения токенайзера.
Генерация модели, благодаря методу на 60% более быстрая и менее дорогая (см. исследование токенайзера в конце статьи).
Model Description / Описание модели
Developed by: [Reisen Raumberg (Attention Signs team)]
Language(s) (NLP): [RU/EN]
Finetuned from model: [Qwen2.5]
Utilized DeepSpeed (Stage 3), HF.Accelerator for distributed training and fused AdamW. GPU hours: ~240h of NVIDIA A100
Для обучения использовались HuggingFace Accelerator с Microsoft DeepSpeed (Stage 3) для распределения параметров и стейта оптимизатора, а так же зафьюженный AdamW GPU часы: ~240h часов NVIDIA A100
Training configuration / Конфигурация обучения
The model was trained using MyLLM framework:
--== MyLLM ==-- MyLLM Configuration
toml
1[model]2model_name_or_path="attn-signs/watari-32-base-extended"34[datasets]5dataset="Vikhrmodels/GrandMaster-PRO-MAX"6conversation_field="conversation"7generate_eval_examples=false8evaluation_strategy="steps"9eval_steps=50010dataloader_num_workers=211remove_unused_columns=true12construct_history=false1314[run]15save_strategy="steps"16save_steps=50017save_total_limit=318run_name="sft-watari-32"19report_to="wandb"20logging_first_step=true21logging_steps=122output_dir="models/attn-signs-watari-32"23project_name="sft-lora-watari"24resume_from=true2526[training]27train_only_on_completions=false28per_device_train_batch_size=129per_device_eval_batch_size=130num_train_epochs=131learning_rate=0.0000432gradient_accumulation_steps=833gradient_checkpointing=true34max_seq_length=3276835warmup_steps=1036bf16=true37seed=4238use_peft=true39attn_implementation="flash_attention_2"4041[lora]42lora_target_modules=[43"k_proj",44"v_proj",45"q_proj",46"o_proj",47"gate_proj",48"up_proj",49"down_proj",50]51lora_r=12852lora_alpha=2565354[tokenizer]55assistant_message_template="<|im_start|>assistant"56pad_token="<|endoftext|>"57eos_token="<|im_end|>"58chat_template="{%- if tools %}\n {{- '<|im_start|>system\\n' }}\n {%- if messages[0]['role'] == 'system' %}\n {{- messages[0]['content'] }}\n {%- else %}\n {{- 'Ты Ватари, созданный Attention Signs. Ты умная нейронная сеть, которая старается помочь пользователю во всём.' }}\n {%- endif %}\n {{- \"\\n\\n# Tools\\n\\nТы можешь вызывать специальные функции, чтобы помочь пользователю или выполнить поставленную задачу.\\n\\nТебе доступны сигнатуры функции внутри конструкции <tools></tools> XML тэги:\\n<tools>\" }}\n {%- for tool in tools %}\n {{- \"\\n\" }}\n {{- tool | tojson }}\n {%- endfor %}\n {{- \"\\n</tools>\\n\\nДля каждого вызова функции, верни json объект с именем и аргументами функции внутри конструкции <tool_call></tool_call> XML тэги:\\n<tool_call>\\n{\\\"name\\\": <function-name>, \\\"arguments\\\": <args-json-object>}\\n</tool_call><|im_end|>\\n\" }}\n{%- else %}\n {%- if messages[0]['role'] == 'system' %}\n {{- '<|im_start|>system\\n' + messages[0]['content'] + '<|im_end|>\\n' }}\n {%- endif %}\n{%- endif %}\n{%- for message in messages %}\n {%- if (message.role == \"user\") or (message.role == \"system\" and not loop.first) or (message.role == \"assistant\" and not message.tool_calls) %}\n {{- '<|im_start|>' + message.role + '\\n' + message.content + '<|im_end|>' + '\\n' }}\n {%- elif message.role == \"assistant\" %}\n {{- '<|im_start|>' + message.role }}\n {%- if message.content %}\n {{- '\\n' + message.content }}\n {%- endif %}\n {%- for tool_call in message.tool_calls %}\n {%- if tool_call.function is defined %}\n {%- set tool_call = tool_call.function %}\n {%- endif %}\n {{- '\\n<tool_call>\\n{\"name\": \"' }}\n {{- tool_call.name }}\n {{- '\", \"arguments\": ' }}\n {{- tool_call.arguments | tojson }}\n {{- '}\\n</tool_call>' }}\n {%- endfor %}\n {{- '<|im_end|>\\n' }}\n {%- elif message.role == \"tool\" %}\n {%- if (loop.index0 == 0) or (messages[loop.index0 - 1].role != \"tool\") %}\n {{- '<|im_start|>user' }}\n {%- endif %}\n {{- '\\n<tool_response>\\n' }}\n {{- message.content }}\n {{- '\\n</tool_response>' }}\n {%- if loop.last or (messages[loop.index0 + 1].role != \"tool\") %}\n {{- '<|im_end|>\\n' }}\n {%- endif %}\n {%- endif %}\n{%- endfor %}\n{%- if add_generation_prompt %}\n {{- '<|im_start|>assistant\\n' }}\n{%- endif %}\n"59force_chat_template=true60added_special_tokens=[61"<|im_start|>",62"<|im_end|>",63"<|object_ref_start|>",64"<|object_ref_end|>",65"<|box_start|>",66"<|box_end|>",67"<|quad_start|>",68"<|quad_end|>",69"<|vision_start|>",70"<|vision_end|>",71"<|vision_pad|>",72"<|image_pad|>",73"<|video_pad|>"74]
Using the model / Как запустить?
python
1from transformers import AutoTokenizer, AutoModelForCausalLM
23repo ='attn-signs/Watari-32b-v0'45model = AutoModelForCausalLM.from_pretrained(repo)6tokenizer = AutoTokenizer.from_pretrained(repo)78model.to('cuda')910prompt ='Расскажи мне про чёрные дыры Керра и сингулярность Белинского — Халатникова — Лифшица (БХЛ-сингулярность). Можешь объяснить это математически?'11messages =[12{"role":"system","content":"Ты Ватари, ассистент и помощник в решении различных задач. Отвечай на вопросы пользователя, рассуждая."},13{"role":"user","content": prompt}14]15text = tokenizer.apply_chat_template(16 messages,17 tokenize=False,18 add_generation_prompt=True19)20model_inputs = tokenizer([text], return_tensors="pt").to(model.device)2122generated_ids = model.generate(23**model_inputs,24 max_new_tokens=3276825)26generated_ids =[27 output_ids[len(input_ids):]for input_ids, output_ids inzip(model_inputs.input_ids, generated_ids)28]2930response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]3132print(response)
Черные дыры Керра - это вращающиеся черные дыры, описанные математическим решением уравнений общей теории относительности, которое было найдено в 1963 году новозеландским астрономом Роджером Пенроузом и независимо от него Робертом Керром. Черные дыры Керра характеризуются двумя параметрами: массой \( M \) и моментом импульса \( J \). Если момент импульса равен нулю (\( J = 0 \)), то черная дыра становится сферической, как в случае черной дыры Шварцшильда.
Математически решение для черных дыр Керра выражается через метрику, которая описывает геометрию пространства-времени вокруг вращающейся массы. Метрика Керра в координатных обозначениях Boyer-Lindquist выглядит следующим образом:
\[ ds^2 = -\left(1 - \frac{r_g r}{\Sigma}\right) dt^2 - \frac{2 r_g a r \sin^2 \theta}{\Sigma} dt d\phi + \frac{\Sigma}{\Delta} dr^2 + \Sigma d\theta^2 + \left(r^2 + a^2 + \frac{r_g a^2 r \sin^2 \theta}{\Sigma}\right) \sin^2 \theta d\phi^2 \]
где:
- \( r_g = \frac{2GM}{c^2} \) - гравитационный радиус,
- \( G \) - гравитационная постоянная,
- \( M \) - масса черной дыры,
- \( c \) - скорость света,
- \( a = \frac{J}{Mc} \) - угловый момент на единицу массы,
- \( \Sigma = r^2 + a^2 \cos^2 \theta \),
- \( \Delta = r^2 - r_g r + a^2 \).
Сингулярность Белинского — Халатникова — Лифшица (БХЛ-сингулярность) - это тип пространственной сингулярности, который возникает при определенных условиях во время космологического расширения или сжатия Вселенной. Она характеризуется неодновременным сжатием пространства в разных направлениях, что приводит к образованию "странных" сингулярностей, где некоторые направления сжатия происходят быстрее других.
Математическое описание БХЛ-сингулярности включает в себя анализ поведения метрики пространства-времени вблизи такой сингулярности. В общем случае, оно может быть представлено системой уравнений Эйнштейна, которые описывают эволюцию метрических компонент и тензора энергии-импульса материи во времени. Однако точное математическое описание БХЛ-сингулярности требует сложных расчетов и часто рассматривается в рамках численного моделирования.
Tokenizer research / Исследование токенайзера:
You can verify and see the internals of tokenization yourself by the python code provided below:
Можно рассмотреть внутренности токенизации самостоятельно, для этого прилагается следующий python код:
python
1input_text ="Привет! Я Ватари, интеллектуальный помощник в решении различных задач."23# Tokenize4tokenized = tokenizer(input_text, return_tensors="pt", return_offsets_mapping=True)5tokens = tokenizer.convert_ids_to_tokens(tokenized["input_ids"][0])67# Print raw tokens and decoded versions8print("Tokenization Analysis:\n")9for i,(token, offset)inenumerate(zip(tokens, tokenized.offset_mapping[0])):10# Get start/end positions in original text11 start, end = offset.tolist()12 original_slice = input_text[int(start):int(end)]1314# Clean token representation and replace Ġ (which represent the whitespace)15 cleaned_token = token.replace('Ġ',' ').replace('▁',' ')1617print(f"Token {i}:")18print(f" Raw: {token}")19print(f" Cleaned: {cleaned_token}")20print(f" Decoded: {tokenizer.decode(tokenized['input_ids'][0][i])}")21print(f" Original text slice: '{original_slice}'")22print(f" Byte representation: {list(token.encode('utf-8'))}")23print("-"*50)2425# Verify full reconstruction26print("\nFull Reconstruction:", tokenizer.decode(tokenized["input_ids"][0]))