模型壓縮整理2020.5.6

https://www.bilibili.com/video/BV1LE411Z76J?p=2

AI領域最有趣的老師李宏毅:模型壓縮系列講解

模型壓縮

1、剪枝的理由

圖片.png

圖片.png

不用小的network直接訓練是因爲小網絡難以訓練,泛化性不好,提取特徵不好,容易卡在局部特徵,有論文表明只要模型夠大,就能提取全局有效的特徵。( [2019ICLR W](模型壓縮_剪枝_彩票理論)The Lottery Ticket Hypothesis: Finding Sparse, Trainable Neural Networks,larger network is easier to optimize),講到了大網絡就像大樂透一樣,買的多中的多,概率更大,隨機初始化,都可以找到最好的結果,但是很小的模型,隨機初始化參數,這組參數很可能找不到,優化的參數方向,小模型可能太小,但是有驗證這個很小的模型隨機參數初始化和大模型的一樣,還是可以訓練的,所以小的net有的可以訓練起來有的訓不起來。大的net實際包含更多的小的network組合有很多冗餘 ,而剪枝過程是找到近似於大的網絡中最有效的小的net,
2019 Rethinking the value of pruning 這篇論文和上一篇是矛盾的,小模型可以訓練起來

所以用剪枝的方式,將訓練好的大的網絡,一點點減去不中的層,權重再finune,直到模型精度滿足要求,不能一次減太多,不然finetune 不能恢復過來

剪枝的問題:
分爲權重剪枝和neuron 剪枝問題
1、剪枝後結構不對成,網絡很難實現,就算實現了,gpu 不好加速(矩陣的運算都會有問題),所以實際上不是直接刪掉,只是需要權重weight 部分設置0,但是又有問題,實際模型大小並沒有改變,如果是權重剪枝,可以丟掉甚至90%的參數,精度都沒有降低很多

圖片.png

2、所以剪枝的結構化剪裁會更合適

3、關鍵點,第一點重要性的衡量標準,第二點哪裏裁剪多少,即sparsity ratio的確定

剪枝的補充

網絡剪枝是網絡的壓縮和加速中一個重要的方向,自1989年LeCun提出以來,得到了迅速發展。現在主要分爲2種方向:1)權重剪枝;2)濾波器剪枝。濾波器剪枝相對於權重剪枝有一系列優點,包括它可以得到規則的模型,由此減少內存消耗,並且加速網絡的推斷。

結構化剪枝又包含三種剪枝維度,輸出通道剪枝(filter pruning),輸入通道剪枝(channel pruning)和輸出通道形狀剪枝(filter shape/column pruning)

結構化剪枝:直接去掉整個kernel的結構化信息;

非結構化剪枝:考慮每個kernel的每個元素,刪除kernel中不重要的參數;也稱爲稀疏剪枝。此爲權重級別的

1、從network pruning的粒度來說,可以分爲結構化剪枝(Structured pruning)和非結構化剪枝(Unstructured pruning)兩類。早期的一些方法是基於非結構化的,它裁剪的粒度爲單個神經元。如果對kernel進行非結構化剪枝,則得到的kernel是稀疏的,即中間有很多元素爲0的矩陣。除非下層的硬件和計算庫對其有比較好的支持,pruning後版本很難獲得實質的性能提升。稀疏矩陣無法利用現有成熟的BLAS庫獲得額外性能收益。因此,這幾年的研究很多是集中在structured pruning上。Structured pruning又可進一步細分:如可以是channel-wise的,也可以是filter-wise的,還可以是在shape-wise的。

————————————————

原文鏈接:https://blog.csdn.net/jinzhuojun/article/details/100621397

2、剪枝的有效性,剪枝和神經網絡架構搜索(NAS),能漸漸走到一起,是因爲發現,剪枝後的網絡結構纔是最重要的。一項最新研究發現,不管繼不繼承原始網絡的權重,已剪裁的網絡都可獲得相同精度。

2018年論文《Rethinking the Value of Network Pruning》,推翻了一些剪枝的基礎概念https://zhuanlan.zhihu.com/p/47349303

