【AI系统】低比特量化原理

news2025/1/10 3:14:49

低比特量化原理

计算机里面数值有很多种表示方式,如浮点表示的 FP32、FP16,整数表示的 INT32、INT16、INT8,量化一般是将 FP32、FP16 降低为 INT8 甚至 INT4 等低比特表示。

在这里插入图片描述

模型量化则是一种将浮点值映射到低比特离散值的技术,可以有效的减少模型的参数大小、内存消耗和推理延迟,但往往带来较大的精度损失。尤其是在极低比特(<4bit)、二值网络(1bit)、甚至将梯度进行量化时,带来的精度挑战更大。本节将会重点讲解低比特量化的通用基本原理。

AI 特点和量化优势

神经网络特点

低比特量化主要用在推理的场景,因此以量化和推理的视角来看,神经网络一般具有以下特点:

  1. 模型参数量大:神经网络模型通常具有大量的参数,特别是在神经网络中,参数数量可能非常庞大。这导致了存储这些参数所需的空间也很大。

  2. 计算量大:神经网络的推理阶段通常需要大量的计算资源,尤其是在神经网络中,包含大量的矩阵乘法和非线性激活函数等操作。这些计算量大大增加了模型在实际部署和执行过程中的成本。

  3. 内存占用大:由于神经网络模型的参数量大、计算量大,因此在推理过程中需要大量的 NPU 内存来存储模型参数、中间计算结果等。这对于嵌入式设备、移动设备等资源受限的环境来说可能是一个挑战。

  4. 模型精度高:与传统的机器学习模型相比,神经网络模型通常具有较高的精度和表现能力。这使得在量化过程中需要考虑如何在减小模型尺寸和计算成本的同时,尽量保持模型的精度和性能。

部署神经网络时,我们希望网络越小越好,来降低部署成本,于是就需要模型量化等压缩手段。

在这里插入图片描述

模型量化优点

通过对神经网络模型进行合理的量化,可以实现以下优势:

  1. 加速计算:传统的卷积操作都是使用 FP32 浮点,低比特的位数减少少计算性能也更高,INT8 相对比 FP32 的加速比可达到 3 倍甚至更高。

  2. 保持精度:量化会损失精度,这相当于给网络引入了噪声,但是神经网络一般对噪声是不太敏感的,只要控制好量化的程度,对高级任务精度影响可以做到很小。

  3. 节省内存:与 FP32 类型相比,FP16、INT8、INT4 低精度类型所占用晶体管空间更小,对应存储空间和传输时间都可以大幅下降。

  4. 节能和减少芯片面积:每个数使用了更少的位数,做运算时需要搬运的数据量少了,减少了访存开销(节能),同时 NPU 所需的乘法器数目也减少(减少芯片面积)。

总之,模型量化主要是对模型的参数进行压缩,比如 200MB 的模型压缩到 50MB,达到提升运算速度,降低内存和功耗的效果。

落地挑战与思考

在实际部署时,量化技术的落地也有一些挑战,需要综合衡量是否需要使用模型量化。

精度挑战

  1. 量化方法的精确性:常见的量化方法如线性量化,对于数据分布的描述并不精确。线性量化将浮点数参数转换为固定位数的整数表示,这种精度的降低可能导致模型在量化后性能下降。对于特定任务和数据分布,需要设计更准确的量化方法以最小化精度损失。

  2. 低比特数的影响:将模型从高比特数(如 16 位)量化为低比特数(如 4 位)会导致更大的精度损失。随着比特数的减少,模型的表示能力下降,因此需要在精度和模型大小之间找到平衡点。

  3. 任务复杂性对精度的影响:在分类、检测、识别等任务中,任务的复杂性与模型所需的表示能力密切相关。通常情况下,任务越复杂,模型对精度的要求也越高,因此在量化过程中,需要针对不同的任务类型和复杂程度进行定制化的量化策略,以最大程度地保持模型的精度。

  4. 模型大小对精度的影响:模型大小与精度之间存在一种权衡关系。一般来说,模型越小,其表达能力和容纳参数的能力也越有限,因此在量化过程中,对于较小的模型,精度损失可能会更加显著。在进行模型量化时,需要综合考虑模型大小、精度要求以及实际应用场景,以确定最适合的量化策略。

硬件支持程度

