Что такое LoRA для training (инференс уже знаем)?

Краткий тезис

LoRA (Low-Rank Adaptation) — это метод параметрически эффективного fine-tuning (PEFT), который добавляет к замороженным весам предобученной модели обучаемые низкоранговые матрицы. Вместо обновления всех параметров (например, 70B) LoRA обучает лишь 1–5% от исходного числа, что сокращает требования к памяти в 10+ раз и ускоряет обучение в 5–10 раз, сохраняя качество на уровне полного fine-tuning для большинства downstream-задач. В контексте RAG|Agentic RAG LoRA позволяет быстро адаптировать LLM под конкретные функции агента (извлечение информации, генерация ответов с источниками) без переобучения всей модели.


1. Проблема: полный fine-tuning больших моделей

fine-tuning|Полный fine-tuning (full fine-tuning) требует обновления всех параметров модели. Для модели размером 70B параметров:

  • Память для весов: 70B × 2 байта (float16) ≈ 140 ГБ.
  • Градиенты: ещё 140 ГБ.
  • Состояние оптимизатора (например, AdamW хранит моменты 1-го и 2-го порядка): ещё 280 ГБ.
  • Итого: до 560 ГБ видеопамяти — недоступно даже для топовых GPU (A100 80 ГБ).

Кроме того, fine-tuning|полный fine-tuning требует хранения полной копии модели для каждого эксперимента, что неэффективно при частой смене задач.

LoRA решает эту проблему, оставляя исходные веса замороженными и добавляя лишь маленькие обучаемые матрицы.


2. Идея LoRA: низкоранговая декомпозиция

LoRA основана на гипотезе, что изменение весов при fine-tuning имеет низкий ранг (rank). То есть матрица обновления ΔW ∈ ℝ^{d×k} может быть аппроксимирована произведением двух матриц малого ранга:

ΔW = B · A, где
B ∈ ℝ^{d×r}, A ∈ ℝ^{r×k}, r ≪ min(d, k).

  • dd— размерность входаk — размерность выхода слоя.
  • r — ранг (гиперпараметр), обычно 1, 2, 4, 8, 16, 64.
  • Исходные веса W₀ заморожены, обучаются только A и B.

Таким образом, число обучаемых параметров сокращается с d·k до r·(d + k). Для типичного слоя attention (d=4096, k=4096) и r=8:

  • Полный слой: 4096×4096 ≈ 16.8M параметров.
  • LoRA: 8×(4096+4096) ≈ 65K параметров — в 258 раз меньше.

3. Математическая формулировка

Прямой проход через слой с LoRA:

h = W₀ · x + ΔW · x = W₀ · x + (B · A) · x

  • W₀ — замороженная матрица исходной модели.
  • x — вход слоя.
  • B и A — обучаемые низкоранговые матрицы.

Инициализация:

  • A инициализируется случайным гауссовым распределением (например, N(0, σ²)).
  • B инициализируется нулями, чтобы ΔW = 0 в начале обучения — это гарантирует, что модель не «ломается» на старте.

После обучения LoRA-веса можно объединить с исходными: W = W₀ + α·B·A, где α — масштабирующий коэффициент (обычно α = r или α = 1/r). Это позволяет выполнять инференс без дополнительных вычислений.


4. Выбор ранга r

Ранг r определяет ёмкость адаптера. Чем больше r, тем больше параметров и потенциально выше качество, но растёт риск переобучения и требования к памяти.

rЧисло параметров LoRA (для слоя 4096×4096)Доля от полного слояПример для модели 70B (≈ 80 слоёв attention)
18 1920.05%~1.3M
432 7680.2%~5.2M
865 5360.4%~10.5M
16131 0720.8%~21M
64524 2883.1%~84M

На практике r=8 или r=16 даёт хороший баланс. Для 70B модели при r=16 обучается ≈ 350M параметров (0.5% от всех), что требует около 10 ГБ памяти вместо 140 ГБ.


5. Преимущества LoRA для training

  • Экономия памяти: не нужно хранить градиенты для W₀, только для A и B. Для 70B модели с r=16: ~10 ГБ против 140+ ГБ.
  • Ускорение обучения: меньше вычислений на каждом шаге, можно использовать больший batch size. На практике обучение ускоряется в 5–10 раз.
  • Качество: для большинства downstream-задач (классификация, генерация, QA) LoRA достигает качества, сопоставимого с полным fine-tuning. Исследования (Hu et al., 2021) показывают разницу менее 1% по метрикам.
  • Переносимость: LoRA-веса занимают единицы мегабайт, их легко деплоить, переключать между задачами без перезагрузки модели.

6. Применение в training: процесс обучения

Типовые шаги для обучения LoRA:

  1. Загрузить предобученную модель (например, Llama 3 8B, Mistral 7B) в формате float16 или bfloat16.
  2. Заморозить все параметры модели (requires_grad=False).
  3. Добавить LoRA-слои к выбранным модулям. Обычно это проекции Q, K, V, O в слоях attention. Иногда добавляют к FFN.
  4. Определить гиперпараметры: r, α, dropout (обычно 0.1), target_modules.
  5. Обучать только параметры LoRA стандартным оптимизатором (AdamW) с scheduler.
  6. Сохранить только LoRA-веса (файл размером ~10–100 МБ).

