終端移植


十歲的小男孩

  未來,All In AI。IT三分天下,算法、算力和終端。  

  本文終端移植方向,助力AI落地。該方向的矛盾在於資源性能的平衡,即在有限的資源下使性能最大化。本文意在將學習過程中遇到的知識點進行總結,試圖構建一個簡單的框架,各章節將獨起博文,也意拋磚引玉,希望大佬們將知識點完善,知識應該是開源的。

  該方向主要分理論和工程兩部分,即模型優化和模型移植,前者為理論支撐,主要在時間空間兩個維度進行優化;后者現階段通過移植框架在終端運行,框架百花齊放,百家爭鳴;后文摘錄當前較流行的幾個開源框架,本文試圖權衡這些框架之間的優劣,其后海納百川。

1. 模型優化

1.1模型壓縮

  通常意義上的網絡模型壓縮,主流思路有兩個方向,一個是一個是設計更小的網絡模型,即重構;另外一種思路是網絡模型結構不變,對模型進行精簡。

1.1.1 重構 

  重構包括遷移學習和更輕量級網絡模型設計,如SqueezeNet,MobileNet,ShuffleNet等,可以根據實際精度要求,不斷裁剪模型,調試優化。

1. 遷移學習

  教師--學生網絡知識蒸餾

2. 輕量化模型設計

  Squeeze-Net、Mobile-Net、Shuffle-Net、X-ception

1.1.2 精簡

  通過一定方法減小網絡帶寬,內存開銷,提升速度,主要基於目前多數網絡模型存在大量冗余節點,節點權重存在占位浪費等原因,做一定算法實現層面的加速優化。

1. 參數裁剪與共享

  模型量化網絡剪枝和共享結構化矩陣

2. 低秩分解和稀疏性

  低秩分解核稀疏化

1.2 優化加速

1.2.1 Op-level的快速算法

  FFT Conv2d (7x7, 9x9)、 Winograd Conv2d (3x3, 5x5)

1.2.2 Layer-level的快速算法

  Sparse Block Net 

1.2.3 優化工具庫

  TensorRT (Nvidia) 、Tensor Comprehension (Facebook) 、Distiller (Intel)       

1.2.4 BNN 

1.3 異構計算

  X-PU(CPU、GPU、TPU、NPU。。)

1.4 AUTO

  1.4.1 PocketFlow 

  1.4.2 AutoML

  1.4.3 AutoKears

  1.4.4 TensorFlow 

2. 模型移植

  2.1 TensorFlow Lite

  2.2 Mace

    2.2.1 環境搭建

    2.2.2 模型編譯

    2.2.3 工程化

  2.3 Tengine

  2.4 NCNN  

  2.5 QNNPACK

  2.6 OpenCV

背景

  為了解決全連接層參數規模的問題,人們轉而考慮增加卷積層,使全連接參數降低。隨之帶來的負面影響便是大大增長了計算時間與能耗。

  現代卷積神經網絡主要由兩種層構成,他們具有不一樣的屬性和性能:

  • 卷積層,占據了90% ~ 95%的計算量,5%的參數,但是對結果具有很大的表達能力。
  • 全連接層,占據了5% ~ 10%的計算量,95%的參數,但是對於結果具有相對較小的表達的能力。

  綜上:卷積層計算量大,所需參數系數 W 少,全連接層計算量小,所需參數系數 W 多。因此對於卷積層適合使用數據並行,對於全連接層適合使用模型並行。

  一個典型的例子是具有50個卷積層的ResNet-50需要超過 95MB的存儲器以及38億次浮點運算。在丟棄了一些冗余的權重后,網絡仍照常工作,但節省了超過75%的參數和50%的計算時間。

研究現狀  

  這里所謂的模型壓縮,主要是指第二種,即網絡結構基本不變,做模型壓縮。主要從以下幾個方面進行壓縮:

模型裁剪,權重共享,核稀疏(正則),量化,二值化,Low-rank分解,知識蒸餾等方向,下圖是Distiller實現的幾種方案。  

  • 參數修剪和共享(parameter pruning and sharing):針對模型參數的冗余性,試圖去除冗余和不重要的項。
  • 低秩因子分解(low-rank factorization):使用矩陣/張量分解來估計深度學習模型的信息參數。
  • 轉移/緊湊卷積濾波器(transferred/compact convolutional filters):設計了特殊的結構卷積濾波器來降低存儲和計算復雜度。
  • 知識蒸餾(knowledge distillation):通過學習一個蒸餾模型,訓練一個更緊湊的神經網絡來重現一個更大的網絡的輸出。

  參數修剪和共享、低秩分解和知識蒸餾方法可以用於全連接層和卷積層的CNN,但另一方面,使用轉移/緊湊型卷積核的方法僅支持卷積層(因為只是修改卷積filter)。

  低秩因子分解和基於轉換/緊湊型卷積核的方法提供了一個端到端的流水線,可以很容易地在 CPU/GPU 環境中實現。

  參數修剪和共享使用不同的方法,如矢量量化,二進制編碼和稀疏約束來執行任務,這導致常需要幾個步驟才能達到目標。

  關於訓練協議,基於參數修剪/共享、低秩分解的模型可以從預訓練模型或者從頭開始訓練,因此靈活而有效。然而轉移/緊湊的卷積核和知識蒸餾模型只能支持從零開始訓練。  

  這些方法是獨立設計和相輔相成的。例如,轉移層和參數修剪和共享可以一起使用,並且模型量化和二值化可以與低秩近似一起使用以實現進一步的加速。

 

挑戰

  深度模型的壓縮和加速技術還處在早期階段,目前還存在以下挑戰: 

  • 依賴於原模型,降低了修改網絡配置的空間,對於復雜的任務,尚不可靠;

  • 通過減少神經元之間連接或通道數量的方法進行剪枝,在壓縮加速中較為有效。但這樣會對下一層的輸入造成嚴重的影響;

  • 結構化矩陣和遷移卷積濾波器方法必須使模型具有較強的人類先驗知識,這對模型的性能和穩定性有顯著的影響。研究如何控制強加先驗知識的影響是很重要的;

  • 知識精煉方法有很多優勢,比如不需要特定的硬件或實現就能直接加速模型。個人覺得這和遷移學習有些關聯。 

  • 多種小型平台(例如移動設備、機器人、自動駕駛汽車)的硬件限制仍然是阻礙深層 CNN 發展的主要問題。相比於壓縮,可能模型加速要更為重要,專用芯片的出現固然有效,但從數學計算上將乘加法轉為邏輯和位移運算也是一種很好的思路。

 

知識應該是開源的,歡迎斧正。929994365@qq.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM