模型剪枝,不可忽視的推斷效率提升方法 - 機器之心Pro

2021-01-08 機器之心Pro

選自TowardsDataScience

作者:Ranjeet Singh機器之心編譯參與:路剪枝是常用的模型壓縮方法之一,本文對剪枝的原理、效果進行了簡單介紹。

目前,深度學習模型需要大量算力、內存和電量。當我們需要執行實時推斷、在設備端運行模型、在計算資源有限的情況下運行瀏覽器時,這就是瓶頸。能耗是人們對於當前深度學習模型的主要擔憂。而解決這一問題的方法之一是提高推斷效率。

大模型 => 更多內存引用 => 更多能耗

剪枝正是提高推斷效率的方法之一,它可以高效生成規模更小、內存利用率更高、能耗更低、推斷速度更快、推斷準確率損失最小的模型,此類技術還包括權重共享和量化。深度學習從神經科學中汲取過靈感,而剪枝同樣受到生物學的啟發。

隨著深度學習的發展,當前最優的模型準確率越來越高,但這一進步伴隨的是成本的增加。本文將對此進行討論。

挑戰 1:模型規模越來越大

我們很難通過無線更新(over-the-air update)分布大模型。

來自 Bill Dally 在 NIPS 2016 workshop on Efficient Methods for Deep Neural Networks 的演講。

挑戰 2:速度

使用 4 塊 M40 GPU 訓練 ResNet 的時間,所有模型遵循 fb.resnet.torch 訓練。

訓練時間之長限制了機器學習研究者的生產效率。

挑戰 3:能耗

AlphaGo 使用了 1920 塊 CPU 和 280 塊 GPU,每場棋局光電費就需要 3000 美元。

這對於行動裝置意味著:電池耗盡

對於數據中心意味著:總體擁有成本(TCO)上升

解決方案:高效推斷算法

剪枝權重共享低秩逼近二值化網絡(Binary Net)/三值化網絡(Ternary Net)Winograd 變換剪枝所受到的生物學啟發

人工神經網絡中的剪枝受啟發於人腦中的突觸修剪(Synaptic Pruning)。突觸修剪即軸突和樹突完全衰退和死亡,是許多哺乳動物幼年期和青春期間發生的突觸消失過程。突觸修剪從公出生時就開始了,一直持續到 20 多歲。

Christopher A Walsh. Peter Huttenlocher (1931–2013). Nature, 502(7470):172–172, 2013.

修剪深度神經網絡

[Lecun et al. NIPS 89] [Han et al. NIPS 15]

神經網絡通常如上圖左所示:下層中的每個神經元與上一層有連接,但這意味著我們必須進行大量浮點相乘操作。完美情況下,我們只需將每個神經元與幾個其他神經元連接起來,不用進行其他浮點相乘操作,這叫做「稀疏」網絡。

稀疏網絡更容易壓縮,我們可以在推斷期間跳過 zero,從而改善延遲情況。

如果你可以根據網絡中神經元但貢獻對其進行排序,那麼你可以將排序較低的神經元移除,得到規模更小且速度更快的網絡。

速度更快/規模更小的網絡對於在行動裝置上運行它們非常重要。

如果你根據神經元權重的 L1/L2 範數進行排序,那麼剪枝後模型準確率會下降(如果排序做得好的話,可能下降得稍微少一點),網絡通常需要經過訓練-剪枝-訓練-剪枝的迭代才能恢復。如果我們一次性修剪得太多,則網絡可能嚴重受損,無法恢復。因此,在實踐中,剪枝是一個迭代的過程,這通常叫做「迭代式剪枝」(Iterative Pruning):修剪-訓練-重複(Prune / Train / Repeat)。

想更多地了解迭代式剪枝,可參考 TensorFlow 團隊的代碼:https://github.com/tensorflow/model-optimization/blob/master/tensorflow_model_optimization/g3doc/guide/pruning/pruning_with_keras.ipynb

權重修剪

將權重矩陣中的多個權重設置為 0,這對應上圖中的刪除連接。為了使稀疏度達到 k%,我們根據權重大小對權重矩陣 W 中的權重進行排序,然後將排序最末的 k% 設置為 0。

