Дообучение Qwen3.5-27B на QLoRA за 30 тыс. руб: гайд для образования 2026 | AiManual
AiManual Logo Ai / Manual.
22 Апр 2026 Гайд

Дообучение Qwen3.5-27B за 30 000 рублей: практическое руководство для нишевых задач (на примере образования)

Практический гайд по дообучению Qwen3.5-27B на QLoRA за 30 000 рублей под задачи российского образования. Пошаговая инструкция: данные, железо, код, развертыван

Зачем мучить общую модель уроками по физике?

Представьте: вам нужен AI-ассистент, который не просто пересказывает Википедию, а понимает контекст российского образования. Знает, что такое "решить задачу по терверу из сборника Чудесенко", может объяснить закон Ома так, чтобы понял восьмиклассник из Уфы, и не путает ЕГЭ с чем-то неприличным. Общие модели, даже самые навороченные, на этом спотыкаются. Они обучены на англоязычных данных, их культурный код - другой. А платить за каждый запрос к GPT-5.4 - это как заказывать такси из Москвы в Казань вместо поезда.

Вот и проблема: нишевые задачи требуют специфических знаний, но бюджеты у школ, вузов и стартапов не резиновые. Аренда мощных GPU для полного дообучения 27-миллиардной модели может обойтись в сотни тысяч. Но есть способ проще, дешевле и умнее.

Важно: на апрель 2026 года Qwen3.5-27B остается одной из самых сбалансированных open-source моделей по соотношению "качество-размер-требования". Она поддерживает контекст до 32K токенов, что идеально для длинных учебных материалов. Более новые версии, вроде Qwen4-72B, требуют уже 40+ GB VRAM только для инференса, что выбивается из нашего бюджета.

QLoRA: магия, которая ужимает стоимость в 10 раз

Полное дообучение (full fine-tuning) Qwen3.5-27B - это примерно 80 GB VRAM и неделя аренды A100. Наш бюджет - 30 000 рублей. Математика не сходится. Но если обновлять не все 27 миллиардов параметров, а только маленький адаптер? Это как не перестраивать всю школу, а прикрутить к ней новый smart-класс.

QLoRA (Quantized Low-Rank Adaptation) - это метод, который замораживает оригинальную модель в 4-битном квантованном виде и обучает только небольшие низкоранговые матрицы-адаптеры. Результат: качество почти как при полном дообучении, а требуется VRAM в 4-5 раз меньше. В цифрах:

Параметр Full Fine-Tuning QLoRA (наш выбор)
Требуемая VRAM ~80 GB ~20 GB
Обучаемые параметры 27B (100%) ~67M (0.25%)
Ориентировочная стоимость (облако) от 150 000 руб. ~30 000 руб.
Время обучения (на наших данных) 3-4 дня 17 часов

Звучит как читерство? Отчасти да. Но это рабочий читерство, которое позволяет получить специализированную модель для проверки домашних заданий, генерации тестов или объяснения сложных тем без необходимости продавать почку.

1 Готовим данные: чем кормить, чтобы не блевала

Самая частая ошибка - накидать в датасет кучу PDF с учебниками и ждать чуда. Модель не станет экспертом по педагогике. Она начнет галлюцинировать терминами или, что хуже, выдавать уверенные, но неправильные ответы.

Формат данных - это все. Qwen3.5-27B - инструктивная модель, поэтому данные должны быть в формате "инструкция-ответ". Для образовательных задач я рекомендую три типа данных:

  • Диалоги учитель-ученик: реальные или сгенерированные цепочки вопросов и развернутых ответов по конкретной теме (например, "Объясни, почему небо синее, для 5 класса").
  • Решение задач с пояснениями: не просто ответ "42", а пошаговое решение с комментариями на каждом шаге. Отлично подходят сборники задач с решениями.
  • Коррекция ошибок: примеры неправильных решений или ответов учеников и их исправление с объяснением.

