【白话模型量化系列一】矩阵乘法量化

简介: 【白话模型量化系列一】矩阵乘法量化

模型量化是模型加速方向一个很重要的方法,主要思想就是用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矩阵。而的话依然表示为。

这样矩阵乘法可以改写为。其中第二项因子可以用来进一步简化,最终得到。

第一项因子和之前一样,先算整数矩阵乘法,再乘上系数,只不过系数变成了。

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

总结

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

「量化:」

1685432278290.png

「反量化:」

1685432292170.png

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

「量化:」

1685432304231.png

「反量化:」

1685432314832.png

当然还有很多其他情况,例如softmax的输出范围一定是,那么attention中的矩阵乘法公式还得改写。

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

相关文章
|
6月前
|
机器学习/深度学习 存储 缓存
加速LLM大模型推理,KV缓存技术详解与PyTorch实现
大型语言模型(LLM)的推理效率是AI领域的重要挑战。本文聚焦KV缓存技术,通过存储复用注意力机制中的Key和Value张量,减少冗余计算,显著提升推理效率。文章从理论到实践,详细解析KV缓存原理、实现与性能优势,并提供PyTorch代码示例。实验表明,该技术在长序列生成中可将推理时间降低近60%,为大模型优化提供了有效方案。
1131 15
加速LLM大模型推理,KV缓存技术详解与PyTorch实现
|
机器学习/深度学习 存储 编解码
Open3d系列 | 3. Open3d实现点云上采样、点云聚类、点云分割以及点云重建
Open3d系列 | 3. Open3d实现点云上采样、点云聚类、点云分割以及点云重建
13822 1
Open3d系列 | 3. Open3d实现点云上采样、点云聚类、点云分割以及点云重建
|
11月前
|
存储 人工智能 编译器
【AI系统】昇腾数据布局转换
华为昇腾NPU采用独特的NC1HWC0五维数据格式,旨在优化AI处理器的矩阵乘法运算和访存效率。此格式通过将C维度分割为C1份C0,适应达芬奇架构的高效计算需求,支持FP16和INT8数据类型。此外,昇腾还引入了NZ分形格式,进一步提升数据搬运和矩阵计算效率。AI编译器通过智能布局转换,确保在不同硬件上达到最优性能。
560 3
|
5月前
|
存储 机器学习/深度学习 缓存
vLLM 核心技术 PagedAttention 原理详解
本文系统梳理了 vLLM 核心技术 PagedAttention 的设计理念与实现机制。文章从 KV Cache 在推理中的关键作用与内存管理挑战切入,介绍了 vLLM 在请求调度、分布式执行及 GPU kernel 优化等方面的核心改进。PagedAttention 通过分页机制与动态映射,有效提升了显存利用率,使 vLLM 在保持低延迟的同时显著提升了吞吐能力。
2327 19
vLLM 核心技术 PagedAttention 原理详解
|
机器学习/深度学习 人工智能 算法
一文搞懂模型量化算法基础
一文搞懂模型量化算法基础
5000 0
|
9月前
|
调度
MindIE对接vLLM框架开发指南
vLLM对接MindIE,使能快速迁移到昇腾设备上,当前MindIE 1.0.0发布版本已支持多种三方框架。
|
JavaScript 前端开发 安全
TypeScript无缝衔接ArkTS:快速入门鸿蒙ArkTS基本语法
【10月更文挑战第12天】TypeScript无缝衔接ArkTS:快速入门鸿蒙ArkTS基本语法
928 0
TypeScript无缝衔接ArkTS:快速入门鸿蒙ArkTS基本语法
|
Kubernetes 关系型数据库 网络架构
ray集群部署vllm的折磨
概括如下: 在构建一个兼容多种LLM推理框架的平台时,开发者选择了Ray分布式框架,以解决资源管理和适配问题。然而,在尝试集成vllm时遇到挑战,因为vllm内部自管理Ray集群,与原有设计冲突。经过一系列尝试,包括调整资源分配、修改vllm源码和利用Ray部署的`placement_group_bundles`特性,最终实现了兼容,但依赖于非官方支持的解决方案。在面对vllm新版本和Ray部署的`reconfigure`方法问题时,又需权衡和调整实现方式。尽管面临困难,开发者认为使用Ray作为统一底层仍具有潜力。
|
存储 JSON 前端开发
multi-agent:多角色Agent协同合作,高效完成复杂任务
随着LLM的涌现,以LLM为中枢构建的Agent系统在近期受到了广泛的关注。Agent系统旨在利用LLM的归纳推理能力,通过为不同的Agent分配角色与任务信息,并配备相应的工具插件,从而完成复杂的任务。
|
Java Python Windows
Python pip 源设置成国内源,阿里云源,清华大学源,最方便的方式,都在这里了
Python pip 源设置成国内源,阿里云源,清华大学源,最方便的方式,都在这里了
76826 1