Ana içeriğe atla

Veri Bilimi Okulu

LLM Quantization Nedir?
LLM Quantization Nedir?
quantization_blog_kapak_960x640

Llama 3.1 70B’nin ağırlıkları 140 GB; elinizdeki en iyi oyun kartında 24 GB var. Buna rağmen insanlar bu modeli evde çalıştırıyor. Bu yazıda quantization’ın ne olduğunu dört sayıyı elle yuvarlayarak göreceğiz, “4-bit” kelimesinin arkasındaki üç ayrı kararı ayıracağız ve modeli küçültürken neyi kaybettiğimizi ölçümlerle konuşacağız.

ChatGPT’ye ya da Claude’a soru yazdığınızda cevap bir sohbet kutusundan geliyor; ama o kutunun arkasındaki model aslında sayı dolu devasa bir dosya. Bu sayılara parametre ya da ağırlık (weight) deniyor; eğitim sırasında milyarlarca kez ayarlanıyor, eğitim bitince donuyor. Model çalışırken bu sayıların tamamının GPU belleğinde (VRAM) durması gerekiyor, çünkü üretilen her token için hepsi baştan sona bir kez okunuyor.

Quantization (nicemleme) tek cümle: aynı sayıları daha az byte ile saklamak. Geri kalan her şey bunu modeli bozmadan nasıl yapacağımızın mühendisliği.

1. Rakamlarla Başlayalım: 70 Milyar × 2 Byte

Açık ağırlıklı (open weights) dünyanın 2026’daki ağır topları Qwen3, DeepSeek-V3 ve Kimi K3. Hesabı yine de Meta’nın Llama 3.1 70B’si üzerinden yapacağım: dense (yoğun) bir model olduğu için çarpma dipnot istemiyor ve 6. bölümde alıntılayacağım kalite ölçümleri bu modelle yapılmış[7]. Model BF16 formatında yayımlandı, yani parametre başına 2 byte:

70 milyar × 2 byte = 140 GB. Sadece ağırlıklar; KV cache bunun üstüne geliyor.

Bir H100’de 80 GB var, RTX 4090’da 24 GB. Aynı modelleri farklı hassasiyetlerde (precision) yan yana koyunca quantization’ın neden bu kadar konuşulduğu görülüyor:

ModelParametreBF16 (2 byte)INT8 / FP8 (1 byte)4-bit (~0.5 byte)
Llama 3.1 8B8 Milyar16 GB — RTX 4090’a ancak8 GB4.6 GB — 8 GB’lık dizüstü kartına[11]
Llama 3.1 70B70 Milyar140 GB — 2× H10070 GB — tek H100~38 GB — 2× RTX 4090
Qwen3-235B-A22B235 Milyar470 GB — 8× H100 node’unun neredeyse tamamı235 GB~120 GB — 2× H100
DeepSeek-V3 / R1671 Milyar1.34 TB671 GB — FP8’de yayımlandı~340 GB
Kimi K32.8 Trilyon5.6 TB — hiç yayımlanmadı~1.5 TB — doğrudan MXFP4’te çıktı[22]

MoE modellerde token başına parametrelerin küçük bir kısmı çalışıyor ama hepsi bellekte durmak zorunda; bellek hesabı toplam parametre üzerinden. Son satıra dikkat: en büyük modeller artık BF16’da çıkıp sonra küçültülmüyor, sağlayıcı en baştan 4-bit veriyor.

Fikir 2022’de LLM’lere geldi: Tim Dettmers ve arkadaşlarının LLM.int8() çalışması 175 milyar parametrelik OPT’yi kalite kaybı olmadan 8-bit’e indirdi[1]; aynı yıl GPTQ 3–4 bit’e inip 175B’yi tek GPU’ya sığdırdı[3]. 2023’te Meta Llama’yı yayımladı, Georgi Gerganov’un llama.cpp’si bu modelleri MacBook’larda çalıştırdı[14]. O günden beri “lokal LLM” dediğimiz şeyin altyapısı quantization. GPTQ — GPT modelleri için post-training quantization; adı GPT + Quantization’dan geliyor (resmi bir açılımı yok, makale başlığı “Accurate Post-Training Quantization for Generative Pre-trained Transformers”)

