05-13 周一 量化是什么

05-13 周一 量化是什么
时间版本修改人描述
2024年5月13日11:27:25V0.1宋全恒新建文档
2024年5月14日16:21:20V1.0宋全恒了解

简介

 神经网络在运行时有较高的计算成本,而且随着大模型时代的到来,知识由一个巨大的LLM存储,为了获取知识,即使用模型进行推理或者以会话的方式获取想要搜索的答案,都变得简单。但深入到计算层面,就可以看到,这些推理的计算对于内存带宽和算力都有较高的要求,如何降低神经网络的功劳和latency,是一个非常热门的话题。

量化意义

量化的意义在于加速推理,减少内存占用和访存带宽需求,降低功耗和面积。

结论

 **量化过程和硬件非强相关,在NN网络中,param的量化对整网精度影响更大,所以一般采用per channel的量化方式,**而activation的量化对整网精度的影响没有param大,一般采用per tensor(又称per layer)的方式进行量化。

从量化精度来看,kl散度>histogram>max_min,目前还有一种对数量化,但nvgpu,x86,arm三大平台上暂时都还没有对数量化的库,只有海思351x系列上有。

 模型量化(pytorch)-CSDN博客

<1>一般我们都将float32量化到qint8。

<2>模型参数中的bias一般是不进行量化操作的,仍然保持float32的数据类型。

<3>weight在浮点模型训练收敛之后一般就已经固定住了,所以根据原始数据就可以直接量化。

<4>activation会因为每次输入数据的不同,导致数据范围每次都是不同的,所以针对这个问题,在量化过程中专门会有一个校准过程,即提前准备一个小的校准数据集,在测试这个校准数据集的时候会记录每一次的activation的数据范围,然后根据记录值确定一个固定的范围。

量化Quantization

定义

 量化概念

量化: 量化实际上就是把高位宽表示的权值和激活值用更低位宽来表示。定点运算指令比浮点运算指令在单位时间内能处理更多数据,同时,量化后的模型可以减少存储空间。 深度学习量化总结(PTQ、QAT)_ptq量化-CSDN博客

 深度学习模型量化(低精度推理)大总结_深度学习 量化-CSDN博客给出了一个定义:

维基百科中关于量化(quantization)的定义是: 量化是将数值 x 映射到 y 的过程,其中 x 的定义域是一个大集合(通常是连续的),而 y 的定义域是一个小集合(通常是可数的)【1】。8-bit 低精度推理中, 我们将一个原本 FP32 的 weight/activation 浮点数张量转化成一个 int8/uint8 张量来处理。模型量化会带来如下两方面的好处:

量化基础总结_线性量化-CSDN博客提出,**模型量化方法本质上是函数映射。**量化建立了高精度的浮点数值和量化后低精度的定点数值之间的数据映射。

 在论文中RPTQ: Reorder-based Post-training Quantization for Large Language Models,

Quantization is an important technique for reducing the computational and memory requirements of deep neural networks (DNNs). There are two main categories of quantization methods for DNNs: posttraining quantization (PTQ) [41; 33; 25; 20; 38] and quantization-aware training (QAT) [8; 42; 5; 17]. PTQ methods involve quantizing pre-trained models, while QAT methods involve training models with quantization constraints.

 基本上上述描述两种深度神经网络DNNs的量化方法: PTQ(训练后量化),QAT(量化感知的训练)

 在深度学习中,基本运算的单位为向量或矩阵,规模比较大。这里会存在一个浮点比例因子,一般的,可以使用均匀量化技术,

image-20240513141246774
where s represents the scaling factor, z denotes the zero point, and the clamp function constrains the value within the range of a k-bit integer, specifically [−2k−1, 2k−1 − 1]. For a 4-bit integer, the range is [-8, 7]. The integer xq can be de-quantized to ˆ x = s(xq − z) ≈ x. The de-quantized value ˆ x is a float. The quantization parameters, scale factor s, and zero point z must be stored in memory for both quantization and de-quantization processes. To further reduce the storage and computational overhead of quantization, multiple weights or activation values X = {x1, ..., xn} share the same quantization parameters.
img

 对权重和激活分别使用单独的比例因子sxsw。这提供了灵活性并减少了量化误差。而量化的关键,在于确定比例因子。