在模型量化落地时,硬件支持是一个至关重要的因素。不同硬件平台对于低比特量化指令的支持程度不同,这会直接影响到模型在该硬件上的性能和效率。

  1. 低比特指令支持差异:不同的硬件架构对于低比特指令的支持程度有所不同。比如英伟达一些系列显卡支持 INT8 Tensor Core 计算。

  2. 低比特指令计算方式差异:即使硬件平台支持相同的低比特指令,不同的硬件架构可能采用不同的计算方式。例如,8bit 计算一些硬件平台可能支持 INT8 的计算,而另一些可能采用 FP8 计算。

  3. 硬件体系结构的 Kernel 优化:不同硬件平台具有不同的体系结构和优化方式。针对特定硬件的优化 Kernel 可以最大限度地利用硬件的并行计算能力和特定指令集,从而提高模型量化后的推理性能。因此,在将模型部署到特定硬件上时,需要进行相应的 Kernel 优化,以确保模型能够充分利用硬件的性能优势。

在这里插入图片描述

软件算法加速思考

在模型量化落地过程中,软件算法的加速能力是一个至关重要的考量因素。尽管软件算法的优化可以提高模型量化的执行效率,但在某些情况下,软件算法也可能对性能造成负面影响。

  1. 混合比特量化的影响:对于混合比特量化(Mixed Precision Quantization)而言,需要进行量化和反向量化操作,同时可能需要插入 Cast 算子来确保数据格式一致性。这些操作会影响到 Kernel 的执行性能,尤其是在硬件平台不支持相关操作的情况下。因此,对于混合比特量化,需要进行针对性的软件算法优化,以尽量减少这些操作对执行性能的影响。

  2. 运行时内存占用优化:除了模型参数量的降低外,还需要关注运行时内存占用。降低模型参数量并不一定会降低运行时内存占用,因为在推理过程中可能需要同时存储模型参数、中间计算结果等数据。因此,软件算法需要考虑如何在保持模型精度的同时,尽量减少运行时内存占用,以提高模型的执行效率。

  3. 模型参数量与内存占用的差异:模型参数量的减少并不直接意味着执行内存占用的减少。一些优化技术可能会引入额外的计算和存储开销,从而影响到运行时内存占用。因此,在进行软件算法优化时,需要综合考虑模型参数量和内存占用之间的差异,以实现最优的性能和内存占用平衡。

量化原理

模型量化方法可以分为以下三种:

在这里插入图片描述

  1. 量化训练 (Quant Aware Training, QAT)

量化训练让模型感知量化运算对模型精度带来的影响,通过微调训练降低量化误差。QAT 对训练好的网络模型进行转换,插入伪量化算子,得到一个新的网络模型。接着对新的网络模型进行微调得到最终的量化模型,最后送到部署端进行推理部署。

  1. 动态离线量化 (Post Training Quantization Dynamic, PTQ Dynamic)

动态离线量化仅将模型中特定算子的权重从 FP32 类型映射成 INT8/INT16 类型。动态离线量化提前将模型的权重转换为 INT8,推理过程中,在真正执行计算之前根据激活输入的范围,动态地将激活即时转换为 INT8。

动态量化的关键思想是根据运行时观察到的数据范围动态确定激活的比例因子。这确保了比例因子被“调整”,以便尽可能多地保留有关每个观察到的数据集的信号。

  1. 静态离线量化 (Post Training Quantization Static, PTQ Static)

静态离线量化使用少量无标签校准数据,采用 KL 散度等方法计算量化比例因子。静态离线量化也是一种在训练完成后将模型参数转换为低比特表示的方法,但与动态离线量化不同的是,静态离线量化中的量化参数是在转换过程中固定的,而不是根据输入数据动态调整的。

量化方法对比

量化方法功能经典适用场景使用条件易用性精度损失预期收益
量化训练 (QAT)通过 Finetune 训练将模型量化误差降到最小对量化敏感的场景、模型,例如目标检测、分割、OCR 等有大量带标签数据极小减少存续空间 4X,降低计算内存
静态离线量化 (PTQ Static)通过少量校准数据得到量化模型对量化不敏感的场景,例如图像分类任务有少量无标签数据较好较少减少存续空间 4X,降低计算内存
动态离线量化 (PTQ Dynamic)仅量化模型的可学习权重模型体积大、访存开销大的模型,例如 BERT 模型一般一般减少存续空间 2/4X,降低计算内存

总的来说,QAT 可以达到的精度较高,但是往往需要较多的量化训练时间,量化成本比较大。PTQ 的量化过程比较迅速,只需要少量数据集来校准,但是量化后精度往往损失较多。

饱和与非饱和量化

