<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          深入了解NNIE量化技術(shù)

          共 5072字,需瀏覽 11分鐘

           ·

          2020-09-24 00:58


          【GiantPandaCV導(dǎo)語】這篇文章對量化技術(shù)做了概要的介紹,由原理推導(dǎo),驗證實現(xiàn)了海思NNIE的量化算法。最后,作者還嘗試了使用Pytorch對訓(xùn)練感知量化算法的進(jìn)行復(fù)現(xiàn),使其不依賴固定Cuda版本,并且可以使用多卡進(jìn)行訓(xùn)練,內(nèi)容非常硬核,具體請看文章。本文同步發(fā)表于知乎,地址為:https://zhuanlan.zhihu.com/p/223018242 。文末送出4本《機(jī)器學(xué)習(xí)與深度學(xué)習(xí)算法基礎(chǔ)》書籍,歡迎評論區(qū)留言抽獎。

          神經(jīng)網(wǎng)絡(luò)的端側(cè)部署與量化技術(shù)

          神經(jīng)網(wǎng)絡(luò)在端側(cè)的部署由于內(nèi)存、帶寬、計算能力的限制,相比服務(wù)器的模型,所占的空間和計算資源小,通常使用模型量化技術(shù)來優(yōu)化。模型量化將模型的參數(shù)離散化,原本32bit的浮點數(shù)被映射到8bit的整數(shù)上,模型的大小壓縮4倍左右;將計算層的輸入進(jìn)行離散化,原本32bit浮點數(shù)的乘加操作變?yōu)?bit的整數(shù)乘加操作,減少了模型推理的計算量,在cpu上能夠有2到3倍的速度提升,在DSP上能夠有10倍左右的速度提升。

          FP32浮點數(shù)能夠表示的數(shù)值范圍為 ?,INT8能表示的數(shù)值范圍是 ,量化技術(shù)將一定范圍的FP32數(shù)據(jù)映射到INT8數(shù)值上。以均勻量化為例,量化過程要確認(rèn)兩個參數(shù):縮放系數(shù) 和零點 ,通過這兩個參數(shù)將浮點數(shù)轉(zhuǎn)換為整數(shù):

          最后將超過INT8表示范圍的值進(jìn)行截斷:

          反量化的操作如下:

          原始數(shù)值在量化和反量化的過程中有一定的數(shù)值偏差,帶來的好處是中間形態(tài)用INT8類型表示,原本32位浮點數(shù)的乘加操作可以轉(zhuǎn)換為8位定點數(shù)的計算,減少計算量,加快了計算速度。

          FP32、INT8之間映射參數(shù)的確定,根據(jù)縮放系數(shù) 能否覆蓋網(wǎng)絡(luò)數(shù)據(jù)和參數(shù)的范圍,可以將量化分類為飽和量化(需要截斷)和非飽和量化(不需要截斷);根據(jù)零點 是否為零,可以分為對稱量化和非對稱量化。給定一個網(wǎng)絡(luò),網(wǎng)絡(luò)參數(shù)范圍已確定,能夠采用指定的量化算法對網(wǎng)絡(luò)參數(shù)進(jìn)行量化;而網(wǎng)絡(luò)層的輸出激活數(shù)值分布與網(wǎng)絡(luò)的輸入有關(guān),需要通過跑量化校準(zhǔn)集來進(jìn)行統(tǒng)計和計算。

          訓(xùn)練感知量化根據(jù)是否有樣本數(shù)據(jù)和是否進(jìn)行重新訓(xùn)練可分為動態(tài)離線量化、靜態(tài)離線量化和量化感知訓(xùn)練。

          動態(tài)離線訓(xùn)練無樣本數(shù)據(jù),對模型的參數(shù)在推理前預(yù)先進(jìn)行量化,而模型層的激活值在預(yù)測的時候再決定量化。相比其它兩個量化方法,動態(tài)離線量化的依賴最少,量化的效果一般,量化的加速效果弱些。

          靜態(tài)離線訓(xùn)練在預(yù)測前使用量化校準(zhǔn)集進(jìn)行模型激活值分布的統(tǒng)計,確定激活層的量化參數(shù)、能夠較方便地進(jìn)行操作,量化的效果較好,加速效果能夠得到保證。

          量化感知訓(xùn)練在訓(xùn)練的過程中網(wǎng)絡(luò)模擬量化的效果進(jìn)行參數(shù)更新和優(yōu)化,量化的效果最好,部署預(yù)測無速度損失,訓(xùn)練過程需要進(jìn)行改變。常見的深度學(xué)習(xí)訓(xùn)練框架(tensorflow和pytorch) 有量化感知訓(xùn)練模塊,但需要與自家的模型推斷框架(tensorflow lite、caffe2)進(jìn)行配合使用,與海思nnie的量化算法和部署框架不一致,無法進(jìn)行使用保證量化效果?;诖耍P者寫了基于pytorch框架進(jìn)行量化感知訓(xùn)練的擴(kuò)展包nnieqat。擴(kuò)展包剛開始直接調(diào)用調(diào)用海思量化庫,后來復(fù)現(xiàn)了量化算法,最終提升了海思nnie上模型部署的效果。

          訓(xùn)練感知量化的流程

          量化感知訓(xùn)練在訓(xùn)練過程中對網(wǎng)絡(luò)進(jìn)行量化,forward()和backward()使用的是量化過后的weights和activation,訓(xùn)練的loss能夠反應(yīng)部署的效果。需要注意的是,update()使用的是未量化的weights。若直接用量化值替代初始值,可能會出現(xiàn)更新的幅度小于量化的幅度,網(wǎng)絡(luò)“原地踏步”的情況。

          量化感知訓(xùn)練由于數(shù)據(jù)的量化,與正常的訓(xùn)練過程在層的使用和訓(xùn)練的策略上有些不同:

          • 由于網(wǎng)絡(luò)參數(shù)的量化,bn層統(tǒng)計的均值和方差會有抖動,造成訓(xùn)練的不穩(wěn)定。最好先正常進(jìn)行訓(xùn)練,得到模型后凍結(jié)bn進(jìn)行finetune;或者在一定的epoch后凍結(jié)bn進(jìn)行訓(xùn)練。
          • 移動端網(wǎng)絡(luò)使用RELU6代替RELU限制激活值能提升模型的準(zhǔn)確率,這在量化感知訓(xùn)練中行不通。量化感知訓(xùn)練過程中讓網(wǎng)絡(luò)自行確定激活值的范圍能得到更好的結(jié)果。
          • 在量化感知訓(xùn)練中要小心使用指數(shù)滑動平均(EMA)的參數(shù)更新策略。反向傳播使用的是量化后的權(quán)重,量化使得權(quán)重的震蕩變大,使用EMA會導(dǎo)致訓(xùn)練的不穩(wěn)定。

          NNIE量化包的實現(xiàn)和使用

          對于量化效果的提升,華為海思部門給出了更改caffe框架、使用量化庫進(jìn)行網(wǎng)絡(luò)finetune的方法。鑒于caffe訓(xùn)練框架更新維護(hù)不夠,pytorch框架使用較多的情況,筆者寫了基于pytorch的NNIE量化感知訓(xùn)練包nnieqat,方便進(jìn)行量化感知訓(xùn)練和部署。

          nnieqat 安裝方便,直接 pip install 后加載模塊進(jìn)行使用, 訓(xùn)練過程中使用四個函數(shù) register_quantization_hook 、merge_freeze_bn、 quant_dequant_weight、 unquant_weight ,增加不到10行代碼就可以方便的進(jìn)行nnie量化感知訓(xùn)練。

          四個函數(shù)分別對應(yīng)的功能如下:

          • register_quantization_hook: 為需要量化的層添加了register_forward_pre_hook, register_forward_hook,進(jìn)行權(quán)重量化和激活量化。
          • merge_freeze_bn:合并convolution層和batchnorm層,并固定batchnorm參數(shù)防止出現(xiàn)訓(xùn)練不穩(wěn)定現(xiàn)象。
          • quant_dequant_weight:使用量化反量化后的權(quán)重。
          • unquant_weight:使用原始的權(quán)重。

          NNIE量化算法與實現(xiàn)

          前幾節(jié)對神經(jīng)網(wǎng)絡(luò)的端側(cè)部署需求和量化技術(shù)作了介紹,給出了基于海思量化庫,在pytorch訓(xùn)練框架下使用的量化感知訓(xùn)練包nnieqat,方便進(jìn)行量化感知訓(xùn)練和部署。文章下半部分將對NNIE量化算法細(xì)節(jié)進(jìn)行說明。

          海思量化庫在使用者角度看是一個算法黑盒:輸入數(shù)據(jù),得到量化反量化后的結(jié)果,沒有相關(guān)量化方法的說明。量化庫有一定的不足之處:

          • 量化庫非線程安全,無法多GPU運行;
          • 需要先加載量化庫,再導(dǎo)入torch模塊(全局變量污染?);
          • CUDA版本需要適配給定的量化庫。

          這些問題限制了量化庫的使用和效率。為了解決這些問題,筆者猜想、驗證、實現(xiàn)了NNIE的量化算法,成功避開海思量化庫依賴,優(yōu)化了模型finetune的效率問題。

          下邊將從海思的量化方案流程、量化方法的猜想和驗證、量化方法評價與量化實驗總結(jié)三個方面對NNIE的量化算法作介紹和評價。

          NNIE量化方案流程

          對于量化后模型效果不好的問題,海思給出更改caffe訓(xùn)練框架加載“黑盒子”GFPQ量化庫進(jìn)行finetune的方案。從量化的數(shù)據(jù)來看,可以劃分為權(quán)重量化和激活量化。對于激活量化,海思在caffe中添加激活量化層,用戶可下載參考包,重新編譯caffe來添加使用量化層。修改后的網(wǎng)絡(luò)結(jié)構(gòu)示意圖如下:

          示意圖

          對于權(quán)重量化,用戶需要根據(jù)具體的訓(xùn)練環(huán)境在訓(xùn)練腳本里手動進(jìn)行相應(yīng)的修改(沒有參考樣例)。權(quán)重量化過程網(wǎng)絡(luò)有一份原始的浮點權(quán)重,和一份量化后的定點權(quán)重。訓(xùn)練過程網(wǎng)絡(luò)forward() 、backward()在定點權(quán)重上進(jìn)行;update()在浮點權(quán)重上進(jìn)行。如果網(wǎng)絡(luò)卷積層和batchnorm()層在部署時進(jìn)行合并加速,在量化感知訓(xùn)練保存模型時要先合并生成對應(yīng)的量化參數(shù)。

          量化方法猜想與驗證

          為了解決量化庫不友好、finetune 沒效率的問題,筆者通過給“黑盒子”喂數(shù)據(jù)、吐數(shù)據(jù),接著擬合數(shù)據(jù),猜想并驗證確認(rèn)了海思的量化方法。

          海思“黑盒子”GFPQ量化庫接受fp32數(shù)據(jù),量化反量化后輸出的數(shù)值也是fp32,但數(shù)值的個數(shù)會被壓縮到最多256個( )。筆者對[0,256]均勻采樣n個數(shù)送入“黑盒子”,當(dāng)n>=5000時,輸出的量化反量化后的數(shù)值個數(shù)為129個且不在增加,得到的結(jié)果如下:

          對[-256, 0] 均勻采樣n個數(shù)送入“黑盒子”,當(dāng)n>=5000時,輸出的量化反量化后的數(shù)值個數(shù)為128個且不在增加,得到的結(jié)果如下:

          正負(fù)兩邊的得到的數(shù)值有一個相同的數(shù)值0,合起來正好是256個。從量化數(shù)值分布我們可以大概猜想GFPQ采用指數(shù)函數(shù)量化、近似對稱量化的方法。把 非零的128個元素與x=[1,128]建立映射,能夠擬合得到曲線:

          的非零元素數(shù)值與 的數(shù)值一致,差個符號,易得曲線為:

          變化輸入數(shù)據(jù)的范圍時,指數(shù)e冪部分的常數(shù)因子不變,筆者把變量和常數(shù)因子與256聯(lián)系起來,得到反量化過程 的函數(shù):

          化簡得:

          對于公式中的 ,先確認(rèn)量化方法。在采樣空間 進(jìn)行均勻采樣5000次,當(dāng) 等于256時, ,將i=127 代入得到 ? 。海思給出了量化表,即 ?在離散空間的一些取值。其中245.14、256、267.33三個數(shù)緊鄰。變化z 在(245.15, 256)范圍取值,輸出的 均為245.14,計算得到 。判斷是進(jìn)行了非飽和量化, ?是離散取值空間大于z的最小上界。接著,確定 的分布函數(shù)。在量化表中筆者發(fā)現(xiàn) 1,2,4,8,16 這些2的n次方形式的數(shù)都存在,間隔16個出現(xiàn)。猜想是在2的指數(shù)冪空間進(jìn)行采樣,驗證確認(rèn)了 ?數(shù)值服從的離散分布為:

          至此,我們從輸入數(shù)據(jù)得到 ?,確認(rèn)了 ?的映射。下一步需要建立 x 與 i的映射 ,從而得到 x與 y的映射關(guān)系 。

          首先,對于y=0的特殊情況,筆者通過小范圍密集均勻采樣實驗確認(rèn)x的取值范圍為 ,直接將該范圍內(nèi)的x映射到0:

          接著,梳理下x, i, y的三者的關(guān)系:x經(jīng)過量化后得到 i,i反量化后得到 y,y是 x在量化反量化后稀疏空間的近似。因此用 x替代 y,根據(jù)正負(fù)代入上文 y與 i的分段函數(shù),求得 i并取整,得到量化過程 ? 的函數(shù):

          將上述的量化函數(shù)和反量化函數(shù)進(jìn)行合并,再加上y=0情況的特判,便是海思黑盒子的量化方法。
          得到量化方法后,筆者在nnieqat量化訓(xùn)練庫中對上述方法進(jìn)行了CUDA實現(xiàn),然后隨機(jī)生成數(shù)據(jù)作為輸入,比對nnieqat量化庫的輸出與海思GFPQ的輸出,確認(rèn)量化方法猜想和算法實現(xiàn)正確性,最后在實際應(yīng)用中也能達(dá)到基本一致的訓(xùn)練效果。

          量化方法評價與量化實驗總結(jié)

          海思的量化算法采用指數(shù)分布量化,量化反量化過程中需要進(jìn)行exp()與log()計算,相比均勻量化的移位計算復(fù)雜度高,代價大。

          筆者采用了自實現(xiàn)的量化庫,在imagenet公開數(shù)據(jù)集上以及在實際應(yīng)用的場景中,能復(fù)現(xiàn)了海思量化庫finetune的優(yōu)化效果,量化后精度與fp32基本一致。目前在進(jìn)行檢測模型yolov5在公開數(shù)據(jù)集coco上的量化訓(xùn)練實驗,具體代碼和實驗結(jié)果見 aovoc/nnieqat-pytorch,后續(xù)更新見 神經(jīng)網(wǎng)絡(luò)量化 , 歡迎使用、點贊、提pull request以及進(jìn)行探討交流。

          需要注意,不同的部署框架的量化方法不同,進(jìn)行量化感知訓(xùn)練需要先確認(rèn)訓(xùn)練框架量化算法與部署框架的量化算法大體是一致的,最終才能夠提升部署效果。例如,英偉達(dá)TensorRT 采用的是均勻量化的方案,海思采用的是指數(shù)量化方案,量化算法有較大差異,筆者使用nnieqat包進(jìn)行量化訓(xùn)練在海思平臺上能夠恢復(fù)fp32的效果,在TensorRT上的部署效果沒有提升。nnieqat量化訓(xùn)練包后續(xù)會根據(jù)需要添加其他平臺的量化方法,不斷提升量化包的場景適用性。





          為了感謝讀者朋友們的長期支持,我們今天將送出4本由北京大學(xué)出版社提供的《機(jī)器學(xué)習(xí)與深度學(xué)習(xí)算法基礎(chǔ)》書籍,對本書感興趣的可以在留言版留言,我們將抽取其中四位讀者送出一本正版書籍。


          如果對這本書感興趣,可以點下面鏈接購買。









          歡迎關(guān)注GiantPandaCV, 在這里你將看到獨家的深度學(xué)習(xí)分享,堅持原創(chuàng),每天分享我們學(xué)習(xí)到的新鮮知識。( ? ?ω?? )?

          有對文章相關(guān)的問題,或者想要加入交流群,歡迎添加BBuf微信:

          二維碼

          為了方便讀者獲取資料以及我們公眾號的作者發(fā)布一些Github工程的更新,我們成立了一個QQ群,二維碼如下,感興趣可以加入。

          公眾號QQ交流群
          - END -


          瀏覽 63
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  www.豆花社区成人 | 一级黄色片A | 丰滿人妻一区二区三区 | 中文字幕+乱码+中文ktv | 波多野结衣中文字幕日韩久久 |