量化技术对比:INT4/INT8/FP8
量化:用更少的比特做更多的事 LLM的参数量从7B到671B不断增长,但GPU显存的增长速度远跟不上。量化是缓解这一矛盾最直接的技术——用更少的比特表示模型参数和激活值,在不修改模型架构的前提下减少显存占用和加速推理。 2026年,量化技术已经形成了从INT4到FP8的完整谱系,每种精度都有其适用场景和工程权衡。 量化的基本原理 对称量化 将浮点数映射到整数的固定范围。以INT8为例: x_int8 = round(x_fp / scale) scale = max(|x_fp|) / 127 反量化:x_fp ≈ x_int8 × scale 非对称量化 引入零点偏移,处理分布不对称的情况: x_int8 = round((x_fp - zero_point) / scale) scale = (max(x) - min(x)) / 255 zero_point = min(x) 量化粒度 逐张量(per-tensor):整个张量共用一个scale,最简单但精度损失大 逐通道(per-channel):每个输出通道一个scale,精度好但额外参数多 逐组(per-group):将通道分组,组内共用scale,是精度和效率的折中 def per_group_quantize(x, group_size=128): """分组量化""" original_shape = x.shape # 重排为 [out_features // group_size, group_size, in_features] x_reshaped = x.view(-1, group_size, original_shape[-1]) # 每组计算独立的scale scales = x_reshaped.abs().max(dim=1, keepdim=True).values / 127 # 量化 x_int8 = (x_reshaped / scales).round().clamp(-128, 127).to(torch.int8) return x_int8, scales def per_group_dequantize(x_int8, scales, original_shape): """分组反量化""" x_fp = x_int8.float() * scales return x_reshaped.view(original_shape) INT8量化 适用场景 INT8是最成熟的量化方案,几乎所有推理框架都原生支持。适用于: ...

