Модуль 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 рядом с ней.

LoRA: замороженная 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 fp16100%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 — стандарт первого захода.

💻 Практика

  1. (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 (байт на параметр — сами).

  1. (5 мин) Выбор конфигурации. По таблице 6.3 подберите конфигурацию GPU для: (а) QLoRA на модели 3–4B; (б) LoRA на 7B; (в) full на 7B. Для каждого случая — одна строка обоснования.
  2. (5 мин) Гиперпараметры под свой кейс. Для задачи из модулей 4–5 выберите метод (LoRA/QLoRA), r, alpha и target modules. Запишите, почему именно так: сложность домена, объём датасета, доступная VRAM.
  3. (5 мин) Ответьте письменно: почему откат адаптера тривиален, а откат full-тюнинга — нет? Подсказка: что именно изменилось в каждом случае.

🧩 Quiz "Проверь себя"

1. Что такое catastrophic forgetting?
2. Ранг r вырос с 8 до 64. Что изменилось?
3. Что обучается в LoRA?
4. Что даёт QLoRA?
5. Почему полный тюнинг 7B не влезает в 32 ГБ VRAM?

✅ Итоги модуля

  • Посчитать VRAM для full / LoRA / QLoRA на 7B из первых принципов.
  • Объяснить по диаграмме путь входа через замороженную W и обучаемую A·B и сложение выходов.
  • Назвать роль r, alpha и target modules и типичные значения.
  • Объяснить, почему адаптер — мегабайты и как это помогает версионированию (модуль 12).
  • Перечислить защиты от catastrophic forgetting.
  • Выбрать метод и конфигурацию GPU под свой кейс.

🔗 Мостик к Модулю 7

Метод выбран: LoRA-адаптер на замороженной базе, бюджет VRAM сходится. Осталось решить, как именно запускать обучение: сколько эпох, какой learning rate, каким батчем — и главное, как понять по ходу, что пора останавливаться. Следующий модуль — «Гиперпараметры и кривые обучения»: в песочнице вы увидите U-кривую валидационной ошибки и раннюю остановку на модели из шести чисел, а затем узнаете, где искать ту же картину в логах настоящего тюнинга.