llm.istanbul·Etüt
TR EN
Workbench →

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, .llm checkpoint 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.

  1. Metin dosyalarını bırak (.txt, .md, …). Birden çok olabilir; "browse folder" klasörü özyineli tarar.
  2. Vocab size seç — sözlükteki token sayısı.
VocabNe zaman
8K–16KKüçük corpus, dar alan
32KTürkçe için iyi denge ⭐
64K (varsayılan)Geniş corpus; embedding tablosu da büyür
İpucu

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.

  1. "Train BPE & Export .bin" — GPU'da merge'leri koşar, sonra tüm metni token'layıp .bin indirir. İstersen sözlüğü .json olarak da ayrı kaydedebilirsin, ama .bin zaten vocab'ı içinde taşıyor.
Önemli

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:

PresetNe içinlrstepsgrad_accumwarmupmin_lrweight_decaygrad_clip
Fresh pretrainSıfırdan eğitim3e-450k45%10%0.11.0
Continue pretrainCheckpoint'ten devam1e-430k410%10%0.10.5
Fine-tuneHazır modeli göreve uyarla5e-510k21%30%0.010.5
Not

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ğerKullanım
64–256Oyuncak / sanity
384–512Küçü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). 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

Önemli

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.
Not

.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):

AyarVarsayılanNe yapar
temperature0.8Dağı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-k40Sadece en olası k token arasından seç; gerisini ele.
top-p0.95Olasılığı toplamı p'yi geçene kadarki en küçük kümeden seç (nucleus).
min-p0En olası token'ın p'sinin bu oranının altındaki adayları ele.
rep (tekrar cezası)1.1Daha önce geçen token'ların olasılığını kısarak döngüye girmeyi engeller.
tokens64Ü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.01

Hangi model ne kadar? (kabaca, M3 Pro)

d_modeln_layers~Parametre~BellekHız
2566~7M200 MB~12 step/s
3846~19M500 MB~7 step/s
5128~39M930 MB~3 step/s
76812~110M2.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

  1. Önce sanity: Gerçek run'dan önce küçük config + 100 step ile boru hattının çalıştığını gör.
  2. Save Best'e güven — overfit başlasa bile en iyi noktayı tutar, dosya küçük.
  3. Pretrain → fine-tune geçişinde lr'yi mutlaka düşür (1/3–1/10).
  4. Aynı tokenizer — pretrain ve fine-tune aynı vocab'ı paylaşmalı.
  5. Bilgisayar uyumasın — uzun run'da uyku WebGPU bağlamını düşürür, run çöker.
  6. 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_clip son 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.

WGSL kernel etüdleri · WebGPU üzerinde sıfırdan LLMİstanbul’da Uğur Toprakdeviren tarafından hazırlandı.