Qwen2.5-1.5B + Opus-4.6 Reasoning LoRA

LoRA-адаптер для Qwen/Qwen2.5-1.5B-Instruct, дообученный на датасете chain-of-thought рассуждений, сгенерированных Claude Opus 4.6.

🎯 Цель

Дистилляция reasoning-способностей из большой модели (Claude Opus 4.6) в маленькую (1.5B параметров). Модель учится не просто давать ответ, а рассуждать перед ответом — показывать цепочку мыслей (chain-of-thought).

📊 Датасет

  • Источник: DarkyMan/Opus-4.6-RU-Reasoning-8000x-not-filtered
  • Размер: 7,758 примеров
  • Формат: User prompt → Reasoning (цепочка рассуждений) + Answer (развёрнутый ответ)
  • Язык: Русский
  • Домены: TypeScript, Python, Go, Rust, архитектура ПО, алгоритмы, системный дизайн

📈 Результаты обучения

Step Training Loss Validation Loss
100 1.0310 1.0309
200 0.9550 0.9557
300 0.8724 0.9172
400 0.8579 0.8938
  • Снижение validation loss: 13.3% (с 1.031 до 0.894)
  • Переобучение: минимальное (разница train/val ~0.04)
  • Эпохи: 2

⚙️ Параметры обучения

Параметр Значение
Base model Qwen/Qwen2.5-1.5B-Instruct
Method QLoRA (4-bit NF4)
LoRA rank (r) 16
LoRA alpha 32
Target modules q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj
LoRA dropout 0.05
Trainable params 18.5M / 1.56B (1.18%)
Batch size 4 × 8 grad_acc = 32 effective
Learning rate 2e-4
Scheduler Cosine
Max seq length 2048
Optimizer paged_adamw_8bit
Hardware NVIDIA A100 40GB
Training time ~1.5 часа

🚀 Использование

import torch
from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer

# Загрузка базовой модели + LoRA
base_model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen2.5-1.5B-Instruct",
    torch_dtype=torch.bfloat16,
    device_map="auto"
)
model = PeftModel.from_pretrained(base_model, "DarkyMan/Qwen2.5-1.5B-Opus46-Reasoning-LoRA")
tokenizer = AutoTokenizer.from_pretrained("DarkyMan/Qwen2.5-1.5B-Opus46-Reasoning-LoRA")

# Генерация
messages = [{"role": "user", "content": "Объясни TypeScript conditional types"}]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(text, return_tensors="pt").to(model.device)

with torch.no_grad():
    outputs = model.generate(
        **inputs,
        max_new_tokens=2048,
        temperature=0.7,
        top_p=0.9,
        do_sample=True
    )

response = tokenizer.decode(outputs[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)
print(response)

⚠️ Ограничения

  • Модель не тестировалась на бенчмарках — это исследовательский эксперимент
  • Качество ответов может быть нестабильным из-за маленького размера базовой модели (1.5B)
  • Датасет не проходил ручную фильтрацию
  • Максимальная длина при обучении 2048 токенов — длинные ответы из датасета были обрезаны

📝 Контекст

Это эксперимент по дистилляции reasoning-способностей из большой модели в маленькую. Датасет был сгенерирован с помощью Claude Opus 4.6 — каждый пример содержит внутреннюю цепочку рассуждений (reasoning) и финальный развёрнутый ответ (content).

Гипотеза: даже маленькая модель (1.5B) может научиться паттерну "сначала думай, потом отвечай", если обучить её на примерах рассуждений от большой модели.

📄 Лицензия

Apache 2.0 (следует лицензии базовой модели Qwen2.5)

Downloads last month
2
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for DarkyMan/Qwen2.5-1.5B-Opus46-Reasoning-LoRA

Adapter
(825)
this model

Dataset used to train DarkyMan/Qwen2.5-1.5B-Opus46-Reasoning-LoRA