模型量化桥接了定点与浮点,建立了一种有效的数据映射关系,使得以较小的精度损失代价获得了较好的收益。模型量化有两种映射方法,以 INT8 量化为例子:

  1. 非饱和量化

非饱和量化方法计算浮点类型 Tensor 中绝对值的最大值 a b s _ m a x abs\_max abs_max,将其映射为 127,则量化比例因子(scale)等于 a b s _ m a x / 127 abs\_max/127 abs_max/127

在这里插入图片描述

  1. 饱和量化

饱和量化方法使用 KL 散度计算一个合适的阈值 T ( 0 < T < a b s _ m a x 0<T<abs\_max 0<T<abs_max),将 ± ∣ T ∣ ±|T| ±T 映射为 ±127,超出阈值 ± ∣ T ∣ ±|T| ±T 外的直接映射为阈值 ±127,则量化比例因子(scale)等于 T / 127 T/127 T/127

在这里插入图片描述

线性与非线性量化

量化可以分为线性量化和非线性量化,目前主流的方法是线性量化。线性量化可以分为对称量化和非对称量化。要弄懂模型量化的原理就是要弄懂这种数据映射关系,浮点与定点数据的转换公式如下:

Q = R / S + Z Q=R/S+Z Q=R/S+Z

R = ( Q − Z ) ∗ S R=(Q-Z)*S R=(QZ)S

其中, R R R 表示输入的浮点数据, Q Q Q 表示量化之后的定点数据, Z Z Z 表示零点(Zero Point)的数值, S S S 表示缩放因子(Scale)的数值。

对称量化

对称量化是非对称量化 Z = 0 Z=0 Z=0 时的特例,即 R m a x R_{max} Rmax R m i n R_{min} Rmin 关于 Z 对称。对称量化常用的方法是最大绝对值量化 ( a b s _ m a x ) (abs\_max) (abs_max),将输入缩放到 8 位范围 [ − 128 , 127 ] [-128, 127] [128,127],对称的量化算法原始浮点精度数据与量化后 INT8 数据的转换如下:

在这里插入图片描述

i n t = r o u n d [ f l o a t s c a l e ] int = round[\frac{float}{scale}] int=round[scalefloat]

s c a l e = ( 2 ⋅ m a x ( ∣ x m i n ∣ , x m a x ) ) Q m a x − Q m i n scale = \frac{(2·max(|x_{min}|,x_{max}))}{Q_{max}-Q_{min}} scale=QmaxQmin(2max(xmin,xmax))

其中,threshold 是阈值, 可以理解为 Tensor 的范围是 [ − t h r e s h o l d , t h r e s h o l d ] [-threshold, threshold] [threshold,threshold]。一般来说,对于激活值, s c a l e = t h r e s h o l d / 128 scale=threshold/128 scale=threshold/128。对于权重, s c a l e = t h r e s h o l d / 127 scale=threshold/127 scale=threshold/127

非对称量化

非对称量化(Affifine Quantization)也称为 zero-point quantization,通过使用归一化动态范围 n d x n_{dx} ndx 进行缩放,然后通过零点 z p x z_{px} zpx 进行移位,将输入分布移动到完整范围 [ − 128 , 127 ] [-128, 127] [128,127] 或者 [ 0 , 255 ] [0, 255] [0,255]。通过这个仿射变换,任何输入张量都将使用数据类型的所有位,从而减小了非对称分布的量化误差。

在这里插入图片描述

以线性量化的 MinMax 方法为例来求解 S S S Z Z Z

S = R m a x − R m i n Q m a x − Q m i n S = \frac{R_{max}-R_{min}} {Q_{max}-Q_{min}} S=QmaxQminRmaxRmin

Z = Q m a x − R m a x S Z = Q_{max}- \frac{R_{max}}{S} Z=QmaxSRmax

其中, R m a x R_{max} Rmax 表示输入浮点数据中的最大值, R m i n R_{min} Rmin​ 表示输入浮点数据中的最小值, Q m a x Q_{max} Qmax 表示最大的定点值(127 / 255), Q m i n Q_{min} Qmin 表示最小的定点值(-128 / 0)。

量化算法原始浮点精度数据与量化后 INT8 数据的转换如下:

f l o a t = s c a l e × ( u n i t 8 − o f f s e t ) float = scale \times (unit8-offset) float=scale×(unit8offset)

确定后通过原始 float32 高精度数据计算得到 uint8 数据的转换即为如下公式所示:

u i n t 8 = r o u n d ( f l o a t s c a l e ) + o f f s e t uint8 = round(\frac{float}{scale})+offset uint8=round(scalefloat)+offset

