1) Choose a mapping scheme: affine (asymmetric, with scale and zero-point) or symmetric (zero-point = 0). 2) Determine the value range per tensor — per-tensor (one scale for the whole tensor) or per-channel (a separate scale per weight channel, more accurate for convolutional layers). 3) Calibration: run a representative dataset to estimate activation ranges (methods: min/max, percentile, KL-divergence/entropy minimization). 4) Quantize: q = round(x / scale) + zero_point, clamped to the INT8 range. 5) Integer inference: multiplications and accumulations run in INT8/INT32 with requantization between layers. The model can be obtained via PTQ (quantizing a trained model, fast, no retraining) or QAT (inserting fake-quant ops into the training graph so the network learns robustness to quantization — higher accuracy at the cost of extra training).
FP32/FP16 models are large and expensive at inference — they consume significant memory and bandwidth, making deployment on edge, mobile, and resource-constrained accelerators difficult. INT8 reduces model size ~4x along with memory-bandwidth and compute demands, enabling faster and cheaper inference at an acceptable accuracy cost.
A non-representative calibration set or naive min/max clips outliers and causes large accuracy drops.
Layers with high inter-channel range variance lose accuracy under a single shared scale.
Large activation outliers in transformers break naive INT8 activation quantization.
Google paper defining the INT8 quantization scheme with QAT, deployed in TensorFlow Lite / gemmlowp.
Systematization of PTQ and QAT for INT8 on GPUs (Wu et al.), including calibration and per-channel.
INT8 methods adapted to large language models with outlier handling.
PTQ (post-training) vs QAT (quantization-aware training). QAT usually yields higher accuracy at the cost of extra training.
Per-tensor (one scale per tensor) vs per-channel (scale per channel). Per-channel is more accurate for convolutional weights.
How activation ranges are estimated during PTQ.
Symmetric (zero-point = 0) vs affine/asymmetric (with a zero-point).
INT8 is a numeric-representation technique applied to inference; the compute flow stays dense, only the arithmetic precision changes.
INT8 operations are fully parallel on matrix units (Tensor Cores, NPUs).
Tensor Cores have dedicated high-TOPS INT8 datapaths.
TPUs/NPUs natively support INT8 integer arithmetic.
SIMD instructions (AVX-512 VNNI) accelerate INT8 multiply-accumulate on CPUs.
Integer logic maps efficiently onto FPGA DSP resources.