Объем: для старта хватит 2000-5000 качественных примеров. Собрать их можно из открытых источников: российские образовательные порталы, форумы, даже адаптировав техники из гайда по фильтрации вывода для кодирующих агентов. Главное - разнообразие и качество.

// Пример одного примера в датасете
{
  "instruction": "Реши задачу: 'Из пункта A в пункт B выехал велосипедист со скоростью 12 км/ч. Одновременно из B в A выехал второй велосипедист со скоростью 15 км/ч. Расстояние между пунктами 54 км. Через сколько часов они встретятся?'",
  "output": "1. Общая скорость сближения велосипедистов: 12 км/ч + 15 км/ч = 27 км/ч.\n2. Время до встречи найдем по формуле: время = расстояние / скорость.\n3. Время = 54 км / 27 км/ч = 2 часа.\nОтвет: велосипедисты встретятся через 2 часа."
}
💡
Не пытайтесь запихнуть в датасет всю школьную программу. Лучше глубоко проработать 2-3 предмета (например, математика и физика), чем поверхностно 10. Модель научится общим принципам объяснения и сможет экстраполировать их на смежные темы.

2 Железо и облако: где считать за 30 тысяч

20 GB VRAM - это примерно одна карта RTX 4090 (24 GB) или две RTX 3090 (по 24 GB каждая). Если есть своя - отлично, считайте, что сэкономили. Но большинство арендует.

На апрель 2026 года цены примерно такие (берем российских или международных провайдеров с оплатой в рублях):

  • RTX 4090 (24 GB): ~120-150 руб./час. За 17 часов обучения - 2040-2550 руб. Уложились? Нет, потому что нужно учесть время на подготовку, отладку и несколько экспериментов. На практике уйдет 50-70 часов машинного времени. Итого: ~6000-10 500 руб.
  • A100 (40/80 GB): Дорого (от 500 руб./час), но если использовать эффективно (например, через Vultr или другие облака с preemptible instances), можно уложиться в 15 000-20 000 руб.
  • Локальный сервер с несколькими 3090: Если планируете регулярно дообучавать модели, возможно, стоит купить железо. Но это уже инвестиция от 300 000 руб.

Мой выбор для разового проекта: 2-3 инстанса с RTX 4090 на разных провайдерах (чтобы сравнить скорость и стабильность). Общая стоимость, включая резервные копии и тесты, уложится в 25 000-30 000 руб. Если использовать спотовые (прерываемые) инстансы, можно сэкономить еще 20-30%.

Осторожно с дешевыми облаками! Некоторые предлагают "игровые" 4090 по низкой цене, но они часто имеют урезанные драйверы или ограничения на длительные вычисления. Читайте отзывы за 2025-2026 годы. Я пару раз попадал на отключение инстанса через 10 часов без предупреждения.

3 Код: от клонирования репозитория до запуска обучения

Будем использовать библиотеку PEFT (Parameter-Efficient Fine-Tuning) от Hugging Face и трансформеры. Актуальные версии на апрель 2026: transformers 4.45.0, peft 0.12.0, bitsandbytes 0.43.0. Установите их в свежее виртуальное окружение.

Сначала загружаем модель в 4-битном виде. Это критически важно для экономии памяти.

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training

model_id = "Qwen/Qwen3.5-27B"

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_use_double_quant=True,  # Двойное квантование для еще большей экономии
    bnb_4bit_quant_type="nf4",        # Тип 4-битного квантования (нормальный float 4)
    bnb_4bit_compute_dtype=torch.bfloat16  # Тип вычислений
)

model = AutoModelForCausalLM.from_pretrained(
    model_id,
    quantization_config=bnb_config,
    device_map="auto",  # Автоматически распределит слои по GPU
    trust_remote_code=True  # Qwen требует этого
)
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
# Важно: для Qwen нужно установить pad_token
if tokenizer.pad_token is None:
    tokenizer.pad_token = tokenizer.eos_token

Теперь настраиваем LoRA. Параметры r, alpha, dropout - это магия, которую нужно подбирать. Для образовательных задач хорошо работают значения r=16, alpha=32. Мы обучаем только query и value слои внимания.

