Дообучение LLM методом Full Fine-Tuning
Full Fine-Tuning — метод дообучения, при котором обновляются все параметры языковой модели, а не только адаптерные слои (как в LoRA). Это максимально мощный инструмент адаптации, дающий наивысшее качество специализации, но требующий значительных вычислительных ресурсов и тщательного управления обучением.
Когда Full Fine-Tuning оправдан
Full FT выбирают не по умолчанию, а при наличии конкретных оснований:
Недостаточное качество LoRA/QLoRA: если после оптимизации LoRA-параметров разрыв с базлайном остаётся существенным, Full FT может дать дополнительные 3–8% по метрикам.
Принципиально новый домен: когда модель нужно обучить на нотации или языке, существенно отличающихся от предобученного распределения (специальные символы, формальные грамматики, уникальная терминология).
Continual Pre-training: добавление нового знания в модель через продолжение предобучения (Continued Pre-Training, CPT), а затем Instruction Tuning.
Изменение архитектурных параметров: расширение словаря (tokenizer), изменение длины контекста через RoPE-масштабирование.
Технические аспекты Full Fine-Tuning
Требования к памяти
Для Full FT модели с N параметрами в bf16:
- Параметры модели: 2N bytes
- Градиенты: 2N bytes (bf16) или 4N bytes (fp32)
- Оптимизатор (AdamW): 8N bytes (fp32 моменты)
- Активации: зависят от batch size и длины последовательности
Итого — минимум 12N bytes без активаций. Для 7B модели: ~84 GB, для 70B: ~840 GB.
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 при Full Fine-Tuning
При Full FT критически важна схема обучения learning rate:
Warmup: первые 5–10% шагов lr растёт с 0 до целевого значения. Предотвращает ранний взрыв градиентов.
Cosine decay: плавное снижение lr до 10% от пикового значения к концу обучения.
Целевые значения: для Full FT на специализированном датасете — 1e-5 to 5e-5. Для CPT (продолжение предобучения) — 1e-5 или ниже.
Catastrophic Forgetting: полное обновление весов может уничтожить общие знания модели. Митигируется: малым lr, replay буфером (смешивание с общими данными), EWC (Elastic Weight Consolidation).
Практический кейс: Full FT для финансового регулятора
Задача: специализированная модель для ЦБ-аналитики — анализ отчётности банков по форматам XBRL, выявление признаков нарушений пруденциальных нормативов, генерация предписаний.
Почему Full FT, а не LoRA: специфический язык регуляторных предписаний (юридические конструкции, ссылки на нормативы), новые символьные паттерны (коды форм, нормативные формулы). LoRA r=64 давал F1=0.79, Full FT — 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 (Full FT)
- ROUGE-L для предписаний: 0.61 → 0.74
- Время обучения: 14 часов на 8×A100
Инфраструктурные требования Full Fine-Tuning
| Модель | 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 недель







