Skip to content

Capstone Module 15: Turkish DPO Model from Scratch to Production — Data, Training, Evaluation, Publishing

Module 15 capstone project: producing a production-grade model with Turkish DPO on Llama-3-8B-Instruct. How to collect 5K Turkish comparison data (manual + synthetic), DPO training (QLoRA, single H100, $50), MT-Bench-TR evaluation, win-rate measurement, publishing on HuggingFace Hub with model card. The curriculum's sixth production artifact.

Şükrü Yusuf KAYA
90 min read
Advanced
Capstone Modül 15: Türkçe DPO Modeli Sıfırdan Üretime — Veri, Eğitim, Değerlendirme, Yayın
🏆 Capstone — Müfredatın 6. Production Artefaktı
Modül 15'in 5 dersinde RLHF/DPO matematiğini, mühendisliğini, Türkçe için detaylarını işledik. Bu capstone hepsini çalışan bir model'e dönüştürüyor. Llama-3-8B-Instruct + 5K Türkçe karşılaştırma verisi + DPO + MT-Bench-TR eval + HuggingFace Hub yayın. Single H100, 24 saat, ~$50. Sonunda: sukruyusufkaya/llama-3-8b-tr-dpo-instruct modeli, dünyaya açık. Diğer geliştiriciler indirebilir, hizalanmış Türkçe Llama deploy edebilirler. Müfredatın altıncı 'gerçek dünya' eseri. TurkTokenizer-tr (Modül 6.10), Semantic Search (7.6), Mini Pretrain (11.3), SFT modeli (14.3), Türkçe ChatGPT klonu (16.2) ile birlikte. 90 dakikada, kendin yapabileceğin bir proje.

Capstone Akışı (10 Aşama)#

  1. Hedef tanımı — model, kalite, maliyet
  2. Karşılaştırma verisi toplama — manual + synthetic
  3. Veri formatı — chosen/rejected pair'leri
  4. Veri kalitesi kontrolü — inter-rater agreement
  5. DPO eğitim setup — QLoRA + TRL
  6. Eğitim monitoring — wandb metrics izleme
  7. Evaluation — MT-Bench-TR + win rate + capability tax
  8. LoRA merge ve quantization — production-ready
  9. HuggingFace Hub yayın — model card + license
  10. Production deployment — vLLM serving

1-4. Veri Toplama ve Kalite#

1.1 Hedef tanımı#

Model:
sukruyusufkaya/llama-3-8b-tr-dpo-instruct
Base:
meta-llama/Meta-Llama-3-8B-Instruct
Hedef kalite: MT-Bench-TR +0.5 puan, win rate %60+ Bütçe: 5K karşılaştırma + 1 H100 24 saat = ~$50 + veri toplama maliyeti Süre: 2 hafta

2.1 Karşılaştırma veri kaynakları#

