Донавчання LLM методом LoRA (Low-Rank Adaptation)
Уявіть: потрібно навчити модель розбиратися в юридичних документах. Повне донавчання Llama 3 8B вимагає чотирьох A100 80GB і тижня часу. Ми використовуємо LoRA (Low-Rank Adaptation) — метод, який вирішує задачу на одному GPU за години, зберігаючи якість у межах 1–2% від повного донавчання. LoRA fine-tuning економить бюджет на GPU-години в 10 разів і дозволяє донавчати моделі на звичайних відеокартах.
LoRA — метод параметрично ефективного донавчання, при якому вихідні ваги моделі заморожуються, а поруч із ними навчаються невеликі матриці низького рангу. Метод запропоновано дослідниками Microsoft Hu et al., 2021 і став стандартом 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×, що демонструє, наскільки LoRA краще за повне донавчання за ефективністю пам'яті.
При ініціалізації A — випадкова гауссова матриця, B — нульова. Це забезпечує ΔW=0 на початку — модель починає з оригінальної поведінки.
Конфігурація LoRA: ключові гіперпараметри
Код конфігурації 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 та Full Fine-Tuning
| Параметр | 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%, при цьому економія GPU сягає 90%. Саме тому ми рекомендуємо LoRA як стартовий метод для більшості проєктів. Порівняння наочно: LoRA навчається в 10 разів швидше та вимагає в 4 рази менше пам'яті.
DoRA: покращення LoRA
DoRA (Weight-Decomposed Low-Rank Adaptation) розділяє оновлення ваг на magnitude та direction компоненти, використовуючи сингулярний розклад (SVD):
config = LoraConfig( r=16, use_dora=True, # Вмикає DoRA замість звичайної LoRA ... ) DoRA покращує якість на 1–3% порівняно зі стандартною LoRA без збільшення інференс-витрат.
Як ми налаштовуємо LoRA: покроковий процес (кастомізація LLM під ключ)
- Аналіз завдання та даних — вивчаємо домен, розмічаємо 100-500 прикладів, оцінюємо складність.
- Базова модель — обираємо підходящу: Llama 3, Mistral, Qwen, Gemma. Визначаємо контекст та токенізацію.
- Конфігурація LoRA — підбираємо r, alpha, target_modules на основі невеликого датасету.
- Навчання — запускаємо на GPU (A100, H100 або RTX 4090 з QLoRA). Контролюємо loss та метрики.
- Оцінка — тестуємо на відкладеній вибірці, порівнюємо з baseline.
- Деплой — зливаємо адаптер, перетворюємо в ONNX або TensorRT, розгортаємо в хмарі.
Ми пропонуємо донавчання LLM під ключ за 3-6 тижнів. Вартість базового пакету для 7B моделі — $1500.
Як обрати ранг LoRA для вашого завдання?
Ранг r визначає кількість навчальних параметрів. Для простих завдань (класифікація, форматування відповіді) достатньо r=4–8. Для генерації спеціалізованого контенту (юридичні, медичні тексти) використовуйте r=16–32. Для глибокої адаптації домену (стиль, знання) — r=64–128. Ми допомагаємо підібрати оптимальне значення на основі пілотного навчання.
Практичний кейс: LoRA та Mistral fine-tuning для NER у медичних записах
Завдання: вилучення іменованих сутностей із медичних записів (4 класи: MEDICATION, DOSAGE, CONDITION, PROCEDURE). Наш клієнт — одна з великих фармацевтичних компаній (ім'я не розголошуємо за NDA, з нашої практики). Базова модель: Llama 3 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-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. Для детального розрахунку вартості отримайте консультацію.