Пример кода с библиотекой PEFT (Hugging Face):

from transformers import AutoModelForCausalLM
from peft import LoraConfig, get_peft_model

model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-8B")
lora_config = LoraConfig(
    r=16,
    lora_alpha=32,
    target_modules=["q_proj", "v_proj"],
    lora_dropout=0.1,
    bias="none",
    task_type="CAUSAL_LM"
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()  # Выведет: trainable params: [[4. Какую векторную БД вы выберете для production-системы с больше 1 млн векторов|4]],[[194. Как вы строите DSL (Domain-Specific Language) для вашей LLM-системы|194]],[[304. Что такое FlashAttention с точки зрения CUDA programming|304]] || all params: [[8. Как вы обрабатываете запросы, на которые нет ответа в документах|8]],000,000,000 || trainable%: 0.0524

7. Сравнение с другими PEFT методами

МетодОбучаемые параметрыИнференс latencyКачество (среднее)Сложность внедрения
LoRA0.1–5%Нет накладок (merge)ВысокоеНизкая
Adapter1–10%Небольшой ростВысокоеСредняя
Prefix Tuning0.1–1%Рост (длиннее контекст)СреднееСредняя
Prompt Tuning0.01–0.1%Рост (длиннее контекст)Ниже среднегоНизкая

LoRA выигрывает за счёт отсутствия дополнительной задержки на инференсе (после merge) и хорошего качества при малом числе параметров.


8. LoRA в контексте Agentic RAG

В Agentic RAG агент использует LLM для планирования, вызова инструментов и генерации ответов. LoRA позволяет:

  • Адаптировать модель под конкретные инструменты: например, обучить LoRA для агента, который должен извлекать факты из документов и отвечать строго по шаблону.
  • Быстро переключаться между агентами: каждый агент может иметь свой LoRA-модуль (размером ~50 МБ), загружаемый по необходимости.
  • Улучшить faithfulness: LoRA может научить модель ссылаться на источники, избегать галлюцинаций.

Пример: для агента, работающего с юридическими документами, LoRA обучается на парах (запрос → ответ с цитатой из документа). После обучения агент генерирует ответы вида: «Согласно статье 5, ... (Источник: договор №123, стр. 4)».


9. Продвинутые техники: QLoRA, LoRA merging, DoRA

  • QLoRA (Dettmers et al., 2023): квантизация базовой модели до 4 бит + LoRA. Позволяет обучать LoRA на моделях 70B на одной GPU с 48 ГБ.
  • LoRA merging: объединение нескольких LoRA-адаптеров в один (например, для мультизадачности). Выполняется как взвешенная сумма B·A.
  • DoRA (Weight-Decomposed Low-Rank Adaptation, 2024): улучшение LoRA, где низкоранговое обновление применяется к направлению весов, а норма обучается отдельно. Даёт прирост качества на 1–2%.

10. Ограничения и когда не стоит использовать LoRA

  • Недостаточная ёмкость: если задача требует кардинального изменения поведения модели (например, выучить новый язык или новую предметную область с нуля), LoRA может не хватить. В таких случаях лучше full fine-tuning или дообучение с большим r.
  • Переобучение: при малом объёме данных LoRA может переобучаться быстрее, чем полная модель.
  • Совместимость: не все архитектуры поддерживают LoRA «из коробки» (например, модели с нестандартными слоями).
  • Инференс с несколькими LoRA: если нужно одновременно использовать несколько адаптеров, требуется либо merge, либо динамическая загрузка, что усложняет систему.

Пет-проект для закрепления

Задача: Обучить LoRA для агента, который отвечает на вопросы по документам компании в формате «Ответ: ... Источник: ...».

Инструменты: Python, Hugging Face Transformers, PEFT, датасет из 1000 пар (вопрос, документ, правильный ответ с источником).

Шаги:

  1. Подготовить датасет: для каждого вопроса взять релевантный чанк документа и сгенерировать ответ с указанием источника (можно вручную или с помощью LLM).
  2. Загрузить базовую модель (например, Mistral 7B) в 4-битном режиме (QLoRA) для экономии памяти.
  3. Настроить LoRA: r=8, target_modules=["q_proj","v_proj","k_proj","o_proj"].
  4. Обучить 3 эпохи с learning rate 2e-4, batch size 4.
  5. Оценить на тестовом наборе: метрики faithfulness (совпадение источника) и answer relevance (ROUGE-L).
  6. Сравнить с базовой моделью без LoRA.

Ожидаемый результат: LoRA-модель генерирует ответы с корректным указанием источника в 90%+ случаев, базовая модель — в 30% (часто галлюцинирует).


Связь с другими вопросами

ВопросТема
480Что такое PEFT?
482Что такое QLoRA?
483Как выбрать ранг LoRA?
484Как объединять LoRA модули?
485LoRA для мультизадачности
486LoRA в Agentic RAG

Навигация