Тонке налаштування LLM методом PEFT (Parameter-Efficient Fine-Tuning)
PEFT — не єдиний метод, а сім'я підходів до параметрично ефективного тонкого налаштування, об'єднаних бібліотекою peft від Hugging Face. LoRA і QLoRA — найпопулярніші представники, але PEFT включає й інші техніки: Prefix Tuning, Prompt Tuning, IA³, AdaLoRA. Вибір конкретного методу залежить від задачі, обсягу даних, доступних ресурсів і вимог до інференсу.
Методи PEFT: порівняння
| Метод | Параметри для навчання | Overhead інференсу | Застосування |
|---|---|---|---|
| LoRA | 0.1–5% | Ні (після merge) | Генерація, класифікація |
| QLoRA | 0.1–5% | Ні (після merge) | Те ж, менше VRAM |
| DoRA | 0.1–5% | Ні (після merge) | Покращена LoRA |
| AdaLoRA | 0.1–3% | Ні (після merge) | Адаптивний rank |
| Prefix Tuning | <0.1% | Так (prefix токени) | Мало даних, NLU |
| Prompt Tuning | <0.01% | Так | Мінімум даних |
| IA³ | <0.01% | Ні (мультиплікація) | Few-shot адаптація |
AdaLoRA: адаптивний вибір рангу
AdaLoRA автоматично розподіляє «бюджет» параметрів між шарами, виділяючи більший ранг важливим шарам:
from peft import AdaLoraConfig, get_peft_model
config = AdaLoraConfig(
init_r=12, # Початковий ранг
target_r=8, # Цільовий середній ранг
beta1=0.85,
beta2=0.85,
deltaT=10, # Крок оновлення рангів
lora_alpha=32,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
task_type="CAUSAL_LM",
)
model = get_peft_model(model, config)
AdaLoRA корисна, коли заздалегідь невідомо, які шари найбільш важливі для адаптації.
Prefix Tuning: м'які токени для задачі
Prefix Tuning додає навчаємі «м'які токени» (virtual tokens) на початку кожного шару моделі. Базові ваги повністю заморожені:
from peft import PrefixTuningConfig
config = PrefixTuningConfig(
task_type="CAUSAL_LM",
num_virtual_tokens=20, # Кількість prefix токенів
prefix_projection=True, # MLP для проекції
)
Перевага: крайньо мало параметрів (<0.1%). Недолік: prefix токени займають частину контекстного вікна при кожному інференсе.
IA³: In-context Activation Augmentation
IA³ вводить вектори масштабування в attention і FFN шари:
from peft import IA3Config
config = IA3Config(
target_modules=["k_proj", "v_proj", "down_proj"],
feedforward_modules=["down_proj"],
task_type="CAUSAL_LM",
)
IA³ дає вражаючі результати в few-shot сценаріях з мінімальними даними (50–200 прикладів), але поступається LoRA при більшому обсязі.
Практичне порівняння методів на одному датасеті
Задача: класифікація тональності фінансових новин (Positive/Negative/Neutral).
Датасет: 1200 прикладів, базова модель Llama 3.1 8B Instruct.
| Метод | Параметри | VRAM (A100) | Точність | Час навчання |
|---|---|---|---|---|
| 5-shot (без FT) | 0 | 16 GB | 0.74 | — |
| IA³ | ~0.01% | 16 GB | 0.81 | 15 хв |
| Prefix Tuning (20 tokens) | ~0.05% | 16 GB | 0.83 | 25 хв |
| LoRA r=8 | ~0.2% | 18 GB | 0.89 | 45 хв |
| LoRA r=16 | ~0.4% | 19 GB | 0.91 | 55 хв |
| QLoRA r=16 (4-bit base) | ~0.4% | 9 GB | 0.90 | 70 хв |
| Full FT | 100% | 4×A100 | 0.93 | 8 год |
Висновок: LoRA r=16 — оптимальний вибір для більшості задач. IA³ виправдана лише при критичному обмеженні ресурсів або дуже малому датасеті.
Управління кількома адаптерами через PEFT
PEFT дозволяє завантажувати й перемикати кілька адаптерів в одній моделі:
from peft import PeftModel
# Завантаження базової моделі
base_model = AutoModelForCausalLM.from_pretrained("meta-llama/Meta-Llama-3.1-8B-Instruct")
# Завантаження кількох адаптерів
model = PeftModel.from_pretrained(base_model, "./adapter-legal", adapter_name="legal")
model.load_adapter("./adapter-finance", adapter_name="finance")
model.load_adapter("./adapter-medical", adapter_name="medical")
# Динамічне перемикання
model.set_adapter("legal")
output_legal = model.generate(...)
model.set_adapter("finance")
output_finance = model.generate(...)
Це архітектурний паттерн «один базовий екземпляр — кілька спеціалізацій», який зменшує витрати пам'яті при обслуговуванні кількох доменів.
Часові рамки
- Вибір методу PEFT і експерименти: 3–7 днів
- Підготовка даних: 2–4 тижні
- Навчання і порівняння методів: 1–2 тижні
- Всього: 3–6 тижнів







