Kullanım — Workbench'i Baştan Sona Çalıştırmak
Ham metinden konuşan modele: tokenizer'ı kur, modeli eğit, çıktı üret — ve her ayarın ne işe yaradığı.
Etütlerin geri kalanı kernel'ları satır satır açıyor. Bu sayfa ise pratik tarafı: llm.istanbul workbench'inde hangi düğmeye basınca ne olur, hangi parametre neyi değiştirir. Sıfırdan küçük bir Türkçe model eğitip çalıştırmak için baştan sona bir tur.
Büyük resim — üç sekme, iki dosya
Workbench üç sekme; aralarında iki tür dosya dolaşıyor:
[ham metin .txt]
│ Tokenizer sekmesi → BPE sözlüğü + token'lama
▼
[.bin] token dizisi + gömülü vocab
│ Train sekmesi → forward / backward / AdamW
▼
[.llm] model ağırlıkları + gömülü vocab
│ Generate sekmesi → prompt'a devam üret
▼
[üretilen metin]- Tokenizer → metni token'lara böler, BPE sözlüğü kurar,
.binçıkarır. - Train →
.bin'i alır, transformer'ı eğitir,.llmcheckpoint kaydeder. - Generate →
.llm'i alır, yazdığın prompt'u sürdürür.
Önemli detay: hem .bin hem .llm vocab'ı içinde gömülü taşır. Yani bir .llm dosyasını tek başına paylaşsan bile sözlük yanında gelir; ayrıca bir vocab dosyası taşımana gerek yok.
Adım 1 — Tokenizer (sözlüğü kur)
Model harf değil token görür — kelime parçaları (neden ve nasıl: 01 Embedding, 13 BPE). İlk iş, metnini token'lara bölecek sözlüğü kurmak.
- Metin dosyalarını bırak (
.txt,.md, …). Birden çok olabilir; "browse folder" klasörü özyineli tarar. - Vocab size seç — sözlükteki token sayısı.
| Vocab | Ne zaman |
|---|---|
| 8K–16K | Küçük corpus, dar alan |
| 32K | Türkçe için iyi denge ⭐ |
| 64K (varsayılan) | Geniş corpus; embedding tablosu da büyür |
Türkçe sondan eklemeli — "ev-ler-imiz-den". Çok küçük vocab ekleri lime lime eder; çok büyük vocab ise nadir token'lara boşa parametre ayırır. Orta-büyük bir corpus için 32K tatlı noktadır; oyuncak denemelerde 8K–16K yeter.
- "Train BPE & Export .bin" — GPU'da merge'leri koşar, sonra tüm metni token'layıp
.binindirir. İstersen sözlüğü.jsonolarak da ayrı kaydedebilirsin, ama.binzaten vocab'ı içinde taşıyor.
Pretrain ve fine-tune aynı vocab ile yapılmalı. Sözlük değişirse embedding tablosu eski checkpoint'le uyuşmaz ve model çöker. Bir corpus için bir kez sözlük kur, sonra hep onu kullan.
Adım 2 — Train (modeli eğit)
İşin kalbi. Önce modelin şeklini (kaç parametre olacak), sonra nasıl öğreneceğini (eğitim ayarları) seçiyorsun.
En kolayı: bir preset'le başla
Onlarca ayarı tek tek kurcalamak yerine bir preset seç, sonra ince ayar yap. Üç preset şunları basıyor:
| Preset | Ne için | lr | steps | grad_accum | warmup | min_lr | weight_decay | grad_clip |
|---|---|---|---|---|---|---|---|---|
| Fresh pretrain | Sıfırdan eğitim | 3e-4 | 50k | 4 | 5% | 10% | 0.1 | 1.0 |
| Continue pretrain | Checkpoint'ten devam | 1e-4 | 30k | 4 | 10% | 10% | 0.1 | 0.5 |
| Fine-tune | Hazır modeli göreve uyarla | 5e-5 | 10k | 2 | 1% | 30% | 0.01 | 0.5 |
Sekmenin varsayılan chip'leri (d=128, 4 head, 4 katman, seq=128, 500 step) bilinçli olarak oyuncak/sanity boyuttadır — birkaç saniyede "çalışıyor mu?" görmek için. Gerçek bir model eğitirken aşağıdaki "Hazır reçete"ye veya bir preset'e geç.
Model boyutu — kaç parametre?
d_model — gizli boyut
Modelin "düşünce alanı"nın genişliği; her token bu boyutta bir vektöre dönüşür (01 Embedding).
| Değer | Kullanım |
|---|---|
| 64–256 | Oyuncak / sanity |
| 384–512 | Küçük üretim modeli ⭐ |
| 768+ | Derin semantik, yavaş |
Etki karelenir: tüm matrisler d_model² ile büyür — d=512, d=384'ün ~1.8 katı hesap/bellek.
n_heads — attention başlığı sayısı
Paralel "bakış açıları"; her başlık metnin farklı bir ilişkisine dikkat eder (05 Attention). Kural: head_dim = d_model / n_heads, 32–128 arası iyi. d=512 → n_heads=8 → head_dim=64 ✓.
n_kv_heads — GQA gruplama
Key/Value başlık sayısını azaltıp bellek kazanır. = n_heads (MHA, en kaliteli ama bellek aç), 2/4 (GQA — 4–5× KV bellek tasarrufu, kalite kaybı cüzi ⭐), 1 (MQA, agresif). Llama, Mistral, Gemma hep GQA.
n_layers — derinlik
Transformer bloğu sayısı; modelin "düşünme adımı". Lineer etki: 8 katman = 4 katmanın 2× bellek/zamanı. Küçük model için 6–8 iyi denge.
d_ff mult — FFN genişleme oranı
FFN katmanı d_model × oran kadar geniş (d=512 × 4 = 2048). 4× modern standart (06 Activation).
activation
GeLU (klasik, 2 matris) ya da SwiGLU (modern, Llama tarzı, 3 matris — gate/up/down, biraz pahalı ama daha kaliteli ⭐). Detay: 06 Activation.
Eğitim ayarları — nasıl öğrensin?
seq_len — bağlam penceresi
Bir örneğin token uzunluğu. Attention O(seq²) olduğu için 1024, 512'nin ~4 katı pahalıdır (05 Attention). Soru-cevap ve diyalog için 512 fazlasıyla yeter; oyuncakta 128–256.
lr — learning rate
Optimizer'ın adım büyüklüğü; cosine schedule ile peak'e çıkıp düşer. 3e-4 Adam ailesi için "sihirli sayı" (pretrain ⭐). 1e-4 güvenli/yavaş (fine-tune). 1e-3+ patlama riski. Fine-tune'da pretrain lr'sinin 1/3–1/10'u.
steps — adım sayısı
Toplam optimizer adımı. Sanity 100, hızlı deney 2k, ciddi pretrain 50k–100k. Fine-tune çok daha az (1k–3k) — küçük corpus'ta çok adım = ezber.
grad_accum ve "batch" meselesi
Bu engine tarayıcıda tek sequence işler — yani batch = 1, gerçek batch yok. "Sanal batch"i grad_accum verir: N micro-adımın gradyanını biriktirip (11 Backward Linear) tek bir optimizer güncellemesi yapar.
Dolayısıyla adım başına token = seq_len × grad_accum. (Bazı genel notlarda geçen "batch=32" varsayımı bu engine için geçerli değildir.)
tokens_per_step = seq_len × grad_accum
epoch_adımı = corpus_token / tokens_per_step
görülen_epoch = steps × tokens_per_step / corpus_tokenÖrnek: 50M token corpus, seq_len=512, grad_accum=4 → adım başına 2048 token → 50k adım ≈ 102M token görüm ≈ ~2 epoch. Bellek hatası almıyorsan grad_accum=1 bırakabilirsin; dar bellekte 4–8'e çıkar.
optimizer
AdamW (fp32) klasik, en kaliteli ⭐ (12 AdamW). AdamW (8-bit) moment'ları (m, v) 8-bit tutar → bellek tasarrufu, kalite ~aynı. 50M altı fp32 yeter; 100M+ için 8-bit lazım olabilir.
precision
fp32 her şey 32-bit (yavaş ama emin). mixed (f16 W) ağırlıkları 16-bit aynalar, gradyanlar 32-bit kalır (08 F16 Cast). Apple Silicon'da mixed ~1.5–2× hızlı, kalite kaybı yok — pratikte doğru seçim.
label_smooth (α)
"%100 doğru ol" yerine "%95 yeter, kalanı dağıt" der; aşırı kendinden eminliği kırar (07 Cross-Entropy). 0.05 hafif ⭐, 0.1 agresif. Loss biraz yükselir, genelleme artar.
z_loss (β)
Çıkış logit'lerinin log-sum-exp'ini küçük tutan stabilizatör; devasa logit oluşmasını engeller, mixed precision'la uyumlu. 1e-4 hafif ⭐.
warmup — ısınma oranı
lr'yi en baştan zirveye yavaşça çıkaran faz (toplam adımın yüzdesi). Soğuk başta büyük adım gradyanı patlatabilir; warmup bunu önler. Pretrain'de %5, devam/fine-tune'da %1 tipik. Model zaten ısınmışsa kısa tut.
min_lr — cosine dip oranı
Cosine düşüşün nereye kadar ineceği (peak lr'nin yüzdesi). %10 standart; fine-tune'da %30 (erken plato riskine karşı lr'yi çok düşürme). 0'a indirmek modeli son adımlarda dondurur.
weight_decay — L2 düzenlileştirme
Ağırlıkları sıfıra doğru hafifçe çeken ceza; aşırı öğrenmeyi (overfit) frenler. 0.1 pretrain standardı, fine-tune'da 0.01 (daha az müdahale).
grad_clip — gradyan kırpma
Gradyan normu bu eşiği aşarsa ölçekleyip kısar — ani bir patlamanın (NaN) tüm eğitimi bozmasını önler. 1.0 tipik; daha hassas/devam eğitiminde 0.5.
Eğitim sırasında
- Validation: corpus'un son %5'i holdout tutulur; her 100 adımda val loss ölçülür. Train loss düşerken val loss yükselmeye başladıysa → overfit sinyali.
- Loss eğrisi anlık çizilir.
ln(vocab)civarı = rastgele başlangıç; düştükçe iyi. - Save Model (.llm): mevcut ağırlıkları (ve istersen optimizer state'i) kaydeder.
- Save Best: run boyunca en düşük val anının snapshot'unu ayrı kaydeder — overfit başlasa bile en iyi noktayı kaçırmazsın.
.llm formatı vocab'ı gömülü taşır. Bir checkpoint'i farklı bir vocab'la üretilmiş .bin üzerinde sürdürmeye çalışırsan workbench uyarır — embedding tabloları uyuşmaz.
Adım 3 — Generate (çıktı üret)
Bir .llm yükle, prompt yaz, token'lar aksın. Sampling ayarları "bir sonraki token nasıl seçilsin"i belirler (07 Cross-Entropy'deki olasılık dağılımından örnekleme):
| Ayar | Varsayılan | Ne yapar |
|---|---|---|
| temperature | 0.8 | Dağılımı keskinleştirir/yumuşatır. Düşük = güvenli/tekrarlı, yüksek = serbest/dağınık. 0'a yakın ≈ hep en olası token. |
| top-k | 40 | Sadece en olası k token arasından seç; gerisini ele. |
| top-p | 0.95 | Olasılığı toplamı p'yi geçene kadarki en küçük kümeden seç (nucleus). |
| min-p | 0 | En olası token'ın p'sinin bu oranının altındaki adayları ele. |
| rep (tekrar cezası) | 1.1 | Daha önce geçen token'ların olasılığını kısarak döngüye girmeyi engeller. |
| tokens | 64 | Üretilecek azami token sayısı. |
Uygulama sırası: önce temperature, sonra tekrar cezası, ardından top-k → min-p → top-p süzgeçleri, en sonda örnekleme. Sağlam başlangıç: temp 0.7–0.9, top-p 0.9–0.95, rep 1.1.
Hazır reçete — Türkçe küçük model (~40M)
Doğrulanmış, çalışan bir başlangıç:
Model:
d_model 512
n_heads 8
n_kv_heads 2 (GQA)
n_layers 8
d_ff mult 4×
activation SwiGLU
→ ~40M parametre
Pretrain:
seq_len 512
lr 3e-4 (cosine; min_lr %10)
steps 50k–100k
grad_accum 4
warmup 5%
optimizer AdamW (fp32) (100M+ ise 8-bit)
precision mixed (f16 W)
label_smooth 0.05
z_loss 1e-4
weight_decay 0.1
grad_clip 1.0Üzerine soru-cevap fine-tune:
Aynı model paramları — DEĞİŞTİRME
seq_len 512
lr 5e-5 ← çok düşür
steps 1k–3k ← kısa tut
grad_accum 2
warmup 1%
min_lr 30%
weight_decay 0.01Hangi model ne kadar? (kabaca, M3 Pro)
| d_model | n_layers | ~Parametre | ~Bellek | Hız |
|---|---|---|---|---|
| 256 | 6 | ~7M | 200 MB | ~12 step/s |
| 384 | 6 | ~19M | 500 MB | ~7 step/s |
| 512 | 8 | ~39M | 930 MB | ~3 step/s |
| 768 | 12 | ~110M | 2.5 GB | ~1 step/s |
(vocab=16K, seq=512 varsayımı; gerçek sayı vocab ve d_ff ile değişir.)
İşe yarayan alışkanlıklar
- Önce sanity: Gerçek run'dan önce küçük config + 100 step ile boru hattının çalıştığını gör.
- Save Best'e güven — overfit başlasa bile en iyi noktayı tutar, dosya küçük.
- Pretrain → fine-tune geçişinde lr'yi mutlaka düşür (1/3–1/10).
- Aynı tokenizer — pretrain ve fine-tune aynı vocab'ı paylaşmalı.
- Bilgisayar uyumasın — uzun run'da uyku WebGPU bağlamını düşürür, run çöker.
- Val loss'a bak, sadece train loss'a değil — ayrışma overfit demektir.
Sık yapılan hatalar
- ❌ Fine-tune'da pretrain lr'sini korumak → catastrophic forgetting (model bildiğini unutur).
- ❌ Yeni vocab + eski checkpoint → embedding uyuşmaz, model çöker.
- ❌ Çok yüksek lr (3e-3) → loss patlar (NaN);
grad_clipson savunma. - ❌ Küçük corpus'a 50k step fine-tune → harf harf ezber + saçmalama.
- ❌ Küçük corpus'ta çok büyük seq_len → pencereler yarı boş, verim düşer.
- ❌ SFT/fine-tune ile yeni bilgi öğretmeye çalışmak → halüsinasyon. Bilgi pretrain'de girer; fine-tune sadece "nasıl aktaracağını" öğretir.
Sonraki
Düğmelerin arkasında ne döndüğünü merak ettin mi? Genel Bakış tüm pipeline'ı, ardından her kernel kendi etüdünü açıyor — embedding'den AdamW'ye, satır satır.