Kaynak A: SFT model çıktıları (en yaygın)
  1. Llama-3-8B-Instruct (veya Modül 14.3'teki Türkçe SFT model) ile 2K Türkçe prompt için her birine 2 yanıt üret (farklı temperature: 0.7 ve 1.0)
  2. İnsan etiketleyici hangisini tercih eder, etiket
  3. Sonuç: 2K karşılaştırma
Kaynak B: Synthetic data (ucuz)
  1. GPT-4o ile 3K Türkçe prompt için 'iyi cevap' ve 'kötü cevap' (intentionally suboptimal) üret
  2. İnsan etiketleyici 'iyi'nin gerçekten iyi olduğunu doğrula (gözden geçirme)
  3. Sonuç: 3K karşılaştırma
Karışım: 5K toplam (2K manual + 3K synthetic).

2.2 Prompt diversity#

Dağılım önerisi (5000 prompt için):
  • Genel sohbet, soru-cevap: %30 (1500)
  • Yaratıcı yazma: %15 (750)
  • Bilimsel/teknik: %15 (750)
  • Kod yazma: %10 (500)
  • Yerel kültür/Türkçe-spesifik: %10 (500)
  • Hassas konular (politika, din, hukuk — sınırlı): %10 (500)
  • Edge cases (jailbreak, yasak istek): %5 (250)
  • Çeviri/dilbilim: %5 (250)

3.1 Veri format#

HuggingFace TRL DPOTrainer format:
{ "prompt": "İstanbul'da hafta sonu yapılabilecek 3 aktivite öner.", "chosen": "İstanbul'da harika hafta sonu seçenekleri var: 1) Boğaz'da tekne turu (Eminönü → Anadolu Kavağı, 1.5 saat, 80 TL) — manzara ve hava değişimi için. 2) Süleymaniye Camii ve çevresi (tarihi yapı, eski İstanbul atmosferi, ücretsiz, sabah saatleri sakin). 3) Pierre Loti tepesi (Eyüp'ten teleferik, 50 TL gidiş-dönüş, Haliç manzarası, hava güzelse iyi gider).", "rejected": "İstanbul büyük bir şehir, çok şey yapabilirsiniz. Müzeler var, restoranlar var, parklar var. İnternette araştırırsanız bulursunuz." }

4.1 Veri kalitesi kontrolü#

Inter-rater agreement: aynı 100 örneği 2 farklı etiketleyiciye ver. Anlaşma oranı %75+ olmalı. Düşükse:
  • Etiketleyici eğitimini gözden geçir
  • Anlaşmazlık yaşanan örnekleri tekrar tartış
  • Kalite standardını net hale getir
Distribution check:
  • Length balance: chosen ve rejected ortalama uzunluk benzer (±%20)
  • Verbosity check: ortalama 200-500 kelime
  • Topic balance: tüm 8 kategori dengeli temsil edilmiş
Kalite filtre: %5'ini manuel inceleme. Çok düşük kalite (etiketleyici dikkatsiz yapmış olabilir) örnekleri at.
python
# Modül 15 Capstone — Türkçe DPO Production-Grade Script
# Müfredatın 6. gerçek dünya artefaktı
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
from trl import DPOTrainer, DPOConfig
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
from datasets import load_dataset
import wandb
 
# ============================================================
# 0. Setup
# ============================================================
MODEL_BASE = 'meta-llama/Meta-Llama-3-8B-Instruct'
DATASET_TR = 'sukruyusufkaya/turkish-preferences-5k' # Önce upload'la
OUTPUT_DIR = './llama-3-8b-tr-dpo'
WANDB_PROJECT = 'turkish-dpo-capstone'
 
wandb.init(project=WANDB_PROJECT, name='llama-3-8b-tr-dpo-v1')
 
# ============================================================
# 1. Quantization (QLoRA) — memory optimize
# ============================================================
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_quant_type='nf4',
bnb_4bit_use_double_quant=True,
)
 
# ============================================================
# 2. Model + tokenizer
# ============================================================
tokenizer = AutoTokenizer.from_pretrained(MODEL_BASE)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = 'left' # DPO için
 
model = AutoModelForCausalLM.from_pretrained(
MODEL_BASE,
quantization_config=bnb_config,
device_map='auto',
torch_dtype=torch.bfloat16,
use_cache=False,
)
model = prepare_model_for_kbit_training(model)
 
# ============================================================
# 3. LoRA config
# ============================================================
lora_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=['q_proj', 'k_proj', 'v_proj', 'o_proj', 'gate_proj', 'up_proj', 'down_proj'],
lora_dropout=0.05,
bias='none',
task_type='CAUSAL_LM',
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters() # ~40M | %0.5
 
# ============================================================
# 4. Dataset
# ============================================================
dataset = load_dataset(DATASET_TR, split='train')
dataset = dataset.shuffle(seed=42)
 
# Train/val split
split = dataset.train_test_split(test_size=0.05, seed=42)
train_dataset = split['train']
val_dataset = split['test']
 
print(f'Train: {len(train_dataset)} | Val: {len(val_dataset)}')
 
# ============================================================
# 5. DPO config
# ============================================================
dpo_config = DPOConfig(
output_dir=OUTPUT_DIR,
num_train_epochs=1, # 1 epoch yeter
per_device_train_batch_size=2,
per_device_eval_batch_size=2,
gradient_accumulation_steps=8, # effective batch 16
learning_rate=5e-6, # SFT'den 4x küçük
warmup_steps=50,
lr_scheduler_type='cosine',
weight_decay=0.0,
optim='paged_adamw_8bit',
bf16=True,
# DPO-specific
beta=0.1, # KL strength
max_length=2048,
max_prompt_length=1024,
# Monitoring
logging_steps=10,
eval_strategy='steps',
eval_steps=100,
save_steps=200,
save_total_limit=3,
# WandB
report_to='wandb',
run_name='llama-3-8b-tr-dpo-v1',
# Best model checkpoint
load_best_model_at_end=True,
metric_for_best_model='eval/rewards/accuracies',
greater_is_better=True,
)
 
# ============================================================
# 6. DPO trainer
# ============================================================
trainer = DPOTrainer(
model=model,
ref_model=None, # TRL otomatik oluşturur (QLoRA için)
args=dpo_config,
train_dataset=train_dataset,
eval_dataset=val_dataset,
tokenizer=tokenizer,
peft_config=lora_config,
)
 
# ============================================================
# 7. Train
# ============================================================
trainer.train()
trainer.save_model(OUTPUT_DIR + '/final')
 
