首页 > 其他分享 >模型量化

模型量化

时间:2022-11-08 10:55:38浏览次数:55  
标签:模型 矩阵 计算 量化 bit 精度

前言

模型量化这个概念在深度学习领域已经很常见了,它主要是通过使用定点数表示模型中的weights和运行时的activations来实现对模型尺寸的压缩和运行的加速。

什么是量化?

量化是数学运算与数字信号处理里广为使用的一种方法,它将一个大的集合种的输入数字映射到一个小的集合中的数字,这个小的集合一般是有限集。这样做可以带来两个好处:

  • 减少内存消耗,增加数据吞吐量,可以用缓存机制存放更多中间结果,减少重复计算;
  • 量化的结果可以被更快的处理,一般硬件会对量化的结果的运算做优化。

最常见的量化应用场景是通信里面对语音信号的处理,在打电话的过程中你的声音信号先被量化成8位的数字信号,经过传输到达对方后再被恢复成声音信号,其实它是一个有损的信息压缩方法。这也是为什么电话里面听到得声音与当面说话得声音有差异得原因,因为量化在一定程度上出现了信息的丢失。

深度学习中的量化

深度学习中处理的数据是浮点数,常见的做法是将64位的浮点数转化位数较低的整数,具体采用的方法被称为uniform quantization。

假设问题中涉及到的浮点数的范围为 r∈(Xmin,Xmax) ,量化后的范围变为 q∈(0,nlevels−1) ,那么量化的公式为

quantization:q=Z+rSde−quantization:r=S(q−Z)

其中:

  • S 为尺度(Scale),它定义了量化的步长,如果浮点数的变换小于这个步长,量化结果将不变;
  • Z 是零点(Zero-point), Xmin 的量化结果。

矩阵乘法

矩阵乘法是神经网络中最为常见得计算,我们看看如何用量化来实现矩阵乘法。

假设 A 与 B 分别是 M∗K 与 K∗N 的矩阵,现在先将矩阵 A 与 B 量化,那么就可以通过量化后的矩阵的低精度整数运算近似得到直接相乘的结果,整个过程如下

 

具体流程为,先将 A 与 B 量化为整数矩阵

Aq​:A(i,k)=Sa​(Aq(i,k)​−Za​),i∈(0,M),k∈(0,K)

Bq:A(k,j)=Sb​(Bq(k,j)​−Zb​),k∈(0,K),j∈(0,N)

那么矩阵A 与 B 的相乘可以简化为量化后的整数矩阵相乘,即