model = prepare_model_for_kbit_training(model)

lora_config = LoraConfig(
    r=16,
    lora_alpha=32,
    target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],  # Обучаем проекции внимания
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM"
)

model = get_peft_model(model, lora_config)
model.print_trainable_parameters()  # Должно показать ~0.25% обучаемых параметров

Подготовка данных и обучение. Используем SFTTrainer из библиотеки TRL (актуальная версия 0.9.0).

from datasets import load_dataset
from trl import SFTTrainer, DataCollatorForCompletionOnlyLM

# Загружаем наш датасет
dataset = load_dataset("json", data_files="education_dataset.jsonl", split="train")

# Форматируем данные: упаковываем инструкцию и ответ в шаблон
def format_instruction(example):
    return f"### Instruction:\n{example['instruction']}\n\n### Response:\n{example['output']}"

dataset = dataset.map(lambda x: {"text": format_instruction(x)})

# Коллатор, который маскирует часть текста (только ответ)
collator = DataCollatorForCompletionOnlyLM(
    instruction_template="### Instruction:",
    response_template="### Response:",
    tokenizer=tokenizer,
    mlm=False
)

trainer = SFTTrainer(
    model=model,
    train_dataset=dataset,
    peft_config=lora_config,
    tokenizer=tokenizer,
    args=transformers.TrainingArguments(
        output_dir="./qwen-education-lora",
        num_train_epochs=3,           # 3 эпохи обычно достаточно
        per_device_train_batch_size=2, # Батч размером 2 на устройство (при 20 GB VRAM)
        gradient_accumulation_steps=8,  # Аккумулируем градиенты, чтобы эффективный батч был 16
        learning_rate=2e-4,            # Стартовая learning rate для LoRA
        fp16=True,                     # Используем половинную точность
        logging_steps=10,
        save_steps=500,
        save_total_limit=3,
        optim="paged_adamw_8bit",     # Оптимизатор с пейджингом для экономии памяти
        max_grad_norm=0.3,
        warmup_ratio=0.03,
        lr_scheduler_type="cosine",
        report_to="none"               # Отключаем отчеты, если не используем WandB
    ),
    data_collator=collator,
    max_seq_length=2048,               # Ограничиваем длину последовательности
)

trainer.train()

Обучение запустится. На инстансе с RTX 4090 одна эпоха на 3000 примеров с такими параметрами займет около 5-6 часов. Итого 15-18 часов. Ждем.

4 Слияние и развертывание: как оживить модель

После обучения у вас есть папка с весами адаптера (например, `qwen-education-lora`). Но это не самостоятельная модель. Нужно объединить адаптер с базовой моделью для инференса. Делается это просто:

from peft import PeftModel

# Загружаем базовую модель снова (в том же 4-битном виде)
base_model = AutoModelForCausalLM.from_pretrained(
    model_id,
    quantization_config=bnb_config,
    device_map="auto",
    trust_remote_code=True
)

# Загружаем обученный адаптер
model = PeftModel.from_pretrained(base_model, "./qwen-education-lora/checkpoint-1500")

# Объединяем и сохраняем полную модель для инференса
merged_model = model.merge_and_unload()
merged_model.save_pretrained("./qwen-27b-education-merged", safe_serialization=True)
tokenizer.save_pretrained("./qwen-27b-education-merged")

Теперь у вас есть готовая модель, которую можно загрузить и использовать. Для развертывания я рекомендую vLLM (актуальная версия 0.6.0 на апрель 2026) - он оптимизирован для быстрого инференса больших моделей и поддерживает Qwen. Или llama.cpp для запуска на слабом железе, если нужно экономить ресурсы.

# Запуск сервера vLLM с нашей моделью
python -m vllm.entrypoints.openai.api_server \
    --model ./qwen-27b-education-merged \
    --served-model-name qwen-education \
    --max-model-len 2048 \
    --tensor-parallel-size 1  # Если 1 GPU

