Локальный ИИ · fine-tuning · LoRA / QLoRA
Дообучение локальной LLM: LoRA, QLoRA, RAG и практический запуск
Не каждую проблему нужно решать обучением модели. Если нейросеть должна помнить новые документы — чаще нужен RAG. Если же нужно устойчиво изменить формат ответов, стиль, терминологию, tool calling или поведение на конкретном типе задач — начинается область fine-tuning. Для домашней GPU самый практичный путь сегодня — LoRA или QLoRA.
Когда локальную LLM действительно стоит дообучать
Fine-tuning полезен, когда нужно изменить поведение модели, а не просто показать ей очередной документ.
Fine-tuning также способен добавлять доменные знания, но использовать его как замену обновляемой базы знаний часто неудобно: при каждом изменении данных модель пришлось бы обучать заново.
RAG или fine-tuning: что выбрать
| Задача | Что обычно лучше | Почему |
|---|---|---|
| Ответы по постоянно меняющимся документам | RAG | Документы можно переиндексировать без обучения модели. |
| Стабильный стиль/формат ответа | LoRA / QLoRA | Поведение закрепляется в adapter weights. |
| Ответы со ссылкой на источник | RAG | Модель получает конкретный retrieved fragment. |
| Лучше выполнять повторяемую узкую задачу | Fine-tuning | Модель учится на множестве правильных примеров выполнения. |
| И знания, и специализированное поведение | RAG + fine-tuning | Эти методы не исключают друг друга. |
Гайд по RAG: локальная нейросеть для PDF и документов.
Что такое LoRA
LoRA — Low-Rank Adaptation — метод parameter-efficient fine-tuning. Основные веса base model остаются замороженными, а обучение изменяет небольшие добавочные low-rank matrices.
Основная модель не переписывается целиком.
Именно они обновляются во время training.
Base + adapter дают новое поведение.
Hugging Face PEFT называет LoRA одним из наиболее популярных и удобных методов PEFT. Главный выигрыш — обучается лишь небольшая доля параметров вместо всей модели.
Что такое QLoRA
QLoRA сохраняет идею LoRA, но base model загружается в 4-bit представлении. Это резко уменьшает VRAM, необходимую для training.
В Hugging Face bitsandbytes для QLoRA используется 4-bit quantization; для обучения 4-bit base models документация рекомендует тип NF4.
LoRA или QLoRA
В актуальной документации Unsloth LoRA описывается как 16-bit training, а QLoRA — как 4-bit. Unsloth оценивает LoRA как немного быстрее и точнее, но примерно в четыре раза более требовательную по памяти.
Сколько VRAM нужно для QLoRA
Ниже — минимальные ориентиры из актуальной документации Unsloth. Это не гарантия: context length, batch size, архитектура и optimizer могут потребовать больше.
| Размер модели | QLoRA 4-bit | LoRA 16-bit |
|---|---|---|
| 3B | ≈3,5 ГБ | ≈8 ГБ |
| 7B | ≈5 ГБ | ≈19 ГБ |
| 8B | ≈6 ГБ | ≈22 ГБ |
| 9B | ≈6,5 ГБ | ≈24 ГБ |
| 11B | ≈7,5 ГБ | ≈29 ГБ |
| 14B | ≈8,5 ГБ | ≈33 ГБ |
| 27B | ≈22 ГБ | ≈64 ГБ |
| 32B | ≈26 ГБ | ≈76 ГБ |
Практический вывод: QLoRA 7–14B-класса сегодня реально тестировать на обычной потребительской GPU. Но таблица показывает абсолютные минимумы Unsloth, а не «комфортные требования».
Что сильнее всего повышает расход памяти
- длинный training sequence;
- batch size;
- более крупная base model;
- LoRA rank;
- отключённый gradient checkpointing;
- vision/multimodal training;
- optimizer и дополнительные training states.
Если получаете CUDA OOM, документация Unsloth предлагает в первую очередь снижать batch size до 1–3.
Как выбрать base model
Fine-tuning не исправляет фундаментальные ограничения слабой base model. Поэтому сначала выберите модель, которая уже умеет примерно то, что требуется.
Для первого SFT почти всегда проще начать с готовой instruct-версии.
Дообучайте модель, которая уже сильна в программировании.
Текстовая модель не станет vision-моделью из-за набора картинок.
Если base model плохо знает русский, небольшой LoRA не гарантирует чудо.
Dataset важнее большинства hyperparameters
Fine-tuning обучает модель повторять паттерны из dataset. Поэтому ошибки, многословие и плохие ответы тоже становятся training signal.
Простой формат prompt → completion
{"prompt":"Определи категорию заявки: Не работает розетка на кухне","completion":"электрика"}
{"prompt":"Определи категорию заявки: Не подключается ноутбук к Wi-Fi","completion":"сеть"}
{"prompt":"Определи категорию заявки: Камера показывает offline","completion":"видеонаблюдение"}
Диалоговый формат
{
"messages": [
{"role":"user","content":"Сформируй краткое техническое заключение."},
{"role":"assistant","content":"Причина: ...\nПроверка: ...\nРешение: ..."}
]
}
Hugging Face TRL SFTTrainer поддерживает как language-modeling, так и prompt-completion datasets.
Сколько примеров нужно
Универсального числа нет. Сотня очень чистых и однородных примеров может дать заметный эффект на узкой задаче, а тысячи слабых примеров — испортить модель.
Train, validation и test нужно разделять до обучения
Если проверить модель на тех же примерах, на которых она училась, результат почти ничего не говорит о реальной способности обобщать.
Для небольшого dataset особенно важно вручную проверить, чтобы очень похожие варианты одного исходного примера не оказались одновременно в train и test.
Установка Unsloth локально
Unsloth сегодня поддерживает Linux и Windows, NVIDIA, AMD и Intel GPU; для разных backend есть отдельные инструкции. Самый простой общий вариант установки:
pip install unsloth
или:
uv pip install unsloth
Для изолированной серверной среды есть официальный Docker image unsloth/unsloth.
Минимальная схема QLoRA training
Упрощённый workflow выглядит так:
Загружается QLoRA-compatible base model.
Определяются trainable adapter layers.
Обучение идёт на подготовленном dataset.
Сравнивается base model и adapter на test-наборе.
Концептуально код Unsloth выглядит так:
from unsloth import FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="YOUR_MODEL",
max_seq_length=2048,
load_in_4bit=True,
)
model = FastLanguageModel.get_peft_model(
model,
r=16,
target_modules=[
"q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"
],
lora_alpha=16,
lora_dropout=0,
use_gradient_checkpointing="unsloth",
)
Затем dataset передаётся в TRL SFTTrainer и запускается trainer.train(). Конкретный tokenizer/chat template, model class и dataset formatter зависят от выбранной архитектуры.
Какие hyperparameters действительно нужно понимать
| Параметр | Что меняет | Разумный старт |
|---|---|---|
r |
Ёмкость LoRA adapter | 16 или 32 |
lora_alpha |
Масштаб влияния adapter | ≈ r или 2×r |
| learning rate | Размер шага оптимизации | Зависит от метода и dataset |
| epochs | Сколько раз модель видит dataset | Обычно 1–3 для instruction SFT |
| batch size | Память и стабильность training | При нехватке VRAM начать с 1–2 |
| max sequence length | Размер training context | Не ставить максимум без необходимости |
Unsloth рекомендует для LoRA rank часто начинать с 16 или 32 и предупреждает о diminishing returns/overfitting при чрезмерном числе epochs.
Как понять, что fine-tuning реально помог
До training создайте фиксированный benchmark из реальных задач. После training прогоните:
- base model с одинаковым prompt;
- base + LoRA adapter;
- по возможности RAG/prompt-only baseline;
- слепую ручную оценку результатов;
- автоматическую метрику, если задача допускает её.
Для classification
Accuracy, precision/recall/F1.
Для JSON / structured output
Процент валидного JSON и точное соблюдение schema.
Для tool calling
Правильный выбор tool + корректность arguments + успешность полного workflow.
Для свободного текста
Human evaluation на отложенных реальных запросах важнее одной aggregate метрики.
Как выглядит переобучение
Модель может отлично повторять training examples и одновременно стать хуже на новых формулировках.
Признаки:
- training loss падает, validation перестаёт улучшаться;
- ответы становятся слишком одинаковыми;
- модель копирует целые куски training data;
- хуже работает на вопросах вне узкого шаблона;
- теряет полезные способности base model.
Увеличивать epochs только потому, что «GPU ещё свободна» — плохая стратегия.
Сохранять adapter или целую модель
Одно из главных преимуществ LoRA — adapter может быть очень небольшим относительно base model.
Hugging Face PEFT предоставляет merge_and_unload() для объединения adapter weights с base model в standalone model. Но merge — отдельный этап deployment, а не обязательная часть обучения.
Как превратить fine-tuned модель в GGUF
Unsloth умеет экспортировать fine-tuned модель напрямую в формат GGUF для llama.cpp, Ollama, LM Studio и других локальных runtimes.
model.save_pretrained_gguf(
"my-model",
tokenizer,
quantization_method="q4_k_m"
)
Можно также экспортировать Q8_0 или F16:
model.save_pretrained_gguf("my-model-q8", tokenizer, quantization_method="q8_0")
model.save_pretrained_gguf("my-model-f16", tokenizer, quantization_method="f16")
Подробнее о GGUF: GGUF и квантизация локальных LLM.
Как запустить fine-tuned модель в Ollama
Один практичный путь — экспортировать модель в GGUF, создать Modelfile и импортировать её в Ollama.
FROM ./my-model-Q4_K_M.gguf
ollama create my-finetuned-model -f Modelfile
ollama run my-finetuned-model
Unsloth также имеет отдельную официальную инструкцию сохранения fine-tuned models в Ollama и автоматического создания Modelfile.
Нужно ли merge LoRA adapter с base model
Не всегда.
Adapter остаётся маленьким и можно переключать специализации.
Удобно для Ollama/llama.cpp как одной модели.
Base model при training была quantized; используйте документированный export path.
Не обязательно создавать отдельную многогигабайтную модель на каждую задачу.
Для QLoRA особенно разумно использовать export/merge процедуры фреймворка, а не вручную «переквантовывать» уже quantized layers.
Главные ошибки при первом fine-tuning
1. Fine-tuning вместо RAG
Если задача — отвечать по свежему прайс-листу, документации или базе знаний, обучение часто лишнее.
2. Плохой dataset
Модель учится именно тем ошибкам и шаблонам, которые вы в него положили.
3. Нет baseline до training
После обучения невозможно понять, стало лучше или просто иначе.
4. Слишком большая модель
Маленькая модель с качественным dataset может быть полезнее огромной, которую приходится обучать на пределе памяти.
5. Слишком длинный context
Training sequence напрямую влияет на VRAM и время обучения.
6. Слишком много epochs
Повтор одного маленького dataset десятки раз ускоряет memorization, а не обязательно улучшает generalization.
7. Проверка на training data
Это измеряет способность запоминать, а не работать на новых запросах.
8. Сразу merge и удалить adapter
Сначала сохраните исходный adapter, config, dataset version и параметры training.
Что сохранять вместе с обученной моделью
- точный base model ID и revision;
- adapter;
- dataset или его version/hash;
- train/validation/test split;
- LoRA rank и alpha;
- learning rate;
- epochs/steps;
- max sequence length;
- версии Unsloth/Transformers/PEFT/TRL;
- результаты baseline и post-training evaluation.
Частые вопросы
Можно ли дообучить LLM на домашней RTX?
Да. QLoRA заметно снижает требования к VRAM. По текущим минимальным оценкам Unsloth 7B требует около 5 ГБ, 8B — около 6 ГБ, 14B — около 8,5 ГБ VRAM, но реальный расход зависит от context и batch size.
Что лучше для 8 ГБ VRAM — LoRA или QLoRA?
Обычно QLoRA. 16-bit LoRA требует гораздо больше памяти. На 8 ГБ разумнее работать с небольшой 4-bit base model.
Fine-tuning добавит модели мои документы?
Он может изменить знания модели, но для регулярно меняющихся документов удобнее RAG. Fine-tuning лучше использовать для устойчивого поведения и задач.
Сколько примеров нужно для LoRA?
Фиксированного числа нет. Для узкого поведения эффект может появиться на сотнях качественных примеров; сложные задачи требуют больше данных и тщательной оценки.
Нужно ли обучать base model или instruct model?
Для первого supervised fine-tuning обычно проще instruct model: она уже умеет следовать инструкциям и вести диалог. Base model нужен для более специфических training strategies.
Можно ли fine-tuned модель запустить в Ollama?
Да. Один из типовых путей — экспортировать её в GGUF и импортировать через Modelfile. Unsloth имеет отдельные инструменты экспорта в GGUF/Ollama.
QLoRA и Q4_K_M — одно и то же?
Нет. QLoRA использует 4-bit представление base model для training, часто NF4. Q4_K_M — GGUF quant для inference.
Что такое SFT?
Supervised Fine-Tuning — обучение на примерах правильного входа и ожидаемого ответа. Для большинства первых LoRA/QLoRA-задач это базовый метод.
Можно ли обучать gpt-oss локально?
Да, современные fine-tuning framework поддерживают gpt-oss. Unsloth отдельно заявляет оптимизированное обучение MoE-моделей и приводит gpt-oss-20b как поддерживаемый пример.
Живой спрос
Почему LoRA/QLoRA снова обсуждают в 2026 году
После роста RAG многие пользователи решили, что fine-tuning больше не нужен. Но это две разные технологии. В свежей ветке LocalLLaMA от 26 августа 2026 отдельно обсуждается практический случай, где LoRA/QLoRA оказался полезнее RAG для специализированного поведения модели.
Параллельно инструменты стали заметно доступнее: Unsloth публикует минимальные VRAM-оценки для QLoRA на потребительских GPU, Hugging Face TRL напрямую поддерживает PEFT/QLoRA через SFTTrainer, а готовую модель можно экспортировать обратно в GGUF и Ollama.
Open source
Полезные проекты
Связанные гайды
Что читать дальше
Первичные источники
Документация
Локальное дообучение LLM