實驗表明,從頭開始訓練小修剪模型幾乎總能達到與典型的“訓練-剪枝-微調”流程獲得的模型相當或更高的精度。這改變了我們對過度參數化的必要性的理解,進一步證明了自動剪枝算法的價值,可以用來尋找高效的架構,併爲架構設計提供指導。

3、曠視研究院提出MetaPruning:基於元學習和AutoML的模型壓縮新方法

4、這一元學習方法有以下優勢:1)它比一般的 pruning baselines 精度高很多,比其他基於 AutoML 的通道剪裁方法精度更高或更好;2)它可根據不同的約束做靈活的優化而無需額外的超參數;3)它可高效裁剪類似於 ResNet 一樣帶有 short-cut 的網絡結構;4)整個 pipeline 極其高效。

5、目前剪枝比(sparsity ratio 和 pruning rate) ,

2019****閒話模型壓縮之網絡剪枝(Network Pruning)篇綜述:https://blog.csdn.net/jinzhuojun/article/details/100621397Sparsity Ratio****部分講解很好

預定義(predifined)和自動(automatic)兩種方式 ,

預定義(predifined)人工修改網絡如mobilenet,直接訓練,或者根據層的屬性爲每層設置最適合的sparsity ratio纔是最優的,這種爲每層專設的稱爲local sparsity,相對地前面那種就稱爲global sparsity。

(automatic)方法會根據所有的layer信息由pruning算法確定每層裁剪比例,就是相對於第一種方法自動找到最優結構的組合,不是提前自己設定一個確定的精簡網絡,自動找到每層的最優sparsity ratio

2、知識蒸餾

效果作用不是很大

通常認爲,大的網絡更好train,小的網絡不好trian,

但是目前仍有爭議,因爲也有很多反例,小的網絡也可以

爲什麼跟着教師網絡,會更好的學習:

會額外告訴學生網絡更多的信息,例如1不僅僅只有1的信息,還和7很類似的信息

所以沒有學習7的信息,它也能知道7的一點信息

最終學習是一系列模型的平均(ensemble [ɒnˈsɒmbl]),學習到的一個平均model,學生網絡

圖片.png

知識蒸餾softmax 有一個超參數,就是T,作用提高小輸入的值,由類似1000結果變成0.7 0.1 0.1 0.1的結果,像標籤平滑類似
,是的softmax 不同輸入之間的輸出拉近一點

圖片.png

3、參數量化

結論:
a1 二值權重網絡(BWN)是一種只針對神經網絡係數二值化的二值網絡算法
a二值神經網絡BNN只在小規模數據集上取得了較好的準確性,在大規模數據集上則效果很差,在bwn基礎上,BNN要求不僅對權重做二值化,同時也要對網絡中間每層的輸入值進行二值化。
B XNOR-net同或網絡是一種針對CNN的簡單、高效、準確近似方法,網絡在大規模數據集上的效果取得了巨大進步,其中在ImageNet上的正確性只比全精度的相同網絡低十個百分點。但是,在很多複雜任務中,這一結果依然不能滿足生產生活的需要。
C TWN三值權重網絡與BWN相當,但是準確率卻有着明顯的提升。
D QNN(用少的bit表示一個值,例如32bit用16bit 表示一個值),軟件上的實現和BNN比較沒有優勢,硬件上針對AI專用芯片的開發,芯片開發可以設計各種位寬的乘法器,因此將神經網絡中32位的全精度數據可以被處理成6位或8位的浮點數

1、用少的bit表示一個值,例如32bit用16bit 表示一個值
2、Weight clustering
分羣方法多種,加入是kmean 顏色分成四部分如下權重,取得平均值,不夠精準,但是network可以小很多
3、第二步的基礎上,進一步壓縮,更多出現的cluster用少bit,表示,反之,用多bits 表示
用到的哈夫曼編碼

圖片.png

1、極致,只用±1,binary weights,表示權重

量化模型(Quantized Model)是一種模型加速(Model Acceleration)方法的總稱,包括二值化網絡(Binary Network)、三值化網絡(Ternary Network),深度壓縮(Deep Compression)等

4、模型結構的修改

