【商湯泰坦公開課】模型量化了解一下?
導讀
隨著深度學習的發展,神經網絡被廣泛應用于各種領域,模型性能的提高同時也引入了巨大的參數量和計算量。模型量化是一種將浮點計算轉成低比特定點計算的技術,可以有效的降低模型計算強度、參數大小和內存消耗,但往往帶來巨大的精度損失。尤其是在極低比特(<4bit)、二值網絡(1bit)、甚至將梯度進行量化時,帶來的精度挑戰更大。
2020年4月9日商湯泰坦公開課第009期的線上直播課程,由商湯研究院--鏈接與編譯團隊的兩位研究員分享了團隊在模型量化方面的的一系列研究工作,其中包含CVPR 2020、ICCV 2019等多篇與北航劉祥龍老師團隊合作的論文成果,快來一睹為快吧~
課程PPT及視頻回放獲取方式見文末提示~
Part 1 量化綜述
1 什么是模型量化?為什么要進行模型量化?
模型量化是由模型、量化兩個詞組成。我們要準確理解模型量化,要看這兩個詞分別是什么意思。
在計算機視覺、深度學習的語境下,模型特指卷積神經網絡,用于提取圖像/視頻視覺特征。
量化是指將信號的連續取值近似為有限多個離散值的過程。可理解成一種信息壓縮的方法。在計算機系統上考慮這個概念,一般用“低比特”來表示。也有人稱量化為“定點化”,但是嚴格來講所表示的范圍是縮小的。定點化特指scale為2的冪次的線性量化,是一種更加實用的量化方法。
卷積神經網絡具有很好的精度,甚至在一些任務上比如人臉識別、圖像分類,已經超越了人類精度。但其缺點也比較明顯,具有較大的參數量,計算量,以及內存占用。而模型量化可以緩解現有卷積神經網絡參數量大、計算量大、內存占用多等問題,具有為神經網絡壓縮參數、提升速度、降低內存占用等“潛在”優勢。為什么“潛在”是加引號的呢?因為想同時達到這三個特性并不容易,在實際應用過程中存在諸多限制和前提條件。
另外,由于模型量化是一種近似算法方法,精度損失是一個嚴峻的問題,大部分的研究都在關注這一問題。作為一個在公司支撐很多業務線的團隊,我們會在關注精度的同時,注重部署最終的速度和資源占用情況。
2 壓縮參數
模型量化在最初的定義里是為了壓縮模型參數,比如韓松在ICLR2016上獲得best paper的論文,首次提出了參數量化方法。其使用k-mean聚類,讓相近的數值聚類到同一個聚類中心,復用同一個數值,從而達到用更少的數值表示更多的數,這是量化操作的一種方案。反過來,從量化數變到原始數的過程,稱之為反量化,反量化操作完之后,模型就可以按照原來的方式進行正常的計算。
我們認為絕大部分的模型量化算法都能壓縮參數,因此壓縮參數的實用性不存在問題。
3 提升速度
量化是否一定能加速計算?回答是否定的,許多量化算法都無法帶來實質性加速。
引入一個概念:理論計算峰值。在高性能計算領域,這概念一般被定義為:單位時鐘周期內能完成的計算個數 乘上 芯片頻率。
什么樣的量化方法可以帶來潛在、可落地的速度提升呢?我們總結需要滿足兩個條件:
1、量化數值的計算在部署硬件上的峰值性能更高 。
2、量化算法引入的額外計算(overhead)少 。
要準確理解上述條件,需要有一定的高性能計算基礎知識,限于篇幅就不展開討論了。現直接給出如下結論:已知提速概率較大的量化方法主要有如下三類,
1、二值化,其可以用簡單的位運算來同時計算大量的數。對比從nvdia gpu到x86平臺,1bit計算分別有5到128倍的理論性能提升。且其只會引入一個額外的量化操作,該操作可以享受到SIMD(單指令多數據流)的加速收益。
2、線性量化,又可細分為非對稱,對稱和ristretto幾種。在nvdia gpu,x86和arm平臺上,均支持8bit的計算,效率提升從1倍到16倍不等,其中tensor core甚至支持4bit計算,這也是非常有潛力的方向。由于線性量化引入的額外量化/反量化計算都是標準的向量操作,也可以使用SIMD進行加速,帶來的額外計算耗時不大。
3、對數量化,一個比較特殊的量化方法。可以想象一下,兩個同底的冪指數進行相乘,那么等價于其指數相加,降低了計算強度。同時加法也被轉變為索引計算。但沒有看到有在三大平臺上實現對數量化的加速庫,可能其實現的加速效果不明顯。只有一些專用芯片上使用了對數量化。
簡單看一下二值化和線性量化兩種方式,分別是右上角的圖和右下角的圖。
總結一下,要使用量化技術來提升模型運行速度,需要滿足兩個條件:
1、選擇適合部署的量化方案。
2、在部署平臺上使用經過深度優化的量化計算庫(必要的時候,可能需要擼起袖子自己上)。
首先保證你實現的低比特計算效率超過原先浮點計算,否則為何要承擔精度損失的風險而使用并不加速的量化模型呢。但低比特計算效率超過浮點計算其實并不容易,因為大家在浮點的計算庫上已經做了非常多細致的優化比如winograd,間接卷積等等。
為了最大限度保證實用性,后面的論文所有工作都是基于二值化、線性量化兩種前提來做的,并且絕大部分工作都報告最終實際的加速效果。這也是鏈接與編譯團隊做研究的一個風格。
4 降低內存
模型量化還有一個潛在的好處是降低運行時內存占用,這個特性無論是在移動端還是云端都是具有現實意義的。如果降低內存占用,可以得到如下好處:
1、降低訪存量,存在提升速度的可能 。
2、在同樣硬件環境下,同時處理更多視頻或者視頻路數 。
3、訓練更大的模型。
我們分析下運行時內存都是被什么東西占用的,大家關心的參數weight只占很少一部分, 大部分內存占用來自激活值activation。如果你做低比特量化只關注卷積的話(很多論文其實也是只量化了卷積),那么是無法帶來內存占用降低的。
如何才能用量化降低內存占用,只有一個方式: 將盡可能多的layer的激活值都進行量化 。在這個方向上之前商湯的一位實習生李潤東也有一個工作,做了除了卷積之外更多層的量化。但是這樣做會帶來更多的精度損失,這可能也是大家需要關心的。
5 生產量化模型
生產一個量化模型的有以下幾種方法,借鑒了ICCV2019上一篇data-free量化論文的定義。
L1:直接將一個浮點參數直接轉化成量化數,一般會帶來很大的精度損失,但使用上非常簡單。
L2:基于數據校準的方案,很多芯片都會提供這樣的功能,比如tensorRT,高通,寒武紀等。它需要轉模型的時候提供一些真實的計算數據。
L3:基于訓練finetune的方案,有很多論文都是使用這種方法,它的好處是可以帶來更大的精度提升,缺點是需要修改訓練代碼,實施周期比較長。
上圖描述了一種實用的pipeline流程,一般會優先使用不進行finetune的offline方法,也就是離線方案。當離線方案精度損失過于嚴重,我們才會進行基于finetune的方法,來做進一步的搶救。
6 量化模型的落地
最后聊聊阻礙模型量化算法落地的幾個問題,核心當然是精度問題。我們發現雖然學術界大家很早就開始做量化,但現在算法還無法大規模落地。主要存在幾個gap:
1、可落地的線性量化方案無法很好的刻畫一些分布,比如高斯分布
2、比特數越低,精度損失就越大,實用性就越差
3、任務越難,精度損失越大,比如識別任務,就比分類任務要難非常多
4、小模型會比大模型更難量化
5、某些特定結構,如depthwise,對量化精度十分不友好
6、常見的對部署友好的方法比如merge BN,全量化,都會給精度帶來更大的挑戰
除了精度外,軟硬件支持不好也是一個阻礙:不同的硬件支持的低比特指令是不一樣的,同樣訓練得到的低比特模型,無法直接部署在所有硬件上。除了硬件之外,不同軟件庫實現的量化方案和細節也不一樣,量化細節里包括量化位置、是否支持perchannel、是否混合精度等等。即使硬件支持了量化,但你會發現不是所有硬件可以在低比特上提供更好的速度提升, 造成這個狀況的主要原因有多個,一方面是指令集峰值提升可能本身就并不多,而要引入較多的額外計算,另一方面也取決于軟件工程師優化指令的水平,同時由于網絡結構靈活多樣,不一定能在不同網絡結構上達到同樣好的加速比,需要優化足夠多的的corner case才可以解決。
相信大家對模型量化的概念和落地難點有了一個系統性的認識。我的部分就到這里結束了,下面是大家最期待的論文解讀時間。
Part 2 論文解讀
1 低比特量化:Differentiable Soft Quantization: Bridging Full-Precision and Low-Bit Neural Networks(ICCV 2019)
由于量化函數本身是離散不可導的,導致其無法像標準神經網絡一樣使用反向傳播計算梯度,一個常用的做法是使用梯度直通估計器(STE),即在反向過程中忽略量化這一步驟產生的影響,而這也就自然的帶來了梯度不準確的問題。權重經過STE拿到的梯度跟它應該拿到的梯度是不匹配的。ICLR 2020年有一篇論文通過實驗具體的分析了這一現象,發現隨著比特數的降低,不匹配的現象更加明顯。
這讓低比特量化網絡很難高效訓練,針對這個問題,該文章提出了一個可微分的軟量化函數DSQ,引入了可求導的量化函數,緩解了不可求導帶來的梯度不匹配問題。同時,這個函數隨著訓練的進行可以逐步趨近標準量化,因此可以在部署時直接利用高效的線性低比特量化函數進行推理,此外,由于這個函數是可以求導的,因此截斷值也能夠直接被優化,在訓練過程中平衡截斷誤差和取整誤差間的關系。
通過可視化分析,我們發現經過DSQ函數后,參數的分布更加接近于量化后的分布,減小了浮點參數和量化參數的鴻溝。為了驗證這套方法的效率,我們基于ARM NEON中的SADDW和MLA指令實現了高效的低比特卷積,并在樹莓派上以ResNet-18為基礎進行測試,相比騰訊開源的高性能推理庫NCNN有1.6倍左右的提速。
論文地址:https://arxiv.org/abs/1908.05033
2 模型二值化:IR-Net: Forward and Backward Information Retention for Highly Accurate Binary Neural Networks(CVPR 2020)
模型二值化在模型的激活值和參數上只有兩個值(0和1)表示,可以預見的是這樣量化肯定會帶來較大的精度和信息損失。該文章引入了信息熵,以量化參數和浮點參數的信息熵作為模型的評判標準。
除了前向信息損失,二值化模型在反向過程中面臨的挑戰更大,標準的恒等映射梯度近似會導致較大的梯度誤差,而包含截斷建模的梯度近似會使得大量被截斷的數值不能得到更新,損失了更新能力。該文章提出了兩階段近似梯度估計器,讓模型優化在前期保持比較高的更新能力,后期梯度的誤差更低。
同樣在樹莓派上進行了速度驗證,借助京東開源的daBNN推理庫,測試了IR-Net的性能,相比daBNN中的全精度模型,大約有5.6倍左右的速度提升。
論文地址:https://arxiv.org/abs/1909.10788
項目地址:https://github.com/htqin/IR-Net
3 8bit訓練加速:Towards Unified INT8 Training for Convolutional Neural Network(CVPR 2020)
除了使用量化技術加速前向推理過程,是否能夠進一步加速包含反向傳播在內的梯度計算過程呢?分析發現反向傳播在訓練過程中占用了一半的時間,如果能減少這個時間,那么就能大大增加訓練效率。一個直接的想法就是量化梯度,但這樣做會導致訓練不收斂。經過統計,我們發現梯度的分布與激活值和參數值有很大不同,大量參數出現在0附近,同時存在較大的極端值,如果對其進行量化會帶來非常大的量化誤差。
發現了梯度的特征后,我們從理論角度進行了分析,借鑒了優化理論中的后悔值分析。推導出了引入梯度量化之后的收斂性上界:
該上界包含三項,其中第一項隨更新迭代的進行會趨向于零,因此主要由后兩項決定,分別對應量化誤差的大小和學習率。只有確保該上界盡可能小,收斂性才能得到保證。
因此針對第二項和第三項,通過使量化梯度與實際梯度的cosine距離更加接近,降低量化誤差,然后根據誤差的大小減小學習率,使得盡可能在更加正確的方向上進行更新,并且不會在錯誤的方向上更新過多,可以保證在收斂邊界內更新,確保正常收斂。論文在分類和目標檢測任務上都進行了精度驗證,損失在1%左右。
借助高性能團隊提供的初步優化實現,該方法可以在NVIDIA GTX 1080TI上帶來22%的加速。
論文地址:https://arxiv.org/abs/1912.12607
4 低比特人臉識別:Rotation Consistent Margin Loss for Efficient Low-bit Face Recognition(CVPR 2020)
由于開集問題里測試集中存在訓練集不存在的類別,因此識別任務比分類任務更難,評價指標也更加嚴格。而引入量化之后,也就面臨著更大的挑戰。為了深入分析人臉識別受量化的影響,論文首先基于人臉特征使用夾角度量作為相似度衡量的共識定義了量化誤差,并定義量化后的類中心為屬于該類所有樣本特征進行量化后的均值。對量化誤差進行分析,發現引入量化后每個類的中心都有所偏移,但類之間的夾角保持住了,類內的距離保持的較差。可以理解成各類在量化后產生了一個整體的旋轉,每個類的緊湊性有所下降。
因此文章將量化誤差分解成類偏差和個體偏差。文章提出了旋轉一致損失函數,使得樣本具有與類中心有同樣的偏移,抵消量化帶來的影響,讓特征更加保序。
論文在不同數據集上進行了實驗,在簡單的數據集上3/4bit基本能夠保持精度,在更有挑戰的數據集上相比基線方法也能夠有1-2%的精度提升。
5 量化友好網絡結構:DMS: Differentiable diMension Search for Binary Neural Networks(ICLR 2020 Workshop)
對量化和網絡結構的探索,許多論文都會對網絡結構進行微調:增加通道數量,修改跨層連接等。對于二值化模型來說這些改動能帶來比全精度模型更大的收益。
這啟發了我們,是否存在一些模型結構,他們對于量化更加友好呢?本文從卷積核output channel的角度進行了探索,將量化背景下的channel探索轉換為網絡結構搜索(NAS)問題。Channel的搜索空間一般較大,直接使用已有的NAS會面臨非常高的搜索復雜度,為了解決這個問題,本文提出了搜索空間聚類方法。首先將channel的變換參數r建模為服從Logistic分布的隨機變量,廣義的搜索空間可以認為是從該分布中進行采樣,我們將采樣限制為三個點:(),由于Logistic分布的分布函數可以進行求導,和能夠進行優化,同時我們將進行衰減,即可最終收斂到上,作為最優的channel放縮系數。
對搜索空間進行建模,對網絡結構進行探索。
實驗表明,搜索得到的結構具有較大的精度潛力,使用ResNet-18拓撲,通過尋找最優的channel設置,在參數量比標準BNN少的情況下,可以實現7%左右的精度提升。
論文地址:
https://drive.google.com/file/d/1DgD1mIBv7MHwM27Vjvb-g8IwlUOv6UJF/view?usp=sharing
項目地址:
https://github.com/yhhhli/DMS_for_BNN
Part 3 Q&A
Q:主流訓練框架是否支持finetune方法的INT8量化?
A:finetune 方法的INT8量化在現在的tensorflow里是支持得比較好的,可以看到google的量化白皮書中就介紹了finetune。Pytorch正在補齊這方面的功能,在1.3版本中加入了finetune 的量化功能,但還在實驗階段。所以現在的PyTorch框架做的比較一般,但公司內部會提供完善的finetune方案和開源算法。
Q:不同量化任務難度有差異的原因是什么?哪些任務作為INT8量化損失會比較大?
A:例如分類任務,只要保證最終的預測概率的相對大小,是保持關系即可,但回歸任務,比如檢測任務偏一點都會影響到檢測出框的準確性,所以會比分類任務的難度更高。剛才提到的人臉識別的任務是出feature的,feature的方向以及本身衡量的難度使其比分類任務更加困難,以及一些low level的任務因為輸出的各個像素點都要顧及到,所以也會比分類任務更困難。另外從分布方面,量化需要做分布的考慮,如果一些任務對分布不友好,量化的部署也會更加困難。
Q:在對網絡結構友好型的量化過程中 對于channel分配上有什么經驗?
A:可以看到我們的論文補充材料中展示了最終的channel數,總結來看如果層中本身計算量較小,那么它的channel就需要更大一些,不同網絡結構的規律也有所不同。
Q:INT8 Training是從頭開始訓練的時候就采用8bit定點嗎?還是說先全FP32精度進行訓練一段時間,再進行量化?是僅對卷積層進行了8比特定點量化嗎?
A:從頭開始訓練的時候就采用8bit定點。第二種方法會更穩定一些,但無法達到較好的加速效果。當前我們的方案里只對卷積層進行量化,并且沒有關心全連接層和第一層的卷積,這是一個比較標準的setting,所以目前達到的加速效果還沒有很好,如何做得更快是需要其他層都需要量化的。
Q:當模型在真正部署,需要模型壓縮的時候,量化、剪枝、知識蒸餾等壓縮方法一般會使用哪些呢?
A:量化是一個大部分硬件平臺都會支持的,因此比較常用;知識蒸餾有利于獲得小模型,還可以進一步提升量化模型的精度,所以這個技巧也會使用,尤其是在有已經訓好比較強的大模型的基礎上會非常有用。剪枝用的會相對較少,因為可以被網絡結構搜索覆蓋。
「商湯泰坦公開課」公眾號后臺回復“量化”,即可獲取相應的課程資料哦!
-
11月2日,為期七天的計算機視覺頂會ICCV 2019落幕。商湯科技以57篇論文(11篇Oral),13項冠軍的成績創造新“高度”(詳見文章《商湯科技57篇論文入選ICCV 2019,13項競賽奪冠》),讓世界見證商湯研究技術積累的“厚度”,在大會現場也能切身感受商湯AI+行業應用落地的“廣度”2019-11-03
-
近日,由阿里巴巴集團、商湯科技及香港科技園公司攜手成立的香港人工智能及數據實驗室(HKAI Lab)在香港科學園正式開幕。商湯科技創始人、香港中文大學教授湯曉鷗、阿里巴巴集團首席技術官張建鋒和香港科技園公司行政總裁黃克強分別發表了講話,祝愿HKAI Lab能夠助力香港初創人工智能企業生態發展。2018-10-18