一文了解模型量化中的QAT和PTQ

一文了解模型量化中的QAT和PTQ

由于前一段时间在做模型的转换工作,实际部署的时候需要一些模型加速的方法,常用的有各家的inference框架,如mnn,tnn,tensorrt等,这些框架除了fp32精度外,都支持了int8的精度,而量化到int8常常可以使我们的模型更小更快,所以在部署端很受欢迎。

常用的模型量化方式有训练中量化,QAT,和训练后量化,PTQ,之前转trt时,用的就是PTQ,在一些常用的模型上表现还不错,几乎没有什么掉点,但是在复杂模型,如带有swish的模型啊,或者nas搜出来的模型,表现就不尽人意了,主要是这些模型的参数分布比较奇怪或者是激活值分布没有很强的规律,导致量化失效。而QAT则避免了这一问题,通过在训练过程中去缩小这种误差,可以达到更好的性能。下面大概介绍一些这两种方法。

PTQ

首先是PTQ,以tensorrt的Int8量化为例,它的原理是什么呢,简单概括就是对于常用的模型,如googlenet,resnet等,图片经过网络生成的特征图的值往往具有相同的规律。如下图所示:
在这里插入图片描述
图中的绿点表示很多张图的统计结果,所以我们可以看出对于同一模型,任意图的特征激活值都呈现了低激活值高密度的特点,而比较大的那些值所占的比例微乎其微,可以忽略不计,根据这个特点,我们在量化时就不用使用饱和量化(将激活值最大值映射到127),而是人为设计一个阈值,这个阈值可以比最大值小,而刚好可以把高密度区保留,所以trt的int8量化就是在做这样一件事,找阈值s!具体怎么做的呢,那就是一一统计,先将每层特征图的激活值分到2048个bins(按照激活值最小最小区间划分),然后从第127个bin开始尝试设计阈值,什么意思呢,就是先把第128个bin的中间值当为阈值,再把129bin当阈值,一直尝试到2048,每次试阈值时,会把这个阈值映射到127,然后低于这个阈值的元素按照这个计算量化结果,而高于阈值的元素直接归到127(实际在做的时候,看了一些代码实现,都是直接将n个bin分到128个量化值上),由此可以得到一个128维的分布向量,表示每个量化值的元素个数,此时我们要做一件事,就是把这个128维的分布向量和原来的n个bin做相似度计算(分布长度不一样,而且n个bins最后一个bin里边包含尾部所有个数,而128维向量最后一维则不含尾部的。这里有一个trade-off:如果n取得比较小,比如就是128,那么对于非尾部的(<=128)bin,就会和128位向量分布一模一样,但是加上尾部个数后,就会在最后一位分布概率上造成较大的误差,导致相似度降低;如果n取得较大,那么虽然尾部的个数已经比较小了,但是前n个bin的数量较大,导致量化成128维时信息损失较多,从而相似度较低),分布的相似度有很多方法,这里使用kl散度,相似度越高,说明阈值取得越合理,量化的误差也就越小。所以,通过多个阈值的尝试,最后找到误差最小的那个阈值作为scale保留。

注意上面说的是特征图的量化,tensorrt int8量化包含特征图的量化和权重的量化,权重的量化可以缩小模型大小,那么权重是怎么量化的呢,权重的话很简单,就是饱和量化,因为权重的分布比较均匀,所以以最大值映射到127就可以了。

量化好模型后,我们可以得到这么一些参数,首先是权重的int8值,然后是特征图的scale,还有权重的scale,权重的scale是channel-wise的,而特征图则是一层一个。

然后便是,模型的推理了,在模型推理过程中有一个细节,就是,只有kernel内的运算是int8,什么意思呢,就是我们将激活值和量化到int8,和int8的权重做运算,得到结果,这个结果还要反量化回fp32,不然会溢出,再加上bias,最后经过激活,再量化为int8。有人说,则不还是有fp32的运算吗,是的,但是这里可以优化,相较于直接的fp32运算要快得多。

QAT

