Google CVPR 2018論文:CNN量化技術

天下武功,無堅不破,唯快不破——火雲邪神

深度學習如何做的更快,最好最實用的壓縮加速方法有哪些,tensorlite中的MobileNet+SSD為什麼那麼快?推薦來自Google的CVPR 2018論文,介紹tensorlite的量化技術,有論文有源碼,能work的良心大作,MobileNet+int8,快到飛起來

相關論文

  • Jacob B, Kligys S, Chen B, et al. Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference [C]// CVPR, 2018.
  • Google. TensorFlow Lite. tensorflow.org/mobile/t.
  • S. Kligys, S. Sivakumar, et al. Tensorflow quantized training support. tensorflow/tensorflow.
  • Howard A G, Zhu M, Chen B, et al. Mobilenets: Efficient convolutional neural networks for mobile vision applications. arXiv:1704.04861, 2017.

背景簡介

計算量限制了我的想像力!

目前SOTA(State Of The Art,頂尖水平)的CNN都不適合在移動設備上部署,兩點原因使CNN模型壓縮和加速領域快速發展:

  1. 從AlexNet開始,CNN都以ImageNet上的分類準確率作為性能評估的主要甚至唯一標準,這使得CNN架構的發展都沒有考慮模型複雜度和計算效率問題。
  2. 想要在智能手機,AR/VR設備,無人機等移動設備上部署CNN,需要模型大小比較小、時耗比較低,才滿足設備的內存限制,保證用戶體驗。

CNN模型壓縮和加速領域的主流方法,可以劃分為兩類:

  1. 設計類:設計新穎的網路結構,研究計算量低,內存消耗少的操作或層。高效的層有1*1 Conv, DepthwiseConv(DwConv), residuals connect, Global Average Pooling(GAP)等,和基於這些層的代表性CNN結構有:SqueezeNet,MobileNet,ShuffleNet,MobileNetV2,NASNet等。還有一種叫Distillation蒸餾法,從大模型teacher指導訓練小模型student,壓縮和加速的關鍵還是小模型設計的好不好,Distillation只是輔助訓練的方法,所以也屬於這一類。
  2. 量化壓縮類:將CNN的權值(weights)和/或激活值(activations),從32-bits浮點數 量化到低比特位數表示,代表性方法是Ternary weight networks (TWN), Binary Neural Networks (BNN), XNOR-net, 和Deep Compression等。其中還有一小類Pruning剪枝法,把部分權值變成0並跳過計算,如connection Pruning 部分連接剪掉後會破壞並行和流水線,有時候得不償失,而Filter/Channel Pruning,僅對冗餘很大的大模型有效,天然緊湊的小模型收效甚微,如果用剪枝的大模型,還不如直接上小模型更方便。