例如 DW可分離卷積,+1*1 卷積,修改原始的卷積,新的更小的網絡架構

模型壓縮加速的綜述

https://zhuanlan.zhihu.com/p/67871864

最新有效代碼工作:

1.1

2017 論文Channel Pruning for Accelerating Very Deep Neural Networks》中在進行channel pruning後,直接通過least square來得到最小化特徵重建精度下的新參數,因此不需要fine-tuning來恢復精度,是一種inference-time pruning方法。它的好處是pruning過程不需要訓練環境。

但是這種方法,人工加入的限定太多,而且引入了很多調節參數,調整和優化都麻煩,實用性不強。而且文章開頭說不需要retrain,其實還是pruning之後再來finetune一下效果比較好。

1、【論文筆記】AMC:AutoML for Model Compression and Acceleration on Mobile Devices

有代碼鏈接2018

論文:https://arxiv.org/abs/1802.03494 代碼:https://github.com/mit-han-lab/amc-release

本篇論文是MIT韓鬆老師組提出的一種模型壓縮方法,其核心思想是使用強化學習技術來實現自動化壓縮模型。目前對於領域問題的解決方案通常採取人工壓縮模型,手工壓縮方法需要相關領域的專家知識,需要人工在推理速度,大小與準確率之間權衡,因此人工壓縮難以得到最優的壓縮策略。與人工設計模型相比使用強化學習的產生壓縮策略從數據出發能夠找到更合適的壓縮策略。該篇文章講FLOPs減少4倍的情況下,對VGG-16模型壓縮,比人工壓縮策略策略高2.7%的精度。並將這種方法應用到更適合移動端設備的Mobilenet模型上,使模型更加輕量化。

————————————————

版權聲明:本文爲CSDN博主「shura_R」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/qq_30615903/article/details/102588437

