Дообучение 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 adaptation |
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) | Accuracy | Время обучения |
|---|---|---|---|---|
| 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 недель







