关于量化【转载以学习、回忆】
关于量化 还不明白
转载一篇以学习、回忆
来源链接:https://zhuanlan.zhihu.com/p/86900556
何谓量化,打个比方,看 1080p 太慢,于是降到 720p 看。
同样的,如果用完整 32 位训练和保存的模型看作 1080p 的话,那么量化完后模型就可以当作是 720p,如此一来,模型自然变小,速度自然加快。
关于量化实际使用,根据实现细节涉及到好些不同分类。比如说真量化(Real Quantization)与伪量化( Pseudo Quantization),训练后量化(Post Training Quantization)与训练中量化(During Training Quantization),最近 pytorch 1.3 文档中还有,动态量化(Dynamic Quantization)与静态量化(Static Quantization),看得人头晕。
真量化
首先真量化,便是一般意义上想的,将模型中参数表示用低精度来表示。
比较常用的方法就是直接通过:
来将高精度(比如说32位)矩阵转换成低精度(比如说8位),之后矩阵运算使用低精度,而结果则用 scale 和 zero_point 这两个参数来还原高精度结果。
还可以更进一步,不光矩阵运算,整个模型中的运算都用低精度(比如激活函数)
伪量化
而关于伪量化,实际的运算过程和一般情况下跑模型没有太大区别,其实也都是 32 位运算,而增加的操作就是将模型用低精度表示存储,然后实际运算中查表近似还原的操作。
这里要介绍一下,(这里应该说的是伪量化)量化中运用很广泛的一个算法 k-means quantization。具体做法是,先拿到模型完整表示的矩阵权重 W,之后用 k-means 算法将里面参数聚成 N 个簇。然后将 W 根据聚成的簇,转化成 1 到 N 的整数,每个分别指向各个簇中心点。这样就能将 32 位降到只有 log(N)位,大大减小了存储空间。而使用时只需要按照对应的 N 查表还原就行。
因为实际运算用的还是完整精度,因此也被称为伪量化。
训练后量化与训练中量化
首先训练后量化,其实大概就类似上面说的 k-means quantization 过程。
而训练中量化,一般会用一个算法 quantization-aware training。大概过程是:
- 量化权重
- 通过这个量化的网络计算损失
- 对没量化权重计算梯度
- 然后更新未量化权重
训练结束后,量化权重用量化后的模型直接进行预测。
pytorch量化文档https://pytorch.org/docs/master/quantization.html