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

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 / Как запустить?

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 код:

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: Привет! Я Ватари, интеллектуальный помощник в решении различных задач.
Downloads last month
5
Safetensors
Model size
32.7B params
Tensor type
BF16
·
Inference Providers NEW
This model is not currently available via any of the supported Inference Providers.

Model tree for attn-signs/Watari-32b-v2

Base model

Qwen/Qwen2.5-32B
Finetuned
(3)
this model

Datasets used to train attn-signs/Watari-32b-v2

Collection including attn-signs/Watari-32b-v2