常見的模型加速方法


引自:https://zhuanlan.zhihu.com/p/147204568

方法主要有模型結構優化、模型剪枝、模型量化、知識蒸餾。

1、模型結構優化

總覽各種深度學習模型,可以發現它們都是由一個個小組件組裝而成,只是初期先把模型做大做強,后期落地遇到問題時,再瘦身優化。具體的優化方法依賴於具體的模型和業務,需要研究員因地制宜。上述這些優化操作都依賴於人工經驗,費時費力,組合優化這種事情更適合讓機器來做,於是神經網絡結構搜索(NAS)技術就應運而生。

2、模型剪枝

模型剪枝的初衷就是深度學習模型的過度參數化,說白了就是你的模型太胖了,跑不動,需要減肥。根據模型剪枝的方法可以分為兩大類:一類是結構化剪枝,另一類是非結構化剪枝。

所謂結構化剪枝是對參數矩陣做有規律的裁剪,比如按行或列裁剪,使得裁剪后的參數矩陣仍然是一個規則的的矩陣。結構化裁剪主流的方法有Channel-level、Vector-level、Group-level、Filter-level級別的裁剪。

非結構化剪枝是將原本稠密的參數矩陣裁剪為稀疏的參數矩陣,一般矩陣大小不變,其效果類似於參數正則化。因為目前大部分計算平台不支持稀疏矩陣的計算,只有結構化剪枝才能真正減少計算量。

模型剪枝的難點在於對“不重要”參數的定義和最優剪枝結構的搜索方法。目前主流的做法是訓練一個大模型,然后根據參數權重的大小對大模型進行剪枝,去除不重要的參數,最后再對剪枝后的模型fine-tune一下。但是這種方法收斂比較慢,而且最終得到的模型不一定是最優的。

為了解決這個問題,同時避免每次剪枝后重新訓練模型帶來的大量計算開銷,Metapruning方法設計了一個權重學習模型來學習不同網絡結構對應的權重矩陣,用於評估模型搜索過程中產生的模型的好壞,從而解決了模型評估過程中模型參數訓練的問題。Metapruning算法最大的創新點在於告訴我們模型參數可以直接“生成”,而不需要訓練。不過比較遺憾的時,“生成”的模型參數不能直接應用於模型推理,僅供對比評估。

小結:根據業界的實踐經驗,非結構化模型剪枝的模型精度損失較小,但受限於底層計算框架,計算加速效果有限。而結構化模型剪枝可以較大幅度地減少模型參數,實現可觀的計算加速,但容易造成明顯的性能損失

3、模型量化

模型量化是通過減少表示每個權重參數所需的比特數來壓縮原始網絡,從而實現計算加速。

半浮點精度(FP16)和混合精度是一種常見的做法,不過需要底層計算框架支持,否則無法實現計算加速。另一種是INT8量化,即將模型的權重參數從 FP32 轉換為 INT8,以及使用 INT8 進行推理。量化的加速主要得益於定點運算比浮點運算快,但從FP32量化為INT8會損失模型精度。

在我們的直觀印象中,神經網絡模型的權重參數一般都是位於0附近的很小的數值,權重參數的分布大概如下圖所示。而量化不會改變權重參數的分布,只是將權重參數從一個值域映射到另一個值域,過程類似於數值的歸一化。整個量化的思想很簡單,后續的研究都是圍繞如何提高量化后的模型的准確度。

圖2:深度神經網絡權重參數分布示例圖

 

采用普通量化方法時,靠近零的浮點值在量化時沒有精確地用定點值表示。因此,量化后的模型預測准確度會顯著下降,如均一量化,會將具有動態值密度的浮點映射成具有恆定值密度的定點。其中一種的做法是在量化過程中做值域調整。

值域調整的目標是學習能在量化后更准確地運行網絡的超參數 min/max,即歸一化參數。根據調整的時機,可以進一步划分為訓練后量化和訓練時量化,代表分別為 Nvidia Calibration 和 TensorFlow Quantization-aware Training。

除了上述常規量化操作,還有一些比較特殊的量化網絡,如二進制神經網絡、三元權重網絡、XNOR網絡。這些神經網絡以更少的位數來表示權重參數,比如二進制神經網絡是具有二進制權重和激活的神經網絡,即網絡權重只有1和-1,和量化不一樣的地方在於這二值權重參數是通過訓練時候的梯度優化得到,而不是從FP32量化得到。

小結:量化技術適用場景較廣,加速效果明顯。此外,對於精度敏感的模型,還可以通過精度補償的操作來進一步優化量化模型的效果。

3、知識蒸餾

模型蒸餾本質上和遷移學習類似,只是它還多了一個模型壓縮的目的,即通過模型蒸餾,將大模型壓縮為小模型,使小模型可以跑得又快又好。所以,最基本的想法就是將大模型學習得到的知識作為先驗,將先驗知識傳遞到小規模的神經網絡中,並在實際應用中部署小規模的神經網絡。在實際研究中,我們將大模型稱為Teacher,小模型稱為Student,模型蒸餾的過程就是讓Student去學習Teacher的知識。目前大部分模型蒸餾框架都是基於Teacher-Student的模式,只是有些方法會請多幾個Teacher或者配個Assistant。模型蒸餾的依據主要有三點:

  • Teacher可以從大量數據中學習數據結構間的相似性
  • Student可以利用Teacher學習到的知識作為先驗,加速模型的收斂
  • Softmax函數隨着溫度變量(temperature)的升高分布更均勻

數據結構的結構間相似是指相似樣本之間的預測值接近,所以大部分模型蒸餾方法都會讓Student去學習Teacher的logit輸出,而不是實際的預測值(實際預測值不能度量樣本間的相似性)。Teacher的先驗知識直觀上理解就是模型中間層的輸出,即Teacher處理數據的方式。這一點跟遷移學習很像,差異點在於模型蒸餾是要讓Student模型也學會處理類似的數據,並得到類似的輸出,而遷移學習一般是直接利用Teacher模型提供的參數或中間輸出。正所謂授人以魚不如授人以漁。

 

                                                                                                             圖3:Teacher-Student模型蒸餾基礎框架

 

基於Teacher-Student蒸餾框架,不同蒸餾方法的差異主要體現在讓Student模型學什么,如何學。

對比表征蒸餾讓Student模型學習一個表征(representation),這個表征在某些度量空間下正樣本對緊密靠近,同時負樣本對盡量分離,解決跨模態蒸餾的問題。

多步蒸餾則認為Teacher模型和Student模型差異比較大時,Student模型學不好,因此需要引入一個助教傳遞知識。

多任務蒸餾利用多個BERT模型擔任Teacher,教Student模型處理多任務問題。這時,Student模型的目標函數就變為多個任務的loss求和,每個訓練batch數據也會從多個任務中隨機采樣得到。

TinyBERT利用Two-stage方法,分別對預訓練階段和精調階段的BERT進行蒸餾,並且不同層都設計了損失函數,是目前為止效果最好的模型。

小結:模型蒸餾技術是通過用小模型替代大模型來實現推理階段的加速,適用於推理階段的加速。而在訓練階段,由於需要預訓練大模型,還需要付出額外的計算開銷。

 

加速深度學習模型訓練速度最有效的方法便是增加計算資源,將單機訓練的模型擴展為多機訓練。目前各大主流框架的多GPU分布式訓練一般存在兩種模式:模型並行和數據並行

 


免責聲明!

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



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