Skip to content
Öğrencilere ve Mezunlarımıza Özel %20 İndirim Sepette!
Bir LLM Aslında Nedir? İndirdiğiniz Dosyanın İçinde Ne Var?

Bir LLM Aslında Nedir? İndirdiğiniz Dosyanın İçinde Ne Var?

Erkan ŞİRİN|

Bir modeli indirdiniz, diskinizde 16 GB'lık bir dosya duruyor ve çalıştırınca size Türkçe cevap veriyor. Peki o dosyanın içinde ne var? Bu yazıda bir LLM'i parça parça açacağız: dosyanın anatomisi, "8B" neyi sayıyor, o sayılar nasıl oluştu ve siz bir soru sorduğunuzda tam olarak ne oluyor.

Bu yazıya "LLM kullanıyorum, hatta lokalde model çalıştırdım ama kaputun altında ne döndüğünü hiç bilmiyorum" diyerek geldiyseniz tam yerindesiniz. Sonunda bir model kartına bakıp Llama-3.1-8B-Instruct-Q4_K_M ya da 671B-A37B gibi bir ismin her parçasının ne anlattığını okuyabileceksiniz — ve daha önemlisi, model çalışırken hangi sayının nereye gittiğini kafanızda canlandırabileceksiniz.

Bir uyarıyla başlayalım, çünkü çoğu kafa karışıklığının kaynağı bu: model bir program değildir. İçinde "eğer kullanıcı selam derse merhaba de" diye bir satır yok. Dilbilgisi kuralları yok, sözlük yok, cevap veritabanı yok. İçinde yalnızca sayılar var — milyarlarca tane, hiçbirinin tek başına anlamı olmayan ondalık sayı. Yazının tamamı bu tuhaf gerçeğin açıklaması.

1. Dosyanın İçinde Ne Var?

Hugging Face'ten bir model indirdiğinizde karşınıza çıkan asıl dosyalar .safetensors uzantılıdır. Bu format, adı üstünde, PyTorch'un eski .bin (pickle) formatının güvenli alternatifi olarak çıktı: eski format dosyayı açarken içindeki kodu çalıştırabiliyordu, dolayısıyla indirdiğiniz bir model teorik olarak makinenizde kod koşturabilirdi. Safetensors bunu kökten keser, çünkü içinde çalıştırılacak hiçbir şey yoktur[1][2].

Yapısı şaşırtıcı derecede sade. Dosyanın başında bir JSON başlık var: hangi tensörün adı ne, veri tipi ne, şekli ne ve dosyanın neresinden başlıyor. Başlığın ardından da o tensörlerin ham baytları arka arkaya dizilmiş durumda. Hepsi bu[2][25].