上述論文在2020年論文中AAAI 2020 | 滴滴&東北大學提出自動結構化剪枝壓縮算法框架,性能提升高達120倍,提出問題在哪(https://zhuanlan.zhihu.com/p/103257169),

(1)只採用了單一的輸出通道(filter)剪枝維度;(2)爲了得到稀疏化模型,其所採用的剪枝方法僅僅是在模型訓練過程中引入一個靜態的正則項;(3)更深層次的侷限性在於其所採用的基於 DRL 框架的剪枝方法本質上與剪枝問題難以兼容。但由於 DRL 框架並不適合解決模型權重剪枝的超參數設置問題,AMC 研究的結果也佐證了這一觀點,其結果中最高壓縮率只有非結構化(non-structured)的 5 倍壓縮倍率。

2、【模型壓縮】MetaPruning:基於元學習和AutoML的模型壓縮新方法

有代碼鏈接2019

論文地址:https://arxiv.org/abs/1903.10258

開源代碼:https://github.com/megvii-model/MetaPruning

MetaPruning 作爲利用 AutoML 進行網絡裁剪的算法之一,有着 AutoML 所共有的省時省力,硬件定製等諸多優勢,同時也創新性地加入了先前 AutoML pruning 所不具備的功能,如輕鬆裁剪 shortcut 中的通道。

https://www.cnblogs.com/carsonzhu/p/11418536.html

3、ADAM-ADMM: A Unified, Systematic Framework of Structured…

ADMM,相比AMC不自動,第四篇論文主要以這個爲基準修改進行

http://bit.ly/2M0V7DO代碼 補充材料 http://bit.ly/2IBiNBk.  有代碼

4、AAAI 2020 | 滴滴&東北大學提出自動結構化剪枝壓縮算法框架,性能提升高達120倍,(https://zhuanlan.zhihu.com/p/103257169),

首次實現了目前最高效的深度神經網絡自動化結構化剪枝的通用框架 AutoCompress

模型權重剪枝(weight pruning 可以結構化也可以不結構化)其中,結構化剪枝(structured pruning)作爲能夠真正在平臺層面解決方法之一

首先,結構化剪枝包含三種剪枝維度,輸出通道剪枝(filter pruning),輸入通道剪枝(channel pruning)和輸出通道形狀剪枝(filter shape/column pruning)

沒git代碼公佈,http://bit.ly/2VZ63dS 模型鏈接Google

還自己推出了自動壓縮框架測試優於 優於 tensorflow lite TVM 框架

得到一個發現,

基於純過濾器剪枝的結果進行“從頭訓練”時,可以恢復相似的精度。此時過濾器/通道修剪類似於查找較小的DNN模型。

當基於組合結構修剪的結果形成“從頭開始訓練”時,精度無法恢復,基本的見解是,組合剪枝不僅僅是訓練較小的DNN模型,而是調整過濾器/內核形狀。

在這種情況下,修剪後的模型代表了一個僅通過DNN訓練無法實現的解決方案,即使已經給出了詳細的結構。

圖片.png

圖片.png

1、CVPR 2020 (Oral) ,CVPR2020-HRank:Filter Pruning using High-Rank Feature Map

重新定義了剪枝規則,從實驗效果來看,效率更高,與上述方法相比,用新的準則進行剪枝,方式簡單一點,有源代碼,

https://github.com/lmbxmu/HRank

#####################

【CVPR 2019 Oral】利用幾何中位數(Geometric Median)進行模型剪枝基於濾波器的幾何中位數的剪枝算法。我們提出的FPGM打破了以往的範數評價指標的侷限性,並且達到了更好的性能

其novelty(新奇點)主要在於提出了一個新的篩選指標-幾何中位數,然後加了求該指標理論推導,其他的如修剪流程和之前的流程完全相同,還是傳統的基於規則的剪枝方法。(因此可以結合使用這一個篩選指標,但是工程本身不推薦

2、Filter Grafting for Deep Neural Networks

CVPR 2020 | 模型壓縮新範式_濾波器嫁接技術

https://www.jianshu.com/p/a835eb8ce1d7

https://github.com/fxmeng/filter-grafting

下表展示了利用L1範數和熵值兩種指標評價濾波器好壞後,嫁接策略的性能。從結果中可以看出,利用熵值有更好的性能,進一步說明了熵值是一種更優秀的評價濾波器好壞的準則。沒有詳細看,不是最好的工作,後期可看借鑑以下

圖片.png

10、剪枝資料彙總

(1)https://github.com/NervanaSystems/distiller

這份代碼整合了時下比較經典的壓縮剪枝算法,當然也整合了本篇論文的AMC算法。設計模式思想體現的淋漓盡致,不愧爲工業界的正經代碼。拜讀源碼好幾天,真的是被秀到了。想要用起這份代碼還是需要一定功力的,如果只是paper做實驗推薦官方開源的代碼,在基礎上進行修改還是比較容易的,因爲功能比較單一註釋也很友好通俗易懂

(2)https://github.com/he-y/Awesome-Pruning#2020

神經網絡剪枝2017-2020,論文代碼彙總基本優秀論文都在,但是cvpr 2020沒有

(3)跟蹤韓明老師的工作,模型壓縮領域大牛,https://zhuanlan.zhihu.com/p/108096347

從算法到硬件部署,都有涉及。

圖片.png

圖片.png

三個步驟之後的壓縮率可以達到類似如下的幾十倍的壓縮率,並且模型精度沒有降低

圖片.png

別人的一些經驗說明
1、對於過參數化的高維度網絡,我想大致只能是定性的討論一下。首先,量化對性能的影響,其實本質是看網絡對噪聲的魯棒性(量化相當於加上量化噪聲),所以這個本質是考察系統的泛化能力。比較剪枝前後的網絡泛化能力的差異,由於剪枝的結果本質上還是在原有配置附近,所以泛化能力不會有本質的優化,相反,剪枝減少了系統中的信息通道數目,實際上會導致系統的魯棒性降低(剪枝前的網絡由於過參數化會有大量備份或者平行互補的信息通道,更形象的圖像是,網絡是構建了一個河道來對水流進行導流,網絡越大,河道越寬,導流能力越強,剪枝就是縮窄河道),所以剪枝會導致系統量化後性能更差一些

作者:匿名用戶
鏈接:https://www.zhihu.com/question/353189956/answer/875010319
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

2、不同的網絡層有不同的冗餘性,因此對於精度的要求也不同,當前已經有許多的芯片開始支持混合精度。通常來說,淺層特徵提取需要更高的精度,卷積層比全連接層需要更高的精度。如果手動的去搜索每一層的位寬肯定是不現實的,因此需要採用自動搜索策略。

1、部署問題,
(1)服務器部署:TensorRT是隻能用在NIVDIA的GPU上的推理框架:
需求三:放到服務器上跑,要求吞吐和時延(重點是吞吐)此時已經要脫離訓練框架,一般用TensorRT
這種應用在互聯網企業居多,一般是互聯網產品的後端AI計算,例如人臉驗證、語音服務、應用了深度學習的智能推薦等。
由於一般是大規模部署,這時不僅僅要考慮吞吐和時延,還要考慮功耗和成本。所以除了軟件外,硬件也會下功夫,比如使用推理專用的NVIDIA P4、寒武紀MLU100等。這些推理卡比桌面級顯卡功耗低,單位能耗下計算效率更高,且硬件結構更適合高吞吐量的情況
軟件上,一般都不會直接上深度學習框架。對於NVIDIA的產品,一般都會使用TensorRT來加速(我記得NVIDIA好像還有TensorRT inference server什麼的,名字記不清了,反正是不僅可以加速前傳,還順手幫忙調度了)。TensorRT用了CUDA、CUDNN,而且還有圖優化、fp16、int8量化等。反正用NVIDIA的一套硬軟件就對了

需求一:簡單的demo演示,只要看看效果的,像是學校裏面的demo展示這種
caffe、tf、pytorch等框架隨便選一個,切到test模式,拿python跑一跑就好,GUI顯示,高級一點,可以用CPython包一層接口,然後用C++工程去調用
需求二:要放到服務器上去跑,但一不要求吞吐二不要求時延的那種,說白了還是有點玩玩的意思
caffe、tf、pytorch等框架隨便選一個,按照官方的部署教程,老老實實用C++部署,例如pytorch模型用工具導到libtorch下跑

(2)移動端的部署:採用 騰訊ncnn,阿里的MNN,ncnn,tensorrt,mace,mnn
還有人推薦,tvm過人之處在於能夠自動調優,這是ncnn,tensorrt,mace,mnn等不具備的。支持各種平臺與開發,本人用過python,c++,java去調tvm的runtime,剩下的是,牛逼的代碼功能,開源移動端框架速度不夠——自己寫一套。比如像商湯、曠世、Momenta都有自己的前傳框架,性能應該都比開源框架好。只不過自己寫一套比較費時費力,且如果沒有經驗的話,很有可能費半天勁寫不好
2018年下半年,Intel公佈了一套基於視覺推斷與神經網絡優化(Visual Inference and neural network optimization)的AI工具集OpenVINOOpenVINO實現了一套通用的API,可以混合調用CPU、GPU、Movidius NCS (Neural Compute Stick)和FGPA的算力來共同完成一次視覺推斷。預先實現了一系列的功能庫、OpenCL kernel等等,可以縮短產品面世時間,優化了OpenCV、OpenVX等的一些功能調用。也開源

(3)實際部署流程
嵌入式部署的場景來進行分析:
一般從離線訓練到在線部署,我們需要依賴離線訓練框架(靜態圖:tensorflow、caffe,動態圖:pytorch、mxnet等),靜態圖工業部署成熟坑少,動態圖靈活便捷、預研方便,各有各的好處;還需要依賴在線inference的框架(如阿里的MNN、騰訊的NCNN等等,
一般流程我分爲如下幾步,1、模型設計和訓練 2、針對推斷框架的模型轉換 3、模型部署。雖然把整個流程分成三步,但三者之間是相互聯繫、相互影響的。首先第一步的模型設計需要考慮推斷框架中對Op的支持程度,從而相應的對網絡結構進行調整,進行修改或者裁剪都是經常的事情;模型轉換也需要確認推斷框架是否能直接解析,或者選取的解析媒介是否支持網絡結構中的所有Op,如果發現有不支持的地方,再權衡進行調整。

作者:糖心他爸
鏈接:https://www.zhihu.com/question/329372124/answer/809058784
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章