如何給深度學習加速 模型壓縮 推理加速

2021-09-10 10:06:52 字數 2121 閱讀 3889

深度學習模型往往受到端計算力的限制,無法很好的部署在移動端或無法降低端的計算成本。例如自動駕駛的模型就過於巨大,而且往往是很多模型並行,所以一般會用一些加速的方法來降低推算的計算力要求。

加速方法有多種不同角度:網路結構,模型推理加速,模型剪枝,引數量化等

table of contents

網路結構加速

模型推理加速

優化模型的推理順序

降低引數精度加速

模型剪枝加速

引數量化

所謂網路結構,就是使用結構更簡單的網路,例如適用於移動端的網路mobilenet和mobilenet2等。

在普通卷積神經網路的基礎上,mobilenet使用了拆分「滑窗遍歷」和「縱向channel」的方法來減少模型參數量。

例:普通卷積操作:5*5*3的卷積核去掃略9*9*3的特徵向量時,乙個卷積核的參數量應該是5*5*3(channel深度方向需要乘3),如果使用10個不同的卷積核,引數總量為:5*5*3*10 =750

mobilenet:對於9*9*3的特徵向量,分別使用3個5*5的卷積核去卷積每乙個channel,得到3個channel的特徵向量,再用10個1*1*3的卷積核去卷積得到的特徵向量來卷積獲取深度方向的關聯,同時同樣得到10個channel的特徵向量(和stride和padding無關),不過這樣拆分的過程使用的引數總量為:5*5*3+1*1*3*10 =105引數縮減了7倍多

nvidia推出的tensorrt工具可以進行模型推理層面的加速。

上圖是google inception模型的乙個block,雖然是不同的卷積方式的組合,但是第一層3個都使用了1*1的卷積,實際上在推理過程中,這3個1*1的卷積可以同時呼叫相同的函式來計算,但是在沒有優化之前,這三次1*1卷積需要呼叫三次相同的函式,這是可以優化的乙個點,這種推理優化只是優化的推理的順序,並不會影響模型推理的精度

通常,我們會使用float32 單精度的浮點數來對引數初始化,在推理過程中,實際上可以將float32轉成float16半精度或者int8來對模型的推理進行加速。半精度或int8的使用都需要有對應的硬體條件來使用。

tensorrt工具可以將float32轉成int8格式並執行在相應的支援的gpu上。

這種降低引數精度加速的方法會影響一些推理的精度需要權衡精度上的損失和速度上的加成

在模型推理時,實際上我們可以獲取每一層,每乙個單元的輸出,觀察這些輸出往往會發現一些值為0或者近似0的數值,這些單元在模型的推理中並不起作用,可以將其「剪」掉。剪掉之後除了可以減少推理過程的計算之外,還可以對剪枝後的模型再訓練幾個epoch,得到新的模型的表現往往會比剪枝前更好。

對4x4的卷積核裡的引數進行k-means聚類,這裡k=4,聚類完後得到兩個矩陣,乙個是聚類中心值,即每個種類引數的平均值;乙個是卷積核引數的類別index,該index可以用2bit int格式儲存。

所以儲存空間從32bit*16—>32bit*4+2bit*16。

上圖下方的梯度更新是在進行重新訓練,目的是為了調整量化後的引數,提公升一些精度(量化的過程會損失很多精度)。

tip:有時不一定會對原來的引數一次性量化,會量化一部分,留下一部分(留下的部分可以是絕對值比較小的,需要設定乙個閾值),然後對所有引數進行重新訓練,得到新的引數後再量化一部分迴圈迭代,直到所有引數被量化。

參考:

除了以上的方法外,還有知識蒸餾、低秩近似等。

深度學習模型壓縮

1 引入1 1的卷積降維 inception v1 例如googlenet,假設輸入是28 28 192的feature map,1 1的channel是64,3 3的channel是128,5 5的channel是32 在左圖被3個 不同尺寸的卷積核卷積之後,參數量是1 1 192 64 3 3 ...

深度學習模型壓縮

前言 目前在深度學習領域分類兩個派別,一派為學院派,研究強大 複雜的模型網路和實驗方法,為了追求更高的效能 另一派為工程派,旨在將演算法更穩定 高效的落地在硬體平台上,效率是其追求的目標。複雜的模型固然具有更好的效能,但是高額的儲存空間 計算資源消耗是使其難以有效的應用在各硬體平台上的重要原因。最近...

深度學習 模型壓縮 PaddleSlim

paddleslim是乙個模型壓縮工具庫,包含模型剪裁 定點量化 知識蒸餾 超參搜尋和模型結構搜尋等一系列模型壓縮策略。對於業務使用者,paddleslim提供完整的模型壓縮解決方案,可用於影象分類 檢測 分割等各種型別的視覺場景。同時也在持續探索nlp領域模型的壓縮方案。另外,paddleslim...