设为首页|收藏本站|
开启左侧

[科技] 终于有人把模型转换与训练后量化部署讲明白了

[复制链接]
黄老汉 发表于 2023-12-21 17:25:10 | 显示全部楼层
 
终究有人把模子转换与练习后量化摆设批注白了 第1张图片


导读:
12月6日,新一期地平线「你好,开辟者」工具链技术专场在智猩猩顺遂结束直播。专场由地平线模子转换和量化工具负责人何道远主讲,主题为《地平线模子转换和练习后量化摆设》。
本文是此次专场主讲环节的实录整理。假如对直播回放以及Q&A有需求,可以点击阅读原文前往旁观。
何道远:大师好,我叫何道远,现在是在地平线工具链负责模子转换和量化工具。我明天讲的主题是《地平线模子转换和练习后量化摆设》。
首要包括4个部分:
1、模子转换流程先容
模子转换首要经过Parser(转换为ONNX模子)- Optimizer(图优化)- Calibrator(模子量化校准和量化参数挑选)- Quantizer(转换为全整形模子) - Compiler(模子编译) 几个步调,最初转换成一个可摆设的Hybrid model。其中Optimizer图优化部分,教员报告了常用的四种方式:常量折叠、算子转换、算子融合,算子拆分。
2、模子量化误差分析
误差分析的有两个切入点,第一:哪些层的量化会致使模子精度的明显下降?第二:量化误差在收集合积累情况是怎样的?基于此需要一个量化模子精度调试工具,该工具有两个功用:Layerwise 分析和 Graphwise分析,别离对应上述两个切入点。
3、模子练习后量化 (PTQ)
对于PTQ量化,教员报告了一个量化Pipeline来天生量化模子。模子经过优化落后入PTQ做量化,PTQ模子量化分为三个部分:激活的量化、权重的量化和量化模子Finetune。激活量化部分先容了Modelwise和Layerwise方式,权重部分先容了BiasCorrection和激活权重均权衡化方式。
4、模子全整形量化
要将量化后的PTQ模子摆设到硬件上,还需要将它转换玉成整型计较模子,才能把量化性能发挥出来。
教员首先先容了浮点Conv到全整型Conv计较的转换方式,以后先容了激活函数的量化和定点化方式,包括多项式拟合和查表计较方式,在int16查表方式中,教员夸大了分段查找:“多项式拟合是用一个多项式去拟合方针函数,而分段查找是用多个一阶函数去拟合方针函数”。
01
模拟转换先容
首先讲的是模子转换流程,我们看一下下面这张图:
终究有人把模子转换与练习后量化摆设批注白了 第2张图片


用户的模子可所以Caffe、PyTorch大概ONNX等,进来以后会先经过一个Parser,获得一个Original onnx model;接着将 Original onnx model送到下一个Optimizer模块里去,Optimizer模块会对原始输入的模子停止图优化,图优化以后会获得一个优化后的Optimized模子;接着再将Optimized模子送到下一个Calibrator模块,对浮点模子停止量化校准和量化参数挑选,然后天生一个PTQ model;再将PTQ model送到下一个Quantizer模块,负责将PTQ模子转换成一个全整型计较的定点模子;最初将定点模子送到Compiler里面,天生一个可摆设的Hybrid model。架构图里面还有一个Debugger模块,是我们明天也会讲到的,这个模块负责对量化模子停止精度分析和调试。
我们再讲一下模子计较图优化这部分,先看一下右侧两张图:
终究有人把模子转换与练习后量化摆设批注白了 第3张图片


前面这张是模子优化前的结构图,前面是图优化以后的模子结构。优化后的模子结构相比优化前的已经少了很多算子,也更简洁,根基是一串算子重新至尾。当我们去摆设这两个模子的时辰,优化后的模子会比优化前模子的履行效力高。
我们再看一下图优化模块里面包括哪些内容呢?
1、常量折叠
首先会包括常量折叠,就是将一些原始的模子中的常量数据在离线端算出来。这样做的益处是,不需要在推理的时辰再计较这些节点了,可以节省模子推理的时候。别的,原始模子中能够还包括一些无用算子,比如Dropout,由于推理的时辰就不再需要Dropout这类算子了,也可以在模子转换阶段先把这类算子删撤除。假如这个模子包括多个输出分支,且停止模子摆设的时辰存在无用分支,那末可以在模子转换阶段删撤除,这样也可以节省模子推理的耗时。
2、算子转换
算子转换部分需要尽能够将Gemm算子转换成Conv算子,这样在前面临模子停止量化的时辰,就只需斟酌Conv算子的量化,不需要斟酌Gemm算子的量化逻辑了。
3、算子融合
算子融合常见的有:Conv+BN可以融分解一个Conv算子;Conv加Mul大概Add,大部分情况下可以融分解一个Conv算子,这样在摆设的时辰可以进步性能。
别的,还有激活函数的融合。它的首要题目是ONNX算子没有高级此外激活函数的暗示,比以下面4个图:
终究有人把模子转换与练习后量化摆设批注白了 第4张图片


Swish算子在ONNX里面是Sigmoid+Mul;Mish是Softplus+Tanh+Mul三个算子;HardSwish是4个算子;Gelu是5个算子组成。
假如不融合这些激活函数会有两个题目:
一个是摆设Gelu的时辰需要推理计较5个算子。假如将这些算子融分解一个Gelu算子,便可以提升推理效力。
另一个是假如不融合这些算子,量化也会是个题目。比如Swish是由Sigmoid和Mul两个算子组成的,假如不停止融合就需要对Sigmoid和Mul都停止量化,量化的精度损失会更大一些。假如是Gelu就更夸张,需要对5个算子都停止量化,这样模子精度会有明显的损失。
所以,我们工具链中的做法就是先把这些激活函数都停止融分解一个零丁的算子,然后再停止量化和摆设。我们会在前面的量化内容里讲到,地平线的工具链是怎样对各类激活函数停止同一的量化和整型化。
4、算子拆分
除了算子融合之外,有些地方还需要对算子停止拆分,典型有Softmax和LSTM。
我们先看一下LSTM,左侧这张图就是对LSTM算子拆分。
终究有人把模子转换与练习后量化摆设批注白了 第5张图片


