Донавчання LLM методом LoRA: ефективна кастомізація LoRA fine-tuning

Донавчання LLM методом LoRA (Low-Rank Adaptation)

Напрямки AI-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1440
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    997
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1264
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    712
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1002

Донавчання 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 під ключ)

  1. Аналіз завдання та даних — вивчаємо домен, розмічаємо 100-500 прикладів, оцінюємо складність.
  2. Базова модель — обираємо підходящу: Llama 3, Mistral, Qwen, Gemma. Визначаємо контекст та токенізацію.
  3. Конфігурація LoRA — підбираємо r, alpha, target_modules на основі невеликого датасету.
  4. Навчання — запускаємо на GPU (A100, H100 або RTX 4090 з QLoRA). Контролюємо loss та метрики.
  5. Оцінка — тестуємо на відкладеній вибірці, порівнюємо з baseline.
  6. Деплой — зливаємо адаптер, перетворюємо в 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. Для детального розрахунку вартості отримайте консультацію.