若待量化数据的取值范围为 [ X m i n , X m a x ] [X_{min}, X_{max}] [Xmin,Xmax],则 s c a l e scale scale 的计算公式如下:

s c a l e = X m a x − X m i n Q m a x − Q m i n scale = \frac{X_{max}-X_{min}}{Q_{max}-Q_{min}} scale=QmaxQminXmaxXmin

offset 的计算方式如下:

o f f s e t = Q m i n − r o u n d ( x m i n s c a l e ) offset = Q_{min}-round(\frac{x_{min}}{scale}) offset=Qminround(scalexmin)

当量化到 INT8 时, Q m a x = 127 Q_{max}=127 Qmax=127, Q m i n = − 128 Q_{min}=-128 Qmin=128; UINT8 时, Q m a x = 255 , Q m i n = 0 Q_{max}=255,Q_{min}=0 Qmax=255,Qmin=0

如果您想了解更多AI知识,与AI专业人士交流,请立即访问昇腾社区官方网站https://www.hiascend.com/或者深入研读《AI系统:原理与架构》一书,这里汇聚了海量的AI学习资源和实践课程,为您的AI技术成长提供强劲动力。不仅如此,您还有机会投身于全国昇腾AI创新大赛和昇腾AI开发者创享日等盛事,发现AI世界的无限奥秘~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2255085.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目文章 | RNA-seq+WES-seq+机器学习,揭示DNAH5是结直肠癌的预后标志物

肿瘤突变负荷&#xff08;TMB&#xff09;已成为预测结直肠癌&#xff08;CRC&#xff09;患者预后和对免疫治疗反应的关键生物标志物。然而&#xff0c;全外显子测序&#xff08;WES-seq&#xff09;作为TMB评估的金标准&#xff0c;成本高且耗时。此外&#xff0c;高TMB患者之…

【NLP修炼系列之Bert】Bert多分类多标签文本分类实战(附源码下载)

引言 今天我们就要用Bert做项目实战&#xff0c;实现文本多分类任务和我在实际公司业务中的多标签文本分类任务。通过本篇文章&#xff0c;可以让想实际入手Bert的NLP学习者迅速上手Bert实战项目。 1 项目介绍 本文是Bert文本多分类和多标签文本分类实战&#xff0c;其中多分…

【CSS in Depth 2 精译_069】11.3 利用 OKLCH 颜色值来处理 CSS 中的颜色问题(上)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 11 章 颜色与对比】 ✔️ 11.1 通过对比进行交流 11.1.1 模式的建立11.1.2 还原设计稿 11.2 颜色的定义 11.2.1 色域与色彩空间11.2.2 CSS 颜色表示法 11.2.2.1 RGB…

基础算法——搜索与图论

搜索与图论 图的存储方式2、最短路问题2.1、Dijkstra算法&#xff08;朴素版&#xff09;2.2、Dijkstra算法&#xff08;堆优化版&#xff09;2.3、Bellman-Ford算法2.4、SPFA求最短路2.5、SPFA判负环2.6、Floyd算法 图的存储方式 2、最短路问题 最短路问题可以分为单源最短路…

IDEA创建Spring Boot项目配置阿里云Spring Initializr Server URL【详细教程-轻松学会】

1.首先打开idea选择新建项目 2.选择Spring Boot框架(就是选择Spring Initializr这个) 3.点击中间界面Server URL后面的三个点更换为阿里云的Server URL Idea中默认的Server URL地址&#xff1a;https://start.spring.io/ 修改为阿里云Server URL地址&#xff1a;https://star…

Git_如何更改默认路径

网上搜了一堆都不好使&#xff0c;其实可以直接使用git bash输入命令来解决 打开 Git Bash&#xff1a;首先打开 Git Bash 终端&#xff0c;这是一个类似于命令提示符的窗口&#xff0c;可在其中执行 Git 命令。设置 Git 默认存储路径&#xff1a;使用 git config 命令来修改 …

计算机毕业设计Python房价预测 房屋推荐 房价可视化 链家爬虫 房源爬虫 房源可视化 卷积神经网络 大数据毕业设计 机器学习 人工智能 AI

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

AndroidAutoSize实战教程:今日头条屏幕适配方案详解

如何在项目中结合 AndroidAutoSize 来进行今日头条屏幕适配&#xff0c;我会具体讲解如何用 AndroidAutoSize 实现屏幕适配&#xff0c;并结合 Kotlin 代码举例分析。 通过 AndroidAutoSize 库来实现屏幕适配&#xff0c;确保在不同的屏幕尺寸、分辨率、密度下&#xff0c;应用…

