Fine-Tuning Cookbook'a Hoş Geldin: Sistematik, Stage Taksonomisi ve Reproducibility Kontratı
Bu cookbook'un kullanım kılavuzu: 5-bileşenli ders anatomisi (Theory/Math/Lab/Debug/Bench), Stage taksonomisi (Spike → Reference → Production → Research), reproducibility kontratı (bit-exact runs), RTX 4090 baseline'ı niye seçildi, GPU bütçeleme matematiği.
Şükrü Yusuf KAYA
35 dakikalık okuma
Orta📕 Bu cookbook size ne vaat eder, ne vaat etmez
Vaat: RTX 4090 (24GB) önündeki bir mühendis, bu kitap bittiğinde dünyadaki popüler 50+ açık model için kendi reçetesini yazacak, profiler'ı doğru okuyacak, OOM'u nedeninden bilecek, AWQ/GPTQ/GGUF arasında niye seçim yaptığını anlayacak, kendi Triton kernel'ını yazabilecek, LoRA hot-swap eden vLLM ile production'a deploy edebilecek. Vaat etmediği: 'tıklayıp çalıştır' tutorial. Her ders kafanı yoracak; ezberlemek değil çıkarsamak öğrendiğin şey.
Bu Dersin Haritası (8 Bölüm)#
- 5-bileşenli ders anatomisi — niye her ders aynı kasap iskeletinde
- Stage taksonomisi — Spike / Reference / Production / Research
- Reproducibility kontratı — bit-exact run nedir, niye umurumuzda
- RTX 4090 baseline'ı — 24GB ile niye ciddi FT mümkün
- GPU bütçeleme formülü — bir bakışta "bu model sığar mı?"
- Cookbook'un sıralaması — niye Part 0/I/II önce kommer
- Lab teslim kontratı — bir Lab "tamam" diye nasıl belirlenir
- Failure mode drill mantığı — bug'la yaşamayı öğrenmek
1. Beş-Bileşenli Ders Anatomisi#
Bu cookbook'taki her ders aşağıdaki sırayı izler. Bu sıra gevşek değil; her seviye bir önceki üzerine kurulur.
| Bileşen | Amaç | Ders içinde tipik süre |
|---|---|---|
| 1. Theory & Math | Paper referansı, denklemler, mimari sketch | %25 |
| 2. Memory & FLOPs | Sayısal anatomi: "bu model 24GB'a sığar mı?" | %15 |
| 3. Lab | Çalışan script + ölçülebilir teslim çıktısı | %35 |
| 4. Failure Mode Drill | Gerçek bug + debug seansı | %15 |
| 5. Benchmark & Eval | Başarıyı sayısal ispatlama (TR-MMLU/MT-Bench/...) | %10 |
Niye bu sıra? Önce kavram (Theory). Sonra donanım gerçeği (Memory). Sonra kod (Lab). Sonra bozulma (Drill — niye eğitim çöker, niye OOM olur). En son ölçüm (Bench — "iyi oldu" iddian ne kadar doğru).
Tutorial alışkanlığından gelen okuyucu sırayı atlayıp Lab'a koşacak — bu bilinçli olarak caydırılır. Lab'ın amacı kopyala-yapıştır değil, kavramı kemiklerinle hissetmek.
2. Stage Taksonomisi: Bu Reçeteyi Hangi Niyetle Çalıştırıyorsun?#
Aynı modeli "öğrenmek için" mi "production'a koymak için" mi çalıştırdığın, her şeyi değiştirir: hyperparameter, eval rigour, monitoring, cost discipline. Cookbook'taki her Lab şu 4 etiketten birini alır.
S1 — Spike (1-4 saat)#
"Bu reçete bende çalışıyor mu, kabaca?"
- Yamalı dataset (50-500 örnek), 1-50 step train
- Tek seed, tek run
- Eval: göz testi + 1-2 metrik
- Amaç: hipotezi 'evet/hayır' eşiğinde doğrulamak
- Cookbook'ta tipik kullanım: "QLoRA ayağa kalkıyor mu", "tokenizer doğru çalışıyor mu"
S2 — Reference (4-24 saat)#
"Cookbook'taki tablo değerine ne kadar yaklaştım?"
- Tam dataset, 1-3 epoch
- 3 seed, ortalama + std
- Eval: cookbook'taki resmi benchmark seti
- Bu cookbook'taki çoğu Lab S2 stage'de
- "Sertifika alabilir miyim" çıktısı bu seviyede ölçülür
S3 — Production#
"Bunu kullanıcıya ulaştıracağım."
-
- Karanlık fırlatma (shadow traffic), canary, online eval
-
- Drift detection, audit log, KVKK uyum kontrolleri
-
- Cost & latency SLA: P50/P95/P99
-
- Otomatik rollback playbook
- Cookbook'taki Part XV (Serving) + Part XVI (Operations) zorunlu
S4 — Research#
"Cookbook reçetesini yarmaya çalışıyorum, yeni bir şey deniyorum."
- Yeni teknik (custom Triton kernel, novel loss, untested data mix)
- 5+ seed, full ablation table
- Eval: literatürdeki referans benchmark + yeni custom probe
- Reproducibility ekstra sıkı (paper'da yayınlayacak gibi)
Cookbook reçetelerinin her birinin Stage etiketi vardır — örneğin: Llama 3.1 8B QLoRA on RTX 4090 — Stage: Reference. Bu etiket ders başlığının yanında durur.
3. Reproducibility Kontratı (Bit-Exact Runs)#
ML mühendisliğinde "çalıştı sende mi?" cümlesi en büyük zaman tüketicisidir. Cookbook'taki her Lab şu kontratla sözleşir:
"Aynı donanım, aynı dataset, aynı seed, aynı git commit hash → aynı loss curve."
Bunu sağlamak gevşek bir hedef değil, kod-seviyesinde uygulanır. Aşağıdaki cell her Lab'ın en başında durur (cookbook'un her zaman bekleyen ilk satırı):
python
# === FTC-REPRO ===# Fine-Tuning Cookbook reproducibility kontratı.# Bu cell her Lab'ın en başında bulunmalı. Aksi halde sonuçlar "sende çalıştı"# kategorisine düşer ve cookbook desteklenemez. import os, randomimport numpy as npimport torch SEED = 42 # cookbook sabit varsayılanos.environ["PYTHONHASHSEED"] = str(SEED)os.environ["CUBLAS_WORKSPACE_CONFIG"] = ":4096:8" # cuBLAS deterministicos.environ["CUDA_LAUNCH_BLOCKING"] = "0" # 1 yaparsan ~%15 yavaşlar, debug only random.seed(SEED)np.random.seed(SEED)torch.manual_seed(SEED)torch.cuda.manual_seed_all(SEED) # Deterministic algorithm seçimleritorch.backends.cudnn.deterministic = Truetorch.backends.cudnn.benchmark = False # benchmark=True non-determinism getirirtorch.use_deterministic_algorithms(True, warn_only=True) # bf16 tercih (RTX 4090 Ada native bf16 destekler)torch.set_float32_matmul_precision("high") # TF32 on for fp32 matmuls # Git commit + lib versiyonlarını logla — sertifika için kanıtimport subprocess, platformdef fingerprint(): sha = subprocess.run(["git", "rev-parse", "HEAD"], capture_output=True, text=True).stdout.strip() return { "git_sha": sha, "python": platform.python_version(), "torch": torch.__version__, "cuda_compiled": torch.version.cuda, "cuda_runtime": torch.cuda.get_device_capability(), "device": torch.cuda.get_device_name(0), "vram_gb": round(torch.cuda.get_device_properties(0).total_memory / 1024**3, 1), "seed": SEED, } print(fingerprint())# === /FTC-REPRO ===cookbook'un her Lab'ında en üstte duran 'repro cell' — bit-exact run kontratı
⚠️ Determinism'in maliyeti
torch.use_deterministic_algorithms(True)scatter_add4. Niye RTX 4090 Baseline'ı? (24GB ile Ciddi FT Mümkün mü?)#
Cevap: evet, hatta bekleyebileceğinden çok daha fazlası. Sayılarla:
| Spec | RTX 4090 | A100 80GB | H100 SXM | Anlamı |
|---|---|---|---|---|
| VRAM | 24 GB | 80 GB | 80 GB | doğrudan model size kapasitesi |
| Mem BW | 1008 GB/s | 2039 GB/s | 3350 GB/s | activation hareketi limiti |
| bf16 TFLOPS | 165 | 312 | 989 | compute upper bound |
| FP8 TFLOPS | 660 (sparse) | yok | 1979 | quant inference speed |
| TDP | 450 W | 400 W | 700 W | termal / elektrik |
| Yaklaşık fiyat | $1,600 | $15,000 | $30,000 | TCO matematiği |
24GB ile cookbook'ta yapılabilenler (Stage: Reference seviyesi):
- 1B–8B modeller: full SFT mümkün (Llama 3.2 3B, Qwen 3B, Gemma 3 4B, Phi-4-mini)
- 13B–32B modeller: QLoRA ile (NF4 + LoRA rank 32-64)
- 70B modeller: inference-only veya CPU-offload QLoRA (yavaş ama mümkün)
- Whisper Large-v3 full FT: rahat
- Stable Diffusion / vision FT: rahat
- DPO / KTO / ORPO: 8B'ye kadar rahat
- vLLM inference (LoRA hot-swap): 30B'ye kadar (quantized)
24GB ile yapılamayanlar (cookbook'ta cloud-rent öneriyoruz):
- 70B full SFT (FSDP gerekli, 4-8 H100 ya da 2-4 A100 80GB)
- Mixtral 8×22B / DeepSeek-V3 671B full FT (multi-node)
- 200K+ context fine-tune (sequence parallel gerekli)
Karar: Cookbook'un %85'i tek 4090'da koşar. Geri kalan %15 için "cloud-rent stage" anlatılır (Lambda/RunPod/Vast saat-fiyat tabloları dahil).
5. GPU Bütçeleme Formülü (Bir Bakışta Sığar mı?)#
Cookbook'ta her ders sayfasının en üstünde şöyle bir tablo durur. Şimdi formülü öğreniyoruz:
mem_total ≈ W + G + O + A + B W = params × bytes_per_param # bf16 → 2, fp16 → 2, fp32 → 4, NF4 → 0.5 G = params × bytes_per_param # gradient (training) O = params × optimizer_multiplier # AdamW: 8 bytes/param (m+v fp32), Lion: 4 A = batch × seq_len × layers × hidden × bytes × activation_multiplier B = fragmentation + workspace + cache (~2-4 GB sabit)
Örnek 1 — Llama 3.1 8B, full SFT bf16, batch=1, seq=4096:
- W = 8B × 2 = 16 GB
- G = 8B × 2 = 16 GB
- O (AdamW) = 8B × 8 = 64 GB ← felaket
- A ≈ 1 × 4096 × 32 × 4096 × 2 × 4 ≈ 4.3 GB (gradient checkpointing varken)
- B ≈ 3 GB
- Toplam ≈ 103 GB → 4090'a sığmaz, A100 80GB'a bile zor
Örnek 2 — Aynı model ama QLoRA (NF4) + LoRA rank=32, batch=1, seq=4096:
- W = 8B × 0.5 = 4 GB (NF4)
- G = sadece LoRA params (~40M × 2) = 0.08 GB
- O = 40M × 8 = 0.32 GB
- A ≈ 4 GB (gradient checkpoint açık) + LoRA forward extra ~0.5 GB
- B ≈ 3 GB
- Toplam ≈ 12 GB → 4090'da rahatlık içinde sığar ✅
Bütçe sayısı her Lab'da ders başında verilir. Cookbook'taki tipik tablo:
yaml
# === Ders 5.3 — Qwen 2.5 7B Türkçe SFT (QLoRA + Unsloth) ===stage: Referencehardware: gpu: RTX 4090 (24GB) cpu_threads: 16 ram_gb: 64 disk_free_gb_needed: 80 # base weights + dataset + ckptmemory_budget: W: 3.5 GB (NF4 quantized base) G: 0.06 GB (LoRA only) O: 0.24 GB (AdamW on LoRA) A: 5.2 GB (seq=4096, batch=2, grad_ckpt=on) B: 3.0 GB (workspace + frag) total_estimate: 12.0 GB measured_peak: 13.4 GB headroom: 10.6 GBruntime: steps_per_sec: 1.8 total_steps: 5400 est_wall_clock: 50 min electricity_cost_tr_avg: ~₺18 (450W × 0.83h × ₺3.5/kWh)her Lab'ın ders başında gördüğün 'bütçe kartı'
📐 6. Cookbook'un sıralaması — niye Part 0/I/II önce gelir
Modeller (Part III'ten itibaren) sıkı bir donanım/veri zemini ister. Bu zemini Part 0 (mühendislik prensipleri), Part I (donanım/bellek), Part II (tokenizer/veri) atar. Bir model dersine (örn. Llama 3.1 8B) Part II tamamlanmadan girersen 'chat template' detayına takılırsın. Bu yüzden cookbook lineer okumayı varsayar. Atlamak isteyenler için her ders başında 'prerequisite slug' listesi durur.
7. Lab Teslim Kontratı#
Bir Lab'ı "tamam" kabul etmek için aşağıdaki dosyaların elinde olması beklenir:
ders-XX-YY/ ├── repro.lock # repro cell çıktısı (git sha + lib versions) ├── train.log # tam stdout/stderr (timestamped) ├── tb_events/ # TensorBoard event dosyaları ├── checkpoints/last.safetensors ├── checkpoints/best.safetensors ├── eval/ │ ├── pre_finetune.json # base model'in benchmark sonuçları │ ├── post_finetune.json # FT sonrası │ └── delta.csv # her metrik için pre→post tablosu ├── samples/ │ ├── pre_FT_outputs.jsonl # base model 20 prompt çıktısı │ └── post_FT_outputs.jsonl ├── nvidia-smi-peak.txt # nvidia-smi --query-gpu çıktısı (peak'te) └── REPORT.md # 1-sayfa rapor, sertifika için
Bu yapı zorunlu çünkü cookbook ileride bu dosya iskeletini bir CI script'ine bağlar — Lab'ı doğrulayan otomatik bir grader (Part XVIII'de anlatılır).
8. Failure Mode Drill'in Mantığı#
Her ders 5. bileşeni "Drill" — bilinçli olarak bir bug üretiriz. Niye?
Çünkü tutorial okumakla bug'la güreşmek farklı kaslar. Cookbook'ta her dersin sonunda şu kalıp olur:
"Şimdi datasetin 100 satırındatoken'ını yanlışlıkla unut.<|im_end|>ile train et. 50 step sonra loss ne oluyor? GPU mem ne oluyor? Düzeltmek için ne yapıyorsun?"packing=True
Cevap dersin sonunda bir akordeon altında saklı duruyor. Önce kendin denersin. Bug'ı yaşamadan FT mühendisi olunmuyor — bu cookbook'un en koyu inanışı.
✅ Bu dersin teslimi
- Yukarıdaki repro cell'i bir notebook'a kopyala, çalıştır, fingerprint'in çıktığını gör. 2) Bir Llama 3.2 3B'yi HuggingFace'ten indir, ile bf16 weights memory'sini ölç, formülün öngördüğüyle uyuştuğunu doğrula. 3) Sonraki ders: 0.2 — Reproducibility Stack: Seeds, cuDNN flags, deterministic CUDA.
model.num_parameters() * 2 / 1024**3
Sık Sorulan Sorular
RTX 3090 (Ampere) ~%85 oranında uyumlu — bf16 TFLOPS 71 (4090'ın yaklaşık %43'ü), o yüzden eğitim ~2x yavaş olur. RTX 4080 (16GB) için cookbook'taki tabloları yeniden hesaplaman gerekir; 13B QLoRA marjinaldir, 8B QLoRA rahat. Cookbook'un tüm sayıları 4090 baseline'ında verilir — kendi donanımına göre orantılayabilirsin.
Yorumlar & Soru-Cevap
(0)Yorum yazmak için giriş yap.
Yorumlar yükleniyor...
İlgili İçerikler
Part 0 — Engineering Foundations
Reproducibility Stack: Seeds, cuDNN Flags ve Deterministic CUDA — 'Sende Niye Çalışıyor Bende Çalışmıyor' Sorununu Bitir
Öğrenmeye BaşlaPart 0 — Engineering Foundations
Environment Pinning: uv + pyproject.toml, CUDA Version Matrix ve Container Reçeteleri
Öğrenmeye BaşlaPart 0 — Engineering Foundations