Дотонування LLM методом повного дотонування
Повне дотонування — метод навчання, де оновлюються всі параметри мовної моделі, а не тільки шари адаптерів (як у LoRA). Це найпотужніший інструмент спеціалізації, що дає найвищу якість, але потребує значних обчислювальних ресурсів та ретельного управління навчанням.
Коли повне дотонування виправдане
Повне дотонування вибирають не за замовчуванням, а при наявності конкретних причин:
Недостатня якість LoRA/QLoRA: якщо після оптимізації LoRA-параметрів розрив від базової лінії залишається суттєвим, повне дотонування може дати додаткове поліпшення на 3–8% за метриками.
Принципово новий домен: коли модель потрібно навчити на нотації або мові, істотно відмінної від розподілу перетренування (спеціальні символи, формальні граматики, унікальна термінологія).
Континуальне перетренування: додавання нового знання до моделі через продовження перетренування (Continued Pre-Training, CPT), а потім Instruction Tuning.
Зміни параметрів архітектури: розширення словника (tokenizer), зміна довжини контексту через RoPE масштабування.
Технічні аспекти повного дотонування
Вимоги до пам'яті
Для повного дотонування моделі з N параметрами в bf16:
- Параметри моделі: 2N bytes
- Градієнти: 2N bytes (bf16) або 4N bytes (fp32)
- Оптимізатор (AdamW): 8N bytes (fp32 моменти)
- Активації: залежить від розміру батча та довжини послідовності
Усього — мінімум 12N bytes без активацій. Для 7B: ~84 ГБ, для 70B: ~840 ГБ.
DeepSpeed ZeRO для розподіленого тренування
ZeRO (Zero Redundancy Optimizer) розподіляє параметри, градієнти та стани оптимізатора між GPU:
{
"zero_optimization": {
"stage": 3,
"offload_optimizer": {"device": "cpu"},
"offload_param": {"device": "cpu"},
"overlap_comm": true,
"contiguous_gradients": true,
"reduce_bucket_size": "auto",
"stage3_prefetch_bucket_size": "auto",
"stage3_param_persistence_threshold": "auto"
},
"bf16": {"enabled": true},
"gradient_accumulation_steps": 8,
"gradient_clipping": 1.0,
"train_micro_batch_size_per_gpu": 2
}
ZeRO Stage 3 з CPU offloading дозволяє тренувати модель 7B на 4×A100 40GB замість 8 GPU.
FSDP як альтернатива DeepSpeed
PyTorch Fully Sharded Data Parallel (FSDP) — вроджена альтернатива DeepSpeed, краще інтегрована з екосистемою PyTorch:
from torch.distributed.fsdp import FullyShardedDataParallel as FSDP
from torch.distributed.fsdp.wrap import transformer_auto_wrap_policy
from transformers import LlamaDecoderLayer
fsdp_config = {
"fsdp": "full_shard auto_wrap",
"fsdp_config": {
"fsdp_auto_wrap_policy": "TRANSFORMER_BASED_WRAP",
"fsdp_transformer_layer_cls_to_wrap": "LlamaDecoderLayer",
"fsdp_state_dict_type": "FULL_STATE_DICT",
"fsdp_offload_params": False,
}
}
Gradient Checkpointing
Зменшує пам'ять активацій шляхом повторного обчислення частини forward pass під час backward:
model.gradient_checkpointing_enable()
# Зменшення пам'яті ~4× зі сповільненням ~20%
Управління learning rate при повному дотонуванні
Для повного дотонування, графік learning rate критичний:
Warmup: перші 5–10% кроків lr зростає з 0 до цільового значення. Запобігає ранньому вибуху градієнтів.
Cosine decay: плавне зменшення lr до 10% від пікового значення до кінця навчання.
Цільові значення: для повного дотонування на спеціалізованому наборі даних — 1e-5 до 5e-5. Для CPT — 1e-5 або нижче.
Катастрофічне забування: повне оновлення ваг може знищити загальні знання моделі. Пом'якшується: низьким lr, буфером replay (змішування з загальними даними), EWC (Elastic Weight Consolidation).
Практичний випадок: повне дотонування для фінансового регулятора
Завдання: спеціалізована модель для аналітики Центрального банку — аналіз звітності банків у форматах XBRL, виявлення порушень пруденціальних нормативів, генерація предписань.
Чому повне дотонування, а не LoRA: специфічна мова нормативних предписань (юридичні конструкції, посилання на нормативи), нові символьні паттерни (коди форм, нормативні формули). LoRA r=64 дав F1=0.79, повне дотонування — F1=0.91.
Інфраструктура: 8×A100 80GB, DeepSpeed ZeRO Stage 2, bf16.
Набір даних: 6800 прикладів (форма звіту → аналіз + предписання).
Параметри тренування: lr=2e-5, warmup_ratio=0.05, cosine decay, 3 епохи, effective batch size=64.
Результати:
- F1 виявлення порушень: 0.79 (LoRA r=64) → 0.91 (повне дотонування)
- ROUGE-L для предписань: 0.61 → 0.74
- Час тренування: 14 годин на 8×A100
Вимоги до інфраструктури для повного дотонування
| Модель | GPU (без offload) | GPU (ZeRO Stage 3 + CPU) | Час (3 епохи, 5K прикладів) |
|---|---|---|---|
| 7B | 4×A100 40GB | 2×A100 40GB | 4–8ч |
| 13B | 8×A100 40GB | 4×A100 40GB | 8–16ч |
| 70B | 8×A100 80GB | 4×A100 80GB | 24–48ч |
| 70B | 16×H100 80GB | 8×H100 80GB | 12–24ч |
Графік проекту
- Аудит та планування: 1–2 тижні
- Підготовка інфраструктури (кластер, DDP/FSDP/DeepSpeed): 1 тиждень
- Підготовка даних: 2–6 тижнів
- Тренування та ітерації: 2–4 тижні
- Оцінка, A/B, розгортання: 1–2 тижні
- Усього: 7–15 тижнів







