← Back to list

Model Quantization Nedir ? | Simetrik, Asimetrik, Statik ve Dinamik Quantization | PTQ ve QAT

Derin öğrenme algoritmalarıyla eğitilen modellerde elde edilen model çıktıları her cihaz veya her donanımda inference için uygun…

Yusuf Cangir · 2025-07-30 17:15 · 78 claps · 4.2 min read
#model-quantization #deep-learning #ptqs #qat #quantization
Open on Medium ↗
Wiki topics: OPS · LLMOps & Inference ML · Machine Learning EDU · Education & Learning

Model Quantization Nedir ? | Simetrik, Asimetrik, Statik ve Dinamik Quantization | PTQ ve QAT

Derin öğrenme algoritmalarıyla eğitilen modellerde elde edilen model çıktıları her cihaz veya her donanımda inference için uygun olmayabilir. Bir mobil uygulamada, uç (Edge) cihazlarda veya düşük donanım kaynağına sahip cihazlarda modelleri olduğu gibi kullanmak mümkün olmayabilir. Bu nedenle eğitilmiş ya da eğitilmesi planlanan modellerin (LLM ve Computer Vision modelleri) düşük kaynaklarda çalışabilmesi için derin öğrenme algoritmalarının içerisinde gerçekleşen işlemleri (ağırlıklar ve aktivasyonlar gibi değerleri) float32 (kayan noktalı sayı) yerine int8 (tam sayı) ile yapılması yöntemidir.

Float yerine Integer Kullanmanın Avantajı Nedir?

Float32 değerler bellekte 32 bit (4 byte) yer kaplarken, int8 değerler bellekte 8 bit (1 byte) yer kaplar. Bu da model ağırlıkları ve aktivasyonlarının bellekte 4 kat daha az yer kaplaması demektir. Bu, büyük modellerde RAM ve disk kullanımını ciddi oranda azaltır.

Aynı zamanda donanımda daha az elektrik tüketimine olanak sağlar bu da taşınabilir bataryalara sahip edge ve mobil cihazlarda pil ömrü açısından avantaj sağlar.

Son olarak da model parametreleri int8 olunca, model yükleme/sunucuya gönderme işlemleri daha az veri taşır, bu da özellikle cloud ve edge senaryolarında network üzerinden model yükleme işlemlerinin 4 kat hızlanmasına neden olur.

Not: Quantization işlemleri sayıların direkt en yakın int değere yuvarlanması işlemi değildir.

Quantization 2 ana başlıkta ve 4 alt başlıkta incelenebilir

  1. Statik Quantization : Ağırlıklar gibi modelde eğitimden sonra değişmeyecek olan değerler, runtime’a girmeden önce int8’e çevrilir. İnference öncesi yapılan bu işleme statik quantization denir.
  2. Dinamik Quantization :Model eğitim sonrası kaydedildiğinde, PyTorch ile ağırlıklar/biaslar bir dictionary yapısında saklanır. Model kullanımı sırasında, girişten sonra oluşan aktivasyonlar her seferinde farklı değerler alır ve bunlar runtime’da int8’e çevrilir. Statik quantize edilemeyen veriler için kullanılır.
  3. Asimetrik Quantization : Çevirme işleminin yapılacağı tensördeki değerlerin [0, 255] arasında (uint8) temsil edilmesidir. Genellikle aktivasyonlar için kullanılır.
  4. Simetrik Quantization : Çevirme işleminin yapılacağı tensördeki değerlerin [-127, 127] arasında (int8) temsil edilmesidir. Genellikle ağırlıklar için tercih edilir.

Simetrik Quantization

Büyük (Maksimum Mutlak) değer bulunur. Float aralık [-A, +A] burada A = max(|min|, |max|) ardından int8 aralığına merkez sıfırda olacak şekilde eşlenir;

float (-A) = -127 float (0) = 0 float (+A) = +127

Scale Katsayısı için; scale = A / 127 ve sıfır noktası her zaman sıfırdır.