假如用这个包括LSTM算子的原始模子去摆设,会发现硬件上并没有一个计较单元对应到LSTM,致使LSTM这个模子是不能摆设的。我们晓得LSTM就是由Conv+Sigmoid+Tanh+Mul这些根基算子组成的,这些算子在硬件上都是被支持的。所以,一个做法是可以将LSTM停止拆分,旁边这个图是将LSTM拆分以后的收集结构。拆出来以后,这个计较图里面就没有完整的LSTM了,只要一些细粒度的算子。这些细粒度的算子都是可以被硬件支持的,所以这个结构的模子便可以尝试摆设到硬件上了。
再看右侧这张图,是一个Softmax算子。
一样,硬件上没有一个计较单元来对应到Softmax算子。但我们可以尝试将Softmax拆分红最右侧这张图,包括6个根基算子。这些根基算子都是可以被硬件支持的,拆分完以后的计较图便可以尝试摆设到硬件上了。
我们前面会讲到,假如要对这样的计较图真正停止摆设,还需要停止量化和定点化。这里面的Conv算子量化摆设是比力常见的,首要难的是这些非线性激活函数Sigmoid、Tanh、Exp的量化摆设题目。
当模子停止图优化以后,下一步就需要将其从浮点模子转换成量化模子。
首要包括三个步调:
第一步,将浮点模子转换成模拟量化模子;
第二步,在模拟量化模子上面停止量化参数搜索,获得最优的量化参数;
第三步,将优化以后的模拟量化模子转换成一个全整型量化模子。
我们先看浮点模子到模拟量化模子的转换。
浮点模子转换成模拟量化模子就是在浮点模子的一些位置上插入伪量化节点,由伪量化节点模拟硬件的量化行为。看一下这幅图里左侧的第一幅这个是原始全精度模子,插入一些伪量化节点以后就酿成第二个图称为模拟量化模子(大概伪量化模子)。
终究有人把模子转换与练习后量化摆设批注白了 第6张图片


第二个图里面这些绿色的节点一般叫做伪量化节点,可以来模拟硬件是若何对数据停止量化的。
那末,若何将第一个全精度模子酿成第二个模拟量化模子?是在每个输入的地方都插入一个伪量化节点吗?
现实上不是这样的,这里还要看算子的属性。首先要看这个算子能否是可量化的,一般情况Conv都是可量化的,所以在Conv的输入、输出上都插入一个量化节点,来模拟Conv在硬件上的量化行为。
那什么是不成量化算子?简单的讲只要量化以后会致使模子精度明显下降的算子,都是不成量化算子。
那怎样识别这样的算子呢?我们前面在量化模子误差分析里面会讲到,可以经过Layerwise的方式识别这些算子的量化敏感度。假如识别到一个Conv是量化敏感节点,它的量化会致使模子精度明显下降,那末便可以把这个Conv标志为不成量化节点,这样我们就不会在 Conv的输入上插伪量化节点了。
还有一对概念是自动量化和被动量化。
自动量化算子是那些在模拟量化算子转成定点算子的时辰,需要用到该节点输入、输出上的量化参数的这类算子。比如,我们前面会讲到将Conv节点转换成定点QConv节点时需要用到输入和输出的Q/DQ节点中的量化参数。假如这个算子在量化成整数计较的定点算子的时辰,并不需要用到输入、输出上的量化参数,那末就是被动量化算子。
我们只需要在自动量化算子上面去插入伪量化节点,被动量化算子是不需要插入的。
适才提到的Conv是自动量化算子,那什么是被动量化算子呢?看一下第四个计较图。MaxPooling前面也有一个伪量化算子,但不是给MaxPooling用的,而是给前面的Conv输出用的。MaxPooling的计较并不会改变输入、输出的数值,只需要从输入里面选出最大的数值,将MaxPooling停止整数化的时辰不需要感知输入上的量化参数。所以MaxPooling输入、输出是不需要伪量化算子的。
回到第二个图的激活节点上,激活节点前后都有一个伪量化节点。假如这个激活是Relu,而Relu是不需要感知数据量化参数的,那末前后的两个伪量化节点是可以删掉一个的(留下的一个是用来量化Conv输出的);但假如激活不是Relu,而是前面提到的Swish、Gelu这些,那末前后两个伪量化节点都是需要保存的。
讲完模拟量化模子,我们再来看一下模拟量化模子的(Q/DQ)伪量化节点的具体行为。
伪量化节点的感化是将输入的浮点FP32数据先做一次量化,再做一次反量化,还是以FP32输出,使全部模子连结浮点计较,可是可以用来模拟硬件的量化行为。伪量化节点的首要行为是适才提到的量化函数
终究有人把模子转换与练习后量化摆设批注白了 第7张图片


和反量化函数
终究有人把模子转换与练习后量化摆设批注白了 第8张图片


两个式子。这两个式子里面包括首要的计较逻辑是:先对输入的x除以scale,再取一次round,加上一个zero_point做偏移,最初再做一次clip就获得量化后数据。
量化节点有哪些参数可以选呢?首要有三类:
一类是量化方式。
适才提到的zero_point是0就是对称量化,非0是非对称量化;round括号里面 x除以scale,scale假如在全部数据的量化进程中是一个牢固的值,那末它就是一个均匀量化;假如scale不是一个牢固的值,那就是一个非均匀量化;假如scale是在模子推理的时辰计较的就是静态量化;假如它在模子转换进程中离线计较的,就是静态量化。
第二类是量化精度。
每个量化节点可以挑选分歧的量化精度,比如4bit、8bit、16bit等。
第三类参数是量化粒度。
量化粒度看上面这个式子
终究有人把模子转换与练习后量化摆设批注白了 第9张图片


,round里面
终究有人把模子转换与练习后量化摆设批注白了 第10张图片


这一项,假如x代表的是某一层的全部激活,也就是全部激活用的是同一个scale量化,那就是per-tensor量化;假如对某一个激活的每个通道挑选分歧的scale,那就是per-channel量化。同理,我们还可以对scale挑选粒度更小一点,就有了per-block以及其他量化方式。
先容完模子转换部分,再看一下模子量化误差分析。
02
模子量化误差分析
量化可以提升模子摆设效力,可是做过模子量化的同学一般都碰到过量化后模子精度下降的题目。想要分析模子量化精度损失缘由,调试精度题目,并找到底子缘由尝试修复精度损失,凡是是比力耗时且困难的工作。
我们首先看一下量化误差的来历。
终究有人把模子转换与练习后量化摆设批注白了 第11张图片


对于量化误差的来历还是先看量化公式
终究有人把模子转换与练习后量化摆设批注白了 第12张图片



