模型压缩-量化
引用原文
常见的量化方式
一般包括二值量化,线性量化、指数量化,常用的是线性量化,其中,线性量化包括对称量化与非对称量化,对称量化计算量低于非对称量化
模型量化的方法有哪些?
训练后量化(PTQ)和量化感知训练(QAT)
PTQ方法,是将已经训练好的模型进行量化,同时只需要很少的数据或者不需要数据,少部分需要手动调整的超参数以及不需要端到端训练。这使得PTQ成为一种工程实现简单并且不需要大量计算成本的量化方法。
QAT,它依赖神经网络在训练过程中进行模拟量化。虽然QAT需要进行重新训练以及调整超参数,但是在低bit时却可以比PTQ获得更接近全精度的效果。
QAT 对于更低精度也是可以使用,如 int4 weight 量化,一般指标损失 2%~10%
精度提升方法 : 部分量化,一些模型量化后精度损失往往是一些层导致的,这些层不进行量化,精度将大幅度提升; QAT 也是精度提升的有效方法;
激活函数为什么要使用非对称量化?
激活函数的输出值一般是分布不均匀的,如果使用对称量化将会导致精度损失和信息丢失等问题,而权重的值分布比较均匀,一般使用对称量化,且权重量化使用非对称量化会导致代价变大
per-tensor 与per-channel区别哪个粒度大?
per-tensor和per-channel都是量化时常用的两种方式。
per-tensor是指对整个张量进行量化,即将整个张量映射到一个固定的整数值区间内。这种方式适用于张量中所有元素的取值范围相似的情况,例如卷积核、全连接层权重等。per-tensor的粒度较大,仅对整个张量进行一个量化参数。
而per-channel是指对张量中每个通道(channel)分别进行量化,即每个通道都映射到一个固定的整数值区间内。这种方式适用于张量中不同通道的取值范围差异较大的情况,例如卷积层的特征图。per-channel的粒度较小,需要为每个通道分别设置一个量化参数。
总的来说,per-channel比per-tensor更加灵活,可以更好地适应不同通道之间取值范围的差异。但是,per-channel需要更多的存储空间和计算资源,因为需要为每个通道分别设置一个量化参数。在实际应用中,需要根据具体情况选择合适的量化方式和粒度。
为啥将浮点数中的零映射到整数中的零,从而导致信息丢失和精度降低?
对称量化指的是将浮点数的范围映射到整数范围内,使得整数的零点对应浮点数的零点,这样可以减少量化误差。然而,在浮点数中,零通常是一个非常小的数,而在整数中,零是一个精确的值。因此,如果将浮点数中的零映射到整数中的零,就会导致浮点数中非零的值被舍入为最接近的整数值,从而导致信息丢失和精度降低。
权重量化步骤
关键性总结:
1、 量化的量化粒度越小, 模型的精度损失越小,但是计算量越大。
2 、激活层的量化使用 per-tensor 就已经足够 。
3、 卷积或者反卷积使用 per-tensor 或 per-channel
4、 量化最小粒度为 per-col 或者 per-row, 实际使用中只有 per-tensor, per-channel