model.safetensors — dosyanın anatomisiJSONbaşlık"katalog"ham tensör baytları — arka arkaya, başka hiçbir şey yokembed128256×4096W_Qkat 0W_KW_VW_Ofeed-forwardkat 0 · 3 matriskat 1, kat 2, … kat 31aynı desen 31 kez dahaBaşlıktan bir satır:"model.layers.0.self_attn.q_proj.weight": {"dtype": "BF16", "shape": [4096, 4096],"data_offsets": [1052770304, 1086324736]Başlık sadece bir katalog:hangi sayı yığını neredebaşlıyor, ne şekilde okunacak.Çalıştırılabilir kod içermez.
Şekil 1 — Bir safetensors dosyası iki parçadan ibaret: neyin nerede olduğunu söyleyen JSON başlık ve onun ardından gelen ham sayılar. Dosyanın içinde mantık, kural ya da kod yok [1][2].

Buradan çok önemli bir ayrım çıkıyor: model = mimari + ağırlıklar, ve bu ikisi ayrı yerlerde durur. Mimari — kaç katman var, katmanlar nasıl bağlanıyor, hangi sırayla ne çarpılıyor — transformers gibi bir kütüphanenin kodudur. İndirdiğiniz dosya ise o mimarinin içine dökülecek sayılardır. Aynı mimariye farklı ağırlıklar koyarsanız bambaşka bir model elde edersiniz; ağırlıkları koymazsanız elinizde saçmalayan boş bir iskelet kalır.

2. "8B" Neyi Sayıyor?

Model isimlerindeki 8B, 70B, 671B ifadeleri parametre sayısını söyler. Parametre, eğitim sırasında ayarlanan tek bir sayıdır — az önceki matrislerin içindeki tek bir hücre. 8B demek, ayarlanmış 8 milyar sayı demek.

Buradan dosya boyutuna geçmek basit bir çarpma: her parametrenin kaç bayt yer kapladığını bilmeniz yeter. Modern modeller genelde bf16 (16 bit, yani 2 bayt) olarak yayımlanır[3]:

Hassasiyet Parametre başına 8,03 milyarlık model Pratik durum
fp32 4 bayt ~32,1 GB Artık nadir; eğitimde bile karışık hassasiyet tercih ediliyor
bf16 / fp16 2 bayt ~16,1 GB Yayımlanan varsayılan; tek 24 GB'lık karta ancak sığar
fp8 1 bayt ~8,0 GB Yeni kartlarda donanım desteği var, kalite kaybı çok küçük
4 bit (Q4_K_M) ~0,56 bayt ~4,9 GB Dizüstü bilgisayarda çalışır; ölçülebilir ama çoğu iş için kabul edilebilir kayıp

Bu tablo, "8 milyar parametreli modeli 8 GB'lık ekran kartımda çalıştırabilir miyim?" sorusunun cevabıdır: bf16 ile hayır, 4 bit ile evet[4][5]. Quantization (nicemleme) denen işlem tam olarak budur — her sayıyı daha az bitle temsil etmek. Sezgiye aykırı gelen kısmı şu: 16 bitlik bir sayıyı 4 bite indirdiğinizde modelin cevap kalitesi çökmüyor, sadece hafifçe bozuluyor. Çünkü bu sayıların hiçbiri tek başına kritik değil; anlam milyarlarcasının ortak davranışında.

Dikkat: Model dosyası belleğe sığdı diye iş bitmiyor. Modelin yanında bir de KV cache için yer ayırmanız gerekiyor — 7. bölümde göreceğiz, uzun context'te bu, modelin kendisi kadar yer kaplayabiliyor.

3. Peki O Sayılar Modelin Neresinde Duruyor?

Cevaba geçmeden önce modelin bir hattı olduğunu görelim, çünkü bundan sonra sık kullanacağım "giriş" ve "çıkış" kelimeleri bu hattın iki ucunu anlatıyor.

Bir LLM tek yönlü bir boru hattı gibi çalışır. Girişte metin yoktur — tokenizer cümlenizi parçalara ayırır ve her parçaya sözlükteki sıra numarasını verir; modele giren şey bu numaralardır. İlk iş, her numaranın karşılığındaki vektörü bir tablodan bulup çıkarmaktır. Sonra bu vektörler 32 katmanın içinden sırayla geçer; her katman onları biraz daha bağlamla zenginleştirir ama boyutlarını hiç değiştirmez — girişte 4096 sayı, 32 katman sonra yine 4096 sayı. Çıkışta ise son vektör tekrar sözlük boyutuna açılır: 128.256 aday token'ın her biri için bir skor. Modelin ürettiği ham çıktı budur — bir kelime değil, 128.256 sayı.

Modelin hattı: numara girer, skor çıkarGİRİŞ"kedi mindere oturdu"tokenizer ↓7498598342201embedding tablosu ↓128.256 × 4096her token → 4096 sayı~525 milyon parametre32 KATMAN — hep aynı desenattentionfeed-forwardkatman 1attentionfeed-forwardkatman 2· · ·attentionfeed-forwardkatman 32boyuthep4096~6,98 milyar parametre (attention + feed-forward)ÇIKIŞ4096 × 128.256128.256 aday için skor ↓oturduuzandıçıktı…bir kelime değil, 128.256 sayı~525 milyon parametreİki uçtaki tablolar  sahip — biri numarayı vektöre çevirir, öteki vektörü skorlara açar.
Şekil 2 — Modelin hattı. "Giriş" tokenizer'dan gelen numaraların vektöre çevrildiği uç, "çıkış" ise son vektörün 128.256 aday için skora dönüştüğü uç. Aradaki 32 katman vektörlerin boyutunu hiç değiştirmez, yalnızca içeriklerini zenginleştirir [3][6].

Şimdi parametreleri bu hattın üzerine yerleştirebiliriz.

İki uçtaki tablolar. Her ikisi de 128.256 × 4096 şeklinde, yani ~525'er milyon parametre. Llama 3 8B'de bunlar ayrı ayrı öğrenilir — yapılandırma dosyasında tie_word_embeddings: false yazar[3][6]. Bazı küçük modellerde ise tek bir tablo iki uçta paylaşılır ve model bir hamlede yarım milyar parametre tasarruf eder.

Tekrar eden katmanlar. İşin bel kemiği. Llama 3 8B'de 32 tane özdeş yapıda katman var ve her birinin içinde iki alt bölüm bulunuyor: attention bölümü (token'ların birbirine bakmasını sağlayan WQ, WK, WV, WO matrisleri)[23] ve feed-forward bölümü (her token'ı tek tek işleyen, çok daha geniş üç matris).

Bir dakika — "katmanın içinde iki alt bölüm" da ne demek?

Burada durup bir terim kazasını çözelim, çünkü "katman" kelimesi iki farklı şeyin adı ve ikisi karıştırılınca bu bölümün tamamı anlaşılmaz oluyor.

Sinir ağı denince akla gelen klasik şemayı düşünün: yan yana nöron sütunları, aralarında oklar. O şemada katman = bir nöron sütunudur; bir matris çarpımı, bir aktivasyon, bitti. Transformer'da ise katman = bir bloktur, yani o klasik şemadaki birkaç katmanın paketlenmiş hali. İngilizce kaynaklarda buna transformer block ya da decoder layer deniyor — ama "layer" kelimesi ikisi için de kullanıldığından karışıklık kaçınılmaz oluyor.

Farkın asıl kaynağı şu: klasik şemada ağdan geçen şey tek bir vektördür. Transformer'da geçen şey bir vektör dizisidir — cümlede kaç token varsa o kadar vektör, alt alta. Klasik şemada bunun karşılığı yoktur, ve bu fark her şeyi değiştirir: artık iki ayrı yönde karıştırma yapmanız gerekir.

Alt bölüm 1 — attention. Token'ların birbirine baktığı yer. "oturdu"nun vektörüne "kedi"nin vektöründen bilgi taşır. Klasik şemada böyle bir hareket olamaz; orada tek vektör vardır, kiminle konuşacak?

Alt bölüm 2 — feed-forward. Her token'ın tek başına işlendiği yer; diğer token'lara hiç bakmaz. 4096 sayıyı alır, 14336'ya açar, tekrar 4096'ya indirir. Ve işin güzel tarafı şu: bu, tam da yukarıda tarif ettiğim klasik şemanın kendisidir. Yani o resim yanlış değil — bir transformer katmanının yarısının içinde ne olduğunu gösteriyor.

① Klasik sinir ağı şeması — burada "katman" bir nöron sütunudurtek vektörgirertek vektörçıkarbu bir "katman"Diziden, cümleden, token'dan haber yok. Bir vektör girer, bir vektör çıkar.② Transformer katmanı — burada "katman" bir ; ve akan şey bir vektör 
Şekil 3 — Aynı kelime, iki farklı şey. Üstte klasik şema: katman bir nöron sütunu, akan şey tek bir vektör. Altta transformer katmanı: bir blok, ve içinden bir vektör dizisi geçiyor. Attention satırlar arasında, feed-forward satırların içinde karıştırıyor — ve feed-forward'ın içindeki ağ, üstteki şemanın ta kendisi [6][23].

Bu bölümleme benim uydurduğum bir kolaylık da değil; kodda birebir böyle duruyor. Bir katman nesnesinin içinde tam olarak iki alt modül var[6]:

model.layers[0]          # "katman 0" — bir blok
├── self_attn            # W_Q, W_K, W_V, W_O
└── mlp                  # gate, up, down  (klasik şemadaki ağ)

model.layers[1]
├── self_attn
└── mlp
...  32 kez

Son bir not: her iki alt bölümün de çıktısı, girdisinin üzerine eklenir. Buna residual connection (artık bağlantı) deniyor[23]. Yani attention da feed-forward da vektörü baştan yazmaz, ona bir düzeltme ekler. Bir önceki şemada "boyut hep 4096 kalır" diyebilmemizin sebebi tam olarak budur — ve 32 katmanın üst üste binebilmesinin de.

Peki bu bölgeler parametre bütçesini nasıl paylaşıyor? Llama 3 8B'nin yapılandırma değerlerinden hesaplayalım — sonuç çoğu kişiyi şaşırtıyor:

Llama 3 8B'nin 8,03 milyar parametresi nereye gidiyor?Feed-forward katmanları5,64 milyar · %70,2Attention matrisleri1,34 milyar · %16,7Embedding tabloları1,05 milyar · %13,1Herkes attention'ı konuşuyor ama parametrelerin çoğu feed-forward'da.Attention mimarinin fikri; feed-forward ise modelin ağırlığını taşıyan yer.Tek bir katmanın içi (32 katmanın her biri böyle)W_QW_KW_VW_Oattention · ~41,9 milyon parametregateupdownfeed-forward · ~176,2 milyon parametre (4 katı)
Şekil 4 — Parametre bütçesi. Attention katmanlara adını veriyor ama sayıların %70'i feed-forward bölümünde duruyor. Kutuların genişliği gerçek parametre oranlarını yansıtıyor [3][6][7].

Buradaki asimetriyi akılda tutmakta fayda var: bir modeli küçültmeye ya da hızlandırmaya çalışırken sadece attention'a bakmak yetmez, ağırlığın çoğu başka yerde[7][8]. Attention'ın içeride tam olarak ne yaptığı ise başlı başına bir konu — yazının sonunda oraya yönlendireceğim.

4. Token: Modelin Alfabesi

Model harflerle de kelimelerle de çalışmaz; token denen ara birimlerle çalışır. Token bazen bütün bir kelime, bazen bir kelimenin parçası, bazen tek bir noktalama işaretidir. Sebebi pratik: harf bazlı çalışmak dizileri gereksiz uzatır, kelime bazlı çalışmak ise sözlükte olmayan her kelimede sistemi kilitler. Token ikisinin arasındaki tatlı nokta.

Llama 3'ün kelime dağarcığı 128.000 token içeriyor ve Meta bu tokenizer'ın Llama 2'ye kıyasla aynı metni %15'e kadar daha az tokenla ifade ettiğini söylüyor[9]. Bu detay önemli, çünkü token sayısı doğrudan paranız ve context'iniz demek.

Ve burada Türkçe konuşanları ilgilendiren bir mesele var

Bu tokenizer'lar ezici çoğunlukla İngilizce metinle eğitiliyor. Sonuç şu: İngilizce bir kelime çoğunlukla tek token'a sığarken, eklerle uzayan diller kelime başına çok daha fazla token harcıyor. On temel modelin tokenizer'ını 24 Avrupa dilinde ölçen bir çalışma bu farkı net gösteriyor: İngilizce kelime başına ~1,2 token'da kalırken, Fince ve Macarca gibi eklemeli (agglutinative) diller 2,7–3,0 bandına çıkıyor[10].

Çalışmada Türkçe yok — ama Türkçe de tam olarak o gruba, eklemeli diller ailesine ait. Türkçe için yapılan ayrı ölçümler de yaygın tokenizer'larda kelime başına 1,8–2,9 token aralığını raporluyor[11][12].

Tokenizer neden Türkçeye daha pahalıya patlıyor?İngilizcede kök ve ekler ayrı kelimeler — çoğu tek token:fromourbooks→ 3 kelime, 3 tokenTürkçede aynı anlam tek kelimeye sıkışıyor, tokenizer onu parçalıyor:kitaplarımızdan→ 1 kelime, 4 token(parçalanma şematiktir; gerçek bölünme tokenizer'dan tokenizer'a değişir)Ölçülen: kelime başına token sayısıİngilizce1,2Almanca, Felemenkçe1,7 – 1,9Fince, Macarca (eklemeli)2,7 – 3,0Türkçe bu ölçümde yok — amaaynı ailede. Türkçe için ayrıçalışmalar 1,8 – 2,9 diyor.Yani aynı metin ~2 kat pahalı.
Şekil 5 — Aynı anlam Türkçede tek kelimeye sıkıştığı için tokenizer onu parçalara ayırıyor. Pratik sonucu: aynı metin için daha çok token, yani daha yüksek fatura ve daha çabuk dolan context [10][11][12].

Bunun günlük hayattaki karşılığı net: API'den token başına ödeme yapıyorsanız aynı metin için İngilizceye göre yaklaşık iki katı ödüyorsunuz, ve 128K'lık bir context penceresi Türkçe metinde İngilizcedeki kadar uzağa gitmiyor.

5. Bu Sayılar Nasıl Oluştu? — Pre-training

Şimdi asıl soruya geldik: milyarlarca sayının değerini kim belirledi? Cevap kimse — daha doğrusu, hiçbir insan tek tek belirlemedi. Süreç şöyle işliyor.

Başlangıçta bütün matrisler rastgele sayılarla dolu. Model bu hâliyle tam bir zırva üretiyor. Sonra tek ve çok basit bir alıştırma başlıyor: devasa bir metin yığınından bir parça al, son kelimeyi kapat, modele "sıradaki token ne?" diye sor.

Model bir tahmin üretir. Tahmin yanlıştır. Yanlışlığın büyüklüğü bir sayıya çevrilir (buna loss, yani kayıp denir). Ardından backpropagation devreye girer: bu hata sinyalini ağın içinden geriye taşır ve her parametre için "sen bu hataya ne kadar sebep oldun, hangi yöne kıpırdasan hata azalırdı?" sorusunu cevaplar. Her parametre o yönde çok küçük bir adım atar. Sonra bir sonraki metin parçası gelir, döngü yeniden başlar.

Bu döngünün büyüsü, milyarlarca kez tekrarlanmasında. Llama 3, herkese açık kaynaklardan toplanmış 15 trilyondan fazla token üzerinde eğitildi[9][24]. Etiketli veri gerekmedi; doğru cevap zaten metnin kendisinde duruyordu.

Pre-training döngüsü — trilyonlarca kez tekrarlanırmetinden parça"kedi mindere ___"model tahmin eder"uçtu" (%31)hata ölçülürdoğrusu: "oturdu"backpropagation"kim suçlu?"her sayıazıcık kıpırdar…ve sıradaki metin parçasıyla baştanÖlçek fikri versin diye: Llama 315.000.000.000.000eğitimde görülen token8.030.000.000ayarlanan parametre~1.870parametre başına düşen token
Şekil 6 — Pre-training tek bir alıştırmanın milyarlarca kez tekrarı: tahmin et, hatayı ölç, suçu dağıt, her sayıyı azıcık düzelt. Bu döngünün sonunda geriye kalan tortu, indirdiğiniz dosyadır [9].

Şekildeki son kutu ilginç bir hikâye anlatıyor. 2022'de yayımlanan Chinchilla çalışması, belli bir eğitim bütçesi için en verimli dağılımın parametre başına yaklaşık 20 token olduğunu göstermişti[13][14]. Llama 3 8B'de bu oran 1.870 — yani "en verimli" noktanın neredeyse yüz katı veri.

Bu bir hata değil, bilinçli bir tercih. Chinchilla eğitim maliyetini optimize ediyor. Ama bir model bir kez eğitilip milyonlarca kez çalıştırılıyor; dolayısıyla asıl fatura eğitimden değil, inference'tan geliyor. Küçük bir modeli "gereğinden fazla" eğitmek, sonsuza kadar daha ucuz çalışan bir model demek. Son yılların küçük ama şaşırtıcı derecede iyi modellerinin sırrı büyük ölçüde bu.

6. Base Model Sohbet Etmez — Post-training

Pre-training biter, elinizde bir base model vardır. Ve base model sandığınız şey değildir: sohbet etmez, talimat dinlemez. Yaptığı tek şey metni devam ettirmektir, çünkü öğrendiği tek beceri bu.

Base model'a "Türkiye'nin başkenti neresidir?" diye sorarsanız cevap vermek yerine soruyu çoğaltabilir — internette bu cümle genelde bir sınav sorusu listesinin içinde geçtiği için:

Aynı girdi, iki farklı modelBASE MODELyalnızca pre-training gördü"Türkiye'nin başkenti neresidir?"↓ devam ettirir:"2. Fransa'nın başkenti neresidir? 3. İtalya'nın…"INSTRUCT MODELüstüne post-training gördü"Türkiye'nin başkenti neresidir?"↓ cevap verir:"Türkiye'nin başkenti Ankara'dır."İkisi de  sahip. Fark bilgide değil,  — post-training modele bilgi eklemez, ne yapacağını öğretir.
Şekil 7 — Base model metni devam ettirir, instruct model soruyu cevaplar. Model kartlarındaki "-Instruct" ya da "-Chat" eki tam olarak bunu anlatır (örnek tepkiler temsilîdir).

Base model'ı asistana çeviren aşamaya post-training deniyor ve iki ana adımdan oluşuyor. Birincisi SFT (supervised fine-tuning): insanlar tarafından yazılmış "şöyle sorulunca böyle cevap verilir" örnekleriyle modeli eğitmek[15]. İkincisi tercih optimizasyonu: aynı soruya üretilen iki cevaptan hangisinin daha iyi olduğu insanlara sorulur, model iyi bulunana yaklaşacak şekilde ayarlanır. Llama 3'te bu aşamada SFT, rejection sampling, PPO ve DPO birlikte kullanıldı[9][16].

Pratik sonuç: Bir instruct model'i kendi kodunuzdan çağırırken chat template'ini doğru uygulamak zorundasınız — mesajları hangi özel token'larla sarmaladığınız modelin eğitimde gördüğü kalıpla eşleşmezse kalite belirgin biçimde düşer. Bu, lokalde model çalıştıran ekiplerin en sık düştüğü tuzaklardan biri.

7. Siz Soru Sorduğunuzda Ne Oluyor?

Eğitim bitti, dosya diskinizde. Şimdi bir soru soruyorsunuz. Model ne yapıyor?

Sürpriz olabilir ama model cevabı bir bütün olarak düşünmüyor. Her seferinde tek bir token üretiyor, ürettiğini girdinin sonuna ekliyor ve baştan başlıyor. Buna autoregressive (özbağlanımlı) üretim deniyor. Ekranda akan cevap, saniyede onlarca kez tekrarlanan bu döngünün görüntüsü.

Her adımda modelin çıkışında kelime dağarcığının tamamı için — Llama 3'te 128.256 aday için — bir olasılık dağılımı oluşuyor. Sonraki token bu dağılımdan seçiliyor ve nasıl seçildiğini siz ayarlıyorsunuz[17][18]:

Ayar Ne yapar Ne zaman
temperature Dağılımı sivrileştirir ya da düzleştirir. 0'a yakın: hep en olası token. Yüksek: düşük olasılıklı adaylar da şans bulur Kod ve veri çıkarımı için düşük (0–0,3); yaratıcı metin için yüksek (0,8–1,2)
top_p Adayları olasılığa göre sıralayıp toplamı p'ye ulaşana kadarını tutar, gerisini eler Genelde 0,9–0,95. Saçma adayları eler ama çeşitliliği öldürmez
top_k Yalnızca en olası k adayı tutar top_p'nin daha kaba akrabası; ikisi birlikte de kullanılabilir

"Aynı soruya neden her seferinde farklı cevap alıyorum?" sorusunun cevabı burada. Model değişmiyor — dağılımdan yapılan seçim rastgele. temperature=0 derseniz seçim rastgele olmaktan çıkar ve büyük ölçüde aynı cevabı alırsınız.

KV cache: aynı işi iki kez yapmamak

Döngünün maliyetli bir yanı var. Her yeni token'da modelin, o ana kadarki bütün metni yeniden işlemesi gerekir. 500 token'lık bir cevabın 500. adımında, ilk 499 token için aynı hesapları 499. kez yapmak akıl kârı değil.

Çözüm KV cache: modelin her token için hesapladığı ara değerler (key ve value tensörleri) bellekte tutulur, sonraki adımlarda yeniden hesaplanmaz[19]. Llama 3'te bu cache'in görece küçük kalmasının sebebi de GQA: birden fazla query head aynı key/value çiftini paylaşıyor[22]. Bu yüzden üretim iki faza ayrılır — prompt'un tamamının bir kerede işlendiği prefill ve token token ilerleyen decode.

Bedeli bellek. Llama 3 8B'de token başına 128 KB KV cache tutulur. Zararsız görünüyor, ta ki çarpana kadar:

Üretim döngüsü: her adımda tek tokengirdi (prompt)"kedi mindere"32 katmantüm ağırlıklar128.256 aday içinolasılık dağılımıörneklemetemperature, top_p"oturdu"1 tokenüretilen token girdinin sonuna eklenir ve döngü baştan başlarKV cache bedeli (Llama 3 8B · token başına 128 KB)8.192 token context1,1 GB32.768 token context4,3 GB131.072 token context17,2 GB — modelin kendisinden bile büyükUzun context'in pahalı olmasının sebebi sadece hesap değil; her token'ı hatırlamak için ayrılan bu bellek de.
Şekil 8 — Üstte üretim döngüsü: model her turda tek bir token üretip onu girdiye ekler. Altta KV cache bedeli — 128K context'te ayrılan bellek, bf16 model dosyasının boyutunu geçiyor [17][19].

8. Model Kartını Okumak

Artık bir model ismindeki her parçayı çözebilirsiniz. Örnek üzerinden gidelim:

Parça Anlamı
Llama-3.1 Aile ve sürüm — mimariyi ve eğitim reçetesini belirler
8B Parametre sayısı. bf16'da ~16 GB dosya demek
Instruct Post-training görmüş. Bu ek yoksa elinizdeki base model'dır ve sohbet etmez
Q4_K_M 4 bite quantize edilmiş GGUF sürümü. ~4,9 GB; dizüstü bilgisayarda çalışır
128K Context penceresi: prompt + cevap toplamda kaç token olabilir
671B-A37B MoE modeli: 671 milyar parametre var ama her token için yalnızca 37 milyarı çalışıyor

Son satır ayrı bir paragrafı hak ediyor, çünkü 2026'nın en yaygın mimari deseni bu. Mixture of Experts (MoE) modellerde feed-forward bölümü tek bir blok değil, onlarca "uzman"a bölünmüş durumda ve her token için yalnızca birkaçı devreye giriyor[20]. DeepSeek-V3 bunun bilinen örneği: toplam 671 milyar parametre, token başına aktif 37 milyar[21].

Buradaki takas çok net ve pratikte can yakıcı: hız aktif parametreye, bellek ihtiyacı toplam parametreye bağlıdır. Yani 37 milyarlık bir modelin hızını alırsınız ama 671 milyarlık bir modeli belleğe sığdırmak zorundasınızdır. "Ucuz çalışıyor" demek "ucuz kurulur" demek değil.

Toparlayalım

Baştaki soruya dönelim: indirdiğiniz dosyanın içinde ne var? Cevap artık tek cümleye sığıyor — bir metin yığınında sonraki token'ı tahmin etmeye çalışırken milimetrik olarak ayarlanmış milyarlarca sayı.

O sayılar embedding tablosunda, tekrar eden 32 katmanda ve çıkış katmanında duruyor. Çoğunluğu feed-forward bölümünde. Siz soru sorunca model bunları kullanarak 128 bin aday arasında bir olasılık dağılımı üretiyor, oradan bir token seçiliyor, döngü baştan başlıyor. Aradaki hesabı tekrarlamamak için KV cache tutuluyor; onun da bedeli bellek.

Peki en kritik parça? Bir katmanın içindeki attention bölümü — yani token'ların birbirine bakıp bağlam kurduğu yer. Bu yazıda ona kasten girmedim, çünkü tek başına bir yazıyı hak ediyor. "kedi mindere oturdu" cümlesinde "oturdu"nun neden "kedi"ye uzandığını, WQ, WK ve WV matrislerinin o çarpımlarda tam olarak ne yaptığını gerçek rakamlarla görmek isterseniz sıradaki durak Self-Attention: Bir Kelime Diğerlerine Nasıl Bakar? yazısı.

Ama önce şunu yapın: bir model indirin, config.json'ını açın ve bu yazıdaki hesapları kendi modelinizle tekrarlayın. Kaç katman var, embedding boyutu kaç, parametrelerin ne kadarı feed-forward'da? On dakikalık bir alıştırma ve bu yazının tamamını okumaktan daha çok şey öğretiyor. Daha da derine inmek isterseniz Sebastian Raschka'nın sıfırdan LLM inşa eden kitabı[26] bu yazının doğal devamı. Kolay gelsin!


Kaynaklar

  1. Hugging Face — safetensors (GitHub)
  2. DataCamp — SafeTensors Format: A Guide to Secure ML Model Serialization
  3. Llama 3 8B — config.json (hidden_size, head counts, layer count)
  4. General Compute — Quantization Explained: INT4, GGUF, GPTQ
  5. LLM Hardware — Quantization Guide: Q4 vs Q8 vs FP16 and VRAM Trade-offs
  6. Hugging Face Docs — Llama Model Documentation
  7. Michael Wornow — Transformer Math: Counting Model Parameters
  8. Vizuara — Two-Thirds of Trainable Parameters in GPT Belong to the MLP, Not the Attention Heads
  9. Meta AI — Introducing Meta Llama 3
  10. The Tokenizer Tax Across 24 European Languages
  11. Tokens with Meaning: A Hybrid Tokenization Approach for Turkish
  12. Impact of Tokenization on Language Models: An Analysis for Turkish (ACM TALLIP)
  13. Hoffmann et al. — Training Compute-Optimal Large Language Models (Chinchilla)
  14. Epoch AI — Chinchilla Scaling: A Replication Attempt
  15. Ouyang et al. — Training Language Models to Follow Instructions with Human Feedback (InstructGPT)
  16. Rafailov et al. — Direct Preference Optimization (DPO)
  17. Sebastian Raschka — How Do Temperature, Top-k and Top-p Sampling Differ?
  18. Machine Learning Plus — LLM Sampling Parameters Explained
  19. Kwon et al. — Efficient Memory Management for LLM Serving with PagedAttention
  20. How AI Works — Mixture of Experts Explained
  21. DeepSeek-AI — DeepSeek-V3 Technical Report
  22. Ainslie et al. — GQA: Training Generalized Multi-Query Transformer Models
  23. Vaswani et al. — Attention Is All You Need
  24. Meta — Llama 3 Model Card (GitHub)
  25. DeepWiki — safetensors File Format Specification
  26. Sebastian Raschka — Build a Large Language Model (From Scratch)
  27. Kapak resmi: Photo by Robina Weermeijer on Unsplash
Back To Blog

Leave A Comment