Что такое 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) |
|---|---|---|---|
| 1 | 8 192 | 0.05% | ~1.3M |
| 4 | 32 768 | 0.2% | ~5.2M |
| 8 | 65 536 | 0.4% | ~10.5M |
| 16 | 131 072 | 0.8% | ~21M |
| 64 | 524 288 | 3.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:
- Загрузить предобученную модель (например, Llama 3 8B, Mistral 7B) в формате float16 или bfloat16.
- Заморозить все параметры модели (requires_grad=False).
- Добавить LoRA-слои к выбранным модулям. Обычно это проекции Q, K, V, O в слоях attention. Иногда добавляют к FFN.
- Определить гиперпараметры: r, α, dropout (обычно 0.1), target_modules.
- Обучать только параметры LoRA стандартным оптимизатором (AdamW) с scheduler.
- Сохранить только 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 | Качество (среднее) | Сложность внедрения |
|---|---|---|---|---|
| LoRA | 0.1–5% | Нет накладок (merge) | Высокое | Низкая |
| Adapter | 1–10% | Небольшой рост | Высокое | Средняя |
| Prefix Tuning | 0.1–1% | Рост (длиннее контекст) | Среднее | Средняя |
| Prompt Tuning | 0.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 пар (вопрос, документ, правильный ответ с источником).
Шаги:
- Подготовить датасет: для каждого вопроса взять релевантный чанк документа и сгенерировать ответ с указанием источника (можно вручную или с помощью LLM).
- Загрузить базовую модель (например, Mistral 7B) в 4-битном режиме (QLoRA) для экономии памяти.
- Настроить LoRA: r=8, target_modules=["q_proj","v_proj","k_proj","o_proj"].
- Обучить 3 эпохи с learning rate 2e-4, batch size 4.
- Оценить на тестовом наборе: метрики faithfulness (совпадение источника) и answer relevance (ROUGE-L).
- Сравнить с базовой моделью без LoRA.
Ожидаемый результат: LoRA-модель генерирует ответы с корректным указанием источника в 90%+ случаев, базовая модель — в 30% (часто галлюцинирует).
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 480 | Что такое PEFT? |
| 482 | Что такое QLoRA? |
| 483 | Как выбрать ранг LoRA? |
| 484 | Как объединять LoRA модули? |
| 485 | LoRA для мультизадачности |
| 486 | LoRA в Agentic RAG |
Навигация
- Предыдущий: 480
- Следующий: 482
- Индекс: 00. Индекс разборов