量化公式现实上有三个部分:
首先对输入的浮点x数据除以scale;再做一次Round操纵,这是一个取整操纵;再做一次Clip操纵,让数据饱并到我们想量化的数值范围里面。
看一下右侧这两个图:
左上角这个绿色的图是原始的浮点数据散布。首先对原始数据做一次scale获得第二排第一个红色散布的图;再做一次Round获得了中心这张红色散布图;然后做一次Clip获得右下角这张图;最初再把数据再反量化回去, 获得了右上角量化后的数据散布图。可以看到相比原始的数据散布,量化后的数据散布已经有明显的差别了,这类差别是终极致使模子精度下降的缘由。
再来看一下中心几个步调,可以看到rounding这个散布图,相比左侧scaling这个散布图,已经发生了明显的误差,这个误差我们叫做rounding error。rounding error首要和两个部分有关:一个是round战略,另一个是 scale巨细,scale代表量化步长。假如scale越小,量化步长越小,round以后误差也会越小;假如scale选的越大,round以后误差也会更大。
Clipping操纵发生的误差主如果在数据散布的两头,图上靠近-100和100的地方。仔细看这四周会发现这里和前面rounding散布图是有一些差别的,Clipping的误差它首要来历于两个部分:
一个是Clipping的时辰挑选min、max的巨细,它的巨细和想要量化的数据暗示有关:假如量化成INT8,那末min、max别离是-128和127;假如量化成INT16,那末这个min、max别离是-32768和32767。
别的,clipping error也和scale有关,假如scale挑选越小,那末x除以scale这一项就会越大,取整以后的值也越大,轻易超越min、max范围,从而被截断掉发生clipping error;假如scale挑选比力大,x除以scale这一项比力小,就不轻易超min、max范围,从而clipping error就会减小。
领会了量化误差的来历,我们怎样去怀抱量化误差呢?
从上面这两个绿色散布图来看,原始数据散布图和量化以后的数据散布图是有一些误差的,怎样怀抱误差的巨细呢?一般常用的怀抱函数有Cosine Similarity(余弦类似度)、SQNR、MAE、MRE、L1、L2等,这里我们选用余弦类似度来怀抱量化误差。余弦类似度的益处是一个归一化的数值,量化以后两个散布的余弦类似度接近1.0,暗示量化误差比力小。假如这两个散布的余弦类似度比力小,就代表量化以后的误差比力大。
大白了量化误差来历,同时也有了量化误差的怀抱函数以后,我们怎样分析模子收集的误差呢?
这里面首要斟酌两个题目:一个是哪些层的量化会致使模子精度的明显下降?另一个是量化误差在收集合积累情况是怎样的?
要回答这两个题目就回到第一页PPT架构图里面讲的Debugger工具,我们需要开辟一个精度调试工具来分析这两个题目。精度调试工具首要包括两个功用:一个是Layerwise分析才能,另一个是Graphwise分析才能。
Layerwise分析是用往返答第一个题目标,模子中哪些层的量化是致使模子精度下降的首要缘由?我们先看一下 Layerwise分析是怎样计较的,下面这张图左侧是浮点模子,右侧是量化模子。
终究有人把模子转换与练习后量化摆设批注白了 第13张图片


Layerwise分析的计较是在不异输入下计较劲化QConv和原始Conv输出的误差,计较一切层的误差并收集起来停止比力,可以看到哪些层量化误差会比力大。固然暗示每一层的误差可所以单层的输出误差,也可以用这个模子的终极输出误差。
收集完这些误差以后,可以看到右侧这两张图:
这是一个模子里面一切层的误差。由于这个模子比力大,就把它截成了两张图。这里的误差已经停止了排序。可以看到这张图的前半部分,这些层的余弦类似度是比力低的,代表着这些层的量化误差会比力大;后半部分余弦类似度比力高,代表着这些层的量化误差比力小。获得了Layerwise量化节点误差的分析以后,下一步一个比力简单的法子是把这些量化误差比力大的层设备成不量化,便可以规复模子精度了。
接下来我们再看一下Graphwise分析方式,先看Graphwise的计较逻辑。
终究有人把模子转换与练习后量化摆设批注白了 第14张图片


一样左侧是浮点模子,右侧是量化后的模子。Graphwise的分析就是把每个QConv输出和原始Conv输出的误差逐层的计较出来,把这些误差绘制成一条曲线,用来分析这个模子的量化误差积累情况。
先看左上角这张图,横坐标是节点索引,纵坐标是误差,这里误差还是用余弦类似度来评价。绿色曲线代表对模子只量化权重,可以看到这条线根基是靠近1.0的,暗示量化模子误差损失比力小;橙色曲线代表的是这个模子只量化激活,这条曲线余弦类似度比力低,且波动比力大。这两条曲线就意味着这个模子的权重量化损失比力小,但激活量的损失会比力大。
再看右侧这张图,它是相反的。前半部分这条绿色的权重量化曲线更靠近1.0,余弦类似度比力高;但到了模子的尾部部分,绿色这条量化曲线降得比力多,甚至比橙色的曲线的余弦类似度掉的更多了。这张图暗示的意义是模子的权重量化误差比激活量化误差还要更大一些。
别的,我们还可以在没稀有据集的情况下评价,用分歧的量化方式获得的量化模子的黑白。比如左下角这张图,蓝色normal曲线暗示对模子对称量化,橙色的曲线暗示非对称量化。可以看到非对称量化的积累误差曲线的余弦类似度更高一些,代表这个模子的非对称量化成果比对称量化的成果更好一点。
最初是右下角这张图,它是对模子停止部份量化,这里有三条曲线,绿色这条曲线的余弦类似度更靠近1.0,代表三种分歧部份量化挑选下,选用绿色这条曲线对应的这一组节点获得的部份量化模子精度最好。
前面先容完量化模子的量化精度损失题目,接下来我们看一下怎样经过度歧的量化方式削减模子精度损失并规复量化模子的精度。
03
模子练习后量化(PTQ)
首先,我们看一下有哪些量化方式。
我们按照模子量化进程中能否需要数据、label以及梯度等,把分歧的量化方式依照易用性做了分级:纵坐标代表量化方式或量化工具的利用复杂度或利用本钱;横坐标是对这些量化方式停止了分级。
终究有人把模子转换与练习后量化摆设批注白了 第15张图片


