Дообучение LLM методом LoRA (Low-Rank Adaptation)
Представьте: нужно обучить модель разбираться в юридических документах. Полное дообучение Llama 3.1 8B требует четырёх A100 80GB и недели времени. Мы используем LoRA (Low-Rank Adaptation) — метод, который решает задачу на одном GPU за часы, сохраняя качество в пределах 1–2% от полного дообучения. Это экономит бюджет на GPU-часы в 10 раз и позволяет дообучать модели на обычных видеокартах.
LoRA — метод параметрически эффективного дообучения, при котором исходные веса модели замораживаются, а рядом с ними обучаются небольшие матрицы низкого ранга. Метод предложен исследователями Microsoft в начале последних лет и стал стандартом de facto для fine-tuning LLM. LoRA позволяет дообучить 7B модель на одном GPU A100 40GB вместо нескольких, при этом потеря качества по сравнению с Full Fine-Tuning минимальна для большинства задач.
Математика LoRA
Для весовой матрицы W ∈ R^(d×k) LoRA добавляет произведение двух матриц:
W' = W + ΔW = W + BA где B ∈ R^(d×r), A ∈ R^(r×k), r << min(d, k) Ранг r — ключевой гиперпараметр. При r=16 и d=k=4096 (типичные размеры attention проекций в 7B модели) количество обучаемых параметров в одном слое: 16×4096 + 4096×16 = 131 072 вместо 4096×4096 = 16 777 216. Это сжатие в 128×.
При инициализации A — случайная гауссова матрица, B — нулевая. Это обеспечивает ΔW=0 в начале — модель начинает с оригинального поведения.
Конфигурация LoRA: ключевые гиперпараметры
from peft import LoraConfig config = LoraConfig( r=16, # Ранг: 4, 8, 16, 32, 64, 128 lora_alpha=32, # Масштаб: обычно = 2*r target_modules=[ # Какие слои адаптируем "q_proj", "v_proj", # Минимум "k_proj", "o_proj", # Расширенный вариант "gate_proj", "up_proj", "down_proj" # MLP включительно ], lora_dropout=0.05, # Регуляризация адаптера bias="none", # "none", "all", "lora_only" task_type="CAUSAL_LM", modules_to_save=["embed_tokens", "lm_head"], # Обучаем полностью ) Выбор r: чем сложнее задача и чем сильнее домен отличается от предобучения — тем выше r. Для классификации и форматирования: r=4–8. Для генерации в специфическом стиле: r=16–32. Для сложного domain adaptation: r=64–128.
lora_alpha: контролирует масштаб адаптера. Эффективный lr адаптера = lr × (alpha/r). Стандартная практика: alpha = 2r.
Почему LoRA эффективнее полного дообучения?
| Параметр | LoRA (r=16) | Full Fine-Tuning |
|---|---|---|
| Обучаемые параметры (7B) | ~1.2% | 100% |
| Память на GPU (7B) | ~20 GB (A100-40) | ~80 GB (4×A100-80) |
| Время обучения (5k примеров) | 3-6 часов | 2-3 дня |
| Качество на целевой задаче | 95-99% от FFT | 100% |
| Стоимость GPU-часов (примерно) | $30-60 | $500-2000 |
Для 80% бизнес-задач разница в качестве между LoRA и полным дообучением не превышает 1–2%, при этом экономия ресурсов достигает 90%. Именно поэтому мы рекомендуем LoRA как стартовый метод для большинства проектов. Сравнение наглядно: LoRA обучается в 10 раз быстрее и требует в 4 раза меньше памяти.
DoRA: улучшение LoRA
DoRA (Weight-Decomposed Low-Rank Adaptation) разделяет обновление весов на magnitude и direction компоненты:
config = LoraConfig( r=16, use_dora=True, # Включает DoRA вместо обычной LoRA ... ) DoRA улучшает качество на 1–3% по сравнению со стандартной LoRA без увеличения инференс-затрат.
Как мы настраиваем LoRA: пошаговый процесс
- Анализ задачи и данных — изучаем домен, размечаем 100-500 примеров, оцениваем сложность.
- Базовая модель — выбираем подходящую: Llama 3.1, Mistral, Qwen, Gemma. Определяем контекст и токенизацию.
- Конфигурация LoRA — подбираем r, alpha, target_modules на основе небольшого датасета.
- Обучение — запускаем на GPU (A100, H100 или RTX 4090 с QLoRA). Контролируем loss и метрики.
- Оценка — тестируем на отложенной выборке, сравниваем с baseline.
- Деплой — сливаем адаптер, преобразуем в ONNX или TensorRT, разворачиваем в облаке.
Как выбрать ранг LoRA для вашей задачи?
Ранг r определяет количество обучаемых параметров. Для простых задач (классификация, форматирование ответа) достаточно r=4–8. Для генерации специализированного контента (юридические, медицинские тексты) используйте r=16–32. Для глубокой адаптации домена (стиль, знания) — r=64–128. Мы помогаем подобрать оптимальное значение на основе пилотного обучения.
Практический кейс: LoRA для NER в медицинских записях
Задача: извлечение именованных сущностей из медицинских записей (4 класса: MEDICATION, DOSAGE, CONDITION, PROCEDURE). Клиент: одна из крупных фармацевтических компаний (имя не разглашаем по NDA) — из нашей практики. Базовая модель: Llama 3.1 8B Instruct. Конфигурация: r=16, alpha=32, target_modules=["q_proj","v_proj"], 3 эпохи. Датасет: 2200 примеров, A100 40GB, QLoRA 4-bit, время обучения 2.5 часа.
| Метрика | Базовая модель (5-shot) | LoRA r=8 | LoRA r=16 | LoRA r=32 |
|---|---|---|---|---|
| F1 MEDICATION | 0.71 | 0.88 | 0.91 | 0.92 |
| F1 DOSAGE | 0.64 | 0.83 | 0.87 | 0.88 |
| F1 CONDITION | 0.79 | 0.91 | 0.94 | 0.94 |
| F1 PROCEDURE | 0.68 | 0.85 | 0.89 | 0.90 |
Разрыв между r=16 и r=32 незначителен — r=16 оптимален.
Слияние адаптера для деплоя
LoRA-адаптер можно слить с базовой моделью для упрощения инференса:
from peft import PeftModel base_model = AutoModelForCausalLM.from_pretrained("meta-llama/Meta-Llama-3.1-8B-Instruct") model = PeftModel.from_pretrained(base_model, "./lora-adapter") # Слияние: результат — обычная модель без PEFT overhead merged = model.merge_and_unload() merged.save_pretrained("./merged-model") После слияния модель идентична по скорости инференса полно обученной — overhead LoRA на inference исчезает.
Что вы получаете в результате
- Готовый к деплою LoRA-адаптер или слитую модель
- Документация: отчёт с метриками, выбранная конфигурация гиперпараметров
- Инструкция по запуску на вашей инфраструктуре
- Поддержка при внедрении (2 недели после передачи)
- Опыт нашей команды: 5+ лет в NLP и MLOps, 15+ проектов по дообучению LLM
Сроки ориентировочно
- Подготовка данных: 2–4 недели
- Обучение (7B, LoRA, A100 40GB): 2–8 часов
- Итерации гиперпараметров: 3–5 дней
- Итого: 3–6 недель
Оценить свой проект можно, связавшись с нами — мы бесплатно проанализируем задачу и предложим оптимальную конфигурацию. Наши инженеры гарантируют прозрачный результат и соблюдение NDA. Для детального расчёта стоимости получите консультацию.







