隨着人工智能應用在手機、IoT上的普及,受能耗和設備體積的限制,端側硬件的計算性能和存儲能力相對較弱,這給人工智能模型帶來了新的挑戰——須要模型更小更快更強。量化,就是其中的一個重要手段。所以,近年來量化成爲學術界與工業界熱門的研究方向。但與此同時,模型量化也引起了巨大的挑戰。其中比較大的有兩個:一是因爲表示精度降低引發信息損失帶來準確率的降低;二是量化帶來的不連續性使神經網絡的訓練不穩定。學術和工業界的大多數工做也正是圍繞它們展開的。git
模型量化簡單來講就是用更低比特數據(如8位整型)代替原浮點數據(32位)。聽上去彷佛是很是簡單,可是實際操做下來會發現這個坑遠遠比想象中的大。量化最核心的挑戰,是如何在減小模型數據位寬的同時,模型的準確度不要掉下來,也就是在壓縮率與準確率損失間做trade-off。這衍生出不少有趣的子問題,好比量化對象是誰(weight,activation,gradient),量化到幾位(8位,4位,2位,1位),量化參數選哪些(如moving rate,clipping value),量化參數是否能夠自動優化,不一樣層是否須要不一樣的量化參數,如何在量化後恢復準確率或者在訓練時考慮量化,等等……github
PACT量化(PArameterized Clipping acTivation)是一種新的量化方法,該方法經過在量化激活值以前去掉一些離羣點,將模型量化帶來的精度損失降到最低,甚至比原模型準確率更高。想知道背後的原理嗎?接下來,我帶你們詳細解讀一下此算法。算法
量化的好處
量化是將以往用32bit或者64bit表達的浮點數用8bit、16bit甚至1bit、2bit等佔用較少內存空間的形式進行存儲。這樣的好處是:服務器
-
減小模型體積,下降模型存儲空間需求;微信
-
下降內存帶寬需求;網絡
-
加速計算。現代移動端設備,基本都支持SIMD(單指令流多數據流),以128-bit 寄存器爲例,單個指令能夠同時運算 4個32位單精度浮點,或者8個16 位整型,或者16個8位整型。顯然8位整型數在 SIMD 的加持下,運算速率要更快。函數
量化面臨的最大問題——精度受損
量化映射方式工具
一般,模型量化是將32bit浮點數轉換成8bit整數,映射過程分爲三種方式:性能
-
非飽和方式:將浮點數正負絕對值的最大值對應映射到整數的最大最小值。學習
-
飽和方式:先計算浮點數的閾值,而後將浮點數的正負閾值對應映射到整數的最大最小值。
-
仿射方式:將浮點數的最大最小值對應映射到整數的最大最小值。
紅色表明非飽和方式,黃色表明飽和方式,綠色表明仿射方式
量化精度損失緣由
不管哪一種映射方式,都會受到離羣點、float參數分佈不均勻的影響,形成量化損失增長。
如上圖,因爲左側的離羣點,使得量化的範圍更大,讓量化後的右側數值點變的過分密集,增大了量化損失。
以實際模型爲例,下圖的分佈直方圖,取自經典的CNN模型MobileNetV3中的一部分激活值,能夠看到它的分佈十分不均勻,最小值和最大值分別是-60和+80,可是絕大多數數據都分佈在-20到+20之間。
若是按照-60到+80的範圍去肯定量化scale,就會對分佈密集的-20到+20範圍帶來較大的量化損失。
PACT量化原理
模型量化主要包括兩個部分,一是對權重Weight量化,一是針對激活值Activation量化。同時對兩部分進行量化,才能得到最大的計算效率收益。權重能夠藉助網絡正則化等手段,讓權重分佈儘可能緊湊,減小離羣點、不均勻分佈狀況發生,而對於激活值還缺少有效的手段。
PACT量化(PArameterized Clipping acTivation)是一種新的量化方法,該方法提出在量化激活值以前去掉一些離羣點來下降模型量化帶來的精度損失。提出方法的背景是做者發現:「在運用權重量化方案來量化activation時,激活值的量化結果和全精度結果相差較大」。做者發現,activation的量化可能引發的偏差很大(相較於weight基本在 0到1範圍內,activation的值的範圍是無限大的,這是RELU的結果),因此提出截斷式RELU 的激活函數。該截斷的上界,即α 是可學習的參數,這保證了每層可以經過訓練學習到不同的量化範圍,最大程度下降量化帶來的舍入偏差。
如上圖,PACT解決問題的方法是,不斷裁剪激活值範圍,使得激活值分佈收窄,從而下降量化映射損失。
PACT經過對激活數值作裁剪,從而減小激活分佈中的離羣點,使量化模型可以獲得一個更合理的量化scale,下降量化損失。
PACT的公式以下所示:
能夠看出PACT原始的思想是用PACT代替ReLU函數,對大於零的部分進行一個截斷操做,截斷閾值爲a。
PaddleSlim改進版——PACT量化實現
實際應用場景中,各類模型結構並不必定都是用ReLU,爲了使PACT方法可以獲得更普遍的應用,就須要咱們對其進行必定改進。改進後的PACT公式以下:
優點:飛槳推出的PaddleSlim提供了改進版的PACT方法,在激活值和待量化的OP(卷積,全鏈接等)之間插入這個PACT預處理,不僅對大於0的分佈進行截斷,同時也對小於0的部分作一樣的限制,從而更好地獲得待量化的範圍,下降量化損失。同時,截斷閾值是一個可訓練的參數,在量化訓練過程當中,模型會自動的找到一個合理的截斷閾值,從而進一步下降量化精度損失。
下面咱們使用具體實例給你們展現一下PACT量化的收益狀況。
PaddleSlim改進版——PACT量化的收益展現
MobileNetV3模型Pact量化收益
MobileNetV3,做爲MobileNet系列模型的集大成者,結合了MobileNetV1 模型的深度可分離卷積(depthwise separable convolutions), MobileNetV2 模型引入的具備線性瓶頸的倒殘差結構(the inverted residual with linear bottleneck)和MnasNet 模型引入的基於squeeze and excitation結構的輕量級注意力模型,吸收衆多模型之長,結合採用神經網絡搜索的方法,是當前最理想的移動端輕量級模型之一。
爲了打造嵌入式終端上」毫秒級」的深度學習應用,咱們嘗試對MobileNetV3進行量化操做。
然而,在實際的量化實驗中,咱們發現:MobileNetV3模型對量化極爲敏感,通常的離線量化或量化訓練帶來的精度損失都很大,幾乎達到了不可用的程度。但使用PACT量化策略後,能夠明顯解決這一問題。實驗結果以下表所示。
-
使用普通的在線量化策略,訓練過程當中損失函數波動明顯,最終量化損失大於10%,這麼大的損失顯然已經超過了常規深度學習任務所能容忍的範圍。
-
使用PACT量化策略後,訓練過程損失函數收斂穩定,最終模型精度達到77.5%,精度損失1.4%,顯著好於普通量化策略。
OCR模型PACT量化收益
本次實驗選取的是PaddleOCR主打的文本檢測和識別以及方向分類模型。其中識別模型基於CRNN結構,原模型大小4.5M(包含參數文件和模型結構信息),識別準確率爲66.49%; 檢測模型基於DB結構,原模型大小2.5M, 原模型檢測hmean評價指標爲74.4;方向分類器基於MobileNetV3模型,原模型大小0.9M,分類準確率爲94.03%。
咱們能夠用下圖所示的流程對OCR模型進行量化壓縮,本次咱們使用的是PACT在線量化方案。
經過PACT在線量化,能夠在不過度損傷模型準確率的前提下,下降模型的大小,提升預測性能。
量化後,識別模型大小從4.5M縮減到1.5M,識別準確率爲65.33%,量化損失相對較小;檢測模型大小從2.5M縮減到1.4M,檢測hmean指標爲74.9,PACT量化不只沒有下降模型精度反而帶來了0.5%的提高;方向分類模型大小從0.9M縮減到0.45M,分類準確率爲94.65%,量化一樣帶來了0.62%的精度提高。咱們能夠發現,合理使用量化方法,不只不會對模型準確率帶來過多損傷,甚至在一些場景下會帶來必定的提高,同時能夠享受模型體積縮小和預測速度提升帶來的便利。
檢測模型PACT量化精度收益
與OCR量化方法相同,咱們對PaddleDetection中的Yolo模型進行PACT量化。相比普通的在線量化方法,PACT量化能夠有效地下降目標檢測任務上的量化損失。
通過實踐數據能夠了解到,移動端的目標檢測模型YOLOv3-MobileNetV3,在COCO任務上,若是使用普通在線量化方法,MAP爲28.2;但使用PACT量化能夠下降量化損失,MAP爲28.8。服務器端的大型檢測模型PPYOLO-ResNet50vd若是使用普通在線量化方法,MAP爲43.2;但使用PACT後MAP能夠達到44.1。由此能夠看出,PACT在目標檢測任務上也有不錯的表現。
從上面分類,OCR,檢測三類實驗咱們已經發現,PACT量化方法相比普通量化,訓練方法更穩定,最終的量化損失也更小。
PaddleSlim改進版——PACT量化的實現步驟
PACT量化功能來自飛槳PaddleSlim模型壓縮工具庫。PaddleSlim是一個模型壓縮工具庫,不只支持PACT量化,還包含模型剪裁、知識蒸餾、超參搜索和模型結構搜索等一系列模型壓縮策略。
使用PaddleSlim對模型進行PACT量化操做只須要如下4步:
-
選擇量化配置
-
轉換量化模型
-
啓動量化訓練
-
保存量化模型
下面分別對這幾點進行講解:
1. 選擇量化配置
首先咱們須要對本次量化的一些基本量化配置作一些選擇,例如weight量化類型,activation量化類型等。若是沒有特殊需求,能夠直接拷貝咱們默認的量化配置。所有可選的配置能夠參考PaddleSlim量化文檔,例如咱們用的量化配置以下:
2. 轉換量化模型
在確認好咱們的量化配置之後,咱們能夠根據這個配置把咱們定義好的一個普通模型轉換爲一個模擬量化模型。咱們根據量化原理中介紹的PACT方法,定義好PACT函數pact和其對應的優化器pact_opt。在這以後就能夠進行轉換,轉換的方式也很簡單:
3. 啓動量化訓練
獲得了量化模型後就能夠啓動量化訓練了,量化訓練與普通的浮點數模型訓練並沒有區別,無需增長新的代碼或邏輯,直接按照浮點數模型訓練的流程進行便可。
4. 保存量化模型
量化訓練結束後,咱們須要對量化模型作一個轉化。PaddleSlim會對底層的一些量化OP順序作調整,以便預測使用。轉換及保存的基本流程以下所示:
參考連接
上文提到的三個PACT量化實例連接以下。
MobileNetV3 PACT:
https://github.com/PaddlePaddle/PaddleSlim/tree/develop/demo/quant/pact_quant_aware
OCR PACT:
https://github.com/PaddlePaddle/PaddleOCR/tree/develop/deploy/slim/quantization
Detection PACT:
https://github.com/PaddlePaddle/PaddleDetection/tree/master/slim/quantization
PACT量化功能來自飛槳PaddleSlim模型壓縮工具庫,除了PACT量化,PaddleSlim還提供模型剪裁、知識蒸餾、超參搜索和模型結構搜索等一系列模型壓縮策略,詳細介紹請參閱如下文檔。
若是您對飛槳的模型壓縮感興趣,歡迎加飛槳小哥哥的微信,回覆paddleslim,進入技術交流羣。
若是您想詳細瞭解更多飛槳的相關內容,請參閱如下文檔。
GitHub:
https://github.com/PaddlePaddle/PaddleSlim
Gitee:
https://Gitee.com/PaddlePaddle/PaddleSlim
·飛槳官網地址·
https://www.paddlepaddle.org.cn/
本文分享 CSDN - 飛槳PaddlePaddle。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。