Сервер запустится на localhost:8000 и будет предоставлять OpenAI-совместимый API. Можно интегрировать в ваш образовательный сервис.

Где спрятаны грабли: 5 ошибок, которые сведут результат к нулю

  1. Экономия на данных. 500 примеров, скопированных с одного сайта, - это не датасет, а мусор. Модель переобучится на стиль этого сайта и будет выдавать шаблонные ответы. Нужно разнообразие источников и форматов.
  2. Неправильный формат инструкций. Если в датасете инструкции вида "Объясни физику", а в продакшене вы спрашиваете "Растолкуй квантовую механику", модель может запутаться. Используйте единый шаблон и придерживайтесь его везде.
  3. Слишком высокий learning rate. Для QLoRA значения выше 3e-4 часто приводят к нестабильности обучения и катастрофическому забыванию. Начинайте с 2e-4 и используйте scheduler.
  4. Игнорирование loss-кривой. Если loss не снижается после первой эпохи, что-то пошло не так. Не ждите 17 часов вслепую. Мониторьте логи каждые 100 шагов. Иногда проблема в битых данных или слишком большом батче.
  5. Попытка обучить все слои. Добавление в target_modules всех линейных слоев ("gate_proj", "up_proj", "down_proj") увеличит число параметров в 3 раза и может не дать прироста качества, но гарантированно вызовет OOM (Out Of Memory). Держитесь классики: q_proj, v_proj.
💡
Если модель после обучения начала зацикливаться или генерировать бессмыслицу, не паникуйте. Скорее всего, проблема в данных или переобучении. Попробуйте уменьшить количество эпох до 2, добавить больше dropout в LoRA (0.1) или применить техники исправления зацикливания из этого гайда.

Вопросы, которые вы хотели задать, но боялись

Правда, что дообученная на QLoRA модель будет хуже, чем полный fine-tuning?

На нишевых задачах разница часто незаметна. QLoRA достигает 95-99% качества полного fine-tuning, потому что адаптеры учатся компенсировать смещение данных. Для образования, где важна точность фактов, этого более чем достаточно. Полный fine-tuning имеет смысл, если вы меняете саму архитектуру знаний модели (например, учите принципиально новую предметную область).

Можно ли дообучить модель на CPU, чтобы сэкономить?

Технически да, но на обучение 27B модели на CPU уйдут месяцы. Это не практично. Если бюджет очень ограничен, рассмотрите меньшую модель, например, Qwen3.5-9B, или используйте квантование для инференса на CPU после обучения на GPU.

Как оценить качество дообученной модели?

Создайте небольшой тестовый набор из 100-200 примеров, которые не попали в обучающие данные. Оценивайте не только точность ответов (это может быть субъективно), но и:

  • Связность и логичность объяснений.
  • Отсутствие галлюцинаций (выдуманных фактов).
  • Соответствие стилю и сложности целевой аудитории (например, для 7 класса).
Можно использовать другую LLM (например, GPT-4o-mini) как судью для оценки, но это добавит затрат.

Что делать, если модель после обучения стала хуже отвечать на общие вопросы?

Это эффект катастрофического забывания. В нашем случае он минимален, потому что QLoRA затрагивает малую часть параметров. Но если проблема есть, добавьте в датасет 10-20% общих вопросов и ответов (из исходных возможностей Qwen) вместе со специализированными данными. Это поможет модели сохранить общие знания.

И последнее: не ждите, что модель заменит живого учителя. Она - инструмент, который может автоматизировать рутину, дать дополнительное объяснение или проверить типовые задачи. И за 30 000 рублей вы получаете именно это - сильного, понимающего контекст цифрового ассистента, который работает в вашей школе или приложении 24/7, не просит отпуск и не устает.

А следующий шаг - дистилляция этой 27B модели в меньшую, например, 7B, для запуска на более дешевом железе. Но это уже тема для отдельного разговора о квантовании и дистилляции.

Подписаться на канал