# ============================================================
# 8. LoRA merge — production-ready
# ============================================================
from peft import PeftModel
base_model = AutoModelForCausalLM.from_pretrained(
MODEL_BASE,
torch_dtype=torch.bfloat16,
device_map='auto',
)
model_with_lora = PeftModel.from_pretrained(base_model, OUTPUT_DIR + '/final')
merged_model = model_with_lora.merge_and_unload()
merged_model.save_pretrained(OUTPUT_DIR + '/merged')
tokenizer.save_pretrained(OUTPUT_DIR + '/merged')
 
# ============================================================
# 9. HuggingFace Hub'a yayın
# ============================================================
from huggingface_hub import HfApi
api = HfApi()
api.create_repo(
repo_id='sukruyusufkaya/llama-3-8b-tr-dpo-instruct',
repo_type='model',
private=False,
)
 
merged_model.push_to_hub('sukruyusufkaya/llama-3-8b-tr-dpo-instruct')
tokenizer.push_to_hub('sukruyusufkaya/llama-3-8b-tr-dpo-instruct')
 
print('🎉 Capstone tamamlandı! Model HuggingFace Hub\'da: https://huggingface.co/sukruyusufkaya/llama-3-8b-tr-dpo-instruct')
 
# Toplam maliyet: 1× H100 24 saat (~$50)
# WandB logları: https://wandb.ai/sukruyusufkaya/turkish-dpo-capstone
 
Türkçe DPO Capstone — Full Production Script

7. Evaluation#

7.1 MT-Bench-TR#

MT-Bench Türkçe çevirisi. 80 challenging Türkçe prompt, 2-turn conversation, GPT-4 hakem. Skor 1-10.
# pip install lm-evaluation-harness mt-bench-tr from mt_bench_tr import run_eval results = run_eval( model='sukruyusufkaya/llama-3-8b-tr-dpo-instruct', judge_model='gpt-4o', num_questions=80, ) print(f'MT-Bench-TR ortalama skor: {results.score}')
Hedef:
  • Base (Llama-3-8B-Instruct): ~7.2
  • DPO sonrası: ~7.7+ (+0.5)

7.2 Win rate vs base#

from comparison_eval import compare_models results = compare_models( model_a='sukruyusufkaya/llama-3-8b-tr-dpo-instruct', model_b='meta-llama/Meta-Llama-3-8B-Instruct', prompts=load_test_prompts('turkish_test_100.jsonl'), judge='gpt-4o', ) print(f'DPO win rate: {results.win_rate_a:.2%}') # Hedef: %60+

7.3 Capability tax kontrolü#

DPO sonrası 'temel yeteneklerde' regresyon kontrol et:
  • TR-MMLU: bilimsel bilgi (Türkçe MMLU benchmark)
  • TR-SQuAD: Türkçe okuduğunu anlama
  • HumanEval-TR: kod yazma (Türkçe yorum + Türkçe değişken adları)
Hedef: maksimum -%3 regresyon (anlamlı bir kayıp olmasın).

7.4 Manual sample inspection#

50 Türkçe prompt × 2 cevap (base ve DPO) = 100 örnek. Manuel oku:
  • 'Karakter' bozulmuş mu (çok kuru, robotik)?
  • Türkçe gramer ve tarz iyi mi?
  • Refusal pattern'leri uygun mu?
  • Edge case'lerde davranış sağlıklı mı?
Bu 'sniff test'i ihmal etme — metrikler iyi olabilir ama gerçek kalite düşük olabilir.

9. HuggingFace Hub Yayını + Model Card#

9.1 Repo oluştur#

huggingface-cli login huggingface-cli repo create llama-3-8b-tr-dpo-instruct --type model

9.2 Model card (README.md)#

--- language: - tr license: llama3 base_model: meta-llama/Meta-Llama-3-8B-Instruct tags: - turkce - llama-3 - dpo - rlhf - turkish-llm datasets: - sukruyusufkaya/turkish-preferences-5k --- # Llama-3-8B-Türkçe-DPO-Instruct Llama-3-8B-Instruct base modelinin **Direct Preference Optimization (DPO)** ile Türkçe için fine-tune edilmiş versiyonu. ## Model Detayları - **Base model**: meta-llama/Meta-Llama-3-8B-Instruct - **Eğitim yöntemi**: DPO (Direct Preference Optimization, Rafailov 2023) - **Veri**: 5,000 Türkçe karşılaştırma (chosen/rejected pair) - **Eğitim süresi**: 1 H100 GPU, 24 saat - **Maliyet**: ~$50 ## Performans | Metrik | Base | Bu model | Δ | |---|---|---|---| | MT-Bench-TR | 7.2 | 7.7 | +0.5 | | Win rate vs base | 50% | 65% | +15% | | TR-MMLU | 62.1 | 61.5 | -0.6 | | TR-SQuAD F1 | 78.3 | 77.9 | -0.4 | Genel: Türkçe nezaket, tarz, ton iyileşti. Çekirdek yetenekler korundu. ## Kullanım ```python from transformers import AutoTokenizer, AutoModelForCausalLM import torch model_id = 'sukruyusufkaya/llama-3-8b-tr-dpo-instruct' tokenizer = AutoTokenizer.from_pretrained(model_id) model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.bfloat16, device_map='auto') messages = [ {'role': 'system', 'content': 'Sen yardımsever bir Türk asistansın.'}, {'role': 'user', 'content': 'İstanbul\'da bir günde ne yapabilirim?'}, ] inputs = tokenizer.apply_chat_template(messages, return_tensors='pt').to(model.device) outputs = model.generate(inputs, max_new_tokens=500, temperature=0.7) print(tokenizer.decode(outputs[0][inputs.shape[1]:], skip_special_tokens=True))