2. Sayıları Nasıl Küçültüyoruz? Elle Yapalım

Quantization’ın özü yuvarlama, ama biraz akıllı bir yuvarlama. En basit haliyle absmax quantization[18][19]: bir grup ağırlığın mutlak değeri en büyük olanını bul; o değer hedef formatın en büyük tam sayısına (INT8 için 127, INT4 için 7) denk gelecek şekilde bir ölçek (scale) hesapla; her ağırlığı ölçeğe böl, en yakın tam sayıya yuvarla. Diske yazılan şey bu küçük tam sayılar + tek bir ölçek. Çalıştırırken tersini yaparsın: tam sayı × ölçek (dequantization).

Dört ağırlıkla deneyelim: [0.90, −1.20, 0.05, 2.40].

Şekil 1 — Absmax quantization elle. INT8’de hata binde birler mertebesinde; INT4’te ise küçük ağırlık tamamen kayboluyor. Alttaki senaryo, quantization’ın gerçek düşmanını gösteriyor: outlier’lar.

INT8 sütununda dört sayı da neredeyse kayıpsız geri okunuyor; hata binde 7. INT4’te ise elimizde −8 ile 7 arasında 16 kutu var ve 0.05 gibi küçük bir ağırlık sıfıra düşüyor: model o ağırlığı öğrenmek için emek harcamıştı, biz yuvarlayarak sildik. Yazının geri kalanının iskeleti bu iki gözlem: 8-bit neredeyse bedava; 4-bit ve altı akıl ister.

Alttaki kırmızı kutu ise quantization’ın gerçek düşmanını gösteriyor. Dettmers’in bulgusu şuydu: ~6.7 milyar parametreden itibaren Transformer’ların birkaç boyutunda diğerlerinden 20–60 kat büyük değerler (outlier) beliriyor[2]. Tek ölçekle quantize ettiğinizde bu birkaç sayı ölçeği öyle büyütüyor ki geri kalan on binlerce normal değer sıfıra yuvarlanıyor. Çözümü basit: ölçeği bütün matrise değil, her 32–128 ağırlıklık gruba ayrı ver (group quantization). Bir outlier artık sadece komşularını etkiliyor. Bedeli, grup başına fazladan bir ölçek saklamak; bu yüzden “4-bit” modeller aslında ağırlık başına 4.5–5 bit tutar[11].

3. “4-bit” Tek Bir Şey Değil: Üç Ayrı Karar

Hugging Face’te Llama-3.1-8B-AWQ-INT4 ile Llama-3.1-8B-Q4_K_M.gguf yan yana duruyor; ikisi de “4-bit” ama üç farklı kararın sonucu[20][21]. AWQ — Activation-aware Weight Quantization. GGML Universal File (GGML = Gerganov’un tensor kütüphanesi)

Şekil 2 — Aynı “4-bit” kelimesi üç ayrı kararı örtüyor. Bir modelin adını okurken üç sütunu ayrı ayrı sorun: kaç bit, hangi yöntemle, hangi dosyada?

Karar 1 — Sayı formatı: kaç bit, nasıl temsil?

Bit sayısı aynı olsa da temsil farklı olabiliyor; INT8 ile FP8 aynı şey değil. Bilmeniz gerekenler:

FormatNeNerede
BF16 (bfloat16, “brain floating point”)16 bit; modellerin yayımlandığı halReferans
FP8 (8-bit floating point)8-bit float; H100 ve sonrası donanımda doğrudan çarpıyorProd serving’in 2026 standardı[7]
INT8 (8-bit integer)−128…127 tam sayı + ölçek; A100’de de tensor core desteği varFP8’siz kartlarda
INT4 (4-bit integer) / NF4 (NormalFloat4)16 seviye + grup ölçeği; GPTQ, AWQ ve QLoRA (Quantized Low-Rank Adaptation)’nın çıktısıBellek sığdırma, tek kullanıcılı hız
MXFP4 (Microscaling FP4) / NVFP4 (NVIDIA FP4)4-bit float + blok ölçeği; Blackwell doğrudan hesaplıyorgpt-oss, Kimi K3, B200’de serving[15]
Q4_K_M, Q8_0, IQ2_XS…llama.cpp’nin kendi blok formatlarıGGUF dosyaları[11]

