Capstone Modül 15: Türkçe DPO Modeli Sıfırdan Üretime — Veri, Eğitim, Değerlendirme, Yayın
Modül 15 capstone projesi: Llama-3-8B-Instruct üzerine Türkçe DPO ile production-grade model üretmek. 5K Türkçe karşılaştırma verisinin nasıl toplanır (manual + synthetic), DPO eğitimi (QLoRA, single H100, $50), MT-Bench-TR ile değerlendirme, win-rate ölçümü, HuggingFace Hub'da model card ile yayın. Müfredatın altıncı production artefaktı.
Şükrü Yusuf KAYA
90 dakikalık okuma
İleri🏆 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)#
- Hedef tanımı — model, kalite, maliyet
- Karşılaştırma verisi toplama — manual + synthetic
- Veri formatı — chosen/rejected pair'leri
- Veri kalitesi kontrolü — inter-rater agreement
- DPO eğitim setup — QLoRA + TRL
- Eğitim monitoring — wandb metrics izleme
- Evaluation — MT-Bench-TR + win rate + capability tax
- LoRA merge ve quantization — production-ready
- HuggingFace Hub yayın — model card + license
- Production deployment — vLLM serving
1-4. Veri Toplama ve Kalite#
1.1 Hedef tanımı#
Model:
Base:
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
sukruyusufkaya/llama-3-8b-tr-dpo-instructmeta-llama/Meta-Llama-3-8B-Instruct2.1 Karşılaştırma veri kaynakları#
Kaynak A: SFT model çıktıları (en yaygın)
- 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)
- İnsan etiketleyici hangisini tercih eder, etiket
- Sonuç: 2K karşılaştırma
Kaynak B: Synthetic data (ucuz)
- GPT-4o ile 3K Türkçe prompt için 'iyi cevap' ve 'kötü cevap' (intentionally suboptimal) üret
- İnsan etiketleyici 'iyi'nin gerçekten iyi olduğunu doğrula (gözden geçirme)
- 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 torchfrom transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfigfrom trl import DPOTrainer, DPOConfigfrom peft import LoraConfig, get_peft_model, prepare_model_for_kbit_trainingfrom datasets import load_datasetimport wandb # ============================================================# 0. Setup# ============================================================MODEL_BASE = 'meta-llama/Meta-Llama-3-8B-Instruct'DATASET_TR = 'sukruyusufkaya/turkish-preferences-5k' # Önce upload'laOUTPUT_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_tokentokenizer.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 splitsplit = 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 PeftModelbase_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 HfApiapi = 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: . 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).
sukruyusufkaya/llama-3-8b-tr-dpo-instructModül 15 Envanteri (Yeniden Yazıldı)#
| # | Ders | Süre | Egzersiz | FAQ | Resource |
|---|---|---|---|---|---|
| 15.1 | RLHF Tarihçesi ve Felsefe | 90 dk | 12 | 8 | 8 |
| 15.2 | Reward Model Matematik | 85 dk | 10 | 7 | 8 |
| 15.3 | PPO Algoritması | 90 dk | — | 6 | 7 |
| 15.4 | DPO Devrim | 85 dk | — | 7 | 7 |
| 15.5 | GRPO + Reasoning RL | 75 dk | 10 | 4 | 7 |
| 15.6 | Capstone Türkçe DPO Üretim | 90 dk | — | — | — |
| Toplam | 6 ders | 515 dk (~8.6 saat) | 32 egzersiz | 32 FAQ | 37 resource |
Önceki Modül 15: 2 ders / 145 dk.
Şimdi: 6 ders / 515 dk. 3.5× genişleme, uzman kalitesi.
Sık Sorulan Sorular
Manual süreç (10-15 etiketleyici):
- Etiketleyici saat ücreti Türkiye'de $5-15
- Karşılaştırma başına ortalama 3-5 dakika
- 5K karşılaştırma = 250-400 saat
- 10 etiketleyici × 25-40 saat = 1 hafta
**Maliyet**: $1,250 - $6,000.
**Hibrit (manual + synthetic, en pratik)**:
- 1.5K manuel (~75 saat, $375-$1,125)
- 3.5K GPT-4 ile synthetic + human verify (~$200 OpenAI + 50 saat verify $250-750)
- **Toplam**: $825 - $2,075, 3-5 gün
Production Türkçe için **hibrit yaklaşım** önerilir.
Yorumlar & Soru-Cevap
(0)Yorum yazmak için giriş yap.
Yorumlar yükleniyor...
İlgili İçerikler
Modül 0: Kurs Çerçevesi ve Atölye Kurulumu
LLM Engineer Kimdir? Junior'dan Staff'a Yapay Zekâ Mühendisliği Kariyer Haritası
Öğrenmeye BaşlaModül 0: Kurs Çerçevesi ve Atölye Kurulumu
Kurs Felsefesi: Neden Bu Yol, Neden Bu Sıra — 8 Aylık Müfredatın İskeleti
Öğrenmeye BaşlaModül 0: Kurs Çerçevesi ve Atölye Kurulumu