摘要:模型壓縮演算法旨在將一個大模型轉化為一個精簡的小模型。工業界的模型壓縮方法有:知識蒸餾、輕量化模型架構、剪枝、量化。
本文分享自華為雲社群《深度學習模型壓縮方法綜述》,作者:嵌入式視覺 。
一,模型壓縮技術概述
因為嵌入式裝置的算力和記憶體有限,因此深度學習模型需要經過模型壓縮後,方才能部署到嵌入式裝置上。
在一定程度上,網路越深,引數越多,模型也會越複雜,但其最終效果也越好。而模型壓縮演算法是旨在將一個龐大而複雜的預訓練模型轉化為一個精簡的小模型。本文介紹了卷積神經網路常見的幾種壓縮方法。
按照壓縮過程對網路結構的破壞程度,《解析卷積神經網路》一書中將模型壓縮技術分為“前端壓縮”和“後端壓縮”兩部分:
- 前端壓縮,是指在不改變原網路結構的壓縮技術,主要包括
知識蒸餾
、輕量級網路(緊湊的模型結構設計)以及濾波器(filter)層面的剪枝(結構化剪枝)
等; - 後端壓縮,是指包括
低秩近似
、未加限制的剪枝(非結構化剪枝/稀疏)、引數量化
以及二值網路等,目標在於儘可能減少模型大小,會對原始網路結構造成極大程度的改造。
總結:前端壓縮幾乎不改變原有網路結構(僅僅只是在原模型基礎上減少了網路的層數或者濾波器個數),後端壓縮對網路結構有不可逆的大幅度改變,造成原有深度學習庫、甚至硬體裝置不相容改變之後的網路。其維護成本很高。
1.1,模型壓縮技術分類
工業界主流的模型壓縮方法有:知識蒸餾(Knowledge Distillation,KD)輕量化模型架構(也叫緊湊的模型設計)、剪枝(Pruning)、量化(Quantization)。各個模型壓縮方法總結如下:
模型壓縮方法 | 描述 | 涉及的網路層 | 示例 |
---|---|---|---|
知識蒸餾 | 屬於遷移學習的一種,主要思想是將學習能力強的複雜教師模型中的“知識”遷移到簡單的學生模型中。 | 卷積和全連線層 | 經典KD論文,屬於蒸 "logits"方法,將Teacher Network輸出的soft label作為標籤來訓練Student Network。必須重新訓練模型。 |
輕量化模型架構 | 輕量級網路的核心是在儘量保持精度的前提下,從體積和速度兩方面對網路進行輕量化改造。 | 卷積層/卷積模組 | Mobilenet 提出深度可分離卷積; shufflenetv2 論文 提出的四個高效網路設計的實用指導思想; RepVGG 提出重引數化思想。 都需要重新設計 backbone 和和重新訓練模型。 |
剪枝 | 將權重低於閾值的連線都從網路中刪除。 | 卷積層和全連線層 | 韓松2016年Deep Compression屬於開山之作,剪枝步驟:正常訓練,刪除網路中權重低於閾值的連線層,重新訓練。需要重新訓練模型。 |
量化 | 指將神經網路的浮點演算法轉換為定點演算法 | 卷積、全連線、啟用、BN層等 | TensoRT框架中的基於 KL 散度方法的INT8量化策略是主流技術。PTQ 訓練後量化方法不需要重新訓練模型。 |
二,知識蒸餾
一個複雜模型可由多個簡單模型或者強約束條件訓練得到。複雜模型特點是效能好,但其引數量大,計算效率低。小模型特點是計算效率高,但是其效能較差。知識蒸餾是讓小模型去擬合大模型,從而讓小模型學到與大模型相似的函式對映。使其保持其快速的計算速度前提下,同時擁有複雜模型的效能,達到模型壓縮的目的。模型蒸餾的關鍵在於監督特徵的設計,例如使用 Soft Target
(軟標籤 KD
) 所提供的類間相似性作為依據,或使用大模型的中間層特徵圖或 attention map 作為暗示,對小網路進行訓練。整體的框架圖如圖下所示。
三,輕量化模型架構
關於如何手動設計輕量級網路的研究,目前還沒有廣泛通用的準則,只有一些指導思想,和針對不同晶片平臺(不同晶片架構)的一些設計總結,建議大家從經典論文中吸取指導思想和建議,然後自己實際做各個硬體平臺的部署和模型效能測試。
3.1,如何設計高效CNN架構
一些結論
- 分析模型的推理效能得結合具體的推理平臺(常見如:英偉達
GPU
、移動端ARM
CPU
、端側NPU
晶片等);目前已知影響CNN
模型推理效能的因素包括: 運算元計算量FLOPs
(引數量Params
)、卷積block
的記憶體訪問代價(訪存頻寬)、網路並行度等。但相同硬體平臺、相同網路架構條件下,FLOPs
加速比與推理時間加速比成正比。 - 建議對於輕量級網路設計應該考慮直接
metric
(例如速度speed
),而不是間接metric
(例如FLOPs
)。 FLOPs
低不等於latency
低,尤其是在有加速功能的硬體 (GPU
、DSP
與TPU
)上不成立,得結合具硬體架構具體分析。- 不同網路架構的
CNN
模型,即使是FLOPs
相同,但其MAC
也可能差異巨大。 Depthwise
卷積操作對於流水線型CPU
、ARM
等移動裝置更友好,對於平行計算能力強的GPU
和具有加速功能的硬體(專用硬體設計-NPU 晶片)上比較沒有效率。Depthwise
卷積運算元實際上是使用了大量的低FLOPs
、高資料讀寫量的操作。因為這些具有高資料讀寫量的操作,再加上多數時候GPU
晶片算力的瓶頸在於訪存頻寬,使得模型把大量的時間浪費在了從視訊記憶體中讀寫資料上,從而導致GPU
的算力沒有得到“充分利用”。結論來源知乎文章-FLOPs與模型推理速度和論文 G-GhostNet。
一些建議
- 在大多數的硬體上,
channel
數為16
的倍數比較有利高效計算。如海思351x
系列晶片,當輸入通道為4
倍數和輸出通道數為16
倍數時,時間加速比會近似等於FLOPs
加速比,有利於提供NNIE
硬體計算利用率。(來源海思351X
晶片文件和MobileDets
論文) - 低
channel
數的情況下 (如網路的前幾層),在有加速功能的硬體使用普通convolution
通常會比separable convolution
有效率。(來源 MobileDets 論文) - shufflenetv2 論文 提出的四個高效網路設計的實用指導思想: G1同樣大小的通道數可以最小化
MAC
、G2-分組數太多的卷積會增加MAC
、G3-網路碎片化會降低並行度、G4-逐元素的操作不可忽視。 GPU
晶片上 3×33×3 卷積非常快,其計算密度(理論運算量除以所用時間)可達 1×11×1 和 5×55×5 卷積的四倍。(來源 RepVGG 論文)- 從解決梯度資訊冗餘問題入手,提高模型推理效率。比如 CSPNet 網路。
- 從解決
DenseNet
的密集連線帶來的高記憶體訪問成本和能耗問題入手,如 VoVNet 網路,其由OSA
(One-Shot Aggregation
,一次聚合)模組組成。
3.2,輕量級模型部署總結
在閱讀和理解經典的輕量級網路 mobilenet
系列、MobileDets
、shufflenet
系列、cspnet
、vovnet
、repvgg
等論文的基礎上,做了以下總結:
- 低算力裝置-手機移動端
cpu
硬體,考慮mobilenetv1
(深度可分離卷機架構-低FLOPs
)、低FLOPs
和 低MAC
的shuffletnetv2
(channel_shuffle
運算元在推理框架上可能不支援) - 專用
asic
硬體裝置-npu
晶片(地平線x3/x4
等、海思3519
、安霸cv22
等),分類、目標檢測問題考慮cspnet
網路(減少重複梯度資訊)、repvgg2
(即RepOptimizer
:vgg
型直連架構、部署簡單) - 英偉達
gpu
硬體-t4
晶片,考慮repvgg
網路(類vgg
卷積架構-高並行度有利於發揮gpu
算力、單路架構省視訊記憶體/記憶體,問題:INT8 PTQ
掉點嚴重)
MobileNet block
(深度可分離卷積 block
, depthwise separable convolution block
)在有加速功能的硬體(專用硬體設計-NPU
晶片)上比較沒有效率。
這個結論在 CSPNet 和 MobileDets 論文中都有提到。
除非晶片廠商做了定製最佳化來提高深度可分離卷積 block
的計算效率,比如地平線機器人 x3
晶片對深度可分離卷積 block
做了定製最佳化。
下表是 MobileNetv2
和 ResNet50
在一些常見 NPU
晶片平臺上做的效能測試結果。
以上,均是看了輕量級網路論文總結出來的一些不同硬體平臺部署輕量級模型的經驗,實際結果還需要自己手動執行測試。
四,模型剪枝
深度學習模型中一般存在著大量冗餘的引數,將權重矩陣中相對“不重要”的權值剔除(即置為 0
),可達到降低計算資源消耗和提高實時性的效果,而對應的技術則被稱為模型剪枝。
圖片來源論文Han et al. Learning both Weights and Connections for Efficient Neural Networks, NIPS 2015
剪枝演算法步驟:
- 正常訓練模型;
- 模型剪枝;
- 重新訓練模型
以上三個步驟反覆迭代進行,直到模型精度達到目標,則停止訓練。
模型剪枝演算法根據粒度的不同,可以粗分為4種粒度:
- 細粒度剪枝(fine-grained):對連線或者神經元進行剪枝,它是粒度最小的剪枝。
- 向量剪枝(vector-level):它相對於細粒度剪枝粒度更大,屬於對卷積核內部(intra-kernel)的剪枝。
- 核剪枝(kernel-level):去除某個卷積核,它將丟棄對輸入通道中對應計算通道的響應。
- 濾波器剪枝(Filter-level):對整個卷積核組進行剪枝,會造成推理過程中輸出特徵通道數的改變。
五,模型量化
模型量化是指將神經網路的浮點演算法轉換為定點。量化有一些相似的術語,低精度(Low precision)可能是常見的。
- 低精度模型表示模型權重數值格式為
FP16
(半精度浮點)或者INT8
(8位的定點整數),但是目前低精度往往就指代INT8
。 - 常規精度模型則一般表示模型權重數值格式為
FP32
(32位浮點,單精度)。 - 混合精度(Mixed precision)則在模型中同時使用
FP32
和FP16
的權重數值格式。FP16
減少了一半的記憶體大小,但有些引數或運算子必須採用FP32
格式才能保持準確度。
模型量化過程可以分為兩部分:將模型從 FP32 轉換為 INT8(即量化算術過程),以及使用 INT8 進行推理。
5.1,模型量化的方案
在實踐中將浮點模型轉為量化模型的方法有以下三種方法:
data free
:不使用校準集,傳統的方法直接將浮點引數轉化成量化數,使用上非常簡單,但是一般會帶來很大的精度損失,但是高通最新的論文DFQ
不使用校準集也得到了很高的精度。calibration
:基於校準集方案,透過輸入少量真實資料進行統計分析。很多晶片廠商都提供這樣的功能,如tensorRT
、高通、海思、地平線、寒武紀finetune
:基於訓練finetune
的方案,將量化誤差在訓練時模擬建模,調整權重使其更適合量化。好處是能帶來更大的精度提升,缺點是要修改模型訓練程式碼,開發週期較長。
按照量化階段的不同,量化方法分為以下兩種:
- Post-training quantization
PTQ
(訓練後量化、離線量化); - Quantization-aware training
QAT
(訓練時量化,偽量化,線上量化)。
5.2,量化的分類
目前已知的加快推理速度機率較大的量化方法主要有:
- 二值化,其可以用簡單的位運算來同時計算大量的數。對比從 nvdia gpu 到 x86 平臺,1bit 計算分別有 5 到128倍的理論效能提升。且其只會引入一個額外的量化操作,該操作可以享受到 SIMD(單指令多資料流)的加速收益。
- 線性量化(最常見),又可細分為非對稱,對稱和
ristretto
幾種。在nvdia gpu
,x86
、arm
和 部分AI
晶片平臺上,均支援8bit
的計算,效率提升從1
倍到16
倍不等,其中tensor core
甚至支援4bit
計算,這也是非常有潛力的方向。線性量化引入的額外量化/反量化計算都是標準的向量操作,因此也可以使用SIMD
進行加速,帶來的額外計算耗時不大。 - 對數量化,一種比較特殊的量化方法。兩個同底的冪指數進行相乘,那麼等價於其指數相加,降低了計算強度。同時加法也被轉變為索引計算。目前
nvdia gpu
,x86
、arm
三大平臺上沒有實現對數量化的加速庫,但是目前已知海思351X
系列晶片上使用了對數量化。
六,壓縮方法總結
- 一般情況下,引數剪枝,特別是非結構化剪枝,能大大壓縮模型大小,且不容易丟失分類精度。對於需要穩定的模型分類的應用,非結構化剪枝成為首要選擇。
- 如果需要一次性端對端訓練得到壓縮與加速後模型,可以利用基於緊性濾波設計的深度神經網路壓縮與加速方法。
- 影響神經網路推理速度主要有
4
個因素:FLOPs、MAC、計算並行度、硬體平臺架構與特性(算力、GPU記憶體頻寬)。
參考資料