Kritik nokta son sütun: bir format ancak donanım onu doğrudan çarpabiliyorsa hız kazandırıyor. H100 FP8’i tensor core’da çarpıyor, A100 çarpamıyor; Blackwell FP4’ü doğrudan hesaplıyor, H100 INT4’ü önce BF16’ya çevirip öyle çarpıyor. NVIDIA’nın ölçümünde NVFP4, FP8’e göre 1.8× az bellekle DeepSeek-R1’de %1’in altında kayıp veriyor[15]; ama o rakam Blackwell’de geçerli, A100’e aynı dosyayı atarsanız ne o hızı ne o kernel’i bulursunuz.

Karar 2 — Yöntem: bozmadan nasıl indiriyoruz?

Şekil 1’deki düz yuvarlama (RTN – round-to-nearest) 8-bit’te yeterli; 4-bit’te büyük modellerde idare ediyor, küçüklerde kaliteyi düşürüyor. Bunun için daha akıllı yöntemler var; çoğu birkaç yüz örnek metinle (kalibrasyon verisi) dakikalar içinde çalışıyor:

  • GPTQ (2022): Ağırlıkları sütun sütun quantize et, her sütundaki yuvarlama hatasını henüz quantize edilmemiş sütunları güncelleyerek telafi et. 175B modeli 4 GPU saatinde 3–4 bit’e indiriyor[3]. vLLM’de gördüğünüz INT4 modellerin çoğu bu yöntemle üretilmiş.
  • AWQ (2023): MIT’nin gözlemi: ağırlıkların sadece ~%1’i kritik ve bunlar büyük aktivasyonlarla çarpılanlar. AWQ o kanalları quantize etmeden önce bir katsayıyla büyütüyor (aktivasyonu aynı oranda küçültüyor, çarpım değişmiyor); büyütülen ağırlık yuvarlamada daha az hata alıyor[4].
  • SmoothQuant (2022): Ağırlık değil, aktivasyon quantization’ı için. Outlier’lı aktivasyon sütunlarını bir katsayıya bölüp aynı katsayıyı ağırlıklara çarpıyor; zorluk “quantize edilmesi kolay” tarafa taşınıyor. Sonuç W8A8: ağırlık da aktivasyon da 8-bit[5].
  • k-quants + imatrix (llama.cpp): İki seviyeli blok ölçekleri + bir kalibrasyon metni üzerinden hangi ağırlıkların önemli olduğunu ölçen importance matrix[11][13].
  • QAT (quantization-aware training): Yukarıdakiler eğitimden sonra yapılıyor (PTQ – post-training quantization). QAT (quantization-aware training)’ta model eğitim sırasında 4-bit’e indirileceğini bilerek eğitiliyor. Google, Gemma 3’ü böyle çıkardı: 5.000 adımlık ek eğitimle 4-bit’teki kaybı yarıya indirdi, 27B’nin VRAM’i 54 GB’tan 14 GB’a düştü[16]. En iyi sonuç, ama eğitim gerektiriyor; sağlayıcının işi.

W4A16, W8A8 ne demek? W = ağırlık (weight) bit’i, A = aktivasyon bit’i. W4A16: ağırlık 4-bit saklanıyor, hesap 16-bit’te yapılıyor; çarpmadan önce dequantize ediliyor. W8A8: ikisi de 8-bit, çarpma doğrudan 8-bit tensor core’da. İlki yalnızca bellek, ikincisi bellek + hesap kazandırıyor. Bu fark 5. bölümde önemli olacak.

Karar 3 — Dosya formatı: diske nasıl yazıyoruz?

