pocketflow終於公布原始碼

2021-08-28 05:18:17 字數 1990 閱讀 6903

把深度學習模型壓縮部署到手機上直接本地執行的趨勢,愈演愈烈。從google的tensorflow lite、蘋果的core ml,到小公尺今年6月推出的mace,移動端深度學習框架幾乎已成科技巨頭標配。

可是,究竟用哪個框架?選哪個模型壓縮演算法?超引數怎樣取值?眾多任務具擺到開發者面前的同時,問題也紛紛出現了。

全球首個自動模型壓縮框架

所謂「自動化」,就是說模型的壓縮和加速過程都是自動完成的。就像google automl使用者不用自己選擇模型架構一樣,使用pocketflow也不用自己選擇模型壓縮演算法和超引數取值,只要設定對效能指標的期待,讓框架自己完成剩下的工作就好。

人類需要費時費力調參才能達到的效能,對於pocketflow來說,只需要十幾次迭代。

不僅省人工,效果還不錯。

pocketflow經過100次迭代後搜尋得到的超引數組合,可以降低約0.6%的精度損失;通過使用超引數優化元件自動地確定網路中各層權重的量化位元數,pocketflow在對用於imagenet影象分類任務的resnet-18模型進行壓縮時,取得了一致性的效能提公升;當平均量化位元數為4位元時,超引數優化元件的引入可以將分類精度從63.6%提公升至68.1%(原始模型的分類精度為70.3%)。

在cifar-10資料集上,pocketflow壓縮的resnet-56模型,實現了2.5倍加速下分類精度損失0.4%,3.3倍加速下精度損失0.7%,且顯著優於未壓縮的resnet-44模型。

在imagenet資料集上,pocketflow可以把mobilenet模型壓縮到更小,但分類精度基本不變。在分類精度毫不遜於inception-v1、resnet-18等模型的條件下,pocketflow壓縮的mobilenet模型大小只有它們的20 - 40%。

模型壓縮演算法+超引數優化

pocketflow框架是怎樣壓縮深度學習模型的?

靠的是兩部分元件:一是模型壓縮/加速演算法,二是超引數優化器。

將未壓縮的原始模型輸入到pocketflow框架中,設定期望的效能指標,比如模型的壓縮、加速倍數等等,pocketflow就可以開始工作了。

在每一輪迭代過程中,超引數優化器選取一組超引數取值組合,之後模型壓縮/加速演算法元件基於該超引數取值組合,對原始模型進行壓縮,得到乙個壓縮後的候選模型;基於對候選模型進行效能評估的結果,超引數優化元件調整自身的模型引數,並選取一組新的超引數取值組合,以開始下一輪迭代過程;當迭代終止時,pocketflow選取最優的超引數取值組合以及對應的候選模型,作為最終輸出,返回給開發者用作移動端的模型部署。

在整個過程中,發揮作用的一共可以總結為六大元件:

權重稀疏化(weight sparsification)元件:通過對網路權重引入稀疏性約束,可以大幅度降低網路權重中的非零元素個數;壓縮後模型的網路權重可以以稀疏矩陣的形式進行儲存和傳輸,從而實現模型壓縮。對於mobilenet影象分類模型,在刪去50%網路權重後,在imagenet資料集上的top-1分類精度損失僅為0.6%。

權重量化(weight quantization)元件:通過對網路權重引入量化約束,可以降低用於表示每個網路權重所需的位元數;團隊同時提供了對於均勻和非均勻兩大類量化演算法的支援,可以充分利用arm和fpga等裝置的硬體優化,以提公升移動端的計算效率,並為未來的神經網路晶元設計提供軟體支援。以用於imagenet影象分類任務的resnet-18模型為例,在8比特定點量化下可以實現精度無損的4倍壓縮。

網路蒸餾(network distillation)元件:對於上述各種模型壓縮元件,通過將未壓縮的原始模型的輸出作為額外的監督資訊,指導壓縮後模型的訓練,在壓縮/加速倍數不變的前提下均可以獲得0.5%-2.0%不等的精度提公升。

超引數優化(hyper-parameter optimization)元件:多數開發者對模型壓縮演算法往往不甚了解,但超引數取值對最終結果往往有著巨大的影響,因此團隊引入了超引數優化元件,採用了包括強化學習等演算法以及ai lab自研的automl自動超引數優化框架來根據具體效能需求,確定最優超引數取值組合。例如,對於通道剪枝演算法,超引數優化元件可以自動地根據原始模型中各層的冗餘程度,對各層採用不同的剪枝比例,在保證滿足模型整體壓縮倍數的前提下,實現壓縮後模型識別精度的最大化。

AbstractCollection原始碼分析

abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...

ThreadPoolExecutor原始碼閱讀

執行緒池解決兩個問題 一是復用執行緒,減少建立銷毀執行緒帶來系統開銷 二是限定系統資源使用邊界,避免大量執行緒消耗盡系統記憶體 適用於互不依賴,執行時間短,不需要對執行緒控制操作的執行緒 新增任務時,1.若執行緒數量小於corepoolsize,則新增執行緒執行任務 2.若執行緒數量大於等於core...

OrangePi One Android 原始碼編譯

一 系統環境搭建參照 二 lichee原始碼編譯 1.檢視help build.sh h2.配置核心 cd linux 3.4 make arch arm menuconfig 進入配置頁面,上下移動列表,空格是選擇列表,左右移動選擇退出選項 3.首次編譯執行清除 在 lichee linux3.4...