最左侧的level1量化方式只需要一个模子,其他都不需要,我们叫做Data-Free的量化方式。
level2方式需要一个模子以及少许的数据,然后基于统计和法则的方式来计较劲化参数,这类方式可以称为Light PTQ。
Level2+方式在模子和少许数据的根本上,可以基于梯度下降的方式优化模子的量化参数。这类方式一般叫做Advanced PTQ。
Level3方式需要模子、全量数据和label,需要完整的模子练习Pipeline。这就是我们之前分享过的QAT量化方式。
一般情况下,模子量化精度损失比力小,可以用 level2的Light PTQ方式。假如这个模子量化精度损失比力高,那便能够需要尝试用Level2+ Advanced PTQ方式甚至Level3 QAT方式去规复量化模子精度。对于PTQ量化,首要斟酌level2和level2+里面的方式。这两个范围里的方式,细分下去又有很多分歧的方式。怎样来利用这些方式呢?我们就需要构建一个量化Pipeline来处置这些方式。
全部模子量化Pipeline大如果左下角这张图。原始模子进来,先经过一个模子转换优化,获得一个优化后的模子;优化后的模子送到 PTQ模块里做量化,而PTQ模块又分红三个部分:
第一步是激活的量化。对这些激活上的 Q/DQ伪量化节点停止量化参数挑选,包括scale、bit等参数;第二步,我们再把它送到权重量化模块里面。一样地,权重量化模块也会对权重节点上的伪量化节点的量化参数停止挑选。权重量化里面还有BiasCorrection等的方式;第三步,我们把这个模子再送到一个包括Level2+量化方式的Finetune模块里面。
最初,我们就获得了一个经过PTQ量化的模子,这个模子和前面提到的伪量化模子的区分是,这个PTQ模子里面一切的Q/DQ节点的量化参数都已经牢固了。
接下来先看一下激活量化这部分。
首先还是看一下量化公式,公式里面的一切参数都是可以经过搜索来挑选或优化的包括 scale、round、min、max、clip。前面我们也讲到,对量化误差影响比力大的是scale。它会影响rounding error,也会影响clipping error。scale是怎样计较的呢?就是右侧的公式。这里我们把zero_point这项去掉,先只看对称量化。
可以看到这个 scale受两个参数影响,一个是Threshold,另一个是Bit。
Threshold是怎样计较的呢?可以看下面这个图。
终究有人把模子转换与练习后量化摆设批注白了 第16张图片


Threshold是在数据散布里面找到一个最优的截断值,最优的截断值可以让数据的量化误差损失最小。常用的Threshold的计较方式有max、kl、percentile、mse、min-max等,min-max已经属于非对称量化的方式。
max暗示在这个数据散布里面取绝对值最大的值作为阈值Threshold。
percentile是一个百分数,它暗示对这个数据散布的所稀有从大到小排序。假如percentile取0.9999,那暗示要取这个数据散布里面第99.99%大的阿谁值。
kl的计较会尝试在这个数据散布里面取多个阈值,对每个阈值停止数据的量化;取量化后和原始数据kl散度最低的阈值,作为量化损失最小的最优阈值。但现实上,KL散度最低对应的阈值并纷歧定是在全部模子中的量化误差最小、最公道的。
有了这些阈值方式以后,我们怎样来计较模子中各个激活的量化参数呢?
1、Modelwise
适才讲到每种阈值方式挑选的Threshold也并纷歧样。简单一点,我们可以用Modelwise的方式来计较。Modelwise就是全部模子尝试用分歧的Threshold方式去计较,获很多个分歧的量化模子,再来比力这些量化模子的黑白,选出最优的量化模子。
右侧这个图就是分歧模子选用分歧的阈值方式去量化的成果,标粗的是这个模子最优的量化成果。
终究有人把模子转换与练习后量化摆设批注白了 第17张图片


可以看到,有几个模子是 Max方式最好、精度最高,也有的是KL和 Percentile方式,而Percentile方式也不都是一样一个百分数是最优的。别的,我们还可以观察到里面有几个模子 Max方式的精度下降出格利害,这是由于 Max校准总是取数据散布里面的最大值作为阈值。大师可以看到,假如Threshold取的是最大值,那末 scale也相对会比力大,响应的Rounding error就会比力大。当这个模子的数据散布中存在比力大的离群值时,就会致使scale算得出格大,Rounding error也出格大,终极致使模子精度明显下降。所以, Max方式虽然在有些情况下是最优的,但用它来量化模子时,波动比力大。
还有一个题目,我们经过Modelwise获得几个量化模子后,怎样晓得哪个量化后的模子是最优的?右侧这张图是我已经用数据把这些模子精度跑出来了,现实作为一个模子转换和后量化工具,假如真的要用全量数据去评测,时候本钱上是不成接管的。
评价这些分歧量化方式获得的模子的黑白,可以用前面在量化误差分析里面提到Graphwise的分析方式,对这些分歧方式获得的量化模子绘制量化误差曲线,去比力哪一条曲线的余弦类似度更接近1.0,从而获得最优的量化模子。
2、Layerwise
除了Modelwise方式之外,我们还可以更细粒度的做Layerwise的量化参数挑选。
Layerwise可以对每一层激活尝试用分歧的阈值,比力这些分歧的阈值获得的量化误差,选出误差最小的作为这一层最优的量化参数并牢固下来。
Layerwise还可以融合Bit搜索。对量化敏感度比力低的、量化后误差比力小的层,可以尝试选用更低的量化Bit比如4Bit。对一些量化敏感度比力高、量化以后误差比力大的层,可以选用比力高的Bit,比如用16Bit去量化,这样就获得一个摆设上最优的模子。
接下来我们再看一下权重的量化部分。
权重的量化也可以和激活量化一样,经过搜索的方式获得最优 scale和Bit等量化参数。此外,权重量化还有一些其他方式来优化模子。
先讲一下BiasCorrection这个方式。它的焦点思惟是:量化的时辰会发生误差,这些误差常常是有偏向性的,致使模子的输动身生偏移,终极致使模子精度的下降。若何批改这些偏移呢?批改这些偏移就是用到BiasCorrection方式。
下面这个图是BiasCorrection的方式,和之前计较误差的图比力像也是左侧是浮点模子,右侧是量化模子。
终究有人把模子转换与练习后量化摆设批注白了 第18张图片


这里计较每一层量化Conv和原始Conv的输出,并计较两者在每个通道上的均匀误差,把均匀误差看做量化发生的偏移。由于均匀误差是每个通道上计较的,所以和 Bias是不异外形的,我们便可以把计较获得的均匀误差融合到卷积的Bias里面去,这就完成了误差的校准。这里融合的另一个益处是不会在模子摆设的时辰带来额外的性能影响。
我们再可以看一下右侧的两个实例模子:
上面是 RepVGG模子。蓝色曲线是BiasCorrection校准之前的误差曲线,橙色是校准以后的误差曲线,可以看到校准前后还是有明显变化的。对应到量化模子精度在校准前精度只要0.69,校准以后可以到0.732,还是有明显的提升的。
下面是MnasNet模子。前半部分它的校准误差还是获得了明显地抑制,但在模子输出部分,校准误差并没有获得很好地抑制,甚至还出现了反偏向的误差。对应到终极的模子精度上还是有一点点提升,但现实上提升已经不明显了。
我们再看一种权重量化的方式,除了BiasCorrection校准之外,我们也可以对权重停止校准。权重校准的方式常用的有跨层均权衡化和SmoothQuant方式。
在这里我们先容一种地平线早期做的激活权重均权衡化方式,这个方式和后来SmoothQuant方式有点像。它的首要思惟是激活的每个通道散布差别能够会比力大,比如右下角这两个图,是从ConvNext模子里面取出来的两层激活散布的箱线图。
终究有人把模子转换与练习后量化摆设批注白了 第19张图片


