首页 > 其他分享 >低比特量化方法

低比特量化方法

时间:2024-09-05 17:04:37浏览次数:5  
标签:比特 模型 内存 量化 方法 INT8 精度

低比特量化方法 计算机里面数值有很多种表示方式,如浮点表示的 FP32、FP16,整数表示的 INT32、INT16、INT8,量化一般是将 FP32、FP16 降低为 INT8 甚至 INT4 等低比特表示,如图7-2所示。 图7-2 数值有很多种表示格式 模型量化则是一种将浮点值映射到低比特离散值的技术,可以有效的减少模型的参数大小、内存消耗和推理延迟,但往往带来较大的精度损失。尤其是在极低比特(<4bit)、二值网络(1bit)、甚至将梯度进行量化时,带来的精度挑战更大。本节将会重点讲解低比特量化的通用基本原理。 7.2.1 神经网络特点和量化优势 1. 神经网络特点 低比特量化主要用在推理的场景,因此以量化和推理的视角来看,神经网络一般具有以下特点: 1) 模型参数量大:神经网络模型通常具有大量的参数,特别是在深度神经网络中,参数数量可能非常庞大。这导致了存储这些参数所需的空间也很大。 2) 计算量大:神经网络的推理阶段通常需要大量的计算资源,尤其是在深度神经网 络中,包含大量的矩阵乘法和非线性激活函数等操作。这些计算量大大增加了模型在实际部署和执行过程中的成本。 3) 内存占用大:由于神经网络模型的参数量大、计算量大,因此在推理过程中需要 大量的 NPU 内存来存储模型参数、中间计算结果等。这对于嵌入式设备、移动设备等资源受限的环境来说可能是一个挑战。 4) 模型精度高:与传统的机器学习模型相比,神经网络模型通常具有较高的精度和 表现能力。这使得在量化过程中需要考虑如何在减小模型尺寸和计算成本的同时,尽量保持模型的精度和性能。 部署神经网络时,希望网络越小越好,来降低部署成本,于是就需要模型量化等压缩手段。 2. 模型量化优点 通过对神经网络模型进行合理的量化,可以实现以下优势: 1) 加速计算:传统的卷积操作都是使用 FP32 浮点,低比特的位数减少少计算性能也更高,INT8 相对比 FP32 的加速比可达到 3 倍甚至更高。 2) 保持精度:量化会损失精度,这相当于给网络引入了噪声,但是神经网络一般对噪声是不太敏感的,只要控制好量化的程度,对高级任务精度影响可以做到很小。 3) 节省内存:与 FP32 类型相比,FP16、INT8、INT4 低精度类型所占用晶体管空间更小,对应存储空间和传输时间都可以大幅下降。 4)节能和减少芯片面积:每个数使用了更少的位数,做运算时需要搬运的数据量少 了,减少了访存开销(节能),同时 NPU 所需的乘法器数目也减少(减少芯片面积)。 总之,模型量化主要是对模型的参数进行压缩,比如 200MB 的模型压缩到 50MB,达到提升运算速度,降低内存和功耗的效果。 7.2.2 落地挑战与思考 在实际部署时,量化技术的落地也有一些挑战,需要综合衡量是否需要使用模型量化。 1. 精度挑战 1)量化方法的精确性:常见的量化方法如线性量化,对于数据分布的描述并不精 确。线性量化将浮点数参数转换为固定位数的整数表示,这种精度的降低可能导致模型在量化后性能下降。对于特定任务和数据分布,需要设计更准确的量化方法以最小化精度损失。 1) 低比特数的影响:将模型从高比特数(如 16 位)量化为低比特数(如 4 位)会导致更大的精度损失。随着比特数的减少,模型的表示能力下降,因此需要在精度和模型大小之间找到平衡点。 2) 任务复杂性对精度的影响:在分类、检测、识别等任务中,任务的复杂性与模型所需的表示能力密切相关。通常情况下,任务越复杂,模型对精度的要求也越高,因此在量化过程中,需要针对不同的任务类型和复杂程度进行定制化的量化策略,以最大程度地保持模型的精度。 3) 模型大小对精度的影响:模型大小与精度之间存在一种权衡关系。一般来说,模型越小,其表达能力和容纳参数的能力也越有限,因此在量化过程中,对于较小的模型,精度损失可能会更加显著。在进行模型量化时,需要综合考虑模型大小、精度要求以及实际应用场景,以确定最适合的量化策略。 2. 硬件支持程度 在模型量化落地时,硬件支持是一个至关重要的因素。不同硬件平台对于低比特量化指令的支持程度不同,这会直接影响到模型在该硬件上的性能和效率。 1) 低比特指令支持差异:不同的硬件架构对于低比特指令的支持程度有所不同。比如 NVIDIA 一些系列显卡支持 INT8张量核计算。 2) 低比特指令计算方式差异:即使硬件平台支持相同的低比特指令,不同的硬件架构可能采用不同的计算方式。例如,8bit 计算一些硬件平台可能支持 INT8 的计算,而另一些可能采用 FP8 计算。 3) 硬件体系结构的 Kernel 优化:不同硬件平台具有不同的体系结构和优化方式。针对特定硬件的优化内核,可以最大限度地利用硬件的并行计算能力和特定指令集,从而提高模型量化后的推理性能。因此,在将模型部署到特定硬件上时,需要进行相应的内核优化,以确保模型能够充分利用硬件的性能优势,如图7-3所示。 图7-3 针对特定硬件的优化内核 3. 软件算法是否能加速 在模型量化落地过程中,软件算法的加速能力是一个至关重要的考量因素。尽管软件算法的优化可以提高模型量化的执行效率,但在某些情况下,软件算法也可能对性能造成负面影响。 1) 混合比特量化的影响:对于混合比特量化(Mixed Precision Quantization)而言,需要进行量化和反向量化操作,同时可能需要插入 Cast 算子来确保数据格式一致性。这些操作会影响到 Kernel 的执行性能,尤其是在硬件平台不支持相关操作的情况下。因此,对于混合比特量化,需要进行针对性的软件算法优化,以尽量减少这些操作对执行性能的影响。 2) 运行时内存占用优化:除了模型参数量的降低外,还需要关注运行时内存占用。降低模型参数量并不一定会降低运行时内存占用,因为在推理过程中可能需要同时存储模型参数、中间计算结果等数据。因此,软件算法需要考虑如何在保持模型精度的同时,尽量减少运行时内存占用,以提高模型的执行效率。 3) 模型参数量与内存占用的差异:模型参数量的减少并不直接意味着执行内存占用的减少。一些优化技术可能会引入额外的计算和存储开销,从而影响到运行时内存占用。因此,在进行软件算法优化时,需要综合考虑模型参数量和内存占用之间的差异,以实现最优的性能和内存占用平衡。 7.2 量化原理 7.2.1 三种模型量化方法 模型量化方法可以分为三种,如图7-4所示。 图7-4 三种模型量化方法

  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 散度等方法计算量化比例因子。静态离线量化也是一种在训练完成后将模型参数转换为低比特表示的方法,但与动态离线量化不同的是,静态离线量化中的量化参数是在转换过程中固定的,而不是根据输入数据动态调整的。 7.2.2 量化方法对比 QAT 可以达到的精度较高,但是往往需要较多的量化训练时间,量化成本比较大。PTQ 的量化过程比较迅速,只需要少量数据集来校准,但是量化后精度往往损失较多,见表7-1。 表7-1 量化方法参数对比

