
TensorRT 8.6 Explicit Quantization: Production Modellerinde INT8 Hassasiyet Kayıplarını İzole Etme

Giriş
Büyük ölçekli derin öğrenme modellerini production ortamına alırken, hesaplama maliyetleri ve VRAM kısıtlamaları mimari kararları doğrudan şekillendirir. FP32 (32-bit floating point) ağırlıkları INT8 formatına indirgemek, bellek bant genişliği gereksinimlerini teorik olarak 4 kat azaltırken, Tensor Core’ların sağladığı donanım ivmelendirmesi sayesinde throughput metriklerinde dramatik artışlar sağlar. Ancak bu teorik kazanımlar, gerçek dünya verisiyle karşılaşıldığında genellikle aktivasyon fonksiyonlarındaki aralık (dynamic range) taşmaları nedeniyle model doğruluk oranlarında (accuracy) kabul edilemez düşüşlere yol açar.
Geçtiğimiz yıl, 1.2 milyar parametreli custom bir OCR Transformer modelini T4 ve A10G sunuculardan oluşan bir cluster üzerine deploy ederken tam olarak bu problemi yaşadık. Geleneksel Post-Training Quantization (PTQ) yöntemlerini uyguladığımızda, modelin FP16’da %94.2 olan tam eşleşme (exact match) oranı INT8 kalibrasyonu sonrasında %61.3 seviyesine çakıldı. Hata loglarını ve tensor dökümlerini incelediğimizde, özellikle self-attention katmanlarından önceki LayerNorm operasyonlarında aktivasyon değerlerinin [-42.5, 41.2] aralığına dağıldığını, ancak INT8’in [-128, 127] uzayına doğrusal haritalanması (linear mapping) sırasında kritik küçük değerlerin (sinyal) tamamen gürültüye karıştığını tespit ettik. PTQ’nun örtülü (implicit) doğası, bu spesifik katmanları FP16’da bırakmamıza olanak tanımıyordu.
Bu vaka, mimarimizi TensorRT 8.6’nın sunduğu Explicit Quantization paradigmalarına ve Q/DQ (Quantize/Dequantize) düğüm manipülasyonuna yönlendirdi. Doğrudan ONNX grafiği üzerinden müdahale ederek, sorunlu katmanları izole etme ve ağın geri kalanını INT8 hızında çalıştırma stratejisi, doğruluk oranını %93.8 seviyesine taşırken gecikme süresine (latency) sadece 1.4ms ek yük getirdi. Aşağıda, bu izolasyon sürecinin TensorRT 8.6 ekosisteminde nasıl kurgulanması gerektiğini, grafik operasyonlarını ve low-level konfigürasyon detaylarını bulacaksınız.
İçindekiler
- Implicit PTQ ve Explicit Quantization Arasındaki Paradigma Farkı
- ONNX Üzerinde Q/DQ (Quantize/Dequantize) Düğümlerinin Anatomisi
- GraphSurgeon ile Hassasiyet Kayıplarını İzole Etme Tekniği
- TensorRT 8.6 Polygraphy ile Katman Bazlı Profiling
- Performans ve Trade-off Analizi
- Production Önerileri ve Fallback Stratejileri
- Sık Sorulan Sorular
- Sonuç
Implicit PTQ ve Explicit Quantization Arasındaki Paradigma Farkı
Derin öğrenme modellerini TensorRT motorlarına derlerken karşılaştığımız en kritik yol ayrımı, kuantizasyon parametrelerinin (scale ve zero-point) nasıl hesaplanacağıdır. Implicit Quantization, nam-ı diğer Post-Training Quantization (PTQ), TensorRT derleyicisine bir kalibrasyon veri seti (örneğin 512 veya 1024 temsili görsel/metin dizisi) beslenerek çalışır. Derleyici (builder), INT8 flag’i aktif edildiğinde ağdaki tüm tensörlerin minimum ve maksimum değerlerini gözlemler. MinMax, Entropy (KL Divergence) veya Percentile algoritmalarından birini kullanarak bu değerleri 8-bit uzaya sıkıştırır. Bu işlem kara kutu (black box) yaklaşımıdır. Hangi katmanın birleştirileceğine (layer fusion) veya hangi katmanın INT8’e zorlanacağına TensorRT’nin kendi heuristik algoritmaları karar verir.
Öte yandan Explicit Quantization, kuantizasyon niyetini modelin topolojisine statik olarak kazıma işlemidir. Modelin ONNX grafiği, orijinal operasyonların arasına yerleştirilmiş QuantizeLinear ve DequantizeLinear (kısaca Q/DQ) düğümleri içerir. TensorRT 8.6, bir modeli derlerken ExplicitPrecision flag’i olmadan bile, eğer grafikte Q/DQ düğümleri tespit ederse bu düğümlerin sınırlarına harfiyen uyar. Explicit yöntem, Quantization-Aware Training (QAT) süreçlerinden elde edilebileceği gibi, PTQ uygulanmış bir modelin ONNX seviyesinde manipüle edilmesiyle de kurgulanabilir.
Production ortamında Implicit PTQ kullanmanın en büyük riski, framework güncellemelerinde veya minör TensorRT sürüm geçişlerinde (örneğin 8.5’ten 8.6.1’e) layer fusion kurallarının değişmesi ve modelin accuracy skorunun sessizce (silent failure) düşmesidir. Explicit Quantization, ONNX grafiğini değişmez bir kontrat (contract) olarak kabul ettiği için bu determinizm problemini tamamen çözer.
ONNX Üzerinde Q/DQ (Quantize/Dequantize) Düğümlerinin Anatomisi
Explicit kuantizasyonun temel yapı taşı Q/DQ düğümleridir. Bir Conv veya MatMul operasyonunun 8-bit hassasiyetle hesaplanması için, hem ağırlıkların (weights) hem de girdilerin (activations) öncesinde birer Q/DQ döngüsünden geçmesi gerekir.
- QuantizeLinear (Q): FP32 bir tensörü alır, belirli bir
scalefaktörüne böler, en yakın tam sayıya yuvarlar ve[-128, 127]aralığına kelepçeler (clip). Çıktı veri tipi INT8’dir. - DequantizeLinear (DQ): INT8 tensörü alır, aynı
scalefaktörü ile çarparak tekrar FP32 (veya FP16) uzayına geri döndürür.
Matematiksel olarak bu operasyon bir veri kaybı (loss of information) oluşturur. TensorRT derleyicisi bu grafiği okuduğunda, ardışık gelen DQ -> Conv -> Q sekansını tanır. DQ ve Q düğümlerini donanım seviyesinde optimize ederek ortadan kaldırır ve aradaki Conv operasyonunu doğrudan INT8 Tensor Core birimlerinde (DP4A veya IMMA instruction setleri) çalıştıracak şekilde derler. Eğer biz kritik bir katmanın (örneğin LayerNorm) etrafındaki Q/DQ düğümlerini silersek, TensorRT o katmanı INT8 birimlerine gönderemez ve zorunlu olarak FP16/FP32’de çalıştırır.
GraphSurgeon ile Hassasiyet Kayıplarını İzole Etme Tekniği
Yukarıda bahsettiğimiz OCR Transformer vakasında, sorunun Softmax ve LayerNormalization operasyonlarında olduğunu tespit etmiştik. QAT araçları (örneğin NVIDIA’nın pytorch-quantization kütüphanesi) genellikle ağın tamamına Q/DQ düğümleri ekler. Kayıpları izole etmek için, derleme öncesinde ONNX grafiğine müdahale edip spesifik düğümleri temizlememiz gerekir. Bu noktada NVIDIA’nın açık kaynaklı onnx-graphsurgeon (gs) kütüphanesi devreye girer.
Aşağıdaki Python kodu, bir QAT ONNX modelini yükleyerek spesifik katmanların etrafındaki Q/DQ düğümlerini grafikten koparır (bypass). Bu sayede kısmi kuantizasyon (Partial Quantization) sağlanır.
import onnx
import onnx_graphsurgeon as gs
def remove_qdq_around_node_types(onnx_path, output_path, target_op_types):
# 1. Modeli GraphSurgeon formatına yükle
graph = gs.import_onnx(onnx.load(onnx_path))
# 2. Silinecek düğümleri takip edeceğimiz liste
nodes_to_remove = []
# 3. Grafiği tara ve hedef operasyonları bul
for node in graph.nodes:
if node.op in target_op_types:
# Girdilerdeki DequantizeLinear (DQ) düğümlerini bul
for i, inp_tensor in enumerate(node.inputs):
if inp_tensor.inputs and inp_tensor.inputs[0].op == "DequantizeLinear":
dq_node = inp_tensor.inputs[0]
# DQ'nun girdisi olan QuantizeLinear (Q) düğümünü bul
if dq_node.inputs[0].inputs and dq_node.inputs[0].inputs[0].op == "QuantizeLinear":
q_node = dq_node.inputs[0].inputs[0]
# Q düğümünün asıl girdisini doğrudan hedef node'a bağla (Bypass)
original_fp_input = q_node.inputs[0]
node.inputs[i] = original_fp_input
nodes_to_remove.extend([q_node, dq_node])
# 4. Bağlantısı kopan düğümleri temizle ve modeli kaydet
graph.cleanup().toposort()
onnx.save(gs.export_onnx(graph), output_path)
print(f"{len(nodes_to_remove)} adet Q/DQ düğümü izole edildi.")
# Production kullanımı:
remove_qdq_around_node_types(
onnx_path="model_qat_full.onnx",
output_path="model_qat_partial.onnx",
target_op_types=["LayerNormalization", "Softmax", "Gelu"]
)
Bu operasyon, belirtilen katmanların FP16 precision ile çalışmasını zorunlu kılar. TensorRT derleyicisine bu yeni grafiği beslerken trtexec komutunda --int8 --fp16 parametrelerinin aynı anda verilmesi kritik bir zorunluluktur.
TensorRT 8.6 Polygraphy ile Katman Bazlı Profiling
Hangi katmanların hassasiyet kaybına uğradığını tahmin etmek yerine, deterministik metriklerle ölçmek gerekir. TensorRT ekosistemindeki polygraphy CLI aracı, FP32 referans modeli ile derlenmiş INT8 motoru arasındaki katman bazlı aktivasyon farklarını (Absolute/Relative Error) hesaplar.
Production pipeline’ımızda her yeni model versiyonu için aşağıdaki test prosedürünü standartlaştırdık:
# 1. Referans FP32 modelin çıktılarını topla
polygraphy run model_fp32.onnx
--onnxrt
--save-outputs=fp32_golden.json
--input-shapes input_ids:[1,512]
# 2. INT8 modeli TensorRT ile derle ve referans verilerle karşılaştır
polygraphy run model_qat_partial.onnx
--trt
--int8
--fp16
--load-outputs=fp32_golden.json
--compare-outputs
--rtol 1e-2 --atol 1e-2
--trt-min-shapes input_ids:[1,128]
--trt-opt-shapes input_ids:[1,512]
--trt-max-shapes input_ids:[1,1024]
Polygraphy çıktısı incelendiğinde, eğer spesifik bir katmanın Max Absolute Error değeri 0.5’in üzerine çıkıyorsa, o katmanın INT8 kuantizasyonunda sinyal bütünlüğünü kaybettiği matematiksel olarak kanıtlanmış olur. Bu analiz sonucunda, sadece hata oranı yüksek olan katmanları GraphSurgeon ile yukarıdaki gibi izole ediyoruz.
Performans ve Trade-off Analizi
Explicit Quantization ile sadece belirli katmanları izole etmenin sistem kaynaklarına ve gecikme sürelerine doğrudan etkisi vardır. Aşağıdaki tablo, A10G GPU üzerinde batch size 32 ile test edilen 1.2 Milyar parametreli Transformer modeline ait metrikleri özetlemektedir.
| Model Formatı / Kuantizasyon Tipi | mAP (Exact Match) | Gecikme (Latency – ms) | VRAM Tüketimi (MB) | Throughput (req/sec) |
|---|---|---|---|---|
| FP32 (Referans) | %94.2 | 114.3 | 4,850 | 280 |
| FP16 (Standart Dağıtım) | %94.2 | 38.6 | 2,430 | 829 |
| INT8 (Implicit PTQ – MinMax) | %61.3 (Kabul Edilemez) | 22.1 | 1,320 | 1,447 |
| INT8 (Explicit QAT – Full) | %82.4 | 21.8 | 1,320 | 1,467 |
| INT8 + FP16 Partial (Explicit Isolated) | %93.8 | 23.5 | 1,450 | 1,361 |
Trade-off Analizi Değerlendirmesi:
- Ne zaman Explicit (Partial) INT8 Kullanılmalı? Model mimarisinde yüksek varyansa sahip aktivasyon çıktıları üreten Transformer (Self-Attention blokları), YOLOv8 (farklı ölçeklerdeki anchor-free detection head’leri) veya yüksek çözünürlüklü 3D CNN ağları bulunuyorsa. %1.4’lük doğruluk kaybına tahammül edilebilen ancak VRAM’in yarı yarıya düşürülmesi gereken edge-cloud senaryolarında.
- Ne zaman Implicit PTQ Kullanılmalı? ResNet-50, MobileNetV3 gibi geleneksel CNN mimarilerinde. Bu ağların aktivasyon aralıkları genellikle ReLU fonksiyonları sayesinde öngörülebilir ve dar olduğundan, Implicit PTQ ile %0.5’ten daha az doğruluk kaybıyla çalıştırılabilirler. Geliştirme eforu (Engineering time) gerektirmez.
Production Önerileri ve Fallback Stratejileri
İzole edilmiş INT8 modellerini NVIDIA Triton Inference Server üzerinden canlı trafiğe açarken aşağıdaki mimari checklist’in uygulanması operasyonel kesintileri önler.
- Triton Ensemble Fallback Kurgusu: Kısmi kuantize edilmiş modelin edge case’lerde (örneğin tamamen siyah bir görsel veya bozuk kontrastlı girdi) beklenmedik sonuçlar üretme riski her zaman vardır. Triton tarafında
Ensemble Modelpipeline’ı kurgulanmalıdır. Eğer INT8 modelin çıktı logit’lerinden hesaplanan confidence skoru 0.65’in altındaysa, istek ağ trafiğinden çıkmadan sunucu içinde FP16 yedek modele yönlendirilmelidir. - Kalibrasyon Verisi Dağılımı: Explicit QAT aşamasında kullanılan verilerin, production’da karşılaşılacak verilerin varyansını yansıtması şarttır. E-ticaret verisiyle eğitilmiş bir modeli, medikal belgelerle kalibre ederseniz
scalefaktörleri yanlış hesaplanır. Kalibrasyon veri seti minimum 512, ideal olarak 1024 heterojen örnekten oluşmalıdır. - Engine Warmup: TensorRT motorları yüklendiğinde, memory allocation gecikmelerini önlemek için Triton
model.configdosyasındamodel_warmupparametresi aktif edilmelidir. Aksi takdirde ilk 10-15 istek, 200ms gibi anormal gecikmeler yaşayabilir. - Precision Constraints Bayrağı:
trtexecile derleme yaparken--obeyPrecisionConstraintsflag’i mutlaka eklenmelidir. Bu parametre builder’a şu emri verir: “Senin heuristiklerin aksini söylese bile, ONNX grafiğinde belirttiğim FP16/INT8 kısıtlamalarına harfiyen uy.”
Sık Sorulan Sorular
Explicit quantization ONNX dosya boyutunu neden artırıyor?
Model ağırlıkları FP32 veya FP16 formatında saklanmaya devam ederken, ağa yüzlerce yeni QuantizeLinear ve DequantizeLinear operasyonu (düğüm) eklenir. Dosya boyutundaki bu artış sadece ONNX diske yazıldığında geçerlidir; TensorRT derlemesi sonrasında oluşturulan .plan / .engine dosyasında bu düğümler kaynaştırılacağı (fusion) için boyut PTQ ile aynı seviyelere iner.
TensorRT 8.5’ten 8.6’ya geçişte Q/DQ kurgusunda ne değişti?
TensorRT 8.6, geliştirilmiş Q/DQ yayılım (propagation) algoritmaları tanıttı. Artık birden fazla dalı (branch) olan operasyonlarda (örneğin residual connection veya concatenation), builder Q/DQ düğümlerini dallar arasında daha iyi taşıyabiliyor ve gereksiz dequantize operasyonlarını donanım seviyesinde daha agresif silebiliyor.
Hangi aktivasyon fonksiyonları INT8 dönüşümünde en çok hata üretir?
SiLU (Swish) ve GELU fonksiyonları. Doğrusal olmayan (non-linear) yapıları ve sıfır etrafındaki dalgalanmaları nedeniyle INT8 kuantizasyon ızgarasına (grid) oturtulmaları zordur. Bu operasyonların öncesinde ve sonrasında genellikle FP16 fallback uygulanması önerilir.
Kısmi kuantizasyon uyguladığımda Tensor Core’lar ne kadar meşgul olur?
Nsight Systems ile profil çıkarıldığında (profiling), INT8 operasyonlar DP4A/IMMA birimlerine, FP16 izolasyon uyguladığınız katmanlar ise HMMA (Half-Precision Matrix Multiply Accumulate) birimlerine yönlendirilir. Context-switching nedeniyle mikro-saniyelik gecikmeler (kernel launch overhead) oluşur, ancak toplam throughput kazancı bu kaybı fazlasıyla telafi eder.
Sonuç
Derin öğrenme modellerinde INT8 çıkarım (inference) yapmak artık bir optimizasyon tercihi değil, production ölçeğinde hayatta kalma zorunluluğudur. Ancak TensorRT’nin Implicit PTQ algoritmalarının sunduğu siyah kutu kolaycılığı, karmaşık mimarilerde sinyal yıkımına neden olmaktadır. Explicit Quantization ve ONNX GraphSurgeon kütüphanesini kullanarak Q/DQ düğümlerine mikro seviyede müdahale etmek; yazılım mimarlarına donanım üzerinde deterministik kontrol sağlar. Accuracy metriklerini koruyarak donanımın sınırlarını zorlamak isteyen her AI altyapı ekibinin, CI/CD pipeline’larına Polygraphy analizini entegre etmesi ve katman bazlı kısmi kuantizasyon stratejilerine geçiş yapması acil bir eylem maddesidir (action item).
Bunları da beğenebilirsiniz