【HarmonyOS】层级轮播卡片效果

【HarmonyOS】层级轮播卡片效果 一、功能效果&#xff1a; 1.上下堆叠由大到小的卡片层叠效果。 2.上层卡片可手势左右滑动&#xff0c;自动左滑动。 3.三层卡片随滑动&#xff0c;内容进行依次切换。 二、开发思路 【完整代码见章节三】 1.最上层使用swiper进行轮播效果…

Postman自定义脚本Pre-request-script以及Test

这两个都是我们进行自定义script脚本的地方&#xff0c;分别是在请求执行的前后运行。 我们举两个可能经常运用到的场景。 (一)请求A先执行&#xff0c;请求B使用请求A响应结果作为参数。如果我们不用自定义脚本&#xff0c;可能得先执行请求A&#xff0c;然后手动复制响应结果…

一些引入依赖,提示引入方式报错的问题

背景 当我们使用gulp自动化处理文件的时候&#xff0c;难免会遇到需要按照一定条件过滤的需求&#xff0c;这里博主所遇到问题是&#xff0c;通过文件内容中是否包含 某一串字符串 决定过滤当前的文件 比如&#xff1a; 碰到文件中包含注释 * replace-note 此文件未被引用 ,那…

R语言 | 峰峦图 / 山脊图

目的&#xff1a;为展示不同数据分布的差异。 1. ggplot2 实现 # 准备数据 datmtcars[, c("mpg", "cyl")] colnames(dat)c("value", "type") head(dat) # value type #Mazda RX4 21.0 6 #Mazda RX4 Wag …

6月份stable diffusion animatediff等插件使用指南,又来更新了

插件一直会更新&#xff0c;包含了基本市面上流行的90%插件&#xff0c;好用的插件更是不会错过&#xff0c;往期插件请看往期文章&#xff0c;如果你没有时间一直关注sd更新的进展&#xff0c;请关注我&#xff0c;一个月用几个小时看一下我的文章&#xff0c;最短时间跟进sd。…

jmeter配置

单接口运行没问题&#xff0c;但是批量执行100个线程数发现总是提示请求不合法 最后发现 需要将配置改成 正好回归一下这个配置&#xff1a; Ramp-Up时间&#xff08;秒&#xff09;的定义&#xff1a; Ramp-Up时间是指在JMeter测试中&#xff0c;所有指定的线程&#xff08…

WPF中的VisualState(视觉状态)

以前在设置控件样式或自定义控件时&#xff0c;都是使用触发器来进行样式更改。触发器可以在属性值发生更改时启动操作。 像这样&#xff1a; <Style TargetType"ListBoxItem"><Setter Property"Opacity" Value"0.5" /><Setter …

如何利用Java爬虫获得商品类目

在当今数字化时代&#xff0c;数据已成为企业最宝贵的资产之一。获取和分析数据的能力对于任何希望在市场上保持竞争力的企业来说都是至关重要的。对于电子商务平台和市场研究公司而言&#xff0c;获取商品类目数据尤为重要&#xff0c;因为这些数据可以帮助他们更好地理解市场…

【Linux】程序的编译过程

程序的翻译过程 预处理&#xff08;头文件展开&#xff0c;条件编译&#xff0c;宏替换&#xff0c;去注释&#xff09;编译 &#xff1a;把c变成汇编语言汇编 &#xff1a;把汇编变成二进制&#xff08;不可执行&#xff0c;二进制目标文件&#xff09;链接 &#xff1a;把自…

#渗透测试#SRC漏洞挖掘# 操作系统-windows系统番外练习

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

信奥常考点:二叉树的构建(已知中序和 前序或后序 的情况下)

一、题目引入 这是来自CCF-GESP C七级认证 2024年9月的题目。 我们在此不解题&#xff0c;只把树画出来。 CCF-GESP 编程能力认证 C 七级 2024年9月份详细解析-CSDN博客 二、解题过程 我们可以根据先序遍历得出根节点是A&#xff0c;然后我们得到了A的左子树[B D]&#xff08;橙…

自回归模型(AR )

最近看到一些模型使用了自回归方法&#xff0c;这里就学习一下整理一下相关内容方便以后查阅。 自回归模型&#xff08;AR &#xff09; 自回归模型&#xff08;AR &#xff09;AR 模型的引入AR 模型的定义参数的估计方法模型阶数选择平稳性与因果性条件自相关与偏自相关函数优…