Cq​:C(i,j)=∑k=0KA(i,k)∗A(k,j)=Sa​Sb​∑k=0KK((Aq(i,k)​−Za​)((Bq(k,j)​−Zb​)=

SaSb​∑k=0KAq(i,k)​Bq(k,j)​−Za​∑k=0KBq(k,j)−Zb∑k=0K​Aq(i,k)​+KZa​Zb​=

SaSbCq(i,j)−Za∑k=0KBq(k,j)​−Zb∑k=0KAq(i,k)+KZaZb​

可以看出计算矩阵A 与 B 的相乘的结果 C 中的每个元素需要量化矩阵的计算结果得到。

 

神经元的量化计算

神将网络中的神经元的计算逻辑是将输入信息一个线性变换再灌入一个非线性的激活函数,比较常见的是RELU函数,整个过程如下

Linear:z=wx+bReLU:y=max(z,0)

针对神经元/感知机的计算的量化有两种解决方案:

  • 直接对weights量化,如下图左边所示,需要分两步,先对线性变换部分涉及的矩阵做量化,并对量化矩阵做计算,然后再对量化计算结果做dequantize,得到的结果再做量化完后输入QuantizedRelu,再做dequantize。
  • 权重与激活函数的联合量化,如下图右边索斯,直接省略中间针对的线性变换量化计算结果的dequantize以及后面下一步的quantize。需要有校准数据,计算激活函数输出的范围,以确定联合量化的计算公式。

模型量化方式

  • 训练后量化:模型训练好之后再进行量化,这种方法一般对大模型效果不错,对小模型则效果比较差。
  • 量化感知训练:在训练过程中对模型参数,inference与training使用的是量化过后的weights和activation,如下图所示。由于训练的loss能够反应了模型部署时的实际计算方式,所以效果一般会好过训练后量化,但训练方式变得更复杂。

 

 

 

参考:

模型加速(二):量化

Quantization and training of neural networks for efficient integer-arithmetic-only inference

 

补充:混合精度量化

就目前而言,8 bit及其以上的量化已经基本做到了无损,且已经可以在各个框架中直接一键转换了,8 bit以下的量化还处在各种论文刷SOTA的阶段,感觉还没有大规模工程化,尤其是1-bit,比如ResNet18的二值模型在ImageNet上离全精度至少还有五六个点的差距(保持原有结构的情况下)。

传统的模型量化方法都是将整个模型的weights和activations都固定量化到某个固定的bit位,但有个问题就是:高bit的量化能保证高精度但内存占用和计算量也更大,低bit的量化精度更低但内存占用和计算量更小,所以固定bit下的量化始终无法在Accuracy和 (FLOPs & Parameters)之间达到一个非常细粒度的trade-off,所以就需要混合精度量化(Mixed-Precision Quantization, MPQ)来对模型实现进一步的高效压缩。

混合精度量化区别于混合精度训练这个概念,后者指的是在模型训练过程中使用FP16来代替传统的FP32从而达到占用显存更少,计算速度更快的目的,而本文要谈的混合精度量化指的是通过设计某种policy,来对模型各层的weights和activations的量化bit位宽进行合理分配,如下图所示,其重点就是如何设计这个policy,从而使得混合精度量化之后模型能够在精度和硬件指标上达到最佳的平衡。

 

 参考:混合精度量化(Mixed-Precision Quantization)相关论文总结

标签:模型,矩阵,计算,量化,bit,精度
From: https://www.cnblogs.com/carsonzhu/p/16868879.html

相关文章

  • 5+:基于单细胞测序和转录组数据构建胰腺癌中坏死性凋亡相关的预后模型
    原文公众号:一起实验网对下述分析方法感兴趣或者没有研究思路的小伙伴,欢迎踊跃探讨! 早!今天小编和大家分析一篇2022年10月发表在《FrontiersinImmunology》(IF:5.0)期刊上......
  • JVM学习笔记——内存模型篇
    JVM学习笔记——内存模型篇在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的内存模型部分我们会分为以下几部分进行介绍:内存模型乐观锁与悲观锁synchron......
  • 基于arx模型的MPC预测控制器simulink建模与仿真实现
    目录一、理论基础二、核心程序三、测试结果一、理论基础MPC的优点模型预测控制善于处理多输入多输出系统对于MIMO系统,PID需要为每个子系统单独设计PID控制器,......
  • Window编程模型
    Windows程序采用如下图所示的事件驱动编程模型,应用程序通过处理操作系统发送来的消息来响应事件。事件可能是一次击键、鼠标单击或是要求窗口更新的命令以及其他事情。Wind......
  • C++对象模型和this指针
    4.3C++对象模型和this指针this指针的本质是一个指针常量,和引用一样,不能够修改指向,但是可以修改值4.3.1成员变量和成员函数分开存储在C++中,类内的成员变量和成员函数分......
  • 网络IO模型之select基础
    思考:为什么线程开销会大一、IO有两种操作,同步IO和异步IO。    同步IO指的是,必须等待IO操作完成后,控制权才返回给用户进程。    异步IO指的是,无......
  • 回归模型评价指标总结
    回归评价指标总结1.MeanAbsoluteError,MAE平均绝对误差(MeanAbsoluteError,MAE),也称为L1损失。它是通过取预测值和实际值之间的绝对差值并在整个数据集中取平均值来计......
  • LabVIEW+OpenVINO在CPU上部署新冠肺炎检测模型实战
    前言之前博客:【YOLOv5】LabVIEW+OpenVINO让你的YOLOv5在CPU上飞起来给大家介绍了在LabVIEW上使用openvino加速推理,在CPU上也能感受丝滑的实时物体识别。那我们今天就一起......
  • Darknet框架2:YOLOV3-使用Darknet训练检测自定义模型+COCO数据集!
    YOLOV3-使用Darknet训练检测自定义模型+COCO数据集!文章目录​​一.YOLOV3网络结构​​​​二.YOLOV3Darknet编译​​​​2.1.Clone项目文件​​​​2.2.根据环境,修改......
  • 服务器端glTF格式模型转换方案
    太长不看版Node.js+fbx2gltf/obj2gltf/……(初步模型转换)+@gltf-transform(精修)(+sharp/……(贴图处理)) 背景手里有个网页3D模型展示的项目,内核选了three.js......