GPU serving dünyası (vLLM, transformers) modeli klasör olarak tutuyor: safetensors dosyaları + config’de yöntemin adı ve grup boyu. Lokal dünyanın formatı GGUF: llama.cpp’nin tek dosyalık formatı; ağırlıklar, tokenizer, chat template ve her tensörün hangi tipte olduğu hepsi içinde, dosya mmap ile doğrudan belleğe haritalanıyor[12][13]. İndirip Ollama’ya ya da LM Studio’ya vermeniz yeterli[25]. Video için MP4 neyse, lokal LLM için GGUF o.

Q4_K_M gibi isimleri okumak için: Q4 = ~4 bit; _K = k-quants blok yapısı; _M = medium karışım, yani hassas olduğu bilinen katmanlar (attention çıkışı, FFN down projeksiyonu) bir üst hassasiyette tutuluyor. Q4_K_M’in varsayılan tavsiye olmasının sebebi bu dengeyi iyi tutturması. llama.cpp’nin kendi tablosunda Llama 3.1 8B: F16 14.96 GiB / 29 token/s → Q8_0 7.95 GiB / 51 token/s → Q4_K_M 4.58 GiB / 72 token/s[11]. Q8_0’da kalite kaybı ölçülemeyecek kadar küçük; Q2_K’ya inince belirginleşiyor.

4. Modeli Kim Quantize Etmeli?

Modeli çalıştıracak olan. Çünkü bu iş “dosyayı küçült” değil, üç soruya cevap vermeyi gerektiriyor: Hangi donanımda koşacak? (H100’de FP8, A100’de INT8/INT4, Blackwell’de NVFP4, MacBook’ta GGUF.) Hangi runtime çalıştıracak? (vLLM, llama.cpp ve TensorRT-LLM’in her biri kendi formatını hızlı çalıştırıyor, diğerini ya açmıyor ya yavaş açıyor.) Sizin görevde kalite düşüyor mu? (Genel benchmark’lar iyimser; sizin RAG pipeline’ınızdaki Türkçe soru-cevapta ne olduğunu ancak siz ölçebilirsiniz.)

Pratikte üç oyuncu var. Model sağlayıcıları işi giderek üstleniyor: Gemma QAT ile, gpt-oss ve Kimi K3 doğrudan MXFP4 ile çıktı[16][22]Inference ekipleri (Red Hat / Neural Magic, NVIDIA) kalibre edilmiş, ölçülmüş sürümleri Hugging Face’e koyuyor[7]Topluluk her yeni modelin GGUF’larını saatler içinde çıkarıyor. Kendiniz quantize etmeniz gereken durum genelde kendi fine-tune ettiğiniz model.

5. “4-bit Daha Hızlı” Cümlesi Ne Zaman Doğru?

En çok yanlış anlaşılan şey bu: quantization belleği kesin küçültür; hızı bazen artırır. Tek kullanıcı için token üretirken GPU şunu yapıyor: 16 GB ağırlığı bellekten okuyor, her biriyle bir çarpma yapıyor, bir token üretiyor, başa dönüyor. Okuma devasa, hesap komik; H100’ün tensor core’ları tam verim için byte başına ~295 çarpma isterken tek kullanıcılı decode’da byte başına 1 çarpma düşüyor[17]. GPU zamanının neredeyse tamamında bellek okumasını bekliyor. Ağırlığı 4-bit’e indirince okunacak veri dörtte bire düşüyor ve decode neredeyse 4× hızlanıyor.

Şekil 3 — Aynı INT4 dosya, iki farklı durumda iki farklı sonuç. Tek kullanıcılı decode’da bellek okuması darboğaz olduğu için 4-bit büyük fark yaratıyor; yüksek eşzamanlılıkta ya da prefill’de darboğaz hesap olduğu için 4-bit’in bellekte küçük olması hiçbir şey kazandırmıyor, dequantize maliyeti eklenince kaybettiriyor bile.

