Представьте: у вас есть 24 ГБ видеопамяти и желание научить открытую языковую модель отвечать в стиле вашей компании. Полный fine-tuning модели на 7 миллиардов параметров потребует примерно 112 ГБ VRAM — вчетверо больше, чем есть. Именно здесь на сцену выходят LoRA и QLoRA: методы, которые позволяют дообучить модель на одной GPU, не покупая кластер. Но за простотой кроются нюансы, из-за которых обучение разваливается или результат не оправдывает ожиданий.
В этой статье разберём, как устроены низкоранговые адаптеры, зачем нужна квантизация 4-bit, сколько памяти реально требуется, какие гиперпараметры на что влияют и когда дообучение вообще не нужно.
Почему fine-tuning — это не просто «запустить train»
Дообучение (fine-tuning) — это продолжение обучения предобученной модели на ваших данных, чтобы она лучше решала узкую задачу: отвечала в определённом стиле, следовала формату, знала предметную область. В отличие от промпт-инжиниринга, где вы подбираете инструкции, fine-tuning меняет веса модели. Это даёт более устойчивое поведение, но требует данных, вычислений и понимания, что именно вы меняете.
Ключевая проблема — масштаб. Модель на 7B параметров в fp16 занимает около 14 ГБ. Для полного fine-tuning нужно хранить веса, градиенты и состояния оптимизатора (обычно AdamW). Градиенты — ещё 14 ГБ, состояния оптимизатора — в два раза больше весов (для AdamW хранятся моменты первого и второго порядка). Итого примерно 14 + 14 + 28 = 56 ГБ плюс активации, которые зависят от размера батча и длины последовательности. На практике для 7B модели с батчем 1 и длиной 512 может потребоваться 60–80 ГБ. Поэтому полный fine-tuning на одной потребительской GPU — редкость.
LoRA: низкоранговые адаптеры
LoRA (Low-Rank Adaptation) предлагает элегантный обходной путь. Вместо того чтобы обновлять все веса матрицы W (размером d×k), мы замораживаем её и добавляем две маленькие матрицы A (d×r) и B (r×k), где r — ранг, обычно 8, 16 или 32. Прямой проход: h = Wx + BAx. Обучаются только A и B. Количество параметров падает с dk до r(d+k). Для d=k=4096 и r=16 это 131 тысяча вместо 16,7 миллиона — в 128 раз меньше.
На практике это означает, что для 7B модели с r=16 обучаемых параметров будет около 4–8 миллионов (в зависимости от того, к каким слоям применять адаптеры). Память под градиенты и оптимизатор для них мизерная. Основная память уходит на замороженные веса в fp16 (14 ГБ) и активации. Такой подход позволяет дообучать 7B модель на GPU с 24 ГБ (например, RTX 4090) при небольшом батче.
Гиперпараметры: rank, alpha, learning rate
- Rank (r) — главный параметр. Больше rank — больше ёмкость адаптера, но и риск переобучения. Для стилевых задач часто хватает r=8–16, для сложных предметных — 32–64. Слишком маленький rank (r=4) может не выучить нужное; слишком большой — теряет смысл LoRA (приближается к полному fine-tuning по числу параметров).
- Alpha — масштабирующий коэффициент: ΔW = (alpha/r) * BA. Обычно alpha ставят равным r или 2r. Если alpha слишком велик, адаптер доминирует и модель теряет базовые знания; если слишком мал — обучение идёт медленно.
- Learning rate — для LoRA обычно выше, чем при полном fine-tuning: 1e-4 – 3e-4. Слишком высокий приводит к разрушению адаптера, слишком низкий — к недообучению.
QLoRA: квантизация 4-bit для ещё большей экономии
QLoRA идёт дальше: замораживает базовые веса в 4-битном формате (NF4 — NormalFloat4), а адаптеры LoRA обучает в 16-bit. Это снижает память под веса с 14 ГБ до примерно 3,5–4 ГБ для 7B модели. Дополнительно используется double quantization (квантование констант квантизации) и paged optimizers для управления пиками памяти.
В результате QLoRA позволяет дообучать 7B модель на GPU с 8–12 ГБ VRAM (например, RTX 3060 12GB или даже 8GB с маленьким батчем). Для 13B модели потребуется около 10–12 ГБ, для 70B — уже 48+ ГБ, но всё равно это в разы меньше полного fine-tuning.
Однако квантизация вносит шум: 4-bit представление теряет точность. На практике это может немного снизить качество итоговой модели по сравнению с LoRA на fp16, но для многих задач разница незаметна. Важно: квантизуются только замороженные веса, адаптеры обучаются в полной точности, поэтому градиенты не страдают от квантизации.
Сколько VRAM реально нужно
Оценки для 7B модели (приблизительно, с батчем 1 и длиной 512):
| Метод | Память под веса | Общая VRAM (с градиентами и активациями) |
|---|---|---|
| Полный fine-tuning (fp16) | 14 ГБ | 60–80 ГБ |
| LoRA (fp16) | 14 ГБ | 18–24 ГБ |
| QLoRA (4-bit) | 3,5–4 ГБ | 6–10 ГБ |
Цифры ориентировочные: активации растут с длиной последовательности и размером батча. Для длины 1024 память может увеличиться на 20–30%.
Где метод уступает полному fine-tuning
LoRA и QLoRA — не серебряная пуля. Они могут не справиться, если:
- Задача требует глубокого изменения знаний (например, обучение новому языку или значительной перестройке предметной области). Низкий rank ограничивает выразительность.
- Данных очень много и они разнообразны — полный fine-tuning может дать лучший результат за счёт настройки всех весов.
- Критична максимальная точность — квантизация в QLoRA вносит шум, и в задачах с жёсткими требованиями (медицина, финансы) лучше использовать LoRA на fp16 или полный fine-tuning.
Также важно: LoRA-адаптеры можно объединять с базовой моделью (merge) для инференса, но при этом теряется возможность быстро переключаться между разными адаптерами.
На каких данных обучение разваливается
Частые причины провала:
- Мало данных или они однообразны. Если у вас 50 примеров одного типа, модель переобучится и будет отвечать шаблонно. Для стилевых задач нужно хотя бы несколько сотен разнообразных примеров.
- Неправильный формат. Модель ожидает определённый шаблон (например, "### Вопрос: ... ### Ответ: ..."). Если в обучении формат один, а на инференсе другой, качество падает.
- Дисбаланс классов. В задачах классификации или извлечения сущностей перекос в сторону одного класса приведёт к смещению предсказаний.
- Шумные метки. Ошибки в разметке модель выучит и будет воспроизводить.
Альтернативы: RAG и промпт-инжиниринг
Fine-tuning — не всегда лучший выбор. Если задача — дать модели доступ к внешним знаниям (документам, базе данных), часто эффективнее RAG (Retrieval-Augmented Generation): вы подгружаете релевантные фрагменты в промпт. Это дешевле, быстрее и не требует обучения. Промпт-инжиниринг с few-shot примерами может решить задачу стиля без изменения весов.
Trade-off: fine-tuning даёт устойчивое поведение и не требует передачи длинного контекста, но стоит денег и времени. RAG проще обновлять, но зависит от качества поиска. Промпт-инжиниринг — самый быстрый старт, но ограничен длиной контекста и может быть нестабильным.
Пути освоения
Самостоятельное изучение: статьи, документация Hugging Face PEFT, туториалы. Плюс — бесплатно, минус — нет обратной связи, легко упустить важные детали (например, как правильно настроить evaluation или деплой). Время — месяцы проб и ошибок.
Курсы: структурированный путь с разбором практических кейсов. На asibiont.com курс Fine-tuning LLM покрывает LoRA, QLoRA, подготовку датасетов, гиперпараметры, evaluation и деплой, включая RLHF и DPO. Обучение персонализировано под ваш уровень, есть обратная связь через AI-чат. Это экономит время, но требует финансовых вложений.
Практика на реальных проектах: лучший способ закрепить, но без наставника можно застрять на этапе отладки.
Кому подходит, а кому нет
Fine-tuning (и особенно LoRA/QLoRA) подходит, если вы хотите кастомизировать открытую модель под узкую задачу и у вас есть GPU (хотя бы 8–12 ГБ) и немного данных. Не подходит, если задача решается промптом или RAG, если нет размеченных данных или если требуется максимальная точность на критичных данных — тогда лучше рассмотреть полный fine-tuning или другие подходы.
Если вы готовы разобраться в механике и избежать типичных ошибок, курс Fine-tuning LLM даёт структурированный путь: от подготовки данных до деплоя. Начать можно на странице курса.