s = max(|x_min|, |x_max|) / 127 
q = round(x / s)

q = Quantize edilmiş tam sayı
x = Gerçek (float) değer
s = Ölçek kat sayısı (scale)

Sıfıra yakın ve negatif/pozitif değerlerin dengede olduğu tensörler için kullanmak oldukça hatasız dönüşümler sağlar bizlere.

Dequantization için;

x = s * q
x = Gerçek (float) değer
s = Ölçek kat sayısı (scale)
q = Quantize edilmiş tam sayı

Asimetrik Quantization (Ağırlıklar için)

En küçük ve en büyük float değerleri bulunur. float aralık = min, max

int8 aralığına kaydırılmış şekilde eşlenir; float min = -127 float 0 = zero_point (genellikle 0 da değildir.) float max = 127

Scale Katsayısı için; scale = (max-min)/255

s = (max - min) / 255
zero_point = round(0 - min/scale)
q = round(x/scale) + zero_point

q = Quantize edilmiş tam sayı
x = Gerçek (float) değer
s = Ölçek kat sayısı (scale)

Dequantization için;

x = scale * (q - zero_point)

q = Quantize edilmiş tam sayı
x = Gerçek (float) değer

Ağırlıklar için asimetrik quantization yapılacaksa eğer integer değerleri [-127, 127] arasında temsil etmek gerekir.

Asimetrik Quantization (Aktivasyonlar için)

En küçük ve en büyük float değerleri bulunur. float aralık = min, max

int8 aralığına kaydırılmış şekilde eşlenir; float min =0 float 0 = zero_point float max = 255

Scale Katsayısı için; scale = (max-min)/255

s = (max - min) / 255
zero_point = round(0 - min/scale)
q = round(x/scale) + zero_point

q = Quantize edilmiş tam sayı
x = Gerçek (float) değer
s = Ölçek kat sayısı (scale)

Dequantization için;

x = scale * (q - zero_point)

q = Quantize edilmiş tam sayı
x = Gerçek (float) değer

Aktivasyonlarda asimetrik quantization için genellikle uint8 ([0, 255]) aralığı tercih edilir, çünkü çoğu activation tensörü negatif değer içermez (örn: ReLU sonrası). Fakat ağırlıklar için signed int8 tercih edilir.

Zaten yaygın olarak ağırlıklar için simetrik quantization kullanıldığından asimetrik quantization’ı yaygın olarak [0, 255] aralığında yapıldığını görebilirsiniz.

Statik Quantization

Modeldeki ağırlıklar ve aktivasyonlar gibi verilerin eğitim sonrası sabit (statik) olarak quantize edildiği yöntemdir. Yani quantize işlemi, model deployment veya inference öncesinde yapılır ve runtime sırasında değişmez.

Ağırlıklar, eğitim bittikten sonra int8 gibi daha küçük veri tiplerine dönüştürülür.

Aktivasyonlar için de quantize edilecek aralık, genellikle calibration (kalibrasyon) datası ile modelin inference modunda örnek veriyle gezdirilmesiyle belirlenir. (Örneğin birkaç batch input ile min-max değerleri bulunur.)

Modelin parametreleri ve katmanlarındaki quantization parametreleri sabitlenir ve değişmez.

Aktivasyonların Statik Quantizationda Sabitlenmesi;

  1. Kalibrasyon verisi (genellikle eğitim veya validasyon setinden birkaç batch) modele verilir.
  2. Her katmandaki aktivasyonların minimum ve maksimum değerleri toplanır.
  3. Bu toplu min-max değerleri, aktivasyonların int8’e çevrilirken kullanılacak olan scale ve zero_point hesaplaması için kullanılır.
  4. Sonrasında bu değerler sabitlenir ve modelin quantized versiyonu oluşturulur.

