Модуль 6. Полное дообучение, LoRA и QLoRA: что происходит с весами
Цель модуля: посчитать бюджет видеопамяти для полного дообучения и объяснить, как LoRA и QLoRA делают 7B-модель обучаемой на одной GPU. После модуля вы выбираете между full / LoRA / QLoRA и задаёте r, alpha и target modules осознанно.
Перед началом: модуль 2 (веса — числа, обучение — подбор чисел), модуль 5 (датасет готов). Инструменты: калькулятор или python3 для арифметики VRAM. Трудоёмкость: ~1.5 ч (теория 50 мин · практика 25 мин · квиз 10 мин).
🔥 7 миллиардов параметров и одна GPU
«Ну что, дообучим модельку на наших тикетах». Скачали open-weights модель на 7B параметров, запустили обучение — CUDA out of memory на первом шаге. Инженерная реакция — не гуглить наугад, а посчитать: 7×10⁹ параметров в fp16 — это 2 байта на параметр, 14 ГБ только чтобы хранить веса. Но обучение — не хранение: на каждом шаге нужны ещё градиенты по каждому параметру и состояния оптимизатора. Считаем — и становится ясно, почему «просто дообучить всё» не влезает даже в 32 ГБ, и что с этим сделали LoRA и QLoRA.
📖 6.1. Полное дообучение и его цена
Полное (full) дообучение меняет все веса модели: после N эпох по вашему датасету это уже другие числа. Бюджет VRAM на один шаг обучения:
| Компонент | Смысл | 7B, грубо |
|---|---|---|
| Веса fp16 | сама модель | ~14 ГБ |
| Градиенты | по каждому параметру, для шага | ~14 ГБ |
| Состояния Adam (m, v) | «память» оптимизатора по каждому параметру | ~28–56 ГБ |
| Активации | промежуточные значения для backward | растёт с батчем и длиной контекста |
Правило большого пальца: градиенты и оптимизатор добавляют ×3–4 к объёму весов — 7B требует порядка 50–70 ГБ ещё до активаций. Полный тюнинг 7B — это карта на 80 ГБ (в Yandex Cloud — конфигурация g2.1; подробности и деньги — в модуле 9) и отдельная борьба с активациями. Моделям в десятки миллиардов параметров нужен уже кластер.
Цена не только в железе. Меняя все веса узким доменным датасетом, вы рискуете catastrophic forgetting — катастрофическим забыванием: модель, дообученная на тикетах поддержки, начинает отвечать стилем поддержки везде и теряет общие способности. Защита — в 6.4.
📖 6.2. LoRA: замораживаем W, учим дельту
Ключевое наблюдение LoRA (Low-Rank Adaptation): при адаптации к новой задаче изменение весов имеет низкую «размерность» и приближается матрицей низкого ранга. Следствие: не трогаем W вовсе, а учим маленькую поправку ΔW = A·B рядом с ней.
Разбор диаграммы. Вход слоя (d-мерный вектор токена) идёт параллельно в две ветви. Верхняя — замороженная W размером d×d: те самые миллиарды параметров базовой модели, «❄ не обучается». Нижняя — адаптер: матрица A (d×r) и матрица B (r×d), обе «🔥 обучаются»; их произведение и есть дельта ΔW с подписью «ранг r ≪ d (r = 4…64)». Выходы ветвей складываются в узле «+»: выход = W·x + A·B·x. В этом весь фокус: базовая модель остаётся нетронутой, а всё новое живёт в маленькой дельте.
Арифметика для d = 4096, r = 16, одна матрица: полная — 16,7 млн параметров; дельта — 2×4096×16 = 131 тысяча, в 128 раз меньше. По всем attention-проекциям 32 слоёв 7B-модели адаптер — около 0,1% обучаемых параметров (аннотация на диаграмме): градиенты и состояния оптимизатора почти ничего не стоят, а сам адаптер после обучения — десятки мегабайт. Его можно переключать, копить по задачам и откатывать — это же свойство ляжет в основу версионирования в модуле 12.
Гиперпараметры LoRA:
- r (ранг) — ёмкость дельты. Мало (4–8): стиль и формат. Больше (16–64): сложные домены. Больше r — больше выразительности, VRAM и риск переобучения (модуль 7).
- alpha (масштаб) — сила вклада дельты: в модель эффективно входит (alpha/r)·A·B. Часто берут alpha = 2r; выше alpha — агрессивнее адаптация.
- target modules — к каким матрицам добавлять дельту. Минимум — проекции attention (q и v); «все линейные слои» (q, k, v, o и MLP) — сильнее и дороже. Первый заход — q,v: этого часто достаточно.
📖 6.3. QLoRA: 4-битовая база под fp16-адаптером
QLoRA снимает последнее препятствие — 14 ГБ на хранение замороженной W. Базовые веса квантуются в 4 бита (формат NF4: сетка значений подогнана под нормальное распределение весов, чтобы потерять поменьше), а адаптеры LoRA живут в fp16 и обучаются как обычно. Градиенты через квантованные веса не идут — те заморожены.
| Сценарий (7B) | Обучается | VRAM, грубо | Конфигурация YC (детали в модуле 9) |
|---|---|---|---|
| Full fine-tuning fp16 | 100% | 50–70+ ГБ + активации | g2.1 (A100, 80 ГБ) |
| LoRA r=16 fp16 | ~0,1% | ~20–30 ГБ + активации | g1.1 (V100, 32 ГБ) с запасом |
| QLoRA (NF4 + адаптеры) | ~0,1% | 16–24 ГБ, малый батч | gt4.1 впритык; g1.1 комфортно |
Цена QLoRA — скорость: обучение медленнее на десятки процентов из-за квантования и деквантования на лету. Для учебных и большинства рабочих задач это честный размен: 7B-модель обучается на одной GPU. Конфигурации Yandex Cloud покрывают диапазон 16–80 ГБ (gt4.1 / g1.1 / g2.1); как их выбирать и сколько это стоит — модуль 9, практика QLoRA в DataSphere — модуль 11.
📖 6.4. Catastrophic forgetting: как не выучить домен ценой общего
Механизм простой: полное дообучение двигает все веса под статистику вашего датасета. Если датасет — тикеты поддержки, то «разговаривать стилем поддержки» становится выгодно и для вопросов про рецепт борща. Способность к общему рассуждению деградирует незаметно — и без отдельной проверки это всплывёт уже в проде (история из модуля 8).
Защита, по нарастанию затрат. База заморожена в LoRA/QLoRA — общие веса вообще не меняются, забывание ограничено самой конструкцией. Малое число эпох и умеренный LR (модуль 7) — модель не успевает «перекоситься». 5–10% общих примеров в датасете — якорь общего поведения. Golden set с общими вопросами рядом с доменными (модуль 8) — регрессия видна до выката, а не после.
📖 6.5. Компромиссы
- Full vs LoRA: full даёт максимум выразительности и «родную» модель без адаптера, но требует 80 ГБ+, время и несёт риск забывания общего; LoRA — проценты параметров, копейки VRAM, мгновенный откат адаптером.
- LoRA vs QLoRA: LoRA быстрее и чуть точнее, но база в fp16 — те самые 14 ГБ; QLoRA медленнее на десятки процентов, зато 7B живёт на карте начального уровня. Для экспериментов — QLoRA, для конвейера — считать.
- r больше vs меньше: выше ранг — ёмче дельта и сильнее адаптация, но больше VRAM, время шага и риск переобучения; стиль лечится малым r, сложный домен — большим.
- Адаптер на задачу vs один универсальный: адаптеры дёшевы и переключаемы — можно держать по одному на домен; универсальный проще в эксплуатации, но размазывает специализацию.
- Все линейные слои vs только q,v: полный охват сильнее, но дороже; q,v — стандарт первого захода.
💻 Практика
- (10 мин) Арифметика VRAM. Посчитайте в python3 (или на бумаге):
python# Прикидка бюджета VRAM без GPU P = 7e9 # параметров в базовой модели print(f"веса fp16: {P * 2 / 1e9:.0f} ГБ") # 2 байта на параметр print(f"full-тюнинг грубо: {P * 2 * 4 / 1e9:.0f} ГБ") # градиенты и Adam: x3-4 d, r, layers = 4096, 16, 32 lora = layers * 2 * (d * r + r * d) # адаптеры q и v во всех слоях print(f"LoRA-адаптер: {lora / 1e6:.1f} млн параметров " f"({100 * lora / P:.2f}% от модели)")
Сверьте результат с «~0,1%» из модуля и посчитайте размер адаптера в fp16 (байт на параметр — сами).
- (5 мин) Выбор конфигурации. По таблице 6.3 подберите конфигурацию GPU для: (а) QLoRA на модели 3–4B; (б) LoRA на 7B; (в) full на 7B. Для каждого случая — одна строка обоснования.
- (5 мин) Гиперпараметры под свой кейс. Для задачи из модулей 4–5 выберите метод (LoRA/QLoRA), r, alpha и target modules. Запишите, почему именно так: сложность домена, объём датасета, доступная VRAM.
- (5 мин) Ответьте письменно: почему откат адаптера тривиален, а откат full-тюнинга — нет? Подсказка: что именно изменилось в каждом случае.
🧩 Quiz "Проверь себя"
✅ Итоги модуля
- Посчитать VRAM для full / LoRA / QLoRA на 7B из первых принципов.
- Объяснить по диаграмме путь входа через замороженную W и обучаемую A·B и сложение выходов.
- Назвать роль r, alpha и target modules и типичные значения.
- Объяснить, почему адаптер — мегабайты и как это помогает версионированию (модуль 12).
- Перечислить защиты от catastrophic forgetting.
- Выбрать метод и конфигурацию GPU под свой кейс.
🔗 Мостик к Модулю 7
Метод выбран: LoRA-адаптер на замороженной базе, бюджет VRAM сходится. Осталось решить, как именно запускать обучение: сколько эпох, какой learning rate, каким батчем — и главное, как понять по ходу, что пора останавливаться. Следующий модуль — «Гиперпараметры и кривые обучения»: в песочнице вы увидите U-кривую валидационной ошибки и раннюю остановку на модели из шести чисел, а затем узнаете, где искать ту же картину в логах настоящего тюнинга.