Quantization — PyTorch 2.3 documentation 关于量化后模型如下描述

Quantization refers to techniques for performing computations and storing tensors at lower bitwidths than floating point precision. A quantized model executes some or all of the operations on tensors with reduced precision rather than full precision (floating point) values. 

# PyTorch 支持INT8量化。INT8模型量化,模型减少4倍,内存占用带宽需求。
PyTorch supports INT8 quantization compared to typical FP32 models allowing for a 4x reduction in the model size and a 4x reduction in memory bandwidth requirements. 

 量化主要是一种加快推理的技术,对于量化的算子来说,仅仅支持钱箱传递。。

分类

饱和量化和非饱和量化

 参考深度学习量化策略 - 知乎

a)非饱和量化方法(No Saturation):map |max| to 127

非饱和量化方法计算 FP32 类型 Tensor 中绝对值的最大值 abs_max,将其映射为 127,则量化scale等于 abs_max/127。

非饱和量化的问题在深度学习量化总结(PTQ、QAT)_ptq量化-CSDN博客有阐述,关键是量化区间的浪费的问题。

b)饱和量化方法(Saturation):above |threshold| to 127

饱和量化方法使用 KL 散度计算一个合适的阈值 T(0 < T < map_max),将其映射为 127,则量化scale等于 T/127

img

静态量化和动态量化

训练后量化和训练感知量化

技术

量化参数

 有三个量化参数,比例因子s,零点z,和比特宽度b。

比例因子和零点用于将浮点值映射到整数网格,其size取决于比特宽度。比例因子通常表示为浮点数,并指定量化器的步长。

 零点是一个整数,确保实零(real zero)被量化而没有误差。这对于确保诸如零填充或ReLU之类的常见操作不会引起量化误差非常重要。

 实际上,浮点型的0会映射到零点,这个零点是一个整型数,用来确保0没有量化误差。具体就是,0有特殊意义,比如padding时,0值也是参与计算的,浮点型的0进行8bit量化后还是0就不对了,所以加上这个零点后,浮点型0就会被映射到0-255这个区间内的一个数,这样的量化就更精确。就相当于让映射后区间整体偏移,浮点最小值对应0。计算完量化因子,再从浮点区间任取一值的量化过程,具体参见深度学习量化总结(PTQ、QAT)_ptq量化-CSDN博客

人工智能干货|一线工程师带你学习深度学习模型量化理论+实践

 。z通常是一个整数,即 zp_x= rounding(q_x * min_x_f)。因此,在量化之后,浮点数中的 0 刚好对应这个整数。这也意味着 zero_point 可以无误差地量化浮点数中的数据 0,从而减少补零操作(比如卷积中的padding zero)在量化中产生额外的误差,参见深度学习模型量化(低精度推理)大总结_深度学习 量化-CSDN博客。

Uniform Affine Quantizer(非对称量化)

非对称量化的意义,是将浮点数映射到不对称的区间,比如说映射到uint8,而uint8的数值表示区间为
0-255,一共256个数。
img

分为两个步骤:

  1. 首先要计算比例因子,包括步长和零点两个参数, s和zimg
  2. 计算完量化因子,从浮点区间任取一值的量化过程,得到xqimg

clamp用于将超出范围的值阶段,因为可能会溢出。上述图中clamp将xint 限制在0到2b-1。round是四舍五入。

 而反量化公式为:

img

注,定点量化,应该指的是整数量化。

 讲真没有看的特别懂。

 这个是Sriven大神提供的例子。

img

 对于上图的理解,可以看到输入,输出,以及权重参数均为量化的int8的格式(为啥Biases为int32,不解)

 非对称量化算法一般能较好的处理数据分布不均匀的情况。

 深度学习模型量化(低精度推理)大总结_深度学习 量化-CSDN博客提供了一个实例:

人工智能干货|一线工程师带你学习深度学习模型量化理论+实践

 由对称算法(symmetric)产生的 量化数据绝大部分都位于[0,127] 这个表示范围内,而 0 的左侧有相当于一部分范围内没有任何的数据。int8 本来在数据的表示范围上就明显少于 FP32,现在又有一部分表示范围没发挥左右,这将进一步减弱量化数据的表示能力,影响量化模型的精度。与之相反,非对称算法(asymmetric)则能较好地解决 FP32 数据分布不明显倾向于一侧的问题,量化数据的分布与原始数据分布情况大致相似,较好地保留了 FP32 数据信息。

Unfiorm symmetric quantizer(对称量化)

 对称量化是非对称量化的简单版本。对称量化即零点z=0的情况。如INT8量化:

img

取值范围[-128, 127]。

 图示还是很简单的。

 由于零点为0,量化的过程,在确定浮点因子时,只需要确定步长s即可。

img

 相应的反量化公式

img

 整个过程步骤也是两个步骤,但由于不考虑零点, 公式更加简单。

y = Clamp(Round([(scale_x*x)*(scale_weight*w)+(scale_x*scale_w)*b]/scale_y))
= Clamp(Round( (x*w+b)*(scale_x*scale_w)/scale_y))
= Clamp(Round( (x*w+b)*scale))

 可以看到,虽然重要的模型参数已经量化后的,但在计算过程中,需要反量化为浮点型。

  • 可以通过这个博客了解计算过程,已经量化的的模型那些参数需要量化,
  • 量化的过程,
      1. 先确定步长s和零点z
      2. 根据量化方法得到量化后的值。

在 深度学习量化总结(PTQ、QAT)_ptq量化-CSDN博客中Srivin还给出确定比例因子如何确定的方式的阐述。具体就是饱和量化和不饱和量化。饱和量化算法是找到一个合适的阈值,如右图,把超出范围的噪声点的值都设为[T],然后量化之后,值会非常均匀的分布在(-127-127)这个区间。

scale和zero_point,这个比例因子,许多文章称为缩放因子和零点。

量化策略 的描述感觉也很关键 。

 量化策略,是为了确定最大和最小值,也即为了确定步长s和零点z。

对于推理过程来说,weights是一个常量张量,不需要额外数据集进行采样即可确定实际的动态范围。但是activation的实际动态范围则必须经过采样获取(一般把这个过程称为数据校准(calibration))。目前各个深度学习框架中,使用最多的有最大最小值(MinMax),滑动平均最大最小值(MovingAverageMinMax)和KL距离(Kullback–Leibler divergence)三种

随机量化

量化发生位置

仅对权重量化

只量化权重和偏置,权重和偏置的比例因子一致

量化权重和激活值

 需要标定数据。

 一般来说在PTQ中,权重使用MinMax量化,激活值使用滑动平均最大最小值或KL散度量化,偏置的比例因子为权重和激活值的比例因子的乘积。

量化方法

 按照量化阶段的不同,一般将量化分为 quantization aware training(QAT) 和 post-training quantization(PTQ)。QAT 需要在训练阶段就对量化误差进行建模,这种方法一般能够获得较低的精度损失。PTQ 直接对普通训练后的模型进行量化,过程简单,不需要在训练阶段考虑量化问题,因此,在实际的生产环境中对部署人员的要求也较低,但是在精度上一般要稍微逊色于 QAT。

 下图是量化方法的分类场景

img

 下图是根据需要选择量化方法

img

PTQ

字面意思,整个模型(浮点型的)训练完成后再单独把权值和激活值拿出来量化。过程中无需对原始模型进行任何训练,只对几个超参数调整就可完成量化过程。

动态量化

 在深度学习量化策略 - 知乎,PTQ Dynamic定义如下:

动态离线量化仅将模型中特定算子的权重从FP32类型映射成 INT8/16 类型,bias和激活在推理过程中动态量化。但是对于不同的输入值来说,其scale是动态计算的。动态量化是几种量化方法中性能最差的,常用于非常大的模型。

 Dynamic Quantization — PyTorch Tutorials 2.3.0+cu121 documentation是Torch官方的动态量化介绍。

torch.quantization.quantize_dynamic()
Class torch.quantization.quantize_dynamic(model, qconfig_spec=None, dtype=torch.qint8, mapping=None, inplace=False)


 动态量化系统自动选择最合适的scale (标度)和 zero_point(零点位置),不需要自定义。量化后的模型,可以推理运算,但不能训练(不能反向传播)