Sınırlamalar#

  • Türkçe DPO 5K küçük dataset → kapasitenin tam kullanımı sınırlı
  • KVKK uyumluluğu için ek değerlendirme önerilir
  • Production deployment'tan önce kendi domain'inde test edin

Lisans#

Meta'nın Llama 3 lisansına tabidir.

Atıf#

@misc{kaya2025turkce-dpo, author = {Şükrü Yusuf KAYA}, title = {Llama-3-8B-Türkçe-DPO-Instruct}, year = {2025}, publisher = {HuggingFace}, howpublished = {https://huggingface.co/sukruyusufkaya/llama-3-8b-tr-dpo-instruct} }
### 9.3 Production deployment vLLM ile (Modül 16.1 detay): ```bash vllm serve sukruyusufkaya/llama-3-8b-tr-dpo-instruct \ --gpu-memory-utilization 0.9 \ --max-model-len 8192 \ --port 8000
OpenAI-compatible API hazır:
http://localhost:8000/v1/chat/completions
🎉 Modül 15 Tamamlandı — RLHF/DPO'nun Tüm Anatomi
Modül 15 final (6 ders, 535 dakika):
  • 15.1: RLHF Tarihçesi — Christiano 2017'den ChatGPT'ye 7 yıl, HHH üçgeni, Goodhart Yasası, Türkçe-özel hizalama
  • 15.2: Reward Model — Bradley-Terry 1952, sigmoid türevi, ranking loss, Plackett-Luce, kalibrasyon
  • 15.3: PPO Schulman 2017 — clipped surrogate, GAE, KL penalty, InstructGPT setup
  • 15.4: DPO Devrim — Rafailov 2023, kapalı form çözüm, implicit RM, modern varyantlar
  • 15.5: GRPO + Reasoning RL — DeepSeek-R1, 'aha moments', process vs outcome reward
  • 15.6 Capstone: Türkçe DPO modeli üretim — 5K veri, single H100, $50, MT-Bench-TR +0.5, HF Hub yayın
Müfredatın 6. production artefaktı üretildi:
sukruyusufkaya/llama-3-8b-tr-dpo-instruct
. RLHF/DPO matematiği, mühendisliği, Türkçe pratisyenliği uzman seviyesinde işlendi. Modül 15 artık müfredatın en derin teknik modülü ile yarışıyor (Modül 6 Tokenization, Modül 8 Attention).

Modül 15 Envanteri (Yeniden Yazıldı)#

#DersSüreEgzersizFAQResource
15.1RLHF Tarihçesi ve Felsefe90 dk1288
15.2Reward Model Matematik85 dk1078
15.3PPO Algoritması90 dk67
15.4DPO Devrim85 dk77
15.5GRPO + Reasoning RL75 dk1047
15.6Capstone Türkçe DPO Üretim90 dk
Toplam6 ders515 dk (~8.6 saat)32 egzersiz32 FAQ37 resource
Önceki Modül 15: 2 ders / 145 dk. Şimdi: 6 ders / 515 dk. 3.5× genişleme, uzman kalitesi.

Frequently Asked Questions

Manual process (10-15 labelers): - Labeler hourly rate $5-15 in Turkey - Average 3-5 minutes per comparison - 5K comparisons = 250-400 hours - 10 labelers × 25-40 hours = 1 week **Cost**: $1,250 - $6,000. **Hybrid (manual + synthetic, most practical)**: - 1.5K manual (~75 hours, $375-$1,125) - 3.5K synthetic with GPT-4 + human verify (~$200 OpenAI + 50 hours verify $250-750) - **Total**: $825 - $2,075, 3-5 days **Hybrid approach** recommended for production Turkish.

Yorumlar & Soru-Cevap

(0)
Yorum yazmak için giriş yap.
Yorumlar yükleniyor...

Related Content