量化方法

功能

经典适用场景

使用条件

易用性

精度损失

预期收益

量化训练 (QAT)

通过 Finetune 训练将模型量化误差降到最小

对量化敏感的场景、模型,例如目标检测、分割、OCR 等

有大量带标签数据

极小

减少存续空间 4X,降低计算内存

静态离线量化 (PTQ Static)

通过少量校准数据得到量化模型

对量化不敏感的场景,例如图像分类任务

有少量无标签数据

较好

较少

减少存续空间 4X,降低计算内存

动态离线量化 (PTQ Dynamic)

仅量化模型的可学习权重

模型体积大、访存开销大的模型,例如 BERT 模型

一般

一般

减少存续空间 2/4X,降低计算内存

7.2.3 量化方法(饱和与非饱和) 模型量化桥接了定点与浮点,建立了一种有效的数据映射关系,使得以较小的精度损失代价获得了较好的收益。模型量化有两种映射方法,以 INT8 量化为例子: 1. 非饱和量化 非饱和量化方法计算浮点类型张量中绝对值的最大值 

标签:比特,模型,内存,量化,方法,INT8,精度
From: https://www.cnblogs.com/wujianming-110117/p/18398831

相关文章

  • java知识点——String类常用方法
    字符串常用方法: 方法描述int字符串.length()获取字符串长度boolean字符串.equals比较字符串内容是否相等boolean字符串1.equalsIgnoreCase(字符串2)不分大小写比较内容String字符串.toLowerCase()将字符串全部转成小写的String字符串.toUpperCas......
  • Java并发编程实战 02 | 为什么创建线程只有一种方法?
    在Java中,我们如何创建和使用线程?为什么说线程的创建方式本质上只有一种呢?本文将从并发编程的基础——如何创建线程开始,希望大家能够打好基础。虽然线程的创建看起来很简单,但其中还是有很多细节值得深入探讨。最后,我们将揭开线程实现的面纱,看清它的本质。首先,大家可以思考......
  • 手写call方法
    <script>//<!--实现mycall方法,功能和调用形式与call一致-->//原型定义一个mycall方法,大家都能调用Function.prototype.mycall=function(thisArg,...argN){//console.log('mycall方法被调用了');//设置this并调用原函数......
  • 业务复杂度治理方法论--十年系统设计经验总结
    一、复杂度综述1、什么是复杂度软件设计的核心在于降低复杂性。--《软件设计的哲学》业界对于复杂度并没有统一的定义,斯坦福教授JohnOusterhout从认知负担和工作量方面给出了一个复杂度量公式子模块的复杂度cp乘以该模块对应的开发时间权重值tp,累加后得到系统的整体复杂度C这里的......
  • 记录一个opencv的imread方法无法读取成功的问题,【设计到visual studio和静态库(lib)匹配
    一、为什么会遇到这个问题公司需要对多图进行拼接,经过多番查找发现了OpenStitching这个库。可以实现多图拼接。在python段尝试了之后感觉效果不错,所以使用VisualStudio进行C++开发。在读取图片的时候发现imread方法无论怎么样都无法读取到图片。二、解决办法我一开始以为是路......
  • 业务复杂度治理方法论--十年系统设计经验总结
    一、复杂度综述1、什么是复杂度软件设计的核心在于降低复杂性。--《软件设计的哲学》业界对于复杂度并没有统一的定义,斯坦福教授JohnOusterhout从认知负担和工作量方面给出了一个复杂度量公式  子模块的复杂度cp乘以该模块对应的开发时间权重值tp,累加后得到系统的整......
  • 大模型微调方法和技术路线
    带你快速了解大模型微调原理目前传统的Fine-Tuning有两个痛点问题:降低语义差异(BridgethegapbetweenPre-trainingandFine-tuning):预训练任务主要以MaskedLanguageModeling(MLM)为主,而下游任务(DownStreamTask)则重新引入新的训练参数,因此两个阶段的目标通常有较大......
  • C++程序的发布部署方式及缺失依赖库dll的解决方法
    主要对Windows平台上C++项目开发过程中库目录进行梳理及程序发布要注意的相关事项进行总结,希望对其他开发者有一定的借鉴意义。1.问题的提出在最近的项目中,主要工作是为SketcchUp平台开发基于Ruby的扩展功能库,这种库文件是以.so为后缀的形式提供,用C++语言来编写实现。当我在自己......
  • 利用数据分析提升SEO排名的7种方法
    我们都听过“大数据分析”这个词。科技让我们能够清晰地了解我们的活动和内容的表现——向我们提供了关于受众的宝贵信息,甚至可以精确到他们在Google和其他搜索引擎上使用的具体搜索词。你已经在你的业务中使用数据分析了吗?如果是,你有利用它来改进你的SEO策略以获得更好的排名......
  • docker制作tomcat镜像方法
    docker制作tomcat镜像方法【说明】制作tomcat镜像,需要在官网下载tomcatbinary压缩包。tomcat官网:https://tomcat.apache.org/download-90.cgi【配置方法】新建一个/opt/tomcat/目录,将下载tomcat与jdk安装包上传并解压缩:#mkdir-p/opt/tomcat;cd/opt/tomcat#......