模型量化是模型加速方向一个很重要的方法,主要思想就是用int8数据格式来存储和进行计算。这样做有两点好处:

  1. 可以减小模型存储的体积。原本float32存储需要4个字节,现在int8存储只需要1个字节,体积是原来的1/4。
  2. 可以加快计算速度。这主要是因为int8数据的读写更快,并且int8矩阵乘法一般来说会更快一点。

以现在最常用的Transformer模型来举例,在使用CUDA推理加速库(例如LightSeq)之后,矩阵乘法的占比高达将近90%。所以优化非矩阵乘法的速度意义不是很大了,占比不高,你算得再快对整体的提速也很小,因此可以尝试优化矩阵乘法。

那么我们考虑浮点数矩阵乘法

,如何将它转化为整数矩阵乘法,并且得到几乎相同的乘法结果呢?

用整数矩阵来表示浮点数矩阵

首先我们需要将一个浮点数矩阵

用整数矩阵
来表示。我们假设
的数值范围在
之间,其实这个假设是合理的,例如一般深度学习模型参数初始化都是正态分布,那么数值范围就在
之间。然后整数矩阵
的数值范围其实就是有符号整数的表示范围
,为了实现的简单,我们只量化到
,这样就和
一样关于零点左右对称了。我们令
,用来表示int8的数值范围,如果
,那就是int4的范围了。

接着整数矩阵

就可以表示为
,也就是将浮点数区间
里的数字等比例映射到整数区间
,然后向最近的整数取整。同理,整数矩阵
可以表示为

这样我们就可以得到两个浮点数矩阵的整数表示,接下来就可以利用他们来进行整数矩阵乘法的转换。

转化为整数矩阵乘法

整数矩阵

还原为浮点数很简单,只需要
即可。但是注意
是取过整的,所以还原回去的
并不完全等于原始的
,是有误差的。举个通俗的例子,两个浮点数0.1和0.101经过量化都变成了整数13,但是还原回浮点数后全都变成了0.102,再也没法区分两个浮点数有什么不同了。

所以回到原始的问题,浮点数矩阵乘法

可以改写为
,也就是

那么就可以先计算整数矩阵乘法

,然后得到整数的输出矩阵之后,乘上系数
,还原为浮点数矩阵。

注意输入矩阵

都是int8的,但是乘法结果
一定是int32的。

总结一下流程

  1. 输入两个浮点数矩阵

    ,先分别转化为各自的整数矩阵
  2. 然后计算整数矩阵乘法结果
  3. 最后乘上系数还原为浮点数的乘法结果

进阶(relu激活函数)

熟悉Transformer的同学应该知道,FFN第二层输入分别是relu的结果

和参数
。那么这里就存在一个问题,relu结果的数值范围是
,而不可能是

如果我们强行还按照

的范围来量化relu结果
的话会怎么样呢?这样会导致整数区间
永远不会有数字,因为根本没有负数浮点数的存在。这样就白白浪费了127个整数,就会导致量化的精度大大受损。

那按照

来量化的话,怎么计算整数矩阵乘法的结果呢?

稍稍推导一下就可以得出,

可以表示为
,其中
表示和
相同形状的全1矩阵。而
的话依然表示为

这样矩阵乘法可以改写为

。其中第二项因子可以用
来进一步简化,最终得到

第一项因子和之前一样,先算整数矩阵乘法

,再乘上系数,只不过系数变成了

第二项因子

的维度和
相同,并且它的矩阵元素等于
中同一列的元素之和。那么问题就很简单了,我们只需要提前计算出矩阵
每一列的元素和,再乘上系数
,结果存下来。最后在计算完
整数矩阵乘法结果之后,加上这个列元素之和就行了,你可以将其理解为残差项。

总结

如果矩阵乘法两个输入的范围都是关于零点对称的,那么计算公式为:
量化:

反量化:

如果矩阵乘法其中一个输入是relu的结果,那么计算公式为:
量化:

反量化:

当然还有很多其他情况,例如softmax的输出范围一定是

,那么attention中的矩阵乘法公式还得改写。

此外为了减小量化的损失,还需要在模型结构中插入伪量化节点,然后进行量化感知训练(QAT)。接着还需要将finetune后的模型存储为int8格式。然后还需要开发加载int8模型的推理加速库代码。最后就是本文讲到的整数矩阵乘法了。整个流程比较繁琐,这部分内容今后我会慢慢给大家分享。网上关于量化的优秀教程非常多,我不会讲太多理论上的量化知识,只会从实践的角度来白话一下我们在Transformer模型量化过程中做的一些尝试。