接着讲QAT,我们在讲PTQ时已经知道,量化过程其实就是在做一件事,就是找阈值 ,或者scale,在PTQ中,我们是通过统计的方法,然后人工通过一些分布相似性得到的,然而,这肯定是有误差的,比如在bin的设计上面,2048只是一个超参。而且,由于量化是每层独立进行的,所以每层的量化是不依赖于前一层量化的结果的,这就导致了在实际的inference过程中会出现误差累积的情况,进一步影响量化后的性能。所以,我们需要一种可学习的scale。QAT就是在做这样一件事情。
这里讲的较详细这个连接讲得比较通俗易懂。
简单概括就是,我们在网络训练过程去模拟量化,我们通过设定一个可学习的scale,这个scale一般可以与weights或者激活值相绑定,然后我们利用一个量化过程 q = round(r/s)*127,将需要量化的值量化到0-127之间,再接着一个反量化过程q * s,就实现了一个误差的传递,接着我们利用反量化后的结果继续前传,最后得到loss,我们求量化后权重的梯度,并用它来更新量化前的权重,使得这种误差被网络抹平,让网络越来越像量化后的权重靠近,最后我们得到了量化后的权重q和缩放因子s。而这一系列操作都可以写成网络中的一个op,实现网络的正常训练。

最后,我们利用q和s,来进行inference。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python量化分析

python量化分析 1 环境配置 Python 3.10 Numpy、Pandas、Tushare、xlwt 2 获取K线数据 #适用场景&#xff1a;1&#xff09;已经有合适的标的&#xff0c;寻找合适买点 #2&#xff09;网格交易中&#xff0c;寻找买点 #3&#xff09;娱乐可用&#xff0c;不构成投资参考 #缺…

数据分析--07:金融量化

데이터 분석--07: 재무 수량화 一、金融介绍1、金融2、金融工具1.期货2.黄金3.外汇4.投资基金5.股票股票的作用 3、股票分类1.收益分类2.上市地区分类3.股票市场的构成4.影响股票的因素5.A股买卖 4、金融分析1.基本面分析2.技术面分析 5、金融量化投资1.为什么需要量化交易&…

聊聊量化分析

当你能够量化讨论的事物&#xff0c;并且可以用数字描述它&#xff0c;你就对它有了深入了解。但如果你不能用数字描述&#xff0c;那你的头脑根本没有跃迁到科学思考的状态。 ——英国物理学家 开尔文勋爵 1、两个量化case 测试地球周长&#xff1a;按照相似三角形的比例关系&…

【CHATGPT】登不上去,报错429,怎么办

节点更换了&#xff0c;浏览器缓存也清除了&#xff0c;还是不行

我,ChatGPT,站在谷歌的肩膀上,让谷歌紧张

ChatGPT的最大意义&#xff0c;在于它向在技术短缺状态中停留了大半个世纪的AI研发者们&#xff0c;传达了这样的信号&#xff1a;是时候走出实验室&#xff0c;拥抱人类&#xff0c;与人类开展有效互动的时候了。 在谷歌加持的类ChatGPT产品Bard回答问题出错后&#xff0c;它的…

ChatGPT:为什么它对所有行业都如此重要,它会杀死谷歌吗?

ChatGPT:为什么它对所有行业都如此重要,它会杀死谷歌吗? 想象一下,如果您与之交互的系统能够真正理解您并回答您提出的任何问题。该系统可以为您进行复杂的分析,像开发人员一样编写代码,甚至提供心理健康支持。2022年不再是幻想,而是现实,这个系统叫做ChatGPT。 ChatG…

“三箭齐发”,诸葛智能三大产品全新升级,助力企业迈向数字化经营 | 爱分析调研

调研&#xff1a;文鸿伟 撰写&#xff1a;文鸿伟 诸葛智能&#xff0c;是容联云旗下敏捷开放的场景化数据智能服务商&#xff0c;累积服务全国1000企业&#xff0c;覆盖泛互联网、泛电商、金融、汽车、产业科技、企服等数十个垂直领域。 自2015年成立至今&#xff0c;诸葛智…

@NotBlank 、@NotEmpty 没有提示具体message错误信息

使用下面统一异常处理的处理方法就可以提示 import com.butler.lib.common.base.BaseResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.validation.BindingResult; import org.springframework.validati…

MQTT接收消息到发送消息全配置

一、配置线程池 二、MQTT订阅生产消息 三、接收处理消息 四、接收消息处理接口 五、消费消息内容 六、MQTT数据处理基础类 七、MQTT的连接类 八、消息回调&#xff0c;一般是失败以后&#xff0c;进行重连接等处理 九、生产消息回调 十、线程异常情况下&#xff0c;处理MQTT自动…

AI之下没有秘密:网友诱骗ChatGPT激活 Windows 11,ChatGPT落入陷阱!