Artık tüm inference boyunca scale ve zero_point değişmez. Yani model deploy edildikten sonra, o aktivasyonun min-max aralığı “sabitlenmiş” olur. Her yeni veri geldiğinde, o sabit scale ve zero_point ile quantization uygulanır. Eğer modelin aldığı aktivasyonlar bu kalibrasyon aralığı dışında değerler üretirse, o zaman quantization hatası (clipping) olur.

Dinamik Quantization

Modeldeki ağırlıkların eğitimden sonra int8 gibi bir tipe çevirildiği, ama aktivayonların quantize edilmesinin runtime sırasında yani gerçek verilerle model kullanılırken yapıldığı yöntemdir.

Ağırlıklar model kaydedildiğinde/convert edildiğinde int8’e dönüştürülür.

Aktivasyonlar ve bias gibi inputtan üretilen değerler, her bir ileri geçişte (forward pass) anlık olarak quantize edilir. Yani her girişte, giriş değerinin min-max aralığına göre quantization scale ve zero_point yeniden hesaplanır.

Özellikle transformer, RNN ve LSTM gibi sıralı modellerde (veya input istatistikleri çok değişken olan uygulamalarda) kullanılır.

Quantization sırasında tensörlerin dönüştürülme aralığı genellikle en küçük ve en büyük değerlerle belirlenir. Ancak bu yöntem outlier (aykırı) değerler olduğunda, ana dağılımdaki verilerin hassasiyetini azaltır. Bunun yerine, percentile yöntemiyle uç değerler göz ardı edilerek daha temsilci bir aralık seçilebilir. Ayrıca CNN tabanlı ağlarda, quantization granularity olarak her kanal için ayrı aralıklar seçmek (per-channel quantization), özellikle farklı kanallarda dağılım farklıysa doğruluğu artırır.

PTQ (Post-Training Quantization) nedir?

Eğitim sonrası, hazır bir modeli ek bir eğitim gerektirmeden quantize etmektir. Modelin ağırlıkları ve aktivasyonları int8 gibi düşük hassasiyetli tiplere dönüştürülür. Kolay uygulanır, ekstra eğitim maliyeti yoktur; ancak doğruluk kaybı yaşanabilir, özellikle dağılımı karmaşık olan verilerde.

QAT (Quantization-Aware Training) nedir?

Modeli baştan, quantization etkilerini simüle ederek eğitirsiniz. Yani, eğitim sırasında model “int8 hassasiyetinde” çalışmayı öğrenir. Böylece doğruluk kaybı minimuma iner. Uygulaması daha karmaşıktır, ama hassasiyet gerektiren uygulamalar için gereklidir.

Tüm bu anlattığım konular hakkında hazırladığım detaylı git reposuna aşağıdaki linkten ulaşabilirsiniz. Repo içerisinde simetrik ve asimetrik quantizationların numpy ile implementasyonlarını gerçekleştirirken, PyTorch ile PTQ ve QAT yöntemleri ile quantization işlemlerini sıfırdan yaparak bunların inference time, accuracy ve memory size gibi etkilerini karşılaştırdım.

https://github.com/tambiyusuf/quantization

Öneri/şikayet ve istek durumlarında bana ulaşabileceğiniz linkleri aşağıya bırakıyorum.

Herkese iyi çalışmalar kolay gelsin.

*https://www.linkedin.com/in/yusufcangir/*


메타데이터
post_id
07a356a3fa22
slug
model-quantization-nedir-simetrik-asimetrik-statik-ve-dinamik-quantization-ptq-ve-qat-07a356a3fa22
url
https://medium.com/@yusufcangir/model-quantization-nedir-simetrik-asimetrik-statik-ve-dinamik-quantization-ptq-ve-qat-07a356a3fa22
canonical_url
https://medium.com/@yusufcangir/model-quantization-nedir-simetrik-asimetrik-statik-ve-dinamik-quantization-ptq-ve-qat-07a356a3fa22
author_url
https://medium.com/@yusufcangir
status
ok
fetched_at
2026-06-21 07:44:09