Дообучение (Fine-Tuning) языковой модели Llama (Meta)
Llama 3.x — семейство открытых языковых моделей Meta, доступных для коммерческого использования и полного контроля над весами. В отличие от GPT-4o или Claude, вы получаете файлы весов, можете развернуть модель на своей инфраструктуре и дообучать без ограничений API. Это делает Llama приоритетным выбором для задач с требованиями к конфиденциальности данных, on-premise деплою и большому объёму инференса.
Модельный ряд Llama 3.x
| Модель | Параметры | VRAM (fp16) | Применение |
|---|---|---|---|
| Llama 3.2 1B | 1B | 2 GB | Edge, встроенные системы |
| Llama 3.2 3B | 3B | 6 GB | Мобильные, лёгкие агенты |
| Llama 3.1 8B | 8B | 16 GB | Общие задачи, fine-tuning |
| Llama 3.1 70B | 70B | 140 GB | Сложные задачи, конкурентен GPT-4 |
| Llama 3.1 405B | 405B | 800+ GB | State-of-the-art, multi-GPU |
Для большинства задач fine-tuning оптимален Llama 3.1 8B или 70B — первый обучается на одной A100 80GB, второй требует 2–4 GPU.
Методы дообучения
Full Fine-Tuning: обновляются все веса. Максимальное качество, но требует значительных вычислительных ресурсов. Для 8B модели — минимум одна A100 80GB, для 70B — 4×A100 или 8×A6000.
LoRA / QLoRA: обновляются только низкоранговые адаптеры, добавленные поверх замороженных весов. QLoRA дополнительно квантизирует базовую модель до 4-bit, позволяя обучать 70B на двух A100 40GB. Качество близко к full fine-tuning при 5–15% задач.
Instruction Tuning: специализированный вариант supervised fine-tuning для адаптации к формату инструкций. Важен при обучении с нуля на domain-specific данных.
Техстек: TRL + PEFT + Hugging Face
Основной инструментарий — библиотека trl (Transformer Reinforcement Learning) в паре с peft:
from datasets import load_dataset
from trl import SFTTrainer, SFTConfig
from peft import LoraConfig, get_peft_model
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
import torch
# QLoRA конфигурация
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
)
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Meta-Llama-3.1-8B-Instruct",
quantization_config=bnb_config,
device_map="auto"
)
lora_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
lora_dropout=0.05,
task_type="CAUSAL_LM"
)
model = get_peft_model(model, lora_config)
trainer = SFTTrainer(
model=model,
args=SFTConfig(
output_dir="./llama3-finetuned",
num_train_epochs=3,
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=2e-4,
bf16=True,
logging_steps=10,
),
train_dataset=dataset["train"],
)
trainer.train()
Глубокий разбор: выбор target_modules для LoRA
Параметр target_modules определяет, какие слои получат LoRA-адаптеры. В Llama 3 архитектура — трансформер с GQA (Grouped Query Attention). Типичные цели:
-
q_proj,k_proj,v_proj,o_proj— attention слои (минимальный набор) -
gate_proj,up_proj,down_proj— MLP слои (добавляет выразительность) - Все 6 вместе — максимальное качество, больше параметров адаптера
LoRA rank r определяет размер адаптера: r=8 даёт ~0.1% дополнительных параметров, r=64 — ~0.8%. Для специализации стиля достаточно r=8–16, для сложных задач извлечения знаний — r=32–64.
Практический пример: юридический ассистент
Задача: дообучить Llama 3.1 8B для анализа российских арбитражных решений и извлечения структурированных данных (стороны, предмет спора, решение суда, сумма).
Датасет: 3200 пар (текст решения → JSON). Данные получены из публичной базы kad.arbitr.ru с ручной аннотацией 20% и синтетической разметкой GPT-4o для остальных (с ручной верификацией выборки).
Инфраструктура: одна A100 80GB, обучение 4 часа (3 эпохи).
Результаты:
- F1 извлечения суммы иска: 0.58 → 0.91
- Точность определения инициатора (истец/ответчик): 82% → 97%
- Token generation speed: 47 tok/s (vLLM, A100)
- Стоимость инференса vs GPT-4o API: в 12 раз ниже при self-hosted
Инференс дообученной модели
После обучения LoRA-адаптер можно:
- Использовать отдельно (PEFT inference): загружать базовую модель + адаптер
-
Слить в одну модель (
merge_and_unload()): упрощает деплой, убирает overhead PEFT - Квантизировать после merge: GGUF через llama.cpp, AWQ через autoawq, GPTQ — для снижения требований к VRAM
# Слияние адаптера с базовой моделью
merged_model = model.merge_and_unload()
merged_model.save_pretrained("./llama3-merged")
tokenizer.save_pretrained("./llama3-merged")
Для продакшн-деплоя используем vLLM — он даёт PagedAttention и continuous batching, увеличивая throughput в 2–5× по сравнению с наивным инференсом через transformers.
Сроки и инфраструктура
- Подготовка данных и разметка: 2–6 недель
- Обучение (8B, LoRA, A100): 2–8 часов
- Обучение (70B, QLoRA, 2×A100): 12–48 часов
- Оценка и итерации: 1–2 недели
- Деплой с vLLM/TGI: 3–5 дней
- Итого от старта до продакшна: 4–10 недель