1/ChatGPT 和 Bard 向用户共享 Windows 产品密钥 要放心踏实地使用 Windows 系统&#xff0c;首先得获取独一无二的密钥。长期以来&#xff0c;购买能用的密钥一直是操作系统安装流程中的重要环节。大家当然可以直接掏钱&#xff0c;技术社区在这几十年间也想尽办法“解决”…

中文情感分析之TextCNN

中文情感分析之TextCNN 综述情感分析方法基于情感词典的情感分析基于机器学习算法的情感分析 文本分类模型TextCNN中文情感分析实践数据预处理文本数值化模型构建结果分析 总结 ​最近接了个业务需求&#xff0c;需要对论坛发帖进行情感分析&#xff0c;以便于对恶意发帖的行为…

利用Sentiwordnet进行文本情感分析(简)

利用Sentiwordnet进行文本情感分析&#xff08;简&#xff09; 1. 简介2. 下载NLTK包和它内部的词典3. 全过程代码详解1. 导入所需包&#xff0c;函数2. 分词3. 计数&#xff0c;给予词性标签4. 计算单词得分 4. 完整代码&#xff08;函数形式&#xff09; 1. 简介 利用python…

最新微信小程序抓包方法

一、安装 fiddler 官网下载&#xff1a;https://www.telerik.com/download/fiddler 二、配置 打开fiddler tools-> options&#xff0c;genneral: 全选 https: connections: 配置代理地址 gateway: 三、打开电脑端小程序 退出微信&#xff0c;登录微信时设置代理 打开小程序…

抓包微信小程序openid的教程

一.所需设备 windows 电脑 二、步骤 1、下载安装Charles&#xff0c;官网版有30天试用。地址&#xff1a;https://www.charlesproxy.com/download/ 或者自行找方法安装该软件即可。 2、打开Charles软件&#xff0c;同时打开微信电脑版并登录。 3、设置 Charles 开启https抓…

微信小程序中英文国际版

1.在main.js中引入vue-i18n //引入中英文 import VueI18n from vue-i18n Vue.use(VueI18n); const i18n new VueI18n({locale: zh, // 默认选择的语言silentFallbackWarn: true, //在初始化VueI18n实例时禁止设置这些警告&#xff08;同时保留那些警告给定键完全没有翻译的警…

微信聊天小程序——(二、账号的注册与登录)

具体效果&#xff1a; 目录 二、账号的注册与登录 步骤一、获取用户信息 步骤二、用户输入账号密码&#xff08;在注册页面中&#xff09; 步骤三、将获取到的值放到我们的数据库中&#xff08;在注册页面中&#xff09; 步骤四、登录的页面逻辑 步骤五、登录页面的实现 …

weixin小程序和公众号抓包方法分享

文章目录 前言一、工具准备及相关设置二、burp抓包演示三、扩展操作四、小结 前言 由于在工作中涉及了微信小程序的渗透测试&#xff0c;参考了一些文章&#xff0c;感觉代理的设置大都太麻烦&#xff0c;甚至还有人用模拟器或者手机登陆微信再抓内网IP的数据包&#xff0c;按…

微信小程序流量主被封和暂停搜索?

9月26号毫无征兆的收到微信广告助手的通知&#xff1a; 然后进入小程序后台&#xff0c;提示如下&#xff1a; 小程序广告组件关闭原因&#xff1a; 流量主通过违法违规等不正常手段获取流量&#xff0c;包括但不限于通过头像、名称、简介混淆正常搜索结果&#xff0c;影响用…

微信小程序功能被封禁怎么办(附上解决方案)

1.首先要明确是被封禁还是警告&#xff0c;警告的话在规定时间内整改就可以恢复&#xff0c;走的是警告申诉通道&#xff0c;封禁的话走的是封禁申诉通道 如果封禁了之后走警告申诉通过了申诉也是不给解封的&#xff0c;只能封禁走封禁申诉&#xff0c;警告走警告申诉。 2.在修…

chatgpt赋能python:Python中归一化处理——实现数据预处理的重要手段

Python中归一化处理 —— 实现数据预处理的重要手段 随着大数据时代的到来&#xff0c;越来越多的公司和机构开始注重数据的价值。不过&#xff0c;数据的价值是在经过处理后才会显现出来的。因此&#xff0c;数据预处理成为了数据分析过程中极为关键的一环。而在数据预处理中…