【白话模型量化系列一】矩阵乘法量化相关推荐

  1. CUDA实例系列一: 矩阵乘法优化

    CUDA实例系列一----矩阵乘法优化 很多朋友在学习CUDA的时候都会面临一个题目----矩阵乘法, 这也是CUDA最广泛的应用之一. 本文将详细讲解如何利用GPU加速矩阵乘法的计算. 话不多说, ...

  2. 【自然语言处理】【大模型】用于大型Transformer的8-bit矩阵乘法介绍

    用于大型Transformer的8-bit矩阵乘法介绍 原文地址:A Gentle Introduction to 8-bit Matrix Multiplication for transforme ...

  3. 一起实践神经网络INT8量化系列教程(一)

    开篇 老潘刚开始接触神经网络量化是2年前那会,用NCNN和TVM在树莓派上部署一个简单的SSD网络.那个时候使用的量化脚本是参考于TensorRT和NCNN的PTQ量化(训练后量化)模式,使用交叉熵的 ...

  4. matlab量化矩阵,MATLAB量化金融分析基础与实战/MATLAB工程应用书库

    目录 前言 量化投资基础篇 第1章 基本数据类型 1.1 变量及其命名规则 1.2 数值 1.2.1 数值类型概述 1.2.2 如何查看数值类型范围 1.2.3 实例1:当心数值类型转换中的溢出 1. ...

  5. 【模型压缩】(三)——量化

    一.概述 量化: 剪枝是删除不重要的权重参数,量化则是减少存储权重的bit,将权重存储在更小的空间中: 权重不需要以高精度方式存储,甚至不应该以高精度方式存储: 如果用简单的量化方式效果并不好,需要一 ...

  6. 隐马尔科夫模型(HMM)择时应用的量化策略

    HMM模型 隐马尔科夫模型(HMM)择时应用的量化策略. 仅为研究学习使用, 不作为任何投资策略建议. 文章内容从各处整理汇总而成, 感谢各位大神分享.  具体策略代码均调试通过. 一.从大奖章讲起 ...

  7. 二流四流神经网路(模型融合矩阵乘法理论实践)

    下面这个代码是传统方式将经济的设计方式倍数的方式将流 网络变为 双流网络 从收敛的速度上看收敛的速度变快了一点点 ,所以说基本一致 下面给出了一个根据上面理论设计的一个四流网络,虽然是四流也就是说权重 ...

  8. 深度学习框架Caffe学习系列(2):Ristretto 量化 cifar_small 实验记录

    模型压缩之量化策略 Caffe 量化工具:Ristretto 近似方案 学习资源 量化cifar_small模型 1. 创建模型训练文件 2. 创建模型训练参数文件 3. 开始训练原始模型 4. 测试 ...

  9. Tensorflow模型优化 端侧部署 tflite 量化 稀疏 quantization sparsity

    Tensorflow模型优化 文章目录 Tensorflow模型优化 为什么要模型优化 端侧部署 模型优化方式 Quantization 工具包支持 32 bit float ->16 bit ...

  10. AI算力碎片化:矩阵乘法的启示

    尽管AI的发展取得了巨大进步,但编译器LLVM之父Chris Lattner认为,AI技术应用并不深入,远远没有发挥出已有机器学习研究的所有潜力.而AI系统和工具的单一化和碎片化正是造成这一问题的根源 ...

最新文章

  1. Mybatis复习笔记:1
  2. SAP系统日常管理 常见 t-code (二)
  3. 锋利的JQuery —— DOM操作
  4. 【python】【scrapy】使用方法概要(三)
  5. vim编辑器初级(七)
  6. Java 8:那些Java8的常见写法
  7. 从产品经理招聘信息分析现代产品经理职责
  8. html上下箭头动态效果,使用CSS和Bootstrap图标制作上下跳动的指示箭头动画效果...
  9. 逐点插入法-delaunay三角剖分
  10. mongo E11000 duplicate key error collection
  11. Win10开了hdr灰蒙蒙的怎么办?
  12. mac 妙控板的手势
  13. android 后台自动拍照,怎么实现后台拍照功能,求解
  14. C语言单元测试框架——CUnit
  15. chrome书签变透明看不清怎么办
  16. python5.0完整版
  17. do while循环
  18. 百度地图添加标注及图标拖拽及给标注添加右键
  19. C/C++项目:编译最爱的童年回忆泡泡堂小游戏教程
  20. vgg16_reducedfc.pth

热门文章

  1. Microsoft SQL Server 2008 Management Studio Express 下载地址
  2. 将文件保存到数据库中
  3. java day30【数据库连接池 、Spring JDBC : JDBC Template】
  4. java day06【类与对象、封装、构造方法】
  5. 多核cpu的特殊中断
  6. JavaScript中call,apply,bind方法的总结
  7. Karma 5:集成 Karma 和 Angular2
  8. MS SQL中查看text,ntext,image类型数据
  9. [bzoj5301][Cqoi2018]异或序列
  10. pytest特色与实用插件