横坐标暗示激活通道,纵坐标暗示激活的幅值。上面这张图中心有一个通道上的激活幅值远远大于其他通道上,下面这张图也有一个通道上的幅值远大于其他通道。为什么ConvNext会出现出现这类通道间的幅值差别出格大的情况呢?主如果由于ConvNext这个模子和传统的 CNN模子纷歧样,传统的 CNN模子中我们归一化层用的是Batchnorm,而ConvNext中归一化层用的是Layernorm。Layernorm的归一化方式和Batchnorm纷歧样,轻易出现分歧通道之间的数据散布差别比力大的情况。
我们对通道之间幅值差别比力大的激活尝试量化的时辰,scale的挑选就会比力困难。假如这个scale选的比力大,那末对幅值异常通道上的量化就会比力友爱,但这会致使其他幅值比力小的通道上的量化rounding error比力大。但假如scale选的比力小,其他通道上比力好,可是幅值比力大的通道上的 Clipping error 就会比力大。这就是用PerTensor量化面临的题目,怎样处理呢?
一个简单的方式就是用PerChannel量化,给每个通道都选一个scale,使每个通道的scale都是自力的、互不影响的。这样每个通道都可以用一个比力公道的scale去保证比力小量化误差。但激活引入PerChannel量化会致使一些硬件上的计较价格,甚至硬件上需要增加一些额外的计较单元来支持这个功用。所以我们希望激活还是PerTensor量化,这里就用到了一个激活权重均权衡化的方式。
我们看一下左下角的Conv计较表示图:上面每个蓝色框代表一个通道的激活,每个橙色的框代表着一个通道的权重。而Conv的计较就是用通道上的权重去卷积激活,再把一切通道上获得的成果停止累加。每个通道上的卷积计较可以暗示成 X*W,假如要在卷积计较上乘一个系数,这个系数是乘在X还是 W上,都是一样的。
假定现在已经对激活停止per-channel量化,每个通道上获得了一个scale别离是S0,S1,Sn,我们可以从per-channel的scale里面提取一个最大的scale记作Smax。提取出来以后,每个通道原本的scale需要除以Smax,比如第一个通道的scale除以Smax酿成了S0/Smax,第二个通道就酿成S1/Smax。
激活跟scale之间是乘法关系,适才讲到了在卷积计较的进程中,假如要乘以一个系数,这个系数是乘在激活上还是权重上都是一样的。所以我们可以把变更后的每个通道的激活scale参数融合到权重里面,这样激活就只保存一个一切通道公共的Smax参数,相当于转换成了per-tensor量化。而每个通道的权重则别离被一个scale停止了校准。这个方式相当因而用Weight校准以后的权重+PerTensor激活量化来取代per-channel的激活量化。
回到ConvNext模子上,在没有益用激活权重均权衡化方式之前,模子精度是0.74,利用了这个方式以后精度可以提升到0.792。
前面讲的都是基于搜索和法则的方式来计较和优化量化参数,我们也可以经过梯度下降的方式来优化模子的量化参数。这类方式可以优化量化公式里的一切参数,右侧这个图蓝色框里的参数都是可以优化的,包括 scale、Bit,甚至 Round战略以及Weight等。
基于梯度下降的模子Finetune优化战略首要有右侧这三种:End-to-End,Layerwise,Blockwise。
终究有人把模子转换与练习后量化摆设批注白了 第20张图片


1、End-to-End
End-to-End是对全部模子的量化参数一路优化。一般做法是拿量化模子和原始模子的输出MSE误差作为 loss来优化这些量化参数。这类方式的一个比力大的题目是:假如在一个较小的数据集上去优化,会有较大的过拟合风险,可是一般情况下也不会同时去优化一切的量化参数。
2、Layerwise
Layerwise是每次只优化调剂某一层的量化参数。比如中心这个图当前这一步只优化Conv2的量化参数,用量化后的Conv2输出与原始Conv2输出的MSE作为loss,去优化 Conv2节点的量化参数,典型的做法有AdaRound、AdaQuant。
AdaRound每次优化时只优化权重,且在优化调剂权重的时辰把调剂幅度限制在0或1上。这样,AdaRound最初优化的成果就相当于给权重量化选了一个最优的Round战略。
AdaQuant是AdaRound方式演变过来的,不再只范围于调剂Weight,一切参数都可以调剂,包括激活的scale、Bit,以及权重,甚至这一层的Bias。在权重的优化上也不再限制调剂范围,幅度可所以肆意的。这类方式的益处是,由于每次只调剂一个节点的量化参数,所以可以在一个比力小的数据集上练习优化,不会发生比力大的过拟合风险。
3、Blockwise
有了End-to-End和Layerwise,自然就有了介于这两种方式之间的第三种方式Blockwise,典型的有BRECQ方式。Blockwise方式是每次去优化一个Block,Block通常为手动指定几个层,每次只调剂指定的几个层里量化参数,所以 该方式中指定Block巨细是其中一个关键题目。
不外,大师假如做的是Transformer模子上的优化,那每次调剂的Block巨细可以牢固是一个Transformer Block便可以了。
04
模子全整型量化
前面我们讲的是若何天生一个模拟量化模子,先容的 PTQ方式也都是在模拟量化模子上去做量化参数的搜索和优化。真正要将量化 后的PTQ模子摆设到硬件上,还需要将它转换玉成整型计较模子。
大师可以看到这里有三个图,左侧是全精度的模子,就是FP32的模子;中心是模拟量化模子,也叫做伪量化模子;右侧是全整型模子,叫做定点模子。
终究有人把模子转换与练习后量化摆设批注白了 第21张图片