# Init asr model from configs
model = init_asr_model(configs)
quantized_model = torch.quantization.quantize_dynamic(model, {torch.nn.Linear}, dtype=torch.qint8)

静态量化

 首先用校准数据集进行fp32正向推理,得到一组真实概率分布。然后选取不同的threshold,分别得到量化成对应int数据下的近似概率分布,选取能使KL散度最小的threshold,计算对应的scale,完成模型量化。

 PyTorch Static Quantization with Eager Mode in PyTorch — PyTorch Tutorials 2.3.0+cu121 documentation,本教程显示了如何进行训练后静态量化,并说明了两种更先进的技术 - 每通道量化和量化感知训练 - 以进一步提高模型的准确性。

结论

 总之,静态量化与动态量化的区别在于其输入的缩放因子计算方法不同,静态量化的模型在使用前有校准过程:准备部分输入校准数据,使用静态量化后的模型进行预测,在此过程中量化模型的scale会根据输入数据的分布进行调整。一旦校准完成,权重和输入的scale都固定(即静态)。静态量化的性能一般比动态量化好,因此实际场景中基本都是在用静态量化。

QAT

 概念:量化训练让模型感知量化运算对模型精度带来的影响,通过 finetune 训练降低量化误差。这种方法会降低训练速度,但是能够获得更高的精度。

from pytorch_quantization import quant_models
quant_models.initialize()

 这是NV发布的QAT库。

精度

模型量化有 8/4/2/1 bit

实践

Pytorch模型量化 - 凌逆战 - 博客园 提供了一个边训练边量化的例子

代码实践

 pytorch量化中torch.quantize_per_tensor()函数参数详解_把32位浮点数转换为8位定点数的python函数-CSDN博客对于torch.quantize_per_tensor函数参数进行了解释。

量化工具/框架整理

 深度学习量化策略 - 知乎中提供了一个量化工具表格,从公司,量化工具,推理引擎,部署平台等角度阐述。

Nvidia使用TensorRT进行量化,

而Meta使用pytorch作为量化工具,

华为团队使用MindSPore Lite套件,支持部署在端边缘。

TVM团队,使用TVM框架,可以部署在端边云上。

在硬件支持的情况下,量化时对激活值X使用非对称量化,对权重值W使用对称量化(谷歌白皮书建议)
TensorRT量化思路:使用校准数据集,对权重用的minmax算法(per channel),激活用的KL散度算法(per tensor), 注意TensorRT里bias是不量化的

总结

参考

参考博客描述
深度学习量化总结(PTQ、QAT)_ptq量化-CSDN博客👍👍👍👍👍博客真的很用心,从这个博客中了解到
量化有两个步骤,三个重要的参数
即缩放因子,零点和比特宽度。
确定缩放因子有三个量化策略,
而量化类型分为了均匀量化和非均匀量化,
Sriven写的超级用心。
深度学习量化策略 - 知乎对于量化分类,提供了图示
模型量化(pytorch)-CSDN博客描述了量化的一些基本结论
Quantization — PyTorch 2.3 documentationPyTorch支持IN*量化和QAT。
量化基础总结_线性量化-CSDN博客👍👍👍里面对于量化基础进行总结,提出线性量化和非线性量化,
并且对于PyTorch支持的量化方式进行了整理。
最重要的事,给出了训练后量化和训练感知量化的步骤
(六) 量化研究_对称量化-CSDN博客三河提供了量化和反量化的图示,理解直观有效。
对于对称量化和非对称量化描述的比较清晰。间隔是相等的。
提供了关于卷积核操作的理解
深度学习编译器入坑指北(Q5)模型量化-PTQ与QAT - 简书提供了关于PTQ与QAT量化的过程图示。
详解pytorch动态量化-CSDN博客👍👍👍直接用数据进行了演示,并且有PyTorch对于量化支持的时间轴。对于Tensor的量化支持模式
per tensor和per channel 进行了描述。
介绍了quantize_dynamic的各个参数。
对于动态量化感觉介绍的比较深入。
Pytorch模型量化 - 凌逆战 - 博客园提供了量化函数公式
Pytorch模型量化 - 凌逆战 - 博客园图示per-Tensor量化和per-Channel量化

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【STM32】状态机实现定时器按键消抖,处理单击、双击、三击、长按事件

