量化的过程可以根据其发生的时机,被划分为训练时量化和训练后量化,也被称为后训练量化(Post Training Quantization)。在模型的训练阶段,我们通常会寻求优质的硬件条件和更高的计算精度,以便训练出性能更优秀的模型,从而获得更高的评估分数。然而,在模型部署阶段,我们需要考虑到用户硬件的实际限制。为了让更多的用户能够使用我们的模型,我们通常会在训练后的推理阶段进行量化处理。这样,我们可以在保持模型性能的同时,降低模型的硬件需求和运行成本,使模型能够在更广泛的硬件环境中运行。因此,后训练量化是实际商业应用中的常见做法。
所以,这里我们只关心训练后量化,将训练好的权重拿出来量化,这些压缩后的模型仅用于推理。
在模型量化技术(1)中,我们提到一个重要的步骤是找到权重附近的“落脚点”,在实际运算过程中,我们是找到浮点数附近的整数,就是做四舍五入运算来间接处理的。代码如下:
static inline int nearest_int(float fval) {
assert(fval <= 4194303.f);
float val = fval + 12582912.f;
int i; memcpy(&i, &val, sizeof(int));
return (i & 0x007fffff) - 0x00400000;
}
对了,是不是和你课本上 ( int )( x + 0.5f ) 不一样?
这段代码实现了一个产品化的,高性能的,精准的将浮点数四舍五入到最接近的整数的函数。这个函数的工作原理基于IEEE 754浮点数的