f = h5py.File("model_weights.h5",'r+')for k in [.25, .50, .60, .70, .80, .90, .95, .97, .99]: ranks = {} for l in list(f[『model_weights』])[:-1]: data = f[『model_weights』][l][l][『kernel:0』] w = np.array(data) ranks[l]=(rankdata(np.abs(w),method= 'dense')—1).astype(int).reshape(w.shape) lower_bound_rank = np.ceil(np.max(ranks[l])*k).astype(int) ranks[l][ranks[l]<=lower_bound_rank] = 0 ranks[l][ranks[l]>lower_bound_rank] = 1 w = w*ranks[l] data[…] = w

單元/神經元修剪

將權重矩陣中的多個整列設置為 0,從而刪除對應的輸出神經元。為使稀疏度達到 k%,我們根據 L2 範數對權重矩陣中的列進行排序,並刪除排序最末的 k%。

f = h5py.File("model_weights.h5",'r+')for k in [.25, .50, .60, .70, .80, .90, .95, .97, .99]: ranks = {} for l in list(f['model_weights'])[:-1]: data = f['model_weights'][l][l]['kernel:0'] w = np.array(data) norm = LA.norm(w,axis=0) norm = np.tile(norm,(w.shape[0],1)) ranks[l] = (rankdata(norm,method='dense')—1).astype(int).reshape(norm.shape) lower_bound_rank = np.ceil(np.max(ranks[l])*k).astype(int) ranks[l][ranks[l]<=lower_bound_rank] = 0 ranks[l][ranks[l]>lower_bound_rank] = 1 w = w*ranks[l] data[…] = w

隨著稀疏度的增加、網絡刪減越來越多,任務性能會逐漸下降。那麼你覺得稀疏度 vs. 性能的下降曲線是怎樣的呢?

我們來看一個例子,使用簡單的圖像分類神經網絡架構在 MNIST 數據集上執行任務,並對該網絡進行剪枝操作。

下圖展示了神經網絡的架構:

參考代碼中使用的模型架構。

