训练后量化(PTQ)提供了一种实用方法,可以在不带来重新训练或微调大型语言模型相关的较大开销的情况下,获得降低精度计算的好处,例如更低的内存占用和更快的推理速度。如本章引言所述,其主要思路是将已用高精度格式(通常是32位浮点数 $FP32$)训练好的模型,将其参数(权重)以及有时激活计算,转换为使用低精度整数数据类型,例如8位整数 $INT8$ 甚至4位整数 $INT4$。训练后量化的主要原理围绕着将原始模型中观察到的浮点数值范围映射到目标整数格式中有限的可用范围。可以将其想象成将宽广的色彩范围压缩到一个更小的调色板中。为了有效地执行这种映射,我们需要为我们要量化的每组值(张量)提供两个重要参数:比例因子 ($S$):一个正浮点数,它决定了量化的步长。它将原始浮点数值的范围映射到目标整数格式的范围。零点 ($Z$):一个整数值,它确保实数零能正确映射到量化整数范围内的值。这对于非对称量化方案尤为重要(如第1章所述)。对于对称量化,零点通常固定为0。原始浮点数值 ($r$) 与其量化整数表示 ($q$) 之间的关系由这些参数定义。量化过程本质上应用了仿射变换:$$ q = \text{取整}(r / S + Z) $$该等式将实数值 $r$ 按 $S$ 缩放,按 $Z$ 偏移,然后将结果取整到目标数据类型可表示的最近整数(例如,$INT8$ 通常范围从-128到127)。取整后通常会应用一个截断函数,以确保结果保持在有效的整数范围内。反之,为了从其量化表示中近似原始浮点数值(一个称为反量化的过程),我们反转变换:$$ r \approx S \times (q - Z) $$这个反量化值 $r'$ 是原始值 $r$ 的近似。$r$ 和 $r'$ 之间的差异构成了量化误差。训练后量化的核心难点是为每个张量(或张量的部分,取决于粒度)确定最佳的比例因子 ($S$) 和零点 ($Z$) 值,以最小化此误差并尽可能保持模型的预测准确性。训练后量化流程确定这些最佳的 $S$ 和 $Z$ 参数需要了解预训练模型中的值分布。这引出了典型的训练后量化流程:获取预训练模型:从您希望量化的全精度(例如 $FP32$)模型开始。校准:选择一个小的、有代表性的数据集(通常称为校准数据集)。此数据集理想情况下应反映模型在推理时会遇到的数据类型。观察值范围:使用原始 $FP32$ 模型在校准数据集上运行推理。在此过程中,收集权重以及层间流动的中间激活的值范围(最小值和最大值)的统计数据,后者尤为重要。计算量化参数:使用收集到的统计数据(最小值/最大值)为每个需要量化的张量(权重和可能的激活)计算合适的比例因子 ($S$) 和零点 ($Z$)。存在不同的算法用于此计算,旨在平衡范围覆盖和精度(本章稍后讨论)。量化模型:使用计算出的 $S$ 和 $Z$ 将模型的权重从 $FP32$ 转换为目标低精度格式(例如 $INT8$)。将这些参数与量化权重一起存储,因为反量化步骤需要它们(无论是显式还是隐式地在硬件中)。如果量化激活(静态量化),激活的参数也会被确定和存储。存储量化模型:以适当的格式保存量化权重和相关量化参数,以用于部署。以下是此过程的简化视图:digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="sans-serif", color="#495057", fontcolor="#495057"]; edge [fontname="sans-serif", color="#495057", fontcolor="#495057"]; FP32 [label="FP32 模型"]; CalibData [label="校准数据", shape=cylinder, style=filled, fillcolor="#a5d8ff"]; Observe [label="观察范围\n(权重和激活)", shape=invhouse, style=filled, fillcolor="#bac8ff"]; CalcParams [label="计算\n比例因子 (S) 和零点 (Z)", shape=parallelogram, style=filled, fillcolor="#96f2d7"]; Quantize [label="应用量化\n(转换权重,存储 S/Z)", shape=cds, style=filled, fillcolor="#ffec99"]; INT8 [label="INT8 模型\n+ 量化参数"]; FP32 -> Observe; CalibData -> Observe; Observe -> CalcParams; CalcParams -> Quantize; FP32 -> Quantize [style=dashed, label="原始权重"]; Quantize -> INT8; }训练后量化的典型流程,从预训练模型和校准数据开始,生成带有相关参数的量化模型。训练后量化的有效性取决于所选校准数据在多大程度上代表了推理期间看到的实际数据分布,以及量化参数如何准确地捕获原始浮点数范围中的重要信息。尽管训练后量化与量化感知训练(QAT)相比显著降低了计算开销,但量化过程本质上引入了近似误差。目标是管理此误差,以便效率提升远超模型性能的任何潜在下降。后续章节将讨论校准策略、不同的训练后量化方法(静态与动态)、用于参数计算的特定算法以及处理有问题的值分布的方法。