inference/research
verifiedmedium · 0.80updated 2026-10-04

SmoothQuant (W8A8 via offline outlier migration)

w8a8

Fields

id
quantization/smoothquant
Scheme
smoothquant
Bits
w8a8
Activation scheme
per-tensor (or per-token) dynamic INT8 scaling, but preceded by an offline, mathematically equivalent per-input-channel transformation that divides activations by s_j and multiplies the corresponding weight columns by s_j, with s_j = max|X_j|^alpha / max|W_j|^(1-alpha). alpha=0.5 in the paper's default setting. Runtime activations need no rescaling.
Kernels
TensorRT-LLM SmoothQuant W8A8 path (smoothing folded into the checkpoint)cutlass INT8 GEMMvLLM SmoothQuant config over torch._int_mmAMD Quark INT8/FP8
Quality delta
From the paper, OPT-175B under INT8 with the most aggressive O3 setting: 7 zero-shot benchmarks plus WikiText perplexity, reported as maintaining the FP16 model's accuracy (quant-smoothquant-paper); up to 1.56x speedup and 2x memory reduction, and the v7 body text gives the more precise 1.51x speedup / 1.96x memory saving for OPT-175B, BLOOM-176B, GLM-130B, MT-NLG 530B. No per-benchmark delta table transcribed here - the paper's Table 3 has it and I did not read the cells.
notes
GROUP SIZE LEFT NULL 2026-10-04: SmoothQuant is a per-tensor (or per-token at inference) scaling method whose contribution is migrating activation outliers into the weights, not choosing a weight grouping. The group size is whatever the underlying INT8/FP8 grid uses - for the W8A8 headline it is per-tensor, which again has no group. This is the record that makes the w4a16 vs w4a4 distinction concrete. SmoothQuant produces a TRUE W8A8 model: int8 weights times int8 activations with int32 accumulate, on real INT8 tensor cores. The method's whole point is to spend accuracy budget where hardware has headroom - it moves quantization difficulty from activations (which have outliers and no hardware tolerance) into weights (which do not), using a transformation that is exactly equivalent in full precision. Unlike LLM.int8() there is no runtime outlier decomposition and no mixed-precision split, so the whole layer runs in int8. Note the alpha hyperparameter: at alpha=0.5 the paper splits difficulty evenly; the abstract claims INT8 for ALL matrix multiplications in OPT/BLOOM/GLM/MT-NLG/Llama-1-2/Falcon/Mistral/Mixtral, which is a strong claim worth re-checking per model before relying on it. Hardware-native int8 on Ampere+ NVIDIA and CDNA2+/CDNA3 AMD. ModelOpt and vLLM both expose SmoothQuant as a PTQ recipe that folds the smoothing into the checkpoint before the int8 GEMM. UPGRADE (2026-10-03): OmniQuant is now recorded separately as quantization/omniquant and borrows this record's 'smoothquant' enum value, because its Learnable Equivalent Transformation is structurally the same idea - an offline transformation that migrates activation-quantization difficulty into the weights while leaving full-precision behaviour unchanged. The difference worth keeping: SmoothQuant's migration parameter alpha is hand-chosen per layer, OmniQuant LEARNS it by block-wise error minimization over 128 calibration samples. OmniQuant is also the method that survives the W2A16/W3A16 weight-only configurations that SmoothQuant was never aimed at, so the two should not be collapsed into one record.

Notes

GROUP SIZE LEFT NULL 2026-10-04: SmoothQuant is a per-tensor (or per-token at inference) scaling method whose contribution is migrating activation outliers into the weights, not choosing a weight grouping. The group size is whatever the underlying INT8/FP8 grid uses - for the W8A8 headline it is per-tensor, which again has no group. This is the record that makes the w4a16 vs w4a4 distinction concrete. SmoothQuant produces a TRUE W8A8 model: int8 weights times int8 activations with int32 accumulate, on real INT8 tensor cores. The method's whole point is to spend accuracy budget where hardware has headroom - it moves quantization difficulty from activations (which have outliers and no hardware tolerance) into weights (which do not), using a transformation that is exactly equivalent in full precision. Unlike LLM.int8() there is no runtime outlier decomposition and no mixed-precision split, so the whole layer runs in int8. Note the alpha hyperparameter: at alpha=0.5 the paper splits difficulty evenly; the abstract claims INT8 for ALL matrix multiplications in OPT/BLOOM/GLM/MT-NLG/Llama-1-2/Falcon/Mistral/Mixtral, which is a strong claim worth re-checking per model before relying on it. Hardware-native int8 on Ampere+ NVIDIA and CDNA2+/CDNA3 AMD. ModelOpt and vLLM both expose SmoothQuant as a PTQ recipe that folds the smoothing into the checkpoint before the int8 GEMM. UPGRADE (2026-10-03): OmniQuant is now recorded separately as quantization/omniquant and borrows this record's 'smoothquant' enum value, because its Learnable Equivalent Transformation is structurally the same idea - an offline transformation that migrates activation-quantization difficulty into the weights while leaving full-precision behaviour unchanged. The difference worth keeping: SmoothQuant's migration parameter alpha is hand-chosen per layer, OmniQuant LEARNS it by block-wise error minimization over 128 calibration samples. OmniQuant is also the method that survives the W2A16/W3A16 weight-only configurations that SmoothQuant was never aimed at, so the two should not be collapsed into one record.

Cross-references