Дотонування мовних моделей DeepSeek
DeepSeek — сім'я моделей мов з відкритим кодом від китайської компанії DeepSeek AI, випущена під ліцензією MIT. DeepSeek-V3 та DeepSeek-R1 — поточні флагманські моделі, конкуруючи з GPT-4o та Claude 3.5 Sonnet за більшістю бенчмарків при значно нижчій вартості логічного висновку. Відкриті ваги та висока якість роблять DeepSeek привабливим для сценаріїв дотонування на рівні enterprise.
Сім'я DeepSeek: навігація за моделями
| Модель | Параметри | Архітектура | Програма |
|---|---|---|---|
| DeepSeek-V3 | 671B (MoE, ~37B активних) | MoE | Флагман, загальна мета |
| 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 | Генерування коду |
Для практичного дотонування найчастіше використовуються дистильовані версії (8B, 32B, 70B) — вони тренуються на звичайних GPU кластерах та дають хорошые результати для спеціалізованих завдань.
Архітектурна особливість: Multi-head Latent Attention (MLA)
DeepSeek-V3 використовує MLA — механізм уваги із стисненням KV-кеша. Порівняно з GQA (Grouped Query Attention в Llama), MLA зменшує KV-кеш у 5–13 разів при порівнянній якості. Це критично для логічного висновку з довгим контекстом — DeepSeek підтримує 128K токенів із розумними вимогами до пам'яті.
При дотонуванні, шари MLA обробляються нормально через peft, але при виборі target_modules враховуємо специфіку: в DeepSeek-V3, проекції уваги названі q_proj, kv_a_proj_with_mqa, kv_b_proj, o_proj.
LoRA дотонування 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
Робота із ланцюгом мислення при дотонуванні R1
DeepSeek-R1 генерує reasoning у спеціальних тегах <think>...</think> перед остаточною відповіддю. При дотонуванні на спеціалізованих даних важливо:
- Зберегти think-блоки в прикладах тренування — це підтримує здатність моделі до reasoning
-
Не придушувати токен
<think>в промптах під час тренування -
Видалити reasoning із логічного висновку, якщо потрібно — використовуйте
<think>\n\n</think>як префікс або відкоригуйте критерії зупинки
Приклад тренувального прикладу для 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-блок з покроковим reasoning аудитора + висновок. Дані підготовлені з практикуючими аудиторами.
Тренування: QLoRA (r=32), 3 епохи, 4×A100 40GB, 18 годин.
Результати:
- Точність виявлення порушень: 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 тижнів