Repository Seviyesinde AI Ajanları ile Otonom Kod İnceleme: Dağıtık İzleme Verilerini Değişim Yönetimine Entegre Etme Rehberi
Modern yazılım geliştirme süreçlerinde AI ajanlarını ve dağıtık izleme verilerini kullanarak otonom kod inceleme sistemleri kurmanın teknik detaylarını ve stratejik avantajlarını keşfedin.

ChatGPT ile Teknolojinin Geleceği ve Yazılıma Katkıları
Son günlerde gündemde olan bir konudan bahsetmek istiyorum. OpenAI tarafından geliştirilen ChatGPT kullanıma sunuldu. ChatGPT ile yapabileceklerimiz neredeyse sınırsız gibi gözüküyor. Kodlama konusunda da oldukça…

Web Uygulamalarında RAG Tabanlı Yapay Zeka Entegrasyonu: Güvenli Dağıtım ve Vektör Veritabanı Optimizasyonları Rehberi
Web uygulamalarınıza RAG (Retrieval Augmented Generation) tabanlı yapay zekayı güvenli bir şekilde entegre etme ve vektör veritabanlarını optimize etme stratejilerini keşfedin. Kullanıcı deneyimini zenginleştirirken güvenlik ve performans sağlamanın yollarını öğrenin.