Sorun kullanıcı sayısı artınca başlıyor. vLLM 64 isteği batch’leyip her ağırlığı bir kez okuyup 64 token için kullanıyor; okuma maliyeti 64’e bölünüyor ve darboğaz bellekten hesaba geçiyor. H100’de INT4 için bu geçiş ~74 eşzamanlı istekte oluyor[17]. Ondan sonra 4-bit ağırlığın hız katkısı sıfır; üstüne her çarpmadan önce INT4→BF16 dönüşümü kritik yola giriyor. Prefill (prompt’un işlenmesi) zaten hep hesap darboğazında. Bu yüzden prod’da resim şu:

SenaryoDarboğazDoğru seçim
Tek kullanıcı, dizüstü / tek GPUBellek okumasıW4A16 — GGUF Q4_K_M, AWQ, GPTQ: okuma 4× azaldı, hız ~3× arttı
Prod serving, H100/H200, yüksek trafikHesapW8A8-FP8 — tensor core doğrudan çarpıyor, dequantize yok, throughput ~2×[7]
Prod serving, BlackwellHesapNVFP4 — 4-bit float doğrudan hesaplanıyor[15]
405B gibi devler, gecikme öncelikliSığmıyorW4A16 — yarı sayıda GPU, 5–7× maliyet düşüşü[7]

6. Ne Kadar Kaybediyoruz?

Bu konuda en kapsamlı çalışma Red Hat / Neural Magic ekibinin ACL 2025’teki “Give Me BF16 or Give Me Death?” makalesi: Llama 3.1’in 8B, 70B ve 405B’sini üç formatta quantize edip 500.000’den fazla değerlendirme çalıştırdılar[7].

Şekil 4 — Doğru yöntemle yapılmış quantization’ın genel benchmark’lardaki bedeli yüzde birin altında. Eksen bilerek %96’dan başlıyor; %0’dan başlasa üç çubuk birbirinden ayırt edilemezdi.

Özet: doğru yöntemle FP8 %99.75, INT4 %99.36, INT8 %99.31 geri kazanım; zor görevlerde (MMLU-Pro, GPQA, MATH) bile hiçbir görev %96’nın altına inmiyor. Daha önce raporlanan %10’luk INT8 kayıplarının sebebi format değil, kötü kalibrasyonmuş. Büyük modeller daha dayanıklı: 405B’de INT4 ile 5–7× maliyet düşüşü alırken kalite %99’da kalıyor[7][23].

Üç köşeye dikkat:

  • Uzun context. 4K–64K arasında INT4 %99’un üstünde; 128K’da geri kazanım 8B’de %85’e, 70B’de %88’e düşüyor[8]. Uzun belge özetliyorsanız kendi ölçümünüzü yapın.
  • Reasoning modelleri. DeepSeek-R1-Distill, QwQ ve Qwen3 üzerinde: W8A8 ve W4A16 kayıpsız; daha düşük bit’lerde kayıp ciddi, küçük modellerde ve zor görevlerde daha ciddi[9][10]. Uzun düşünce zinciri üreten modellerde Q6_K ya da Q8_0’a çıkın.
  • 3-bit ve altı. Q2_K ve IQ2, 70B’yi 24 GB’a sığdırıyor ama kayıp artık yüzde birlerle değil on’larla ölçülüyor. 70B Q2 ile 8B Q8 arasında kalırsanız 8B’yi seçin.

Kapsam notu: bunların hepsi ağırlıkların quantization’ı. Uzun context’te VRAM’i asıl yiyen KV cache ayrı bir konu; o da FP8’e ya da INT4’e iniyor, vLLM ve llama.cpp destekliyor[24].

Karar Tablosu

DurumunuzTavsiye
MacBook / tek tüketici GPU, sohbet ve kodGGUF Q4_K_M; VRAM artıyorsa Q6_K
Reasoning modeli lokalQ6_K veya Q8_0
H100/H200’de vLLM, yüksek trafikFP8 W8A8 — kalibrasyon yok, %99.75 kalite
Model sığmıyor, az kullanıcı, gecikme önemliW4A16 (GPTQ / AWQ)
Tek GPU’da fine-tuningQLoRA — model 4-bit NF4’te donuk, üstüne küçük adaptörler eğitiliyor; 65B’yi 48 GB’ta eğitmenin tarifi[6]
Sağlayıcı QAT / MXFP4 sürümü vermişOnu kullanın; eğitimle yapılmış quantization her PTQ’dan iyi
Kendi fine-tune ettiğiniz modelÖnce FP8 ya da Q8_0; 4-bit’i kendi eval’ınızla deneyin

