Генеративный AI
Fine-Tuning: SFT, LoRA, QLoRA
Момент, когда all изменилось
24 февраля 2023. Meta выпускает LLaMA-7B - не продукт, а исследовательский артефакт с предупреждением 'только для академических целей'. Через несколько дней веса утекают на 4chan. Через несколько недель Стэнфорд выпускает Alpaca - LLaMA, дообученную на 52 000 инструкциях, сгенерированных GPT-3.5, менее чем за 600 долларов вычислительного времени. Через неделю Databricks выпускает Dolly. Через месяц появляется Vicuna. Открытое сообщество за 30 дней воспроизвело то, что GPT-3 делал за сотни миллионов долларов. Катализатор: LoRA снизила барьер с 'нужен кластер' до 'нужна одна GPU'. QLoRA, вышедшая два месяца спустя, снизила дальше: с A100 до потребительской RTX 4090.
Предварительные знания
- Что даёт pre-training: base модель, предсказывающая следующий токен
- Backpropagation и цена обновления всех весов модели
GPT-4 дообучить нельзя - только через OpenAI fine-tuning API, от 25 долларов за 1000 токенов обучения, без доступа к весам. LoRA на LLaMA-3-8B: 6 часов на RTX 4090, 15 долларов электричества, полный контроль. Это не просто экономия - это разница между зависимостью от вендора и суверенитетом над моделью.
- **Медицинские AI-ассистенты**: тонкая настройка на клиническую документацию, протоколы лечения. QLoRA позволяет больнице обучить собственную модель, не отправляя данные пациентов в облако - HIPAA compliance by design.
- **Code generation для специфичных фреймворков**: LLaMA дообученная на внутреннем кодовой базе компании знает её архитектуру, соглашения, API. GitHub Copilot не знает.
- **Localisation и языки**: fine-tuning на 50 000 примеров на казахском, вьетнамском, суахили - и LLaMA говорит на языке без акцента. Предобученные модели на этих языках - либо нет, либо закрытые.
- **Customer support**: модель, обученная на истории разрешения тикетов, знает продукт лучше любого промпта. RAG даёт знания. Fine-tuning меняет стиль и тактику ответа.
Supervised Fine-Tuning и instruction tuning
Март 2023. Студенты Стэнфорда берут LLaMA-7B - сырую модель, умеющую только предсказывать следующий токен - и за выходные, потратив меньше 600 долларов, получают **Alpaca**: ассистента, который отвечает на вопросы, пишет код и объясняет концепции. Секрет не в архитектуре. Секрет в 52 000 пар (инструкция, ответ) и одном проходе fine-tuning.
**Supervised Fine-Tuning (SFT)** - это дообучение pre-trained модели на небольшом датасете с правильными ответами. Pre-training учит модель распределению языка. SFT учит её *поведению*: отвечать на вопросы, следовать инструкциям, придерживаться формата.
Механика та же, что при pre-training: forward pass, cross-entropy loss, backward pass, обновление весов. Разница в данных и масштабе. Pre-training - триллионы токенов, месяцы на тысячах GPU. SFT - тысячи примеров, часы на одной.
Instruction tuning и chat templates
**Instruction tuning** - специфический вид SFT, где каждый пример оформлен как пара (инструкция, желаемый ответ). Именно так GPT-3 стал InstructGPT, а LLaMA стала Alpaca, Vicuna, Mistral-Instruct.
Каждая модель ожидает конкретный **chat template** - способ форматирования диалога. Mistral использует `[INST]...[/INST]`. LLaMA-3 использует специальные токены `<|start_header_id|>user<|end_header_id|>`. Llama-2-chat требует `[INST] <<SYS>> system [/INST]`. Неправильный шаблон при инференсе - и качество падает вдвое даже при идеально обученной модели.
Full fine-tuning: почему это проблема
Полное дообучение обновляет **все** параметры модели. LLaMA-7B - это 7 миллиардов параметров. В float32 - 28 GB только для хранения модели. Плюс градиенты (28 GB), плюс optimizer states Adam (ещё 56 GB). Итого - больше 100 GB VRAM. Один GPU A100 80GB не вмещает. Нужен как минимум 2-4 GPU, что переводит стоимость из "хобби" в "корпоративный бюджет".
**Catastrophic forgetting**: при aggressively fine-tuning модель забывает общие знания, полученные при pre-training. SFT с маленьким датасетом может разрушить то, что pre-training строил триллионами токенов. Это системная проблема, не баг реализации.
Что именно делает instruction tuning, чего не делает стандартный pre-training?
LoRA: ранговая декомпозиция вместо полного обновления
2022 год. Команда Microsoft (Hu et al.) публикует **LoRA: Low-Rank Adaptation of Large Language Models**. Идея звучит почти безумно: вместо обновления весовой матрицы $W \in \mathbb{R}^{d \times k}$ - заморозить её и добавить рядом произведение двух маленьких матриц. Это работает. Настолько хорошо, что через год LoRA становится стандартом.
Математика LoRA
Исходная гипотеза: при fine-tuning изменения весов имеют низкий ранг. Модель не меняет каждый из миллиардов параметров независимо - изменения лежат в низкоразмерном подпространстве.
Матрица $A$ инициализируется случайным нормальным распределением, $B$ - нулями. Это гарантирует, что в начале обучения $\Delta W = 0$ и обучение стартует с поведения исходной модели. Элегантная деталь - не случайность.
Куда ставить LoRA-адаптеры
Оригинальная статья применяет LoRA только к query и value матрицам attention. Но практика показала: добавление адаптеров к **q, k, v, o, up, down, gate** проекциям даёт заметно лучший результат. Параметр `target_modules` в PEFT контролирует это.
**Rank collapse**: слишком маленький ранг (r=1, r=2) недостаточно выразителен. Слишком большой (r=256) приближается к full fine-tuning по памяти и теряет regularization-эффект. Оптимум для 7B моделей на специализированных задачах: r=8..32. Для задач, требующих сохранить общий разум: r=64..128.
После обучения адаптеры весят 50-200 MB вместо 14 GB модели. Их можно хранить, версионировать, переключать на лету. Один базовый вес LLaMA-7B - и десятки специализированных адаптеров поверх. Hugging Face Hub содержит десятки тысяч LoRA-адаптеров.
Почему матрица B в LoRA инициализируется нулями, а не случайно как A?
QLoRA: 4-bit quantization + LoRA на одной GPU
Май 2023. Команда Вашингтонского университета (Dettmers et al.) публикует **QLoRA**. Результат: LLaMA-65B дообучается на одном GPU NVIDIA A100 80GB. До этого нужен был кластер. Спустя неделю появляются инструкции для RTX 4090 (24 GB). Через месяц - для RTX 3090 (24 GB). Fine-tuning перестал быть корпоративной привилегией.
NF4: нормальное 4-битное квантование
QLoRA загружает базовую модель в **4-bit NF4** (NormalFloat4) - специальный тип данных, оптимизированный под нормально распределённые веса нейросетей. Обычное int4 квантует равномерно. NF4 учитывает, что большинство весов сосредоточено около нуля, и кодирует их точнее.
**Double Quantization** - ещё один приём из QLoRA: квантуются не только веса, но и константы квантизации. Звучит рекурсивно, но экономит ещё ~0.5 бит на параметр. На 7B модели это дополнительные ~500 MB.
Paged Optimizers: когда не хватает VRAM
Обучение нейросетей иногда требует внезапных всплесков памяти - при длинных последовательностях, сложных батчах. QLoRA использует **paged optimizers**: состояния оптимизатора Adam хранятся в CPU RAM и подгружаются в GPU только когда нужны. Работает как виртуальная память ОС, но для VRAM.
Сравнение подходов
Разрыв в качестве между QLoRA и full fine-tuning минимален для большинства задач: code generation, instruction following, domain adaptation. Там, где он проявляется - сложный многошаговый reasoning на узкоспециализированных данных. Для 99% практических сценариев QLoRA - правильный выбор.
**PEFT библиотека**: Hugging Face поддерживает не только LoRA. В PEFT (Parameter-Efficient Fine-Tuning) также реализованы prefix-tuning, prompt-tuning, IA3, AdaLoRA (адаптивный ранг), и LoftQ (инициализация LoRA из квантованной модели). LoRA остаётся самым популярным методом по соотношению эффективность/простота.
QLoRA даёт заметно худшее качество, чем full fine-tuning - из-за потерь при квантовании
На большинстве задач разрыв составляет 2-5%, а иногда QLoRA даже превосходит full FT - за счёт regularization-эффекта квантования
Квантование действует как implicit regularization: небольшой шум в весах похож на dropout. Для задач с небольшим датасетом это помогает бороться с overfitting.
LLaMA-3-70B в bf16 требует ~140 GB VRAM - не влезает даже в 2x A100 80GB. Какая комбинация позволяет дообучить эту модель на одном A100 80GB?
Ключевые идеи
- **SFT** превращает предсказатель токенов в ассистента: те же веса, другое поведение. Нужны тысячи правильных пар (инструкция, ответ), не миллиарды токенов.
- **LoRA** замораживает веса и обучает только произведение двух маленьких матриц. r=16 даёт 1% обучаемых параметров при 95%+ качества full fine-tuning.
- **QLoRA** = base model в 4-bit NF4 + LoRA адаптеры. Снижение VRAM в 3x. 70B модель влезает в один A100 80GB. 7B модель - в RTX 3090.
- **Chat templates** критичны: неправильный шаблон при инференсе уничтожает результаты правильно обученной модели.
- **PEFT библиотека** Hugging Face - стандарт индустрии. `prepare_model_for_kbit_training` + `LoraConfig` + `SFTTrainer` - три строчки конфигурации заменяют сотни строк кастомного кода.
Связанные темы
Fine-tuning - не изолированная техника, а часть пайплайна выравнивания LLM:
- Pre-training LLM — SFT строится поверх pre-trained модели - без него нечего дообучать
- RLHF и DPO — После SFT модель часто дообучается с обратной связью от людей
- Fine-tuning на практике (AI Engineering) — Применение LoRA/QLoRA в production через Hugging Face экосистему
- Open-source модели — LLaMA, Mistral, Qwen - основные base модели для fine-tuning
Вопросы для размышления
- Instruction tuning Alpaca стоил менее 600 долларов в 2023. Что изменилось за год - цена GPU времени, размер датасета или эффективность алгоритмов?
- LoRA замораживает base model и обучает только адаптеры. Значит ли это, что base model не должна меняться при обучении на новом домене - или иногда full fine-tuning неизбежен?
- Квантование в NF4 вносит шум в веса. Как этот шум взаимодействует с LoRA адаптерами при мёрже весов после обучения?
Связанные уроки
- gai-05 — Pre-training - фундамент, на котором строится fine-tuning
- gai-07 — RLHF/DPO - следующий шаг после instruction tuning
- aie-36-fine-tuning — Практическое применение LoRA через Hugging Face PEFT
- aie-37-open-source-models — Open-source модели - основная цель fine-tuning с LoRA
- dl-05 — Градиентный спуск - тот же движок, другой масштаб
- dl-01