目录 一、简单介绍 二、模块与接线 三、cubemx配置 四、驱动编写 状态图 按键类型定义 参数初始化/复位 按键扫描 串口重定向 主函数 五、效果展示 六、驱动附录 key.c key.h 一、简单介绍 众所周知&#xff0c;普通的机械按键会产生抖动&#xff0c;可以采取硬件…

【江南大学×朗汀留学】部分留学录取案例合集

朗汀留学 X 江南大学 尽管客观条件如此艰难&#xff0c;朗汀留学的同学们还是斩获众多名校的录取。成绩属于过去&#xff0c;我们继续努力创造更好未来。 以下为我们摘取的江南大学部分学生案例供大家参考&#xff0c;再次恭喜所有获得理想大学offer的学生们&#xff0c;你们…

CAST: Cross-Attention in Space and Time for Video Action Recognition

标题&#xff1a;CAST: 时空交叉注意力网络用于视频动作识别 原文链接&#xff1a;2311.18825v1 (arxiv.org)https://arxiv.org/pdf/2311.18825v1 源码链接&#xff1a;GitHub - KHU-VLL/CASThttps://github.com/KHU-VLL/CAST 发表&#xff1a;NeurIPS-2023&#xff08;CCF A…

Linux第四节--常见的指令介绍集合(持续更新中)

点赞关注不迷路&#xff01;本节涉及初识Linux第四节&#xff0c;主要为常见的几条指令介绍。 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1f44d;&#x1f3fb; 收藏 ✨ 加关注&#x1f440; 期待与你共同进步! 1. more指令 语法&#xff1a;more [选项][文件]…

MySQL文档_下载

可能需要&#xff1a;MySQL下载–》更新版本–》迁移数据库到MySQL 以下都不重要【只要确定好需要安装版本&#xff0c;找到对应的版本下载&#xff0c;安装&#xff0c;设置即可】 下载、安装&#xff1a; Determine whether MySQL runs and is supported on your platform…

电脑刚开机的时候不卡,用一会就变卡顿了…怎么回事?

前言 昨天咱们聊到旧电脑更换了固态硬盘之后&#xff0c;开机就会变快的事情&#xff0c;这个确实是可行且有效的升级电脑办法之一。 看完这篇之后&#xff0c;切莫着急升级电脑硬件配置&#xff0c;因为这里的坑比你想象的还要多。 从机械硬盘测试的数据和固态硬盘的测试数…

【C语言】—— 动态内存管理

【C语言】——动态内存管理 一、动态内存管理概述1.1、动态内存的概念1.2、动态内存的必要性 二、 m a l l o c malloc malloc 函数2.1、函数介绍2.2、应用举例 三、 c a l l o c calloc calloc 函数四、 f r e e free free 函数4.1、函数介绍4.2、应用举例 五、 r e a l l o …

SSL协议

SSL 安全传输协议&#xff08;安全套接层&#xff09; 也叫TLS ---- 传输层安全协议 SSL的工作原理&#xff1a;SSL协议因为是基于TCP协议工作的&#xff0c;通信双方需要先建立TCP会话。因为SSL协议需要进行安全保证&#xff0c;需要协商安全参数&#xff0c;所以也需要建立…

【数据结构】栈和队列专题

前言 上篇博客我们讨论了栈和队列的有关结构&#xff0c;本篇博客我们继续来讨论有关栈和队列习题 这些题算是经典了 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;数据结构 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d…

Oracle 临时表空间的管理

Oracle 临时表空间的管理 临时表空间的处理 1.创建一个新的temporary tablespace; create temporary tablespace tp tempfile ...... size 10m autoextend on; 2.改变数据库的默认临时表空间 alter database default temporary tablespace tp; 3。drop tablespace temp; …

Zoho CRM企业成长的智能引擎,智能化销售自动化

