量化基础 PTQ QAT

news2024/10/4 12:30:16

简介

固定bit下的量化始终无法在Accuracy和 (FLOPs & Parameters)之间达到一个非常细粒度的trade-off,所以就需要混合精度量化(Mixed-Precision Quantization, MPQ)来对模型实现进一步的高效压缩
混合精度量化区别于混合精度训练这个概念,后者指的是在模型训练过程中使用FP16来代替传统的FP32从而达到占用显存更少,计算速度更快的目的,而本文要谈的混合精度量化指的是通过设计某种policy,来对模型各层的weights和activations的量化bit位宽进行合理分配,其重点就是如何设计这个policy,从而使得混合精度量化之后模型能够在精度和硬件指标上达到最佳的平衡。

量化并不是什么新知识,我们在对图像做预处理时就用到了量化。回想一下,我们通常会将一张 uint8 类型、数值范围在 0~255 的图片归一成 float32 类型、数值范围在 0.0~1.0 的张量,这个过程就是反量化。类似地,我们经常将网络输出的范围在 0.0~1.0 之间的张量调整成数值为 0~255、uint8 类型的图片数据,这个过程就是量化。
所以量化本质上只是对数值范围的重新调整,可以「粗略」理解为是一种线性映射。之所以加「粗略」二字,是因为有些论文会用非线性量化,但目前在工业界落地的还都是线性量化
不过,可以明显看出,反量化一般没有信息损失,而量化一般都会有精度损失。这也非常好理解,float32 能保存的数值范围本身就比 uint8 多,因此必定有大量数值无法用 uint8 表示,只能四舍五入成 uint8 型的数值量化模型和全精度模型的误差也来自四舍五入的 clip 操作。

量化其实是离散化。基本保持定点值在对应原浮点值的相对大小关系的情况,利用了定点值计算快开销小来进行加速,达到这个目的要求将不同的全精度值尽可能映射到不同的定点值,采用什么映射方法是没有关系的,只要能够来回映射就可以。
这是因为在图像任务中,具体的值是没有意义的,我们并不关心具体的取值是多少,我们需要的其实是一群值之间组成的相对大小关系
也就是说,其实不同层的conv采用相同的S和Z在原则上也是可行的,但是由于定点值区间就是0-255,而不同层的浮点值值区间不一样,如果采用相同的S和Z,会导致有些层的映射损失很大,因此需要采取适应的 S 和 Z
在这里插入图片描述
需要对 weight 量化到 int8 然后又反量化回 float,这里其实就是所谓的伪量化节点,因为我们在实际量化 inference 的时候会把 weight 量化到 int8,这个过程本身是有精度损失的 (来自四舍五入的 round 带来的截断误差),所以在统计 min、max 的时候,需要把这个过程带来的误差也模拟进去
理解:

首先float32也是一种精度,只不过精度比较高,但是他也不是 R R R这么大的范围。其实同理于int8,uint8能表示的范围就是 [ 0 , 2 b − 1 ] [0, 2^b - 1] [0,2b1] [ 0 , 255 ] [0, 255] [0,255]你每表达一个数就是 1 256 \frac {1}{256} 2561。255也就是我们说的quantization
level
神经网络的表达能力,主要体现在网络本身的结构,还有数的精度。数在神经网络中可以抽象成占比的大小,越高代表权重越重要。数的精度肯定是越精细越好,但你像bit
width很低的神经网络也能达到好的效果,一定程度上说明了数只是表达的一部分,相对大小是保留了的。能达到好的效果的很重要的一部分是因为你这个网络结构足够复杂足够深。

量化的主要过程是先模拟量化然后再反量化,像0.32,量化到8bit,先乘以255,0.32*255=81.6,经过round函数以后就是82。然后再反量化到32-bit,82/255=0.321568627451,这样子量化前和反量化以后的值就不相同了,原来的值等于0.32,反量化以后等于0.321568627451

PTQ

PTQ一般是不需要重新训练的,PTQ就是在full precision后,用一点测试集估计一下minmax这些量化参数就可以。

QAT

