Дообучение (Fine-Tuning) языковой модели DeepSeek
DeepSeek — семейство открытых языковых моделей китайской компании DeepSeek AI, выпускаемых под лицензией MIT. DeepSeek-V3 и DeepSeek-R1 — текущие флагманы семейства, конкурирующие с GPT-4o и Claude 3.5 Sonnet по большинству бенчмарков при существенно меньшей стоимости инференса. Открытые веса и высокое качество делают DeepSeek привлекательным кандидатом для fine-tuning в enterprise-сценариях.
Семейство DeepSeek: навигация по моделям
| Модель | Параметры | Архитектура | Применение |
|---|---|---|---|
| DeepSeek-V3 | 671B (MoE, ~37B активных) | MoE | Флагман, general purpose |
| DeepSeek-R1 | 671B (MoE) | MoE + Chain-of-Thought | Reasoning, математика |
| DeepSeek-R1-Distill-Llama-70B | 70B | Dense | Reasoning, доступнее |
| DeepSeek-R1-Distill-Llama-8B | 8B | Dense | Легкий reasoning |
| DeepSeek-R1-Distill-Qwen-32B | 32B | Dense | Баланс качества/ресурсов |
| DeepSeek-Coder-V2 | 236B (MoE) | MoE | Генерация кода |
Для практического fine-tuning чаще используются дистиллированные версии (8B, 32B, 70B) — они обучаются на обычном GPU-кластере и дают хорошие результаты для специализированных задач.
Архитектурная особенность: Multi-head Latent Attention (MLA)
DeepSeek-V3 использует MLA — механизм внимания с компрессией KV-кэша. По сравнению с GQA (Grouped Query Attention в Llama), MLA снижает объём KV-кэша в 5–13× при аналогичном качестве. Это критично при инференсе с длинным контекстом — DeepSeek поддерживает 128K токенов при разумных требованиях к памяти.
При fine-tuning MLA-слои обрабатываются стандартным образом через peft, но при выборе target_modules учитываем специфику: в DeepSeek-V3 attention проекции называются q_proj, kv_a_proj_with_mqa, kv_b_proj, o_proj.
LoRA fine-tuning DeepSeek-R1-Distill-Qwen-32B
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, TaskType
import torch
model_name = "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B"
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True,
)
model = AutoModelForCausalLM.from_pretrained(
model_name,
quantization_config=bnb_config,
device_map="auto",
trust_remote_code=True, # обязательно для DeepSeek
torch_dtype=torch.bfloat16,
)
lora_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
lora_dropout=0.05,
bias="none",
task_type=TaskType.CAUSAL_LM,
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# trainable params: 160,432,128 || all params: 32,783,822,848 || trainable%: 0.49
Работа с цепочкой размышлений (Chain-of-Thought) при fine-tuning R1
DeepSeek-R1 генерирует рассуждения в специальных тегах <think>...</think> перед финальным ответом. При fine-tuning на специализированных данных важно:
- Сохранять think-блоки в обучающих примерах — это поддерживает reasoning-способность модели
-
Не подавлять токен
<think>в промптах во время обучения -
При необходимости убрать reasoning из инференса — использовать
<think>\n\n</think>как prefix или настроить stopping criteria
Пример обучающего примера для R1:
{
"messages": [
{"role": "user", "content": "Есть ли противоречие между п.3.2 и п.7.1 договора?"},
{"role": "assistant", "content": "<think>\nПункт 3.2 устанавливает срок оплаты — 30 дней с момента поставки. Пункт 7.1 говорит о праве поставщика приостановить поставки при просрочке оплаты более 15 дней. Противоречия нет — п.7.1 создаёт право поставщика, которое наступает раньше истечения общего срока оплаты.\n</think>\n\nПрямого противоречия между пунктами нет..."}
]
}
Практический кейс: reasoning-модель для финансового аудита
Задача: дообучить DeepSeek-R1-Distill-Qwen-32B для выявления нарушений в финансовой документации — несоответствий между статьями баланса, нарушений принципа двойной записи, аномальных операций.
Датасет: 2100 примеров: фрагменты финансовой документации + think-блок с пошаговым рассуждением аудитора + финальное заключение. Данные подготовлены совместно с практикующими аудиторами.
Обучение: QLoRA (r=32), 3 эпохи, 4×A100 40GB, 18 часов.
Результаты:
- Precision выявления нарушений: 0.61 → 0.89
- Recall (не пропускает нарушения): 0.54 → 0.84
- F1: 0.57 → 0.87
- Качество reasoning (оценка аудиторов, 1–5): 2.8 → 4.3
Инференс через vLLM с поддержкой MoE
Для DeepSeek-V3/R1 (полный размер) требуется специальная конфигурация vLLM:
from vllm import LLM, SamplingParams
llm = LLM(
model="deepseek-ai/DeepSeek-V3",
tensor_parallel_size=8, # 8×H100 для полной модели
trust_remote_code=True,
max_model_len=65536,
dtype="bfloat16",
)
Для дистиллированных моделей (8B, 32B) достаточно 1–4 GPU.
Сроки проекта
- Подготовка датасета с think-блоками: 3–8 недель (значительно сложнее обычного SFT)
- Обучение (32B, 4×A100): 12–24 часа
- Оценка reasoning-качества: 2 недели (требует экспертной оценки)
- Деплой и мониторинг: 1–2 недели
- Итого: 7–14 недель