模拟量化模子比全精度的模子多了一些Q/DQ伪量化节点。假如将模拟量化模子拿去摆设,就会发现性能是没有提升的,反而是下降的。由于模拟量化模子 Conv输入还是FP32,和原始浮点模子Conv计较劲是一样的,反而还多了很多Q/DQ伪量化节点,所以性能必定是下降的。
想要将量化后模子的性能发挥出来,还需要将量化后的模子停止全整型量化,也就是定点化。定点化以后可以获得右侧这个图,这时辰Conv节点已经酿成了QConv节点,它的输入、权重、输出都是INT8。这个QConv节点相比本来浮点模子里面的Conv节点,计较劲就有明显下降了。此外,原始浮点模子里面的Activation节点输入和输出都是FP32;到了全整型模子里面已经转换成一个LUT(查表算子)节点,输入和输出也酿成了INT8。
全整型量化模子的头尾还有两个节点Quantize和Dequantize节点。这两个节点还是浮点的,若要想优化这两个节点,需要在模子摆设阶段停止优化了。一般做法是把Quantize节点和数据前处置去停止融合,把Dequantize节点和数据后处置融合,这样便可以最大化地发挥摆设模子的性能。
我们再看一下浮点的Conv到定点的Conv是若何转换的?
终究有人把模子转换与练习后量化摆设批注白了 第22张图片


1、
终究有人把模子转换与练习后量化摆设批注白了 第23张图片


先看一下最上面Conv的计较公式
终究有人把模子转换与练习后量化摆设批注白了 第24张图片


。我们在第三部分模子练习后量化(PTQ)里讲到,经过PTQ量化获得了Conv的输入、输出以及权重的量化参数,就是scale。
2、
终究有人把模子转换与练习后量化摆设批注白了 第25张图片


有了每一个数据上的量化参数,用反量化公式来暗示
终究有人把模子转换与练习后量化摆设批注白了 第26张图片



3、
终究有人把模子转换与练习后量化摆设批注白了 第27张图片


再把这些量化公式带到上面的浮点计较公式里面,就有了第三个公式
终究有人把模子转换与练习后量化摆设批注白了 第28张图片


。这就是Conv的量化计较公式。
4、
终究有人把模子转换与练习后量化摆设批注白了 第29张图片


对量化计较公式做一些等效变更,把
终究有人把模子转换与练习后量化摆设批注白了 第30张图片


提出来,括号里面就获得
终究有人把模子转换与练习后量化摆设批注白了 第31张图片


,在括号里面是
终究有人把模子转换与练习后量化摆设批注白了 第32张图片


。可以看到
终究有人把模子转换与练习后量化摆设批注白了 第33张图片


这一项已经是整数计较了,
终究有人把模子转换与练习后量化摆设批注白了 第34张图片


这项还是浮点的,下一步我们就把
终究有人把模子转换与练习后量化摆设批注白了 第35张图片


这一项也转成定点。
5、
终究有人把模子转换与练习后量化摆设批注白了 第36张图片


终究有人把模子转换与练习后量化摆设批注白了 第37张图片


这一项改变比力轻易。我们把
终究有人把模子转换与练习后量化摆设批注白了 第38张图片


这一项的间接取一次round,就酿成整型了,再做一次clip是保证数据不要溢出量化范围。
6、
终究有人把模子转换与练习后量化摆设批注白了 第39张图片


一般情况下我们会把
终究有人把模子转换与练习后量化摆设批注白了 第40张图片


量化到int32范围。对
终究有人把模子转换与练习后量化摆设批注白了 第41张图片


停止量化以后,我们再把
终究有人把模子转换与练习后量化摆设批注白了 第42张图片


移过来,就获得了最初的量化公式
终究有人把模子转换与练习后量化摆设批注白了 第43张图片


,这就已经是Conv的量化计较公式了。
大师假如是在GPU上做模子量化摆设的话,到这一步便可以了。由于GPU是有浮点计较才能的,只要保证中心卷积部分是定点计较的,摆设模子的推理就是高效,前面的量化部分可以用浮点算(这部分计较劲占比不大)。可是假如我们的方针是全整型计较,最初这项
终究有人把模子转换与练习后量化摆设批注白了 第44张图片


还是浮点的,还需要把这一项也转成定点的。这一项在量化里面一般叫做Requantize。
我们先把
终究有人把模子转换与练习后量化摆设批注白了 第45张图片


这一项暗示成
终究有人把模子转换与练习后量化摆设批注白了 第46张图片



再把
终究有人把模子转换与练习后量化摆设批注白了 第47张图片


拆成
终究有人把模子转换与练习后量化摆设批注白了 第48张图片


。浮点数在二进制上的暗示原本就是指数项和小数项,只不外这里拆的时辰要保证
终究有人把模子转换与练习后量化摆设批注白了 第49张图片


是在0.5~1之间的,这样可以保证
终究有人把模子转换与练习后量化摆设批注白了 第50张图片


在量化的时辰误差损失最小。获得
终究有人把模子转换与练习后量化摆设批注白了 第51张图片


以后,
终究有人把模子转换与练习后量化摆设批注白了 第52张图片


这一项是个常数。在硬件上做
终究有人把模子转换与练习后量化摆设批注白了 第53张图片


操纵右移就行了,是个整数操纵,这里唯一还有
终究有人把模子转换与练习后量化摆设批注白了 第54张图片


是0.5~1的小数。
那怎样样把
终究有人把模子转换与练习后量化摆设批注白了 第55张图片


转化成整数呢?我们在
终究有人把模子转换与练习后量化摆设批注白了 第56张图片


上去乘一个较大的值,比如在
终究有人把模子转换与练习后量化摆设批注白了 第57张图片


上乘
终究有人把模子转换与练习后量化摆设批注白了 第58张图片


,取一下,就酿成了一个整数了。乘上怎样消除呢?就把它提到前面去,在指数exponent上加上15,就酿成第三这个式子。
这里有两个
终究有人把模子转换与练习后量化摆设批注白了 第59张图片


主如果由于
终究有人把模子转换与练习后量化摆设批注白了 第60张图片


乘整项取
终究有人把模子转换与练习后量化摆设批注白了 第61张图片


时辰会有误差损失,可以按照硬件价格做权衡。假如想要保存尽能够高的精度,那就用更大的整数去乘
终究有人把模子转换与练习后量化摆设批注白了 第62张图片


,比如
终究有人把模子转换与练习后量化摆设批注白了 第63张图片


×
终究有人把模子转换与练习后量化摆设批注白了 第64张图片


,这样乘完以后做
终究有人把模子转换与练习后量化摆设批注白了 第65张图片


就保会保存更多的有用位数。
假如要权衡硬件价格,挑选更小的也可以,可以比15更小,12、13都是可以的。
我们可以把requantize这项记作
终究有人把模子转换与练习后量化摆设批注白了 第66张图片


,把这个式子代回到量化公式里面,就获得了右侧这个式子
终究有人把模子转换与练习后量化摆设批注白了 第67张图片


。括号里面都是整数计较,M也是一个整数,而
终究有人把模子转换与练习后量化摆设批注白了 第68张图片


