关于量化【转载以学习、回忆】

关于量化 还不明白

转载一篇以学习、回忆

来源链接: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。大概过程是:

  1. 量化权重
  2. 通过这个量化的网络计算损失
  3. 对没量化权重计算梯度
  4. 然后更新未量化权重

训练结束后,量化权重用量化后的模型直接进行预测。

pytorch量化文档https://pytorch.org/docs/master/quantization.html

posted on 2022-01-14 14:00  nlp如此迷人  阅读(339)  评论(0)    收藏  举报

导航