Дообучение LLM методом Full Fine-Tuning
На одном из проектов для финансового регулятора LoRA с рангом 64 дал F1 всего 0.79 — разрыв с целевыми метриками оставался критическим. Тогда мы применили полное дообучение всех весов модели (Full Fine-Tuning) и получили F1 0.91. Этот метод обновляет все параметры языковой модели, а не только адаптерные слои. Он даёт наивысшее качество адаптации, но требует серьёзных вычислительных ресурсов и аккуратного управления обучением. Мы проводим Full Fine-Tuning под ключ, предоставляя полный цикл: от аудита данных до деплоя оптимизированной модели. В этой статье разберём, когда стоит выбирать полное дообучение, как настроить распределённое обучение с DeepSpeed ZeRO и FSDP, и на что обратить внимание, чтобы избежать катастрофического забывания.
Когда Full Fine-Tuning оправдан
Full FT выбирают не по умолчанию. Основания:
- Недостаточное качество LoRA/QLoRA: если после оптимизации LoRA-параметров разрыв с базлайном остаётся существенным, полное дообучение может дать дополнительные 3–8% по метрикам.
- Принципиально новый домен: когда модель нужно обучить на нотации или языке, существенно отличающихся от предобученного распределения (специальные символы, формальные грамматики, уникальная терминология).
- Continual Pre-training: добавление нового знания в модель через продолжение предобучения, а затем Instruction Tuning.
- Изменение архитектурных параметров: расширение словаря, изменение длины контекста через RoPE-масштабирование.
Почему полное дообучение эффективнее LoRA для сложных доменов?
Причина — обновление всех весов позволяет модели адаптировать свои внутренние представления под новое распределение данных. LoRA же модифицирует только низкоранговые адаптеры, оставляя исходные веса неизменными. Если домен сильно отличается от предобученного, LoRA не хватает гибкости. На практике разница может достигать 10–15 процентных пунктов по ключевым метрикам.
Как подготовить данные для Full Fine-Tuning?
Качество датасета критично. Мы используем следующие практики:
- Тщательная очистка от дубликатов и шума.
- Балансировка классов, если задача классификации.
- Разделение на train/val/test с учётом временной или тематической стратификации.
- Для генерации инструкций применяем шаблоны chain-of-thought и few-shot примеры.
Технические аспекты Full Fine-Tuning
Требования к памяти
Для полного дообучения модели с 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 } Подробнее о конфигурации DeepSpeed
ZeRO Stage 3 с CPU offloading позволяет обучать 7B модель на 4×A100 40GB вместо 8 GPU. Как указано в документации DeepSpeed, эта техника существенно снижает требования к видеопамяти.
FSDP как альтернатива DeepSpeed
PyTorch Fully Sharded Data Parallel (FSDP) — нативная альтернатива DeepSpeed, лучше интегрированная с экосистемой PyTorch. Документация по FSDP доступна на официальном сайте.
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% Сравнение методов дообучения
| Параметр | Full FT | LoRA | QLoRA |
|---|---|---|---|
| Обновляемые параметры | Все | Адаптеры (0.1–1%) | Адаптеры |
| Память на 7B (bf16) | ~84 GB | ~16 GB | ~8 GB |
| Качество на сложных доменах | Высокое | Среднее | Среднее |
| Время обучения | Долго | Умеренно | Быстро |
Управление learning rate при полном дообучении
При Full FT критически важна схема обучения:
- Warmup: первые 5–10% шагов lr растёт с 0 до целевого значения. Предотвращает ранний взрыв градиентов.
- Cosine decay: плавное снижение lr до 10% от пикового значения к концу обучения.
- Целевые значения: для Full FT на специализированном датасете — 1e-5 to 5e-5. Для CPT — 1e-5 или ниже.
- Catastrophic Forgetting: полное обновление весов может уничтожить общие знания модели. Митигируется: малым lr, replay буфером (смешивание с общими данными), EWC.
Практический кейс: полное дообучение для финансового регулятора
Задача
Специализированная модель для ЦБ-аналитики — анализ отчётности банков по форматам XBRL, выявление признаков нарушений пруденциальных нормативов, генерация предписаний.
Почему Full FT, а не 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 (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ч |
Что входит в проект
- Аудит текущей модели и датасета, рекомендации по стратегии дообучения.
- Настройка распределённого обучения (DeepSpeed/FSDP) под вашу инфраструктуру.
- Разработка пайплайна подготовки данных, включая разметку и аугментацию.
- Проведение обучения с мониторингом метрик и logging в Weights & Biases.
- Оценка качества, A/B-тестирование и деплой оптимизированной модели.
- Документация и обучение вашей команды работе с моделью.
Сроки проекта
- Аудит и планирование: 1–2 недели
- Подготовка инфраструктуры: 1 неделя
- Подготовка данных: 2–6 недель
- Обучение и итерации: 2–4 недели
- Оценка, A/B, деплой: 1–2 недели
- Итого: 7–15 недель
Стоимость проекта — от $4.5k–6.5k, точная цена зависит от объёма данных и конфигурации. Оценим ваш проект и предложим оптимальное решение. Свяжитесь с нашими инженерами для консультации.
Наш опыт: более 10 лет в NLP и 50+ проектов по дообучению LLM. Гарантируем прозрачный процесс и достижение целевых метрик.