在硬件上就是一个右移的操纵,也是整数计较。
到这一步,我们就完成了浮点Conv到全整型Conv计较的转换。
然后我们再看一下全整型Conv计较在硬件上是怎样做的。下面这个图就是Conv在硬件上计较的表示图。
终究有人把模子转换与练习后量化摆设批注白了 第69张图片


可以看到输入是两个,一个是INT8的激活,另一个是INT8的权重。输入进来以后先送到 MAC里面计较,计较完以后再送到下一个Accumulator累加器里面;
终究有人把模子转换与练习后量化摆设批注白了 第70张图片


可以间接送到Accumulator里面停止累加;累加完了以后再送到下一个Requantize模块里面。这个模块现实上就是上面
终究有人把模子转换与练习后量化摆设批注白了 第71张图片


的操纵,经过Requantize模块,我们就获得了
终究有人把模子转换与练习后量化摆设批注白了 第72张图片


整数的INT8的输出。
接下来,我们再看一下激活函数的定点化题目。
终究有人把模子转换与练习后量化摆设批注白了 第73张图片


这里列了一些常见的激活函数,现实还有更多。ONNX里面大要有四十几种激活函数。
可以看到这些激活函数不同还挺大的,第一列根基都是一些分段线性的函数,比如最上面的leakyrelu有两段;中心的clip,左侧是饱和的;最下面hardsigmoid两头是饱和的,中心是一段线性。
第二列看起来是一些单调递增的函数,比如Sigmoid、Tanh、Softplus都是单调递增。
第三列是CNN里面常用的一些激活函数,比如说这些函数都跟Relu长得比力像,但在靠近0的部分都是一段曲线,而且也各纷歧样。
第四列是一些下降或上升比力快的函数。第一个是Reciprocal求倒数、第二个是Exp、第三个是Log。
那怎样去实现这些激活函数的计较呢?假如在模子里面碰到了这些激活,怎样实现模子的全整型计较?
第一个法子,我们可以尝试用多项式来拟合这些激活函数。
比如右侧这个公式:方针函数是
终究有人把模子转换与练习后量化摆设批注白了 第74张图片


,可以尝试构建
终究有人把模子转换与练习后量化摆设批注白了 第75张图片


这样一个多项式,去拟合
终究有人把模子转换与练习后量化摆设批注白了 第76张图片


这个方针函数。拟合以后再对多项式停止量化,然落后行定点化,便可以到达全整型计较的目标。
可是多项式拟合也有一些价格。我们看右下角这张图,这是用多项式去拟合Sigmoid的函数:
终究有人把模子转换与练习后量化摆设批注白了 第77张图片


第一个图是一阶的函数,一阶只能拟合线性,拟合不了Sigmoid。
第二个是二阶的函数,它只能拟合一半的Sigmoid。
左下角是一个三阶函数,它根基快拟合到Sigmoid。
右下角是一个五阶的函数,这个拟合的稍微好一点。
多项式拟合常常是越高阶的拟合越好,可是越高阶的计较价格就越高。
我们先斟酌一阶的,比如
终究有人把模子转换与练习后量化摆设批注白了 第78张图片


。浮点上需要一次乘法和一次加法,假如我要把浮点的
终究有人把模子转换与练习后量化摆设批注白了 第79张图片


转换成定点的,需要用到前面讲到的Conv定点化中的Requantize那部分的逻辑,先把
终究有人把模子转换与练习后量化摆设批注白了 第80张图片


提出来,再把括号里面的a1/a0浮点数拆解成
终究有人把模子转换与练习后量化摆设批注白了 第81张图片


,这样括号里面是一次乘法、一次移位和一次加法操纵,括号里面的a0也需要拆分红
终究有人把模子转换与练习后量化摆设批注白了 第82张图片


形式,又需要一次乘法和一次移位操纵。
假如斟酌多阶的,比如五阶的
终究有人把模子转换与练习后量化摆设批注白了 第83张图片


,大师可以算一下大要需要几多次的乘加以及移位操纵,才能完成计较。这个计较价格现实上是不低的。
别的,假如用高阶多项式去拟合还会有溢出风险。可以斟酌一下,假定x输入范围是INT8的数据,假如是一个五阶的的操纵,数据范围大如果几多呢?现实上已经溢出INT32的范围了,相当于假如用五阶多项式去拟合方针函数,即使输入INT8,也需要用跨越INT32的计较才能来计较,这样它的计较价格就更高了。
所以,多项式拟合里面一个关键题目,是能不能找到一个低阶的函数来拟合方针函数。
但一阶就不用想了,它只能拟合线性的。可以斟酌二阶的函数,它可以比力好的拟合方针函数或方针函数的一部分。假如可以找到,我们便可以尝试用多项式拟合去做。
我们再先容别的一种计较价格小的查表计较方式:
1、INT8查表
首先看一下,当输入数据是INT8时辰的查表计较方式。
终究有人把模子转换与练习后量化摆设批注白了 第84张图片


先看一下方针函数
终究有人把模子转换与练习后量化摆设批注白了 第85张图片


,假定为,经过PTQ阶段,我们已经获得 x和 y的量化参数
终究有人把模子转换与练习后量化摆设批注白了 第86张图片



终究有人把模子转换与练习后量化摆设批注白了 第87张图片


,带到方针函数里面就有了量化计较公式
终究有人把模子转换与练习后量化摆设批注白了 第88张图片




终究有人把模子转换与练习后量化摆设批注白了 第89张图片


移过来,把量化函数做一下变更,就获得了第三个式子
终究有人把模子转换与练习后量化摆设批注白了 第90张图片


。括号里面先取一次round,把这个数整数化,再做一次clip,假如Y是INT8输出的,那末clip的范围是-128~127。
其中函数f是常量,在模子里面必定晓得激活函数是什么,
终究有人把模子转换与练习后量化摆设批注白了 第91张图片



终究有人把模子转换与练习后量化摆设批注白了 第92张图片


也是常量,在PTQ阶段已经算出来了。
终究有人把模子转换与练习后量化摆设批注白了 第93张图片


虽然是个变量,可是它的范围是-128~127。已知
终究有人把模子转换与练习后量化摆设批注白了 第94张图片


在-128~127范围,假定方针函数是Sigmoid,且PTQ经算出了输入、输出的
终究有人把模子转换与练习后量化摆设批注白了 第95张图片



终究有人把模子转换与练习后量化摆设批注白了 第96张图片


。我们怎样做呢?我们可以尝试遍历一切
终究有人把模子转换与练习后量化摆设批注白了 第97张图片


从-128~127的值,代入到上面这这个式子里面算一下,获得了每一个
终究有人把模子转换与练习后量化摆设批注白了 第98张图片


输入情况对应
终究有人把模子转换与练习后量化摆设批注白了 第99张图片


