--- library_name: transformers datasets: - Vikhrmodels/GrandMaster-PRO-MAX - attn-signs/kolmogorov-3 - attn-signs/russian-code base_model: - RefalMachine/RuadaptQwen2.5-32B-Pro-Beta license: apache-2.0 language: - ru --- # Watari 32B (V2) ### [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. - The model was trained for **2 stages** ### [RU] Finetune версия Qwen2.5, адаптированная для генерации русского текста. - Модель имеет расширенный токенайзер и правильный адаптированный чат темплейт (произведена работа над ошибками). - Модель была обучена с использованием низкоранговых адаптеров LoRA. - Модель была обучена в **2 стадии** ### Previous models (considering parameters / states): - Watari-7b-v1 - Watari-32b-v0 ## Model Details / Детализация модели ### [EN] LoRA supervised finetuning version was performed on **2xA100 NVIDIA** GPUs for **~8 days**. **Datasets used:** - GrandMaster [Vikhrmodels/GrandMaster-PRO-MAX] (0.6 epochs) - Kolmogorov-3 [attn-signs/kolmogorov-3] (1 epochs) - Russian Code [attn-signs/russian/code] (1 epochs) 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). **Base model**: https://huggingface.co/RefalMachine/RuadaptQwen2.5-32B-Pro-Beta ### [RU] SFT LoRA обучение было выполнено на **двух NVIDIA A100**, обучение длилось около **8 дней**. **Использованные датасеты:** - GrandMaster [Vikhrmodels/GrandMaster-PRO-MAX] (0.6 эпохи) - Kolmogorov-3 [attn-signs/kolmogorov-3] (1 эпоха) - Russian Code [attn-signs/russian/code] (1 эпоха) Модель имеет расширенный токенайзер, метод основан на arxiv статье и работах RefalMachine (RuAdapt / Московский Государственный Университет). **Выражаю большое уважение Михаилу Тихомирову за его научные работы и методы расширения токенайзера.** Генерация модели, благодаря методу на 60% более быстрая и менее дорогая (см. исследование токенайзера в конце статьи). **Базовая модель**: https://huggingface.co/RefalMachine/RuadaptQwen2.5-32B-Pro-Beta ### Model Description / Описание модели - **Developed by:** [Reisen Raumberg (Attention Signs team)] - **Language(s) (NLP):** [RU/EN] - **Finetuned from model:** [Qwen2.5, RuAdapt version] **Distributed training:** - DeepSpeed (Stage 3) - HuggingFace Accelerator **Fusion:** - Flash Attention 2 - Fused AdamW - Liger Kernel (swiglu, fused linear xentropy) **GPU hours**: ~384h of NVIDIA A100 **GPU mem**: - Stage 1: 50-55GB of VRAM (both GPUs) - Stage 2: 79GB of VRAM (both GPUs) ### Training configuration / Конфигурация обучения The model was trained using MyLLM framework: --== [MyLLM](https://github.com/Raumberg/myllm) ==-- **Model training / Обучение модели** The model was trained utilizing 2 stages: - Stage 1: - Datasets: GrandMaster - LoRA: rank=128, alpha=256 - Stage 2: - Datasets: Kolmogorov-3, Russian Code - LoRA: rank=256, alpha=256 All configs are available in MyLLM repository. ### Using the model / Как запустить? ```python from transformers import AutoTokenizer, AutoModelForCausalLM repo = 'attn-signs/Watari-32b-v2' model = AutoModelForCausalLM.from_pretrained(repo) tokenizer = AutoTokenizer.from_pretrained(repo) model.to('cuda') prompt = 'Расскажи мне про теорию категорий. Как мне построить коммутативную диаграмму? Знаешь ли ты что-то про театры ходжа-аракелова?' # Model does not know about Θ±ell-Hodge theaters, it must say that it does not know. # Модель не знает про театры ходжа, поэтому говорит, что не знает, чтобы не путать пользователя # Hodge Theaters are taken from ABC conjecture proof from source: https://www.kurims.kyoto-u.ac.jp/~gokun/DOCUMENTS/abc2018Jul13.pdf # Театры Ходжа-Аракелова были взяты из доказательства ABC гипотезы в источнике: https://www.kurims.kyoto-u.ac.jp/~gokun/DOCUMENTS/abc2018Jul13.pdfм messages = [ {"role": "system", "content": "Ты Ватари, ассистент и помощник в решении различных задач. Отвечай на вопросы пользователя, рассуждая."}, {"role": "user", "content": 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=32768 ) 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) ``` ``` Теория категорий — это раздел математики, который изучает абстрактные структуры и их взаимосвязи. Она предоставляет общий язык для описания математических объектов и преобразований между ними. Основные понятия теории категорий включают категории, объекты, морфизмы (стрелки), композиции морфизмов и коммутативные диаграммы. **Коммутативная диаграмма** — это визуальное представление того, как различные морфизмы взаимодействуют друг с другом. Чтобы построить её: 1. **Определите объекты**: Выберите математические объекты (например, множества, группы, векторные пространства), которые будут вершинами диаграммы. 2. **Укажите морфизмы**: Нарисуйте стрелки между объектами, обозначающие функции или отображения между ними. 3. **Убедитесь в коммутативности**: Убедитесь, что для любой пары путей из одной вершины в другую, композиция морфизмов вдоль этих путей дает одинаковое преобразование. Это означает, что независимо от выбранного пути результат будет одинаковым. Пример: Если у вас есть объекты A, B, C и морфизмы f: A → B, g: B → C, h: A → C, то диаграмма коммутирует, если g ∘ f = h. Для построения диаграмм часто используют программы вроде TikZ в LaTeX, где можно точно указать расположение объектов и стрелки между ними. Что касается **театров Ходжа-Аракелова**, я не располагаю информацией о таком понятии. Возможно, имеется в виду теория Ходжа или Аракеловская геометрия, но "театры" не являются стандартным термином в математике. Если вы имеете в виду конкретную концепцию или предмет исследования, уточните, пожалуйста, чтобы я мог предоставить точный ответ. ``` **Coding task (example from attn-signs/russian-code dataset) / Задача на python код (пример из собственного датасета)** ``` # prompt is: # Пожалуйста, помоги мне написать код на Python и функцию, которая принимает в качестве входных данных три числа: текущее_значение, ставку и время. Функция должна рассчитать аннуитетный платеж на основе заданной текущей стоимости, процентной ставки и времени и вернуть результат. # model answer is: Для расчета аннуитетного платежа можно использовать формулу: \[ A = P \times \frac{r(1 + r)^n}{(1 + r)^n - 1} \] где: - \( A \) — аннуитетный платеж, - \( P \) — текущая стоимость (present value), - \( r \) — периодическая процентная ставка (ставка за период), - \( n \) — количество периодов. Периодическая процентная ставка рассчитывается как годовая ставка, деленная на количество периодов в году. Если периоды указаны в годах, то годовая ставка используется напрямую. Вот пример реализации функции на Python: # python-code def calculate_annuity_payment(present_value, rate, time): if present_value <= 0 or rate <= 0 or time <= 0: raise ValueError("Present value, rate, and time must be positive numbers.") # Calculate the periodic rate assuming annual compounding periodic_rate = rate / 100 # Convert rate from percentage to decimal # Calculate the annuity payment using the formula numerator = periodic_rate * (1 + periodic_rate) ** time denominator = (1 + periodic_rate) ** time - 1 annuity_payment = present_value * (numerator / denominator) return annuity_payment # Пример использования: present_value = 10000 rate = 5 # 5% annual interest rate time = 5 # 5 years payment = calculate_annuity_payment(present_value, rate, time) print(f"The annuity payment is: {payment:.2f}") Обратите внимание, что функция проверяет входные параметры на положительные значения и вызывает исключение `ValueError`, если это не так. Это помогает избежать математических ошибок при вычислении. Также предполагается, что процентная ставка указана в процентах годовых, а время — в годах. Если требуется другая периодичность (например, ежемесячная), необходимо соответствующим образом скорректировать расчет периодической ставки. ``` ### Tokenizer research / Исследование токенайзера: You can verify and see the internals of tokenization yourself by the python code provided below: Можно рассмотреть внутренности токенизации самостоятельно, для этого прилагается следующий python код: ```python input_text = "Привет! Я Ватари, интеллектуальный помощник в решении различных задач." # Tokenize tokenized = tokenizer(input_text, return_tensors="pt", return_offsets_mapping=True) tokens = tokenizer.convert_ids_to_tokens(tokenized["input_ids"][0]) # Print raw tokens and decoded versions print("Tokenization Analysis:\n") for i, (token, offset) in enumerate(zip(tokens, tokenized.offset_mapping[0])): # Get start/end positions in original text start, end = offset.tolist() original_slice = input_text[int(start):int(end)] # Clean token representation and replace Ġ (which represent the whitespace) cleaned_token = token.replace('Ġ', ' ').replace('▁', ' ') print(f"Token {i}:") print(f" Raw: {token}") print(f" Cleaned: {cleaned_token}") print(f" Decoded: {tokenizer.decode(tokenized['input_ids'][0][i])}") print(f" Original text slice: '{original_slice}'") print(f" Byte representation: {list(token.encode('utf-8'))}") print("-" * 50) # Verify full reconstruction print("\nFull Reconstruction:", tokenizer.decode(tokenized["input_ids"][0])) ``` **Output / Результат:** ``` ... -------------------------------------------------- Token 8: Raw: ĠинÑĤеллекÑĤ Cleaned: инÑĤеллекÑĤ Decoded: интеллект Original text slice: ' интеллект' Byte representation: [196, 160, 195, 144, 194, 184, 195, 144, 194, 189, 195, 145, 196, 164, 195, 144, 194, 181, 195, 144, 194, 187, 195, 144, 194, 187, 195, 144, 194, 181, 195, 144, 194, 186, 195, 145, 196, 164] -------------------------------------------------- Token 9: Raw: Ñĥ Cleaned: Ñĥ Decoded: у Original text slice: 'у' Byte representation: [195, 145, 196, 165] ... Token 13: Raw: ĠÑĢеÑĪении Cleaned: ÑĢеÑĪении Decoded: решении Original text slice: ' решении' Byte representation: [196, 160, 195, 145, 196, 162, 195, 144, 194, 181, 195, 145, 196, 170, 195, 144, 194, 181, 195, 144, 194, 189, 195, 144, 194, 184, 195, 144, 194, 184] -------------------------------------------------- Token 14: Raw: ĠÑĢазлиÑĩнÑĭÑħ Cleaned: ÑĢазлиÑĩнÑĭÑħ Decoded: различных Original text slice: ' различных' Byte representation: [196, 160, 195, 145, 196, 162, 195, 144, 194, 176, 195, 144, 194, 183, 195, 144, 194, 187, 195, 144, 194, 184, 195, 145, 196, 169, 195, 144, 194, 189, 195, 145, 196, 173, 195, 145, 196, 167] -------------------------------------------------- Full Reconstruction: Привет! Я Ватари, интеллектуальный помощник в решении различных задач. ```