数字化时代&#xff0c;客户体验已成为企业竞争的核心要素。卓豪Zoho CRM&#xff0c;作为全球领先的SaaS云端客户关系管理平台&#xff0c;正引领着一场企业运营模式的变革&#xff0c;助力超过25万家企业跨越180多个国家&#xff0c;实现客户互动与业务增长的无缝对接。让我们…

Verlog-流水灯-FPGA

Verlog-流水灯-FPGA 引言&#xff1a; ​ 随着电子技术的飞速发展&#xff0c;现场可编程门阵列&#xff08;FPGA&#xff09;已成为电子设计自动化&#xff08;EDA&#xff09;领域中不可或缺的组件。FPGA以其高度的灵活性和可定制性&#xff0c;广泛应用于通信、图像处理、工…

【C++】学习笔记——继承_2

文章目录 十二、继承5. 继承与友元6. 继承与静态成员7. 复杂的菱形继承及菱形虚拟继承 未完待续 十二、继承 5. 继承与友元 友元关系不能继承&#xff0c;也就是说父类友元不能访问子类私有和保护成员 。除非子类也设置成友元。 6. 继承与静态成员 父类定义了 static 静态成…

单用户模式破解root密码

目录 一. 破解root密码 1. 查看操作系统版本 2.重启系统&#xff0c;进入grub菜单&#xff0c;选择要使用的内核&#xff0c;按e进入​编辑 3. 找到linux16那一行&#xff0c;把光标移动到最后&#xff0c;添加 init/bin/sh 然后ctrlx保存退出会自动进入系统 4. 进入系统后…

Spring WebFlux:响应式编程

在软件开发领域&#xff0c;随着互联网应用的规模和复杂性不断增加&#xff0c;传统的编程模型逐渐暴露出一些局限性&#xff0c;尤其是在面对高并发、大规模数据流处理等场景时。为了应对这些挑战&#xff0c;响应式编程&#xff08;Reactive Programming&#xff09;应运而生…

强化训练:day9(添加逗号、跳台阶、扑克牌顺子)

文章目录 前言1. 添加逗号1.1 题目描述2.2 解题思路2.3 代码实现 2. 跳台阶2.1 题目描述2.2 解题思路2.3 代码实现 3. 扑克牌顺子3.1 题目描述3.2 解题思路3.3 代码实现 总结 前言 1. 添加逗号   2. 跳台阶   3. 扑克牌顺子 1. 添加逗号 1.1 题目描述 2.2 解题思路 我的写…

ros键盘控制程序teleop_twist_keyboard 键值含义及用法

在机器人仿真中&#xff0c; 经常会用到键盘控制程序teleop_twist_keyboard 对机器人进行控制。但是对各个键值是何种含义&#xff0c; 如何操作并没有任何资料介绍,初次使用时会不知所措。 通过实践&#xff0c; 发现各个键值的作用如下&#xff1a; u-- 向左前方前进 i-- 直…

java-spring 09 下.populateBean (方法成员变量的注入@Autowird,@Resource)

1.在populateBean 方法中的一部分&#xff1a;用于Autowird&#xff0c;Resource注入 // 后处理器已经初始化boolean hasInstAwareBpps hasInstantiationAwareBeanPostProcessors();// 需要依赖检查boolean needsDepCheck (mbd.getDependencyCheck() ! AbstractBeanDefinitio…

现在闪侠惠递寄快递有福利了,千万不要因没把握住而后悔呀!

闪侠惠递平台寄快递现在真的是太便宜了&#xff0c;优惠价格把握不住&#xff0c;后悔都来不及&#xff01;大家可以在闪侠惠递上面寄快递&#xff0c;价格真的非常优惠呢&#xff0c;比咱们平常寄快递的价格都优惠呢&#xff0c;真的&#xff0c;小编都亲自替大家尝试过了呢。…

联软安渡 UniNXG 安全数据交换系统 任意文件读取漏洞复现

0x01 产品简介 联软安渡UniNXG安全数据交换系统,是联软科技自研的业内融合网闸、网盘和DLP的一体机产品,它同时支持多网交换,查杀毒、审计审批、敏感内容识别等功能,是解决用户网络隔离、网间及网内数据传输、交换、共享/分享、存储的理想安全设备,具有开创性意义。 UniN…