在量化的过程中,对网络进行训练,从而让网络参数能更好地适应量化带来的信息损失。量化中的round函数会导致反向传播的梯度也变成 0。换言之,这个函数是没法学习的,从而导致量化训练进行不下去。
训练时量化对于权重和激活输出采用模拟量化操作来衡量量化效果。对于反向传播,使用“直通估计器”去建模量化。
模拟量化操作是在训练时就进行量化的,操作实际包括一个量化再紧跟一个逆量化。具体的,就是在前向传播的时候(forward)模拟了量化的这个过程,在forward时首先会把权值和激活值量化到8bit再反量化回有误差的32bit,整体训练还是浮点
量化时反向传播梯度使用了 STE,即straight-through estimator,去掉round函数,然后直接将梯度传递给浮点数
QAT时,要进行两步的,要经过量化和反量化,前向传播进行量化和反量化,反向传播梯度还是给的浮点数
LSQ对量化公式里的参数scale进行了调整,可以让网络训练的同时,训练scale值,不再是定值了

总结

PTQ是没有backward不进行weight更新,forward只是用来统计,所以其实伪量化对PTQ来说可有可无;QAT还会再训练一下得出loss进行反向传播更新参数,这个地方的训练采用的是伪量化,要不然由于导数为0无法进行梯度更新。
AI小男孩:
一般是先train一个全精度的,区别主要是PTQ一般是不需要重新训练的,用一点测试集估计一下minmax这些量化参数就可以,QAT一般是会结合具体任务再训练的,或者说finetune。
AI小男孩:
finetune就是正常的训练,伪量化只是方便求导

详解per channels / per layer的区别

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

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

相关文章

c基本数据类型

关键字 charshort intintlong intfloatdouble 常量和变量 常量:在程序运行过程中,其值不可改变的量变量:其值可以改变的量称为变量 字符数据 字符常量 直接常量:用单引号括起来,如:‘a’,‘b’.转义字…

7.4Java EE——Bean的作用域

一、singleton作用域 Spring支持的5种作用域 作用域名城 描述 singleton 单例模式。在单例模式下,Spring 容器中只会存在一个共享的Bean实例, 所有对Bean的请求,只要请求的id(或name)与Bean的定义相匹配&#xff0…

msvc2017x64编译器编译项目报错”编译器的堆空间不足“错误 的解决方法

开发日常软件的时候,因为项目较大,模块较多,编译时,报错”编译器编译空间不足“,且常规方法无法消除的问题。有 opengl模块 占用内存大 尝试 尝试1   按照常规的,在pro里面加大资源配置: CONF…

记录一下uniapp开发中遇到的一些问题

概述 最近码代码的时候遇到一些问题,这里自己记录总结一下,供大家参考,说得不对的地方希望大家指出 大概介绍一下我用到的内容 用HbuilderX新建一个uni-app项目 ,vue版本选的2,爬坑轻松一点移动端ui框架选了uView&…

C 知识积累 回车与换行 Linux C 语法分析

目录 回车与换行一.知其然二.知其所以然 关键字,操作符和函数区别1:关键字2:操作符3:函数 命令行参数argv原码补码补码加法 Linux C 语法分析结构体指针类型函数宏定义其他 const语法整理 回车与换行 一.知其然 \n是换行&#x…

智能电表远程抄表系统原理

智能电表远程抄表系统是现代智能电网建设的重要组成部分,它利用物联网技术实现电表数据的远程采集、传输和处理,提高了电力公司的抄表效率,同时也为用户提供了更加便捷、准确的用电服务。本文将从远程智能电表抄表系统的工作原理、特点、应用…

KDE项目近日发布了KDE Frameworks 5.108

导读KDE项目近日发布了KDE Frameworks 5.108,作为这个开源软件套件的最新版本,它由80多个Qt附加库组成,为KDE Plasma桌面环境和KDE应用程序提供常用功能。 KDE Frameworks 5.108在这里修复了Plasma桌面崩溃的问题,该问题发生在用中…

Openlayers layer 基础及重点内容讲解

