如何讓深度學習模型更高效地執行

2021-10-06 03:18:15 字數 2075 閱讀 2751

1.bottleneck或者depthwise或者winograd

bottleneck或者depthwise這兩種方法可以大大降低參數量和計算量,winograd是降低卷積的乘法量(沒有任何精度損失),詳見我的另外三篇部落格;

需要注意的是winograd/fft卷積不一定有利於模型加速

2.稀疏化

稀疏化主要指的是核的稀疏化,指的是在模型訓練過程中通過正則項對引數加以限制(本意是防止過擬合),使得部分引數為0,這樣子可以大大提公升卷積im2col的速度,但是如果不是規則化的稀疏化,依賴於特殊的訪問和計算庫,所以在一般的gpu上實現不了真正的加速,稀疏化後更有利於模型的剪枝操作.

**[10]提出了structured sparsity learning的學習方式,能夠學習乙個稀疏的結構來降低計算消耗,所學到的結構性稀疏化能夠有效的在硬體上進行加速。由於在gemm中將weight tensor拉成matrix的結構(即im2col操作),因此可以通過將filter級與shape級的稀疏化進行結合來將2d矩陣的行和列稀疏化,再分別在矩陣的行和列上裁剪掉剔除全為0的值可以來降低矩陣的維度從而提公升模型的運算效率。該方法是regular的方法,壓縮粒度較粗,可以適用於各種現成的演算法庫,但是訓練的收斂性和優化難度不確定。

它的缺點是工程實現較難,需要fine tune,不易於解耦模型研究和部署加速。另外稀疏矩陣運算的實際效率往往也不高。

那麼在工程上如何解決呢?如同上文所說,採用regular的方式,通過結構化稀疏,通過一些方式保證稀疏矩陣中0以一定的規律出現,例如同一列、同一行、某些塊等,盡量提高稀疏矩陣運算的效果。

3.低精度運算(量化)

低精度運算具體而言就是使用更低位寬,實現成倍降低的訪存量,同時使部分處理器上效能成倍提高。

舉個例子,fp16相比fp32,一半的位寬,幾乎沒有精度損失;int8相比fp32,1/4的位寬,採用正確的方式進行量化後也幾乎沒有精度損失。缺點是目前支援的硬體不多,新一代的arm處理器和部分英偉達的gpu支援。

裁剪的方法是根據預訓練得到的全精度神經網路模型中的資料分布,分別對階碼和位數的長度進行適當的減少。實驗證明,對於大部分的任務來說,6位位元或者8位位元的資料已經能夠保證足夠好的測試準確率。

qnn在實際的操作中通常有兩種應用方式,一種是直接在軟體層面實現整形的量化,通過更少的資料位數來降低神經網路在使用時計算的複雜度;另一種重要的應用是針對於ai專用晶元的開發。

由於晶元開發可以設計各種位寬的乘法器,因此將神經網路中32位的全精度資料可以被處理成6位或8位的浮點數,同時結合硬體指定的乘法規則,就可以在硬體上實現更高的運算效率,達到實時執行深度神經網路的目的。這也是qnn最大的理論意義。但是如果從軟體角度而非硬體角度出發,只是將浮點數量化成整形數,就沒有辦法顯著地降低計算複雜度(除非對整形再進行量化),也就無法達到在低配硬體環境上實時執行深度神經網路的目的。因此,在軟體設計的層面上,qnn相比bnn並沒有特別明顯的優勢。

4.graph層面上

5.operater粒度上:以上兩個沒有具體看,具體參照:讓深度學習更高效執行的兩個視角 | ***** reading第二季第一期

7.模型剪枝

所謂的模型剪枝,就是把一些不重要的connection或者filter去掉,來減少模型引數和計算量

同樣也分為regular和iregular兩種方式

pruning filters for efficient convnets:

把數值低的引數視為不重要的,對於乙個filter,其中所有weight的絕對值求和,來作為該filter的評g價指標,將一層中值低的filter裁掉,可以有效的降低模型的複雜度並且不會給模型的效能帶來很大的損失,演算法流程如下:

1.對於每乙個卷積核,計算其引數的和

2.根據引數和排序

3.把引數和最小的m個filter以及它們對應的featuremap去掉,下一層的kernel和featuremap也要去掉

4.為影響到的上下層建立新的kernel matrix,剩下的引數儲存到新模型當中;

作者在裁剪的時候同樣會考慮每一層對裁剪的敏感程度,作者會單**剪每一層來看裁剪後的準確率。對於裁剪較敏感的層,作者使用更小的裁剪力度,或者跳過這些層不進行裁剪。目前這種方法是實現起來較為簡單的,並且也是非常有效的,它的思路非常簡單,就是認為引數越小則越不重要。

其他的沒怎看了

大資料時代,如何讓學習更高效

說起 讓學習更高效 這個話題,我們不難發現這其實是個老話題。懂點教育的人會都知道,有效,還是無效 低效,還是高效 是搞課堂教學的人歷來就關注的永恆的主題。一堂課先生講來抑揚頓挫,聲音圓潤洪亮,但一下課便 心生蒼茫 這是一堂低效甚至無效的課。真正的高效的課堂自然會讓 伸手可觸控到知識與技能的紋理,俯仰...

技術團隊,如何更高效地開會?

編輯 小智 會議目標混亂不堪,與會人員莫名其妙,會議冗長且無趣,浪費時間耗費生命,咋整?寫在前面 相信很多做技術的朋友都一樣,我們都是非常討厭開會的人。我們只希望能夠靜下心來,沉醉在自己的 世界中,為了讓世界變得更加美好,而付出自己的青春,這才是我們程式設計師的夢想,這才是我們最應該去做的事情。為何...

如何更高效的學習

針對學習,不同的人的認知能力是有差距的,不同的學科也會呈現不同的特點,所以我們要具體問題具體分析。但下面這些基本原則和方法,我認為是很有參考價值的,故總結如下,希望能給讀者帶來啟發和幫助。三大核心原則 1.關聯 人類的認識本質是乙個概念迭代的過程,即用已有知識去認知未知物件,當兩者可以找到關聯時,就...