稀疏度 vs. 準確率。讀者可使用代碼復現上圖(https://drive.google.com/open?id=1GBLFxyFQtTTve_EE5y1Ulo0RwnKk_h6J)。

總結

很多研究者認為剪枝方法被忽視了,它需要得到更多關注和實踐。本文展示了如何在小型數據集上使用非常簡單的神經網絡架構獲取不錯的結果。我認為深度學習在實踐中用來解決的許多問題與之類似,因此這些問題也可以從剪枝方法中獲益。

參考資料本文相關代碼:https://drive.google.com/open?id=1GBLFxyFQtTTve_EE5y1Ulo0RwnKk_h6JTo prune, or not to prune: exploring the efficacy of pruning for model compression, Michael H. Zhu, Suyog Gupta, 2017(https://arxiv.org/pdf/1710.01878.pdf)Learning to Prune Filters in Convolutional Neural Networks, Qiangui Huang et. al, 2018(https://arxiv.org/pdf/1801.07365.pdf)Pruning deep neural networks to make them fast and small(https://jacobgil.github.io/deeplearning/pruning-deep-learning)使用 Tensorflow 模型優化工具包優化機器學習模型(https://www.tensorflow.org/model_optimization)

相關焦點

  • 生成式模型入門:訓練似然模型的技巧 - 機器之心Pro
    機器之心編譯參與:李志偉、Geek AI生成模型不止有 GAN,本教程討論了數學上最直接的生成模型(易處理的密度估計模型)。讀罷本文,你將了解如何定量地比較似然模型。散度最小化:生成模型的一般框架生成模型(其實都是統計機器學習模型)旨在從一些(可能是條件的)概率分布 p(x) 中取樣本數據,並學習對 p(x) 進行近似的模型 pθ(x)。建模過程使我們可以基於給定的原始數據外推觀察到的信息。
  • 先看看這份2019機器學習與NLP年度盤點吧
    機器之心編譯作者:Sebastian Ruder機器之心編譯參與:王子嘉、Geek AI2019 年是機器學習和自然語言處理領域飛速發展的一年。., 2019)和 PIRL(Misra & van der Maaten, 2019)在內的模型,以及為了提升在 ImageNet 數據上的採樣效率與圖像生成效果而提出的強大的生成器模型 BigBiGAN(Donahue & Simonyan, 2019)都利用了自監督學習方法。
  • 想入門機器學習?機器之心為你準備了一份中文資源合集
    機器之心整理參與:機器之心編輯部機器學習日益廣為人知,越來越多的計算機科學家和工程師投身其中。不幸的是,理論、算法、應用、論文、書籍、視頻等信息如此之多,很容易讓初學者迷失其中,不清楚如何才能提升技能。本文作者依據自身經驗給出了一套快速上手的可行方法及學習資源的分類匯總,機器之心在其基礎上做了增益,希望對讀者有所幫助。
  • EMNLP2018最佳論文:Facebook 提升 11BLEU 的無監督機器翻譯
    為了做到這一點,當前的機器翻譯(MT)系統需要訪問大量的已翻譯文本(例如,分別用英語和西班牙語表示的相同文本對)。因此,MT 目前僅對於已擁有大量翻譯文本的少數語言集表現出不錯的效果。在訓練模型時無需訪問任何翻譯文本資源的 MT 模型的建立(稱為無監督翻譯)是必要的下一步。
  • 機器之心獨家對話百度 NLP:先解決語義理解,再談機器翻譯取代人類
    機器之心原創作者:虞喵喵9 月 28 日,Google 在 Research Blog 中介紹其神經網絡機器翻譯系統(GNMT)進展,譯文質量的大幅提升引發業內極大關注。據稱,在雙語評估者的幫助下,通過對維基百科和新聞網站的例句測定,在多個樣本的翻譯中谷歌神經網絡機器翻譯系統將錯誤降低了 55-85%甚至更多。
  • 模型選擇與多模型推斷
    此文基於AIC的判定方法,利用模型選擇和多模型推斷(model selection and multimodel inference)探討千島湖島嶼鳥類多樣性的決定因素。同時開展對千島湖墓葬分布的可能性分析,為盜墓的理論研究打下翔實的基礎。
  • 淺析基於隱變量的非自回歸神經機器翻譯方法
    雖然最近提出的幾個模型利用卷積[1]或者自注意力[2]使得訓練過程高度並行化,加快了訓練速度。但由於其自回歸的特性,模型的推理過程非常緩慢,這對於對於實際的工業應用是個很大的挑戰。因此,怎樣提升模型的推理速度成為了一個新的研究熱點。
  • 比Tiny YOLOv3小8倍,性能提升11個點,4MB的網絡也能做目標檢測
    選自arXiv作者:Alexander Wong等機器之心編譯在本文中,來自滑鐵盧大學與 Darwin AI 的研究者提出了名為 YOLO Nano 的網絡,他們通過人與機器協同設計模型架構大大提升了性能。
  • 搜狗機器翻譯團隊獲得 WMT 2017 中英機器翻譯冠軍
    本文由機器之心編輯,「機器之心」專注生產人工智慧專業性內容,適合開發者和從業者閱讀參考。點擊右上角即刻關注。每年的第三季度都是機器學習相關的頂級學術會議密集召開的時期,今年也不例外。採用了 Geoffrey Hinton 團隊提出的網絡層正則化(layer normalization)技術,極大提高了模型訓練效率,同時改善了模型的翻譯質量。從這一張「技巧清單」中,我們可以看出,搜狗的機器翻譯團隊在自然語言處理和深度學習方面有非常深厚的積累。
  • 機器之心編譯 - 機器之心Pro
    本文整體梳理了 Python 的基本語法與使用方法,並重點介紹了對機器學習十分重要且常見的語法,如基本的條件、循環語句,基本的列表和字典等數據結構,此外還介紹了函數的構建和對象與類的聲明。這些在使用 Python 執行機器學習任務中十分常見,它可以為我們搭建一個基本的使用框架。首先,什麼是 Python?
  • 如何提升家用跑步機使用效率?這一點很多用戶都會忽視
    不知道大家在入手家用跑步機之後是否能夠保證使用效率和鍛鍊效果,對比在健身房鍛鍊或者請私教,在家跑步可能會陷入疑惑不知道該如何提高運動用效率。在這裡為大家推薦幾個提高家用跑步機使用效率的方法,也為還沒有購買的朋友提供一些參考。
  • ResNet壓縮20倍,Facebook提出新型無監督模型壓縮量化方法
    機器之心原創作者:立早怎樣用量化方法解決模型壓縮問題?Facebook 近日提出了一個基於向量的量化方法,無需標註數據即可對 ResNet 模型進行20倍壓縮,還能夠獲得很高的準確率。這類方法用低bit權重,優點是可以加速推理過程,利用位操作代替複雜的邏輯操作,但是同時也會帶來一個比較大的精度下降。量化。向量量化(VQ[3])和乘積量化(PQ[4])是其中的典型。這種量化方法是將原始的高維向量分解至低維笛卡爾積,然後對分解得到的低維向量做量化,這種方法的缺點是對於深度網絡會產生一個笛卡爾漂移。剪枝。
  • 這家公司正在影響大公司決策,還開發了一款機器學習優化引擎
    在為企業提供決策支撐的同時,杉數還在進行機器學習優化引擎的開發。與 H2o.ai 類似,這款優化引擎可供各類機器學習方案調用,提升學習效率。目前,杉數已經完成回歸類分析、分類及變種問題上的算法開發,仍在開發更多場景、優化並行效率,預計將在今年 7 月正式發布。
  • 樹模型(一)——樹的構造
    前言樹模型是最常見的機器學習方法之一,也是入門機器學習必須掌握的基礎。樹模型通常分為分類樹和回歸樹。預剪枝預剪枝是指在決策樹的生成過程中,在結點劃分前進行評估判斷。若當前結點已經滿足截止條件或劃分後不能帶來性能的提升,則停止劃分並將當前結點標記為葉子結點。
  • 陳丹琦新作:關係抽取新SOTA,用pipeline方式挫敗joint模型
    機器之心報導編輯:魔王、小舟端到端關係抽取涉及兩個子任務:命名實體識別和關係抽取。近期研究多採用 joint 方式建模兩個子任務,而陳丹琦等人新研究提出一種簡單高效的 pipeline 方法,在多個基準上獲得了新的 SOTA 結果。
  • 將科幻變成現實,谷歌百度用神經機器翻譯踐行人類的「巴別塔之夢」
    機器之心作者:iCombinator機器翻譯之夢今天,當我們很自然的拿出手機,選擇一個谷歌、百度或微軟的翻譯 app ,輕而易舉的完成文字翻譯、拍照翻譯和實時語音翻譯時,我們可能不會意識到由於深度學習的出現和數據量的積累,研究數十年的機器翻譯問題已經變得可用並走入了我們的生活,給我們帶來了極大便利。
  • 面對千萬級推薦,如何壓縮模型最高效?這是騰訊看點新框架
    機器之心發布機器之心編輯部推薦領域的模型壓縮一直是個極具挑戰性的問題,面對實際部署中數千萬或億級的推薦項,如何壓縮才能獲得最佳性能?具體來說,文中首先提出一種分塊自適應分解方法,通過利用 SRS 中的推薦項服從長尾分布的事實來近似輸入矩陣和 softmax 矩陣。為了減少中間層的參數,文中引入了三種分層參數共享方案。通過廣泛的消融研究,文中證明了所提出的 CpRec 在現實世界的 SRS 數據集中可以實現高達 4-8 倍的壓縮率。同時,CpRec 在訓練和推斷過程中速度更快,並且在大多數情況下勝過其未壓縮的模型。
  • IBM NeurIPS 2018 poster:把深度學習模型的表現遷移到傳統機器...
    在許多機器學習系統中,系統的可解釋性和模型性能往往是不可兼得的。因為許多性能最好的模型(即深度神經網絡)本質上都是黑盒。在 IBM 研究院改進簡單模型的工作中(https://arxiv.org/abs/1807.07506 ),他們提出一種將信息從高性能的神經網絡遷移到另一個領域專家或應用程式可能需要的模型的方法,從而彌補性能和可解釋性之間的鴻溝。