图层就像是含有文字或图形等元素的图片,一张张按顺序叠放在一起,组合起来形成页面的最终效果。 在 openlayers 中,图层是使用 layer 对象表示的,主要有 WebGLPoints Layer、热度图(HeatMap Layer)、图片图层(Image Layer)、切片图层(Tile Layer)和 矢量图层(Vector Layer…

ShardingSphere分库分表实战之水平分表

🚀 ShardingSphere 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜&…

科东软件入选“四化”赋能重点平台

科东软件Intewell工业嵌入式实时操作系统成功入选广州市“四化”赋能重点平台名单 2023年7月14日,广州市工业和信息化局公布广州市“四化”赋能重点平台名单(第二批),科东软件凭借国产化技术创新优势、成熟的数字化转型方案&#…

与 AI 数智助理 Kyligence Copilot 携手,共同挖掘数据的无限潜能

Kyligence 用户大会近日在上海顺利召开,会上 Kyligence 重磅发布了 AI 数智助理 Kyligence Copilot(预览版)。生成式 AI(Generative AI)正带来人机交互方式的革命,并将改变人类使用数据的习惯,K…

MyBatis学习笔记——1

MyBatis学习笔记——1 一、MyBatis概述1.1、框架1.2、三层架构1.4、了解MyBatis1.4、ORM思想 二、MyBatis入门程序2.1、Mybatis程序的编写2.2、MyBatis入门程序的一些小细节2.3、MyBatis事务管理机制深度解析2.4、在开发中junit是如何使用的2.5、Mybatis集成日志框架logback 三…

3.9 Bootstrap 分页

文章目录 Bootstrap 分页分页(Pagination)默认的分页分页的状态分页的大小 翻页(Pager)默认的翻页对齐的链接翻页的状态 分页 Bootstrap 分页 本章将讲解 Bootstrap 支持的分页特性。分页(Pagination)&…

PADS VX2.5学习

1、关于库的定义 PADS中的元件库分为四个文件 :*.ld9 *.ln9 *.pd9 *.pt9 即CAE、 LINES、PCB DECAL、PART TYPE。只有这四个文件都存在才是一个完整的库,才可以加载。 我们设计的电路所用到的元件必须在PADS logic和PADS layout中都存在,…

【正点原子STM32连载】第六十五章 UCOSII实验3-消息队列、信号量集和软件定时器摘自【正点原子】STM32F103 战舰开发指南V1.2

1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html# 第六…

【Linux系统编程】Linux调试器——gdb 的基本使用

文章目录 1. 准备工作及知识补充1.1 源文件和Makefile1.2 安装gdb并解决没有调式信息的问题debug和release的了解如何解决 2. gdb的基本使用2.1 显示代码2.2 设置、删除和查看断点2.3 禁用和启用断点2.4 逐语句和逐过程调式2.5 查看函数调用堆栈2.6 查看指定变量的值2.7 跳至指…

STM32学习笔记(十二)丨RTC实时时钟

本篇文章包含的内容 一、计算机底层计时系统——时间戳1.1 时间戳简介1.2 GMT/UTC1.3 C语言和time.h库 二、STM32的BKP和RTC时钟2.1 BKP(Backup Registers)备份寄存器2.2 RTC(Real Time Clock)实时时钟2.2.1 RTC简介2.2.2 RTC的内…

行业追踪,2023-07-18,减速器,汽车零部件是重点关注板块,随时开启

自动复盘 2023-07-18 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

PB从入坑到放弃(五)窗口使用技巧

PB从入坑到放弃(五)窗口使用技巧 一、窗口类型二、窗口属性2.1 General 属性页属性2.2 Scroll 属性页属性2.3 ToolBar 属性页属性2.4 Other 属性页中的属性 三、11种常用控件四、窗口事件4.1 常用事件4.2 举个栗子 五、窗口常用函数5.1 open 函数5.2 clo…

【力扣每日一题】2023.7.19 模拟行走机器人

题目: 示例: 分析: 机器人模拟类题目,力扣里有很多这样的模拟题,就是模拟机器人在坐标系上行走. 套路就是记下每个方向行走后,x轴和y轴的变化(代码中的direction),例如 direction[0] 就表示向北走一次,y轴1,x轴不变.…