Kapanış

Quantization’ı tek cümleye indirirsek: modelin sayılarını daha az bit ile saklamak; kazanç bellekte kesin, hızda şartlı, kalitede ölçülmesi gereken bir bedel var. 2022’de soru “175B’yi bozmadan 8-bit’e indirebilir miyiz”di[1]. 2026’da cevabını bildiğimiz sorular çoğaldı: 8-bit bedava, 4-bit doğru yöntemle %99, 3-bit ve altı pazarlık, reasoning ve uzun context hassas. Donanım da yetişti; sağlayıcılar modelleri en baştan 4-bit’te yayımlamaya başladı.

Ama asıl soru değişmedi. Soru “modeli küçültebilir miyiz” değil; onu zaten yapabiliyoruz. Soru, küçülttükten sonra hâlâ işe yarıyor mu. Ve o soruyu genel benchmark’lar değil, sizin verinizle yaptığınız ölçüm cevaplıyor. En öğretici deney şu: bir 8B modeli Q8_0, Q4_K_M ve Q2_K olarak indirip aynı 20 soruyu üçüne sorun, farkı kendi gözünüzle görün. Kolay gelsin!


Kaynaklar

  1. Dettmers et al. — LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale (arXiv:2208.07339)
  2. Tim Dettmers — LLM.int8() and Emergent Features
  3. Frantar et al. — GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers (arXiv:2210.17323)
  4. Lin et al. — AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration (arXiv:2306.00978)
  5. Xiao et al. — SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models (arXiv:2211.10438)
  6. Dettmers et al. — QLoRA: Efficient Finetuning of Quantized LLMs (arXiv:2305.14314)
  7. Kurtic et al. — “Give Me BF16 or Give Me Death”? Accuracy-Performance Trade-Offs in LLM Quantization (arXiv:2411.02355, ACL 2025)
  8. Red Hat Developer — How well do quantized models handle long-context tasks?
  9. Liu et al. — Quantization Hurts Reasoning? An Empirical Study on Quantized Reasoning Models (arXiv:2504.04823, COLM 2025)
  10. Quantization Meets Reasoning: Exploring LLM Low-Bit Quantization Degradation for Mathematical Reasoning (arXiv:2501.03035)
  11. llama.cpp — quantize tool README (quantization types, sizes, bits per weight, imatrix)
  12. ggml — GGUF file format specification
  13. ZeroEntropy — GGUF format and k-quants: local LLM inference, explained
  14. ggml-org/llama.cpp — LLM inference in C/C++
  15. NVIDIA Technical Blog — Introducing NVFP4 for Efficient and Accurate Low-Precision Inference
  16. Google Developers Blog — Gemma 3 QAT Models: Bringing state-of-the-art AI to consumer GPUs
  17. Why INT4 Weight-Only Quantization Doesn’t Speed Up Prefill
  18. DeepInfra — From Precision to Quantization: A Practical Guide to Faster, Cheaper LLMs
  19. BentoML — LLM Inference Handbook: LLM quantization
  20. The AI Engineer — GPTQ vs AWQ vs GGUF: Which 4-Bit to Pick in 2026
  21. Prem AI — LLM Quantization Guide: GGUF vs AWQ vs GPTQ vs bitsandbytes Compared (2026)
  22. Kimi K3 Model Overview: 2.8T Parameters, MXFP4 Quantization, and What the Open Weights Mean
  23. A Comprehensive Evaluation of Quantized Instruction-Tuned Large Language Models: An Experimental Analysis up to 405B (arXiv:2409.11055)
  24. vLLM Documentation — Quantization (supported methods, FP8, INT4, KV cache)
  25. Ollama — run LLMs locally (GGUF-based)
  26. Kapak Görseli: Photo by Ricardo Gomez Angel on Unsplash

Bir yanıt yazın