输出的成果,就是右侧这个表。
获得这个表以后,把这个表作为 LUT算子的参数。在推理的时辰,先将这个表加载起来,QConv算出INT8数以后,在这个内里面查一下对应的输出是什么,这样就相当于我只要做一次查表操纵就获得成果。这类方式在现实推理的时辰,只需要预先加载一个256字节的表,在推理的时辰,只要需要在内外查一下数据便可以获得成果,比间接计较要更快一些了。
2、INT16查表
我们前面讲到激活量化的时辰提到了Layerwise量化参数搜索,对于有一些量化比力敏感的层会尝试用更高Bit量化,比如用INT16去量化。当碰到激活函数输入是INT16时辰该怎样做呢?
看一下左侧这张图,假定QConv输出INT16的时辰激活函数怎样做?
终究有人把模子转换与练习后量化摆设批注白了 第100张图片


我们前面讲浮点Conv到定点Conv转换的时辰,只讲了怎样输出一个INT8的Conv,现实上也可以输出INT16的Conv,并不是那末复杂,大师可以回到前面那页PPT自己推理一下。假定前面这一层Conv输出的是INT16,这时辰激活该怎样做呢?假如我们采用
终究有人把模子转换与练习后量化摆设批注白了 第101张图片


一样的方式会存在一个题目。
终究有人把模子转换与练习后量化摆设批注白了 第102张图片


的取值范围比
终究有人把模子转换与练习后量化摆设批注白了 第103张图片


大很多,在-32768~32767之间,假如和
终究有人把模子转换与练习后量化摆设批注白了 第104张图片


一样就需要构建一个128KB巨细的查找表来做。
但128KB就比力夸张了。前面QConv这一层量化后的权重自己能够就没有128KB这么大,假如激活表这么大明显不是很公道。别的,假如真的构建这样一个表并尝试在硬件上用查找的方式去做,计较价格也会是很高的。现实中也不会有人真正去构建这样的表用于推理的时辰计较。
那要怎样做呢?这里先容一个分段查找的方式。
分段查找现实上也是一种方针函数的拟合方式,跟前面讲的多项式拟合方式的不同是:
多项式拟合是用一个多项式去拟合方针函数,而分段查找是用多个一阶函数去拟合方针函数。
右侧的图是Sigmoid分段的方式。分段拟合就是先把方针函数分红很多个段。比如第一个图把 Sigmoid用9个点分红8个段,每段用一个一阶函数
终究有人把模子转换与练习后量化摆设批注白了 第105张图片


去拟合,用这样的方式取代全部方针函数的计较。大师可以很轻易想到,分段拟合分的越细,误差必定越小。蓝色的是Sigmoid曲线;红点就是分段的点;布景上这些橙色的点是误差,它暗示的意义是在这个数值四周,用一阶的线性函数
终究有人把模子转换与练习后量化摆设批注白了 第106张图片


和原始函数算得的成果误差巨细。
可以看到,假如分红8个段去拟合,它的最大误差(MAE)在0.014左右。看第二个图,假如用16个段去拟合,那末它的误差就削减了,酿成了0.0044。假如是第三个图,用更多的32段去拟合,它的最大误差MAE已经降到了0.0012。
分段查表方式的益处是:我们不需要一个很大的查找表,计较速度也比力快,由于在每一个点上只需要计较一次
终究有人把模子转换与练习后量化摆设批注白了 第107张图片


就够了。
分段查表有两个题目:一个是怎样对函数停止分段,另一个是分段的个数。
前面三个图都是均匀分段,比如第一个分红8段,就在方针函数范围里均匀分红8段;左下角这张图是分红32段,也是在方针函数范围里均匀分红32段。
再看一下右下角这张图。很明显这张图的分段就不是均匀的了,那这些图上的点是怎样分的呢?我们是按照曲率大概方针函数的二阶导数去分,曲率代表的是曲线的曲折水平,曲率越大越曲折。为什么要用曲率去分别呢?由于假如这个地方曲折水平比力大,用一段线性去拟合的误差能够会更大。所以一般我们在曲率比力大的地方分的比力密,在曲率比力小的地方就分的比力稀疏,这样就获得了最右侧这张图。
我们可以对照一下左下角和右下角这两张图。它们都是对方针函数停止32个分段的,橙色的点是每一个数值上的误差,可以看到左下角这图在0四周,出格是-2~2四周,它的误差是比力大的。右下角这个图在-2~2四周,它的误差明显比力小,误差在两头比力大。由于两头只要一段,没有像左下角阿谁图一样分的比力密,所以两真个误差比力大。
这是一个权衡题目,激活函数到底哪一部分数据的误差对模子影响比力大?假如中心这部分的误差对全部模子精度比力大,那可以尝试用曲率的方式停止分段;假如两头误差影响比力大,那末你也可以停止均匀分段。
现实上,除了这两种方式还可以肆意分段,按照实在的数据散布尝试用分歧的方式去做分段,可以获得分歧的结果。
别的就是分段的个数,分的越密误差越小,分的越稀疏误差就会越大。
最初再看一下,分完段以后我们应当怎样做。还以左上角这个图为例,将Sigmoid 分红了8个段以后,我们便可以获得每一段的线性拟合函数。可以看到左下角 y0=0.0055x+0.0346,y1、y2等,一向到y7,一共有8个式子。这8个式子还是浮点的,还是需要把它们定点化(整数化)。现实上和前面提到的Requantize那部分逻辑类似,把浮点数提出来转换成整数乘法和移位操纵,便可以把这些计较公式整数化。
整数化以后,我们便可以获得8个公式。这8个公式我们就加载到最左侧这个图的LUT算子里面。作为它的常数,在模子推理的时辰,先把LUT的8个式子都加起来,当稀有据进来的时辰,判定这个数据是落在哪一段,就用哪一段公式去计较,算完以后输出响应的成果。
这类方式加载的常数表远远不需要128KB巨细,而且计较速度比力快,由于对于每一个数据都是一次
终究有人把模子转换与练习后量化摆设批注白了 第108张图片


线性计较。不外,在终极硬件上还是需要去权衡到底分红几多个段,用怎样样的方式来保证硬件价格是最小的,而且精度是有保障的。
我明天的分享到这里就竣事了,感谢大师。


上一篇:恒信东方:未介入“摩尔线程PES-KUAE智算同盟”
下一篇:实在的机械人100ETF(159530)来了,细说机械人产业指数
 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

排行榜
活跃网友
返回顶部快速回复上一主题下一主题返回列表APP下载手机访问
Copyright © 2016-2028 CTLIVES.COM All Rights Reserved.  西兔生活网  小黑屋| GMT+8, 2024-3-1 17:53