設計類不是這篇論文的重點,按下不表(留在下一篇介紹我所認識的MobileNetV2,如果有下一篇的話。。

量化壓縮類是這篇論文關注的重點,雖然紛繁複雜、多種多樣,但目前壓縮量化方法在處理速度-精度的權衡(latency-accuracy trade-off)時有兩個通病:

【這是重點,打上高光】

第一個問題:已有壓縮量化方法都沒有在一個合理的基準CNN結構(reasonable baseline architecture)上進行評估。最常用的CNN結構,如AlexNet, VGGNet, GoogleNet, ResNet等,這些競賽模型為了在ImageNet上取得最優性能和極限準確率提升,在設計時參數都是嚴重過量的,因此這些CNN結構很容易獲得大倍數或超大倍數的壓縮。以兩個例子來解釋:

  1. FC層問題:AlexNet和VGGNet中參數最多的是那兩個FC全連接層,而近期CNN結構都表明去掉這兩個FC層,僅用GAP就能獲得高精度,如Inception系列和ResNet系列都去掉了FC僅用GAP,所以這兩年有很多論文專撿軟柿子捏,在FC層上大作文章就能輕易得到亮瞎狗眼的壓縮率,把AlexNet和VGGNet壓縮個幾十倍還能保證精度不變,您怎麼不在ResNet或者Inception系列上做實驗呢?
  2. CONV層通道/濾波器數量:網路設計時,每個層的通道數通常都是人工設置的,比如最常用的64, 128, 256, 512, 1024等,這些數字都去遍歷調參不太可能,而且ILSRVC競賽打得火熱,大家都儘可能的讓卷積核/通道的數量比較大,網路寬一點保證性能最優。這其中肯定有很大冗餘,所以這兩年也有論文研究減少濾波器數量這個點(128換成127試試,哎呦效果不錯,再試試125,嘿嘿嘿。。)

所以這篇論文呼籲:這些CNN結構上的實驗最多只能證明某方法理念正確,但意義不大,所以這種量化實驗要少做,更有意義的挑戰是量化那些本來就在速度-精度權衡方面比較高效的模型,如MobileNet

第二個問題:很多壓縮量化方法都無法在真實硬體上提供可驗證的效率提升。僅量化weight方法的主要理念是減少設備上的存儲需求,而不是減少計算量,如int8的權值乘float32的輸入得到輸出float32,計算量與純float32完全沒有區別。

值得注意的例外情況是二值,三值和bit-shift比特移位網路:

  1. bit-shift方法的權值是0或2的指數倍,這樣乘法就可以通過比特移位的方式實現,然而,bit-shift僅能在定製的硬體上比較高效,在採用乘加指令(multiply-add instructions)的已有常用硬體上幾乎無法加速。
  2. multiply-add instructions乘加指令的常用硬體,如果能正確使用流水線,乘加運算與單獨用加法的速度差別不大,所以bit-shift加速乘法的優化就沒有意義了。此外,乘法操作僅在操作位數很寬時才耗時,一旦權值和激活值都被量化到低比特位數,就沒有必要避免乘法操作,而且操作位數越少就越不需要避免,所以這類量化方法都不會在設備上實測,都沒有給出能驗證預期加速的實驗結果。
  3. 1-bit看起來更實用,將權值和激活值都量化到1-bit表示,這樣乘法和加法都可以通過bit-shift和bit-count實現,如BNN在定製GPU kernels上的展示,但1-bit量化會導致嚴重的性能下降,這或許對模型表達太過於嚴苛了。

所以Google這篇論文,在移動硬體上對MobileNet做量化加速,提高latency-vs-accuracy tradeoffs:

  • 核心是量化方案quantization scheme,權值和激活值都量化到8-bit整數,少量參數是32-bit整數;
  • 提供inference framework和高效ARM NEON實現;
  • 提供模擬量化效應的協同訓練,最小化量化誤差;
  • 在分類檢測任務上量化MobileNet的實驗驗證。

論文分quantized inference和Training with simulated quantization兩部分。

Quantized Inference量化預測

參考論文:用8-bit定點計算在x86 CPU上加速預測。

  • V. Vanhoucke, A. Senior, and M. Z. Mao. Improving the speed of neural networks on cpus [C]// NIPSw, 2011.

量化方案,權值和激活值從實數r量化到8-bit定點整數q的公式:

兩個量化參數,S是實數scale,Z是零點zero-point的量化值,每個權值矩陣內和每個激活矩陣內的所有值用一組量化參數,不同矩陣不同量化參數。定點後卷積:

累加結果是int32,所以偏置也量化到32-bit保證與累加結果同類型,最後激活值截斷到uint8,激活函數用ReLU6

具體推導和細節見論文,就不展開了。

Training with simulated quantization模擬量化訓練

參考論文:低精度定點計算加速CNN訓練。

  • S. Gupta, A. Agrawal, K. Gopalakrishnan, and P. Narayanan. Deep learning with limited numerical precision [C]// ICML, 2015.

實驗發現,浮點數訓練後直接量化權值的簡單量化方法,對大模型效果較好,但會嚴重影響小模型的準確率,可能原因:

  • 不同輸出通道的權值範圍差異較大(有時候超過100倍),如果所有通道量化到同一範圍,權值範圍較小的通道誤差相對更大。
  • 異常權值會降低其他權值的量化後精度。

論文依然採用浮點訓練,但在訓練的前向傳播中模擬量化效應,反向傳播保持不變。這部分也不展開了,有興趣直接看論文:

TensorFlow code(逼我學TF系列):

BN層融入權值層一起量化,節省了單獨做BN的計算了:

實驗結果

影響CNN性能最重要的一點,是矩陣乘法GEMM,論文中8-bit整數用Google自己的gemmlowp library,32-bit浮點乘法用Eigen library。

量化大模型的實驗結果速覽:

量化不同深度的ResNet,定點準確率比浮點僅低2%:

ResNet50不同量化方法的比較,這篇論文的方法精度最好,而且預測加速最友好:

InceptionV3用8-bit量化和7-bit量化結果接近,ReLU6比ReLU量化後精度下降更少:

量化小模型的實驗結果速覽:

量化MobileNet在ImageNet分類任務上的結果,硬體依次是:高功效處理器Snapdragon 835 LITTLE core,高性能處理器Snapdragon 835 big core,專門優化了浮點運算的高性能處理器Snapdragon 821 big core:注意橫軸不是均勻的

量化Mobile SSD在COCO目標檢測任務上,時間減少50%,精度下降1.8%:

量化Mobile SSD在人臉檢測任務上,精度下降2%,耗時下降接近一半,四核加速1.5~2.2倍:

人臉屬性分類,即使是優化浮點運算的821 big core,也有明顯加速:

消融實驗:

  1. 量化比特寬度減少時,權重對變化更敏感
  2. 8bit和7bit量化與浮點模型性能相當
  3. 當總bit深度相同時,保持權值和激活的bit深度相同時更好

END

以上,其實大部分都是論文翻譯,很多地方強迫翻譯成中文,表達不當之處請見諒!


推薦閱讀:

進一步理解 TensorFlow 的 Graph 機制
學習筆記TF022:產品環境模型部署、Docker鏡像、Bazel工作區、導出模型、伺服器、客戶端
[Tensorflow]-[技術]Tensorflow訓練好的模型的保存和讀取
學習筆記TF024:TensorFlow實現Softmax Regression(回歸)識別手寫數字

TAG:深度學習DeepLearning | TensorFlow | 計算機視覺 |