全网最全-网络模型低比特量化
CSDN的公式是在是太蛋疼了,如果要看公式的可以上知乎上面看原文
神經(jīng)網(wǎng)絡(luò)低比特量化中訓(xùn)練和推理是如何實(shí)現(xiàn)的? - ZOMI醬的回答- 知乎 https://www.zhihu.com/question/510246227/answer/2300794034
1.1 神經(jīng)網(wǎng)絡(luò)模型量化概述
隨著深度學(xué)習(xí)的發(fā)展,神經(jīng)網(wǎng)絡(luò)被廣泛應(yīng)用于各種領(lǐng)域,模型性能的提高同時(shí)也引入了巨大的參數(shù)量和計(jì)算量。模型量化是一種將浮點(diǎn)計(jì)算轉(zhuǎn)成低比特定點(diǎn)計(jì)算的技術(shù),可以有效的降低模型計(jì)算強(qiáng)度、參數(shù)大小和內(nèi)存消耗,但往往帶來(lái)巨大的精度損失。尤其是在極低比特(<4bit)、二值網(wǎng)絡(luò)(1bit)、甚至將梯度進(jìn)行量化時(shí),帶來(lái)的精度挑戰(zhàn)更大。
這篇文章比較詳細(xì),所以下面這個(gè)圖是這篇文章的一個(gè)整體目錄。當(dāng)然啦,除了非常多的文字,這篇文章塞了59個(gè)公式,涉及到量化在推理和訓(xùn)練的內(nèi)容。雖然可能看得很辛苦,但是也希望可以多多支持ZOMI醬哈。打公式不容易,發(fā)現(xiàn)錯(cuò)誤歡迎評(píng)論留言指正。
與FP32類(lèi)型相比,FP16、INT8、INT4的低精度類(lèi)型所占用空間更小,因此對(duì)應(yīng)的存儲(chǔ)空間和傳輸時(shí)間都可以大幅下降。以手機(jī)為例,為了提供更人性和智能的服務(wù),現(xiàn)在越來(lái)越多的OS和APP集成了深度學(xué)習(xí)的功能,自然需要包含大量的模型及權(quán)重文件。以經(jīng)典的AlexNet為例,原始權(quán)重文件的大小已經(jīng)超過(guò)了200MB,而最近出現(xiàn)的新模型正在往結(jié)構(gòu)更復(fù)雜、參數(shù)更多的方向發(fā)展。顯然,低精度類(lèi)型的空間受益還是很明顯的。低比特的計(jì)算性能也更高,INT8相對(duì)比FP32的加速比可達(dá)到3倍甚至更高,功耗上也對(duì)應(yīng)有所減少。
模型量化即以較低的推理精度損失將連續(xù)取值(或者大量可能的離散取值)的浮點(diǎn)型模型權(quán)重或流經(jīng)模型的張量數(shù)據(jù)定點(diǎn)近似(通常為int8)為有限多個(gè)(或較少的)離散值的過(guò)程,它是以更少位數(shù)的數(shù)據(jù)類(lèi)型用于近似表示32位有限范圍浮點(diǎn)型數(shù)據(jù)的過(guò)程,而模型的輸入輸出依然是浮點(diǎn)型,從而達(dá)到減少模型尺寸大小、減少模型內(nèi)存消耗及加快模型推理速度等目標(biāo)。
首先量化會(huì)損失精度,這相當(dāng)于給網(wǎng)絡(luò)引入了噪聲,但是神經(jīng)網(wǎng)絡(luò)一般對(duì)噪聲是不太敏感的,只要控制好量化的程度,對(duì)高級(jí)任務(wù)精度影響可以做到很小。
其次,傳統(tǒng)的卷積操作都是使用FP32浮點(diǎn),浮點(diǎn)運(yùn)算時(shí)需要很多時(shí)間周期來(lái)完成,但是如果我們將權(quán)重參數(shù)和激活在輸入各個(gè)層之前量化到INT8,位數(shù)少了乘法操作少了,而且此時(shí)做的卷積操作都是整型的乘加運(yùn)算,比浮點(diǎn)快很多,運(yùn)算結(jié)束后再將結(jié)果乘上scale_factor變回FP32,這整個(gè)過(guò)程就比傳統(tǒng)卷積方式快很多。
提前從體系結(jié)構(gòu)的考量角度思考量化帶來(lái)的另一個(gè)好處是節(jié)能和芯片面積,怎么理解呢?每個(gè)數(shù)使用了更少的位數(shù),做運(yùn)算時(shí)需要搬運(yùn)的數(shù)據(jù)量少了,減少了訪(fǎng)存開(kāi)銷(xiāo)(節(jié)能),同時(shí)所需的乘法器數(shù)目也減少(減少芯片面積)。
1.1.1 主要的量化方法
一邊而言,量化方案主要分為兩種:在線(xiàn)量化(On Quantization)和離線(xiàn)量化(Off Quantization),在線(xiàn)量化指的是感知訓(xùn)練量化(Aware Quantization),離線(xiàn)量化指的是訓(xùn)練后量化(Post Quantization)。訓(xùn)練量化根據(jù)名字的意思很好理解,其實(shí)就是在網(wǎng)絡(luò)模型訓(xùn)練階段采用量化方案進(jìn)行量化。訓(xùn)練后量化中的量化方案跟訓(xùn)練并不相關(guān),主要是在模型離線(xiàn)工具(模型轉(zhuǎn)換工具的時(shí)候)采用量化方案進(jìn)行量化。
感知量化訓(xùn)練(Aware Quantization)
實(shí)際上無(wú)論是Tensorflow、MindSpore、Pytroch的量化感知訓(xùn)練是一種偽量化的過(guò)程,它是在可識(shí)別的某些操作內(nèi)嵌入偽量化節(jié)點(diǎn)(fake quantization op),用以統(tǒng)計(jì)訓(xùn)練時(shí)流經(jīng)該節(jié)點(diǎn)數(shù)據(jù)的最大最小值,便于在使用端測(cè)轉(zhuǎn)換工具(推理轉(zhuǎn)換工具)的時(shí)候,轉(zhuǎn)換成端側(cè)需要的格式時(shí)進(jìn)行量化使用。
目的是減少精度損失,其參與模型訓(xùn)練的前向推理過(guò)程令模型獲得量化損失的差值,但梯度更新需要在浮點(diǎn)下進(jìn)行,因而其并不參與反向傳播過(guò)程。
某些操作無(wú)法添加偽量化節(jié)點(diǎn),這時(shí)候就需要人為的去統(tǒng)計(jì)某些操作的最大最小值,但如果統(tǒng)計(jì)不準(zhǔn)那么將會(huì)帶來(lái)較大的精度損失,因而需要較謹(jǐn)慎檢查哪些操作無(wú)法添加偽量化節(jié)點(diǎn)。
值得注意的是,偽量化節(jié)點(diǎn)的意義在于統(tǒng)計(jì)流經(jīng)數(shù)據(jù)的最大最小值,并參與前向傳播,讓損失函數(shù)的值增大,優(yōu)化器感知到這個(gè)損失值得增加,并進(jìn)行持續(xù)性地反向傳播學(xué)習(xí),進(jìn)一步提高因?yàn)閭瘟炕僮鞫鸬木认陆?#xff0c;從而提升精確度。
值得注意的是,訓(xùn)練時(shí)候的原理與在端測(cè)推理的時(shí)候,其工作原理并不一致。
2. 訓(xùn)練后動(dòng)態(tài)量化(Post Dynamic Quantization)
訓(xùn)練后動(dòng)態(tài)量化是針對(duì)已訓(xùn)練好的模型來(lái)說(shuō)的,針對(duì)大部分已訓(xùn)練,未做任何量化處理的模型來(lái)說(shuō)均可用此方法進(jìn)行模型量化。
其工作比較簡(jiǎn)單,在端測(cè)轉(zhuǎn)換工具的時(shí)候,對(duì)網(wǎng)絡(luò)模型的權(quán)重進(jìn)行統(tǒng)計(jì)其每一層卷積的layer或者channel的最大值和最小值,然后通過(guò)量化公式對(duì)數(shù)據(jù)進(jìn)行byte轉(zhuǎn)換。這樣得到的權(quán)重參數(shù)比以前小1/4。推理的時(shí)候,在內(nèi)存初始化的時(shí)候?qū)W(wǎng)絡(luò)模型中的權(quán)重進(jìn)行反量化操作變成float進(jìn)行正常的推理。
3. 訓(xùn)練后校正量化(Post Calibration Quantization)
訓(xùn)練后靜態(tài)量化,同時(shí)也稱(chēng)為校正量化或者數(shù)據(jù)集量化。其原理是對(duì)于Mindspore在端測(cè)低比特推理的時(shí)候(Inference),需要生成一個(gè)校準(zhǔn)表來(lái)量化模型。這個(gè)量化校準(zhǔn)表的生成需要輸入有代表性的數(shù)據(jù)集,對(duì)于分類(lèi)任務(wù)建議輸入五百?gòu)埖揭磺堄写硇缘膱D片,最好每個(gè)類(lèi)都要包括(即數(shù)據(jù)無(wú)偏)。
量化算法介紹
一般而言,無(wú)論per channel還是per layer量化方案,對(duì)于weight權(quán)重的量化使用對(duì)稱(chēng)量化,對(duì)于activate激活的量化使用非對(duì)稱(chēng)量化。
其原因是對(duì)于權(quán)重而言,其數(shù)據(jù)的分布為對(duì)稱(chēng)的如或,因此采用對(duì)稱(chēng)量化可以進(jìn)一步有效降低計(jì)算量,使得數(shù)據(jù)分布更加符合其真實(shí)的分布;activate激活在網(wǎng)絡(luò)中通常使用ReLU和ReLU6等作為網(wǎng)絡(luò)模型的激活函數(shù),其數(shù)據(jù)分布集中在或者,如果采用對(duì)稱(chēng)方案會(huì)加劇數(shù)據(jù)的離散程度,另外一個(gè)原理是會(huì)造成數(shù)據(jù)的浪費(fèi),如[-128,0]之間并不存儲(chǔ)任何數(shù)據(jù),只有[0,127]有數(shù)據(jù)分布。
下面以int8作為量化的標(biāo)準(zhǔn),介紹一下兩種量化算法的主要細(xì)節(jié)。
對(duì)稱(chēng)量化symmetry
對(duì)稱(chēng)的量化算法原始浮點(diǎn)精度數(shù)據(jù)與量化后INT8數(shù)據(jù)的轉(zhuǎn)換如下:
float=scale ×int
其中,scale默認(rèn)是float32浮點(diǎn)數(shù),為了能夠表示正數(shù)和負(fù)數(shù),int采用signed int8的數(shù)值類(lèi)型。通過(guò)將float32原始高精度數(shù)據(jù)轉(zhuǎn)換到signed int8數(shù)據(jù)的操作如下,其中round為取整函數(shù),量化算法需要確定的數(shù)值即為常數(shù)scale:
由于在神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)以層(Layer)來(lái)進(jìn)行劃分的,因此對(duì)權(quán)值和數(shù)據(jù)的量化可以層Layer為單位來(lái)進(jìn)行,對(duì)每層Layer的參數(shù)和數(shù)據(jù)分別進(jìn)行不同scale的量化。
對(duì)權(quán)值和數(shù)據(jù)的量化可以歸結(jié)為尋找scale的過(guò)程,由于int8為有符號(hào)數(shù),要保證正負(fù)數(shù)值表示范圍的對(duì)稱(chēng)性,因此對(duì)所有數(shù)據(jù)首先進(jìn)行取絕對(duì)值的操作,使待量化數(shù)據(jù)的范圍變換為,再來(lái)確定scale,其scale正確的計(jì)算公式為:
另外對(duì)于offset的計(jì)算公式為:
offset=0
確定了scale之后,itn8數(shù)據(jù)對(duì)應(yīng)的表示范圍為 [-128×scale,127×scale] ,量化操作即為對(duì)待量化數(shù)據(jù)以 [-128×scale,127×scale] 進(jìn)行飽和式截?cái)?#xff0c;即超過(guò)范圍的數(shù)據(jù)飽和到邊界值,然后進(jìn)行第一條公式所示量化計(jì)算即可。
2. 非對(duì)稱(chēng)asymmetric
非對(duì)稱(chēng)的量化算法與對(duì)稱(chēng)的量化算法,其主要區(qū)別在于數(shù)據(jù)轉(zhuǎn)換的方式不同,如下,同樣需要確定scale與offset這兩個(gè)常數(shù):
float=scale×(uint+offset)
確定后通過(guò)原始float32高精度數(shù)據(jù)計(jì)算得到uint8數(shù)據(jù)的轉(zhuǎn)換即為如下公式所示:
uint8=round(float/scale)-offset
其中,scale是float32浮點(diǎn)數(shù),uint為unsigned INT8定點(diǎn)數(shù),offset是int32定點(diǎn)數(shù)。其表示的數(shù)據(jù)范圍為[ scale×offset,scale×(255+offset) ]。若待量化數(shù)據(jù)的取值范圍為 [x_{min}, x_{max}] ,則scale的計(jì)算公式如下:
offset的計(jì)算方式如下:
對(duì)于權(quán)值和數(shù)據(jù)的量化,都采用上述公式的方案進(jìn)行量化, x_{min} 和 x_{max} 為待量化參數(shù)的最小值和最大值, Q_{max} 和 Q_{min} 為:
3. 量化初始化
在一般的端測(cè)推理的時(shí)候,由于網(wǎng)絡(luò)模型的輸入并沒(méi)有偽量化節(jié)點(diǎn)記錄輸入tensor的最大值和最小值,因?yàn)闊o(wú)法求得量化參數(shù)scale和offset,這個(gè)時(shí)候推理框架許可要根據(jù)輸入數(shù)據(jù)的標(biāo)準(zhǔn)差deviation和均值mean進(jìn)行計(jì)算,得到對(duì)應(yīng)的量化參數(shù)。
其中標(biāo)準(zhǔn)差Standard Deviation的計(jì)算公式為下:
其對(duì)應(yīng)的scale為:
Offset的計(jì)算為:
值得注意的是,由于在其他端測(cè)推理框架(如tflite)需要手工輸入標(biāo)準(zhǔn)差deviation和均值mean,容易導(dǎo)致對(duì)數(shù)據(jù)分析、數(shù)據(jù)輸入的錯(cuò)誤和框架的割裂,因此感知量化訓(xùn)練的時(shí)候會(huì)對(duì)模型的輸入和輸出加上fakeQuant偽量化節(jié)點(diǎn),記錄數(shù)據(jù)min和max,從而求得Mindspore端測(cè)用到input tensor的scale和offset。
1.1.2 感知量化訓(xùn)練
上面講解了基本的量化公式和量化的方法,下面來(lái)詳細(xì)展開(kāi)感知量化訓(xùn)練(Aware Quantization)模型中插入偽量化節(jié)點(diǎn)fake quant來(lái)模擬量化引入的誤差。端測(cè)推理的時(shí)候折疊fake quant節(jié)點(diǎn)中的屬性到tensor中,在端測(cè)推理的過(guò)程中直接使用tensor中帶有的量化屬性參數(shù)。
偽量化節(jié)點(diǎn)
為量化節(jié)點(diǎn)(Fake Quant)的意義在于:
1)找到輸入數(shù)據(jù)的分布,即找到min和max值;
2)模擬量化到低比特操作的時(shí)候的精度損失,把該損失作用到網(wǎng)絡(luò)模型中,傳遞給損失函數(shù),讓優(yōu)化器去在訓(xùn)練過(guò)程中對(duì)該損失值進(jìn)行優(yōu)化。
a. 基本原理
低比特量化模型運(yùn)行時(shí),需要確定scale與offset兩個(gè)量化參數(shù):
其中,是float32浮點(diǎn)數(shù),uint8為unsigned int定點(diǎn)數(shù),offset是int32定點(diǎn)數(shù)。其表示的數(shù)據(jù)范圍為:
[scale×offset,scale×(2^n+offset)]
若待量化數(shù)據(jù)的取值范圍為[a,b],則scale和offset的計(jì)算方式如下:
對(duì)于權(quán)值和數(shù)據(jù)的量化,都采用上述公式的方案進(jìn)行量化,min和max為待量化參數(shù)的最小值和最大值。
前面呢,曾經(jīng)提到一般而言,權(quán)重?cái)?shù)據(jù)是對(duì)稱(chēng),為了可以進(jìn)一步減少數(shù)據(jù)的計(jì)算,較少額外的存儲(chǔ)數(shù)據(jù),因此推薦使用對(duì)稱(chēng)的量化算法。但是在對(duì)mobieNetV2,mobileNetV3的實(shí)際測(cè)試開(kāi)發(fā)的過(guò)程中,發(fā)現(xiàn)數(shù)據(jù)大部分是有偏的,例如mobileNetV2中:
此時(shí)權(quán)重對(duì)應(yīng)的數(shù)據(jù)并不是以0為中心點(diǎn)對(duì)稱(chēng),featture.child8.conv.child3.weight的權(quán)重?cái)?shù)據(jù)分布范圍是,為了更好地?cái)M合更多的數(shù)據(jù),對(duì)更多的數(shù)據(jù)具有更好的泛化性,因此統(tǒng)一使用了非對(duì)稱(chēng)的量化算法。
b. 正向傳播
為了求得網(wǎng)絡(luò)模型tensor數(shù)據(jù)精確的Min和Max值,因此在模型訓(xùn)練的時(shí)候插入偽量化節(jié)點(diǎn)來(lái)模擬引入的誤差,得到數(shù)據(jù)的分布。
為了更好地表示上面公式的作用,正向傳播的時(shí)候fake quant節(jié)點(diǎn)對(duì)數(shù)據(jù)進(jìn)行了模擬量化規(guī)約的過(guò)程,如下圖所示:
首先對(duì)數(shù)據(jù)根據(jù)min和max值進(jìn)行截?cái)?#xff0c;然后把float數(shù)據(jù)轉(zhuǎn)換成為int數(shù)據(jù),之后再把int數(shù)據(jù)重新轉(zhuǎn)換成為float數(shù)據(jù),該操作會(huì)丟失掉float1與float2轉(zhuǎn)換之間的精度差。對(duì)于量化感知訓(xùn)練,通過(guò)模擬量化操作時(shí)候?qū)?shù)據(jù)進(jìn)行規(guī)約操作,所以網(wǎng)絡(luò)模型中每一個(gè)tensor數(shù)據(jù)可以根據(jù)下面公式進(jìn)行封裝成為op,得到:
x_{out}=SimQuant(x)
c. 反向傳播
按照正向傳播的公式,如果方向傳播的時(shí)候?qū)ζ淝髮?dǎo)數(shù)會(huì)導(dǎo)致權(quán)重為0,因此反向傳播的時(shí)候相當(dāng)于一個(gè)直接估算器:
δ_{out}=δ_{in},I_{(x∈S)}∈S:x:x_{min}≤x≤x_{max}
最終反向傳播的時(shí)候fake quant節(jié)點(diǎn)對(duì)數(shù)據(jù)進(jìn)行了截?cái)嗍教幚?#xff0c;如下圖所示:
d. 更新Min和Max
FakeQuant偽量化節(jié)點(diǎn)主要是根據(jù)找到的min和max值進(jìn)行偽量化操作,更新min和max分別為running和moving,跟batch normal算子一樣,這里不進(jìn)行過(guò)多的講述,具體在Mindspore框架中會(huì)自動(dòng)根據(jù)網(wǎng)絡(luò)模型的結(jié)構(gòu)進(jìn)行自動(dòng)插入不同的形式,具體用戶(hù)不感知。
2. BN折疊
初步實(shí)施方案中構(gòu)圖比較復(fù)雜的主要集中在如何拆分BN層,本節(jié)將會(huì)對(duì)拆分的原理進(jìn)行細(xì)化,落實(shí)確定到每一個(gè)算子上面,包括每個(gè)算子的具體計(jì)算公式,控制原理。
a. BN Fold原理
網(wǎng)絡(luò)模型中經(jīng)常使用BN層對(duì)數(shù)據(jù)進(jìn)行規(guī)約,有效降低上下層之間的數(shù)據(jù)依賴(lài)性。然而大部分在推理框架當(dāng)中都會(huì)對(duì)BN層和卷積操作進(jìn)行融合,為了更好地模擬在推理的時(shí)候的算子融合操作,這里對(duì)BN層進(jìn)行folding處理。下面左邊圖是(a)普通訓(xùn)練時(shí)模型,右邊圖是(b) 融合后推理時(shí)模型。
下面圖中左邊是BN折疊的BN folding訓(xùn)練模型,右邊是BN folding感知量化訓(xùn)練模型。
b. Correction數(shù)據(jù)矯正
-
貝塞爾矯正(Bessel Correction)
在計(jì)算方差的時(shí)候,論文并沒(méi)有提及貝塞爾校正,因?yàn)樨惾麪栃U峭ㄓ玫慕y(tǒng)計(jì)學(xué)方法,用于校正方差。
-
Batch Normal矯正
由于每次更新batch參數(shù)的delta的時(shí)候,都是使用當(dāng)前batch的統(tǒng)計(jì)數(shù)據(jù),這會(huì)使得權(quán)重參數(shù)連帶著一起被當(dāng)前的batch影響,為了避免當(dāng)前權(quán)重?cái)?shù)據(jù)w的抖動(dòng),加入correction的校正因子將權(quán)重縮放到長(zhǎng)期batch統(tǒng)計(jì)數(shù)據(jù)中。
模型開(kāi)始訓(xùn)練的時(shí)候會(huì)在fold conv卷積的輸出除以correction因子,這樣的操作是為了讓模型直接去學(xué)習(xí)正常的BN操作(根據(jù)當(dāng)前的batch進(jìn)行學(xué)習(xí)),在學(xué)習(xí)到一定程度之后,凍結(jié)當(dāng)前的BN不再更新全局delta,然后fold conv卷積的操作中直接作用,并同時(shí)修改bias,作為correction_2更新到ADD算子中。
c. BN FOLD訓(xùn)練圖
-
算子
組合模式ConvD+BN+ReLU拆分子圖并加入FakeQuant算子,一共拆分為為以下幾個(gè)算子:Conv2D、BatchNormFold、CorrectionMul、MulFold、FakeQuantWithMinMaxPreChannel、ConvMul、CorrectionAdd、AddFold、ReLU、FakeQuantWithMinMax。
-
正向圖
下面左邊為原始設(shè)計(jì)bn折疊訓(xùn)練圖,右邊是實(shí)際Mindspore執(zhí)行經(jīng)過(guò)優(yōu)化融合的訓(xùn)練圖。
圖中主要注意的點(diǎn)為BN_Fold_1和BN_Fold_2,其中BN_Fold_1的作用有兩個(gè):拆分融合的BN層對(duì)weight的影響,和對(duì)權(quán)重?cái)?shù)據(jù)進(jìn)行校正;BN_Fold_2的作用有兩個(gè):拆分融合的BN層對(duì)bias的作用影響,和對(duì)bias數(shù)據(jù)進(jìn)行校正。
d. BN FOLD推理圖
-
算子
組合模式ConvD+BN+ReLU拆分子圖并加入FakeQuant算子,一共拆分為以下個(gè)算子:Conv2D、BatchNormFold、MulFold、FakeQuantWithMinMaxPreChannel、AddFold。
-
驗(yàn)證圖示例
正向推理驗(yàn)證圖,上面的所有公式都會(huì)化為這個(gè)圖的實(shí)際計(jì)算方式。
1.1.3 訓(xùn)練后量化
訓(xùn)練后靜態(tài)量化(Post Calibration Quantization),同時(shí)也稱(chēng)為校正量化或者數(shù)據(jù)集量化。其原理是對(duì)于Mindspore在端測(cè)低比特推理的時(shí)候(Inference),需要生成一個(gè)校準(zhǔn)表來(lái)量化模型。其核心是取得數(shù)據(jù)值的量化參數(shù)表。
1. 權(quán)值量化
權(quán)值在進(jìn)行推理加速時(shí)均已確定,因此不需要對(duì)權(quán)值進(jìn)行校準(zhǔn)。如果使用對(duì)稱(chēng)量化方案,max使用權(quán)值的絕對(duì)值的最大值,對(duì)于非對(duì)稱(chēng)量化算法,max和min使用權(quán)值的最大值和最小值。
根據(jù)算法驗(yàn)證結(jié)果,對(duì)于Convolution,每個(gè)卷積核按照per channel的方式采用一組獨(dú)立的量化系數(shù)(scale和offset),量化后推理精度較高。因此,Convolution權(quán)值的量化根據(jù)卷積核數(shù)量分組進(jìn)行,計(jì)算得到的scale和offset的數(shù)量與卷積核數(shù)量相同。Dense的權(quán)值使用一組scale和offset。
2. 數(shù)據(jù)量化
數(shù)據(jù)量化是對(duì)每個(gè)要量化的Operation的輸入數(shù)據(jù)進(jìn)行統(tǒng)計(jì),每個(gè)Operation計(jì)算出最優(yōu)的一組scale和offset。
數(shù)據(jù)是推理計(jì)算的中間結(jié)果,其數(shù)據(jù)的范圍與輸入高度相關(guān),需要使用一組參考輸入作為激勵(lì),得到每個(gè)Operation的輸入數(shù)據(jù)用于確定量化max和min。數(shù)據(jù)的范圍與輸入相關(guān),為了使確定的min和max在網(wǎng)絡(luò)接收不同輸入時(shí)有更好的魯棒性,因此提出基于統(tǒng)計(jì)分布確定min和max的方案。
該方案的思路為最小化量化后數(shù)據(jù)的統(tǒng)計(jì)分布與原始高精度數(shù)據(jù)的統(tǒng)計(jì)分布差異性,操作流程如下:
使用直方圖統(tǒng)計(jì)的方式得到原始float32數(shù)據(jù)的直方圖統(tǒng)計(jì)分布;
在給定的min和max搜索空間中選取若干個(gè)和分別對(duì)待量化數(shù)據(jù)進(jìn)行量化,分別得到量化后的數(shù)據(jù);
使用同樣的直方圖統(tǒng)計(jì)的方式得到n個(gè)的直方圖統(tǒng)計(jì)分布;
分別計(jì)算中每個(gè)與的統(tǒng)計(jì)分布差異性,找到差異性最低的一個(gè)對(duì)應(yīng)的min和max作為確定的量化數(shù)值。
在上述操作中,涉及的超參數(shù)包括進(jìn)行直方圖統(tǒng)計(jì)時(shí)選取的直方圖bin個(gè)數(shù)、min和max的搜索空間、統(tǒng)計(jì)分布差異性的指標(biāo)。
對(duì)于直方圖bin個(gè)數(shù),該參數(shù)直接反應(yīng)了直方圖統(tǒng)計(jì)特征的分布數(shù)個(gè)數(shù),由于數(shù)據(jù)經(jīng)過(guò)量化后會(huì)集中到256個(gè)離散的點(diǎn)上,因此bin的個(gè)數(shù)不宜過(guò)大,否則絕大多數(shù)的bin都沒(méi)有數(shù)值。
max的搜索空間可以通過(guò)search_start_scale,search_end_scale與search_step來(lái)確定。
-
search_start_scale為搜索空間起始點(diǎn)與search_value的比值。
-
search_end_scale為搜索空間結(jié)束點(diǎn)與search_value的比值。
search_step為搜索空間中每次搜索的值與seach_value的比值步進(jìn)值。以max_candidate=100,search_start_scale=0.8,search_end_scale=1.2,search_step=0.01為例,對(duì)稱(chēng)量化算法下,其定義的max搜索空間為從100*0.8=80到100*1.2=120的范圍,每次步進(jìn)100*0.01=1,一共41個(gè)d_max搜索值;非對(duì)稱(chēng)量化算法下,搜索0.8*(max–min) ~ 1.2*(max–min),確定最好的一個(gè)系數(shù)。
繼續(xù)舉多一個(gè)例子, search_start_scale =0.3,search_step=0.01,search_end_scale==1.7,bin=150。需要在0.3*max~1.7*max這個(gè)范圍中找一個(gè)最好的max,搜索步長(zhǎng)是0.01max,因此需要搜索(1.7-0.3)/0.01 + 1 = 141個(gè)max數(shù)值。直方統(tǒng)計(jì)的bin個(gè)數(shù)也可以設(shè)置,假設(shè)當(dāng)前是150。對(duì)于算法方案一,將0-2*max的數(shù)據(jù)分為150段,統(tǒng)計(jì)數(shù)據(jù)落在每段中的頻率,使用數(shù)據(jù)的絕對(duì)值統(tǒng)計(jì),對(duì)于算法方案二,在0.3*(max – min)~1.7*(max - min)這個(gè)范圍中找一個(gè)最好的ratio,將0-2*(max - min)的數(shù)據(jù)分為150段,統(tǒng)計(jì)數(shù)據(jù)落在每段中的頻率,使用data – min的值來(lái)統(tǒng)計(jì)頻率。141個(gè)數(shù)值都要統(tǒng)計(jì),因此一個(gè)量化算子需要存儲(chǔ)141*150個(gè)數(shù)值。多個(gè)batch情況下對(duì)frequancy進(jìn)行累加。
統(tǒng)計(jì)分布差異性的指標(biāo)為計(jì)算兩個(gè)長(zhǎng)度為n直方圖、分布之間的信息差異度,選取的指標(biāo)包括如下三種:
1) Kullback-Leibler Divergence(KL散度)
2) Symmetric Kullback-Leibler Divergence(對(duì)稱(chēng)KL散度)
3) Jensen-Shannon Divergence(JS散度):首先生成一個(gè)新的分布M,為與的均值,JS Divergence為相對(duì)M的KL Divergence與相對(duì)M的KL Divergence的均值
3. Calibration流程
a. Calibration功能
離線(xiàn)Calibration需要完成以下功能:
對(duì)算子的輸入數(shù)據(jù)量化校準(zhǔn),計(jì)算出數(shù)據(jù)的最優(yōu)scale和offset;
將算子的權(quán)值量化為INT8,計(jì)算出權(quán)值的scale和offset。
將算子的bias量化為INT32。
由于算子輸入數(shù)據(jù)在推理過(guò)程中才能產(chǎn)生,因此離線(xiàn)Calibration還要實(shí)現(xiàn)inference功能。與普通inference過(guò)程的不同之處在于對(duì)每個(gè)需要量化的op的輸入數(shù)據(jù)和權(quán)值數(shù)據(jù)進(jìn)行了量化和反量化過(guò)程。
b. Calibration過(guò)程
Calibration過(guò)程可以分為4步:
遍歷graph中的node,對(duì)需要量化的算子的權(quán)重進(jìn)行量化。
第一次inference,搜索需要量化的算子的輸入數(shù)據(jù)的max和min。
第二次inference,進(jìn)行數(shù)據(jù)的直方統(tǒng)計(jì)。
計(jì)算分布差異性能指標(biāo)(見(jiàn)4.2),根據(jù)指標(biāo)選擇最好的min和max,然后計(jì)算出數(shù)據(jù)的scale和offset,根據(jù)數(shù)據(jù)和權(quán)值的scale,進(jìn)行bias量化。
值得注意的是,min不一定是所有數(shù)據(jù)batch中的最小值,max也不一定是所有batch中的最大值,與min_percentile和max percentile的值相關(guān)。
假設(shè)每個(gè)batch處理10張圖片,共100個(gè)batch,某個(gè)op的1張圖片輸入數(shù)據(jù)是1000個(gè)數(shù),max_percentile = 0.99999,數(shù)據(jù)總量是10*100*1000 = 1000000個(gè)數(shù)。1000000*0.99999 = 999990。把所有輸入數(shù)據(jù)從大到小排序,max取第10個(gè)數(shù)。因此需要緩存10個(gè)數(shù),對(duì)第一個(gè)batch的輸入1000個(gè)數(shù)進(jìn)行從大到小排序,取前10大的數(shù)進(jìn)行緩存,第二個(gè)batch的輸入1000個(gè)數(shù)進(jìn)行從大到小排序,取前10個(gè)數(shù),與緩存的10個(gè)數(shù)共20個(gè)數(shù)進(jìn)行排序,取前10大的數(shù),以此類(lèi)推,最終獲得所有batch數(shù)據(jù)中前10大的數(shù)。
Inference有兩種方式,第一種是數(shù)據(jù)不做量化進(jìn)行推理,第二種是數(shù)據(jù)量化后進(jìn)行推理。數(shù)據(jù)量化是指算子的當(dāng)前batch輸入數(shù)據(jù)使用當(dāng)前batch的max和min進(jìn)行量化,將數(shù)據(jù)量化為INT8,再由INT8轉(zhuǎn)回FP32進(jìn)行inference計(jì)算。
第二次inference,進(jìn)行數(shù)據(jù)的直方統(tǒng)計(jì)。根據(jù)第2步已經(jīng)根據(jù)max_percentile找到需要的max的值。
最后,計(jì)算分布差異指標(biāo),根據(jù)指標(biāo)選擇最好的min和max,然后計(jì)算出數(shù)據(jù)的scale和offset,根據(jù)數(shù)據(jù)和權(quán)值的scale,進(jìn)行bias量化。
c. 搜索空間
影響搜索空間的參數(shù)可以分為兩類(lèi):一類(lèi)是增加搜索組合的數(shù)量的可以稱(chēng)之為配置參數(shù),一類(lèi)是影響單個(gè)模型結(jié)果的稱(chēng)之為超參數(shù)(不增加結(jié)果數(shù)量)。
1.1.4 端測(cè)量化推理
端側(cè)量化推理的結(jié)構(gòu)方式主要由3種,分別是下圖的(a) Fp32輸入Fp32輸出、(b) Fp32輸入int8輸出、(c) int8輸入int32輸出。
INT8卷積示意圖,里面混合里三種不同的模式,因?yàn)椴煌木矸e通過(guò)不同的方式進(jìn)行拼接。
使用INT8進(jìn)行inference時(shí),由于數(shù)據(jù)是實(shí)時(shí)的,因此數(shù)據(jù)需要在線(xiàn)量化,量化的流程如圖所示。數(shù)據(jù)量化涉及Quantize,Dequantize和Requantize等3種操作。
1. Quantize量化
將float32數(shù)據(jù)量化為int8。離線(xiàn)轉(zhuǎn)換工具轉(zhuǎn)換的過(guò)程之前,計(jì)算出數(shù)據(jù)量化需要的scale和offset,如果采用對(duì)稱(chēng)量化算法,則根據(jù)公式4進(jìn)行數(shù)據(jù)量化,如果采用非對(duì)稱(chēng)量化算法,則根據(jù)本文公式6進(jìn)行數(shù)據(jù)量化。
2. Dequantize反量化
INT8相乘、加之后的結(jié)果用INT32格式存儲(chǔ),如果下一Operation需要float32格式數(shù)據(jù)作為輸入,則通過(guò)Dequantize反量化操作將INT32數(shù)據(jù)反量化為float32。
3. Requantize重量化
INT8乘加之后的結(jié)果用INT32格式存儲(chǔ),如果下一層需要INT8格式數(shù)據(jù)作為輸入,則通過(guò)Requantize重量化操作將INT32數(shù)據(jù)重量化為INT8。
總結(jié)
以上是生活随笔為你收集整理的全网最全-网络模型低比特量化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: appcan使用心得体会
- 下一篇: 【COCOS2DX-游戏开发之二四】 q