【机器学习】模型压缩大杀器!详解高效模型设计的自动机器学习流水线
作者丨科技猛獸
編輯丨極市平臺
導讀
?本文首先對模型壓縮進行了綜述,論述目前深度學習存在的挑戰(zhàn),同時對三種高效自動機器流水線方法ProxyLessNAS、AMC和AMC進行了詳細的介紹。最后探討了如何進行網(wǎng)絡體系結構、剪枝和量化策略的聯(lián)合搜索。
目錄
為什么要進行Model Compression?
論述當前深度學習存在的挑戰(zhàn)。
自動機器學習流水線 (AutoML Pipeline):讓模型更加高效
簡述自動機器學習的流水線。
第1步:ProxyLessNAS:搜索最適宜的模型架構。
第2步:AMC:壓縮模型,減少參數(shù)量。
第3步:HAQ:進一步量化模型,減小內(nèi)存占用。
自動機器學習流水線的演進
論述如何進行網(wǎng)絡體系結構、剪枝和量化策略的聯(lián)合搜索。
1 為什么要進行Model Compression?
摩爾定律告訴我們:芯片的性能每隔18個月將會提高一倍。
盡管摩爾定律的現(xiàn)象已經(jīng)被觀察到了數(shù)十年,但是,它仍應該被視為一種對現(xiàn)象的觀測或對未來的推測,而不是一個物理定律。
換句話說,未來的增長率在邏輯上無法保證會跟過去的數(shù)據(jù)一樣,也就是邏輯上無法保證摩爾定律會持續(xù)下去。而且,摩爾定律已經(jīng)在2013年年底放緩。
比如說英特爾在22納米跟14納米的CPU制程上已經(jīng)放慢了技術更新的腳步,之后的時間里,晶體管數(shù)量密度預計只會每3年增加一倍。
而另一方面,在現(xiàn)代深度學習中,更復雜的問題往往需要更復雜的計算量來處理;摩爾定律的放緩使得當前的算力往往無法滿足復雜AI問題的要求,尤其是在移動端這種算理有限的設備上面。
圖1:摩爾定律正在放緩評價一個深度學習模型,除了Accuracy之外,我們還要考慮下面這5個方面:
延遲:Latency (ms)
能耗:Energy Consumption (J/度電)
計算量:Computational Cost (FLOPs/BitOPs)
模型參數(shù)量:Parameter (M)
運行占用內(nèi)存:Memory (MB)
所以當前深度學習面臨的一個挑戰(zhàn)是:模型非常大 (Large Model Size),也就需要大量的能源消耗 (Large Energy Consumption),密集的計算量 (Computation Intensive)和密集的內(nèi)存占用 (Memory Intensive)。以上問題使得模型在部署的過程中會遇到很大的挑戰(zhàn)。
舉一個例子: AlphaGo打一局比賽約需要1920塊CPU和280塊GPU的算力,以及3000$的電費(electric bill),對于端側設備 (Edge-side devices)來講,會很快耗盡電池的電量 (Drains Battery);對于數(shù)據(jù)中心來講會增加總持有成本TCO (Total Cost of Ownership)。
圖2:模型非常大,也就需要大量的能源消耗所以,模型壓縮對于深度學習的部署來講意義重大,尤其是硬件資源受限的端側設備。
模型壓縮的方法有很多,可以參考下面的鏈接:
深入淺出的模型壓縮:你一定從未見過如此通俗易懂的Slimming操作
科技猛獸:模型壓縮工作總結
https://zhuanlan.zhihu.com/p/262359207
借助AutoML技術,可以使得深度學習模型變得更加高效,以部署在端側設備上面。所以本文介紹的重點是這一流水線具體是什么樣的,以及后續(xù)有哪些改進的工作。
2 自動機器學習流水線 (AutoML Pipeline):讓模型更加高效
2.1 自動機器學習的流水線
自動機器學習流水線是指基于自動機器學習(AutoML)完成模型的優(yōu)化過程。
輸入: 模型要部署的目標硬件設備。約束條件(Latency,Energy Consumption,Model Size,Memory,FLOPs等)。
輸出: 部署的模型。
中間過程:
AutoML搜索最適宜的模型架構,最大化精度。
對這個模型進行壓縮,減少參數(shù)量。
對壓縮后的模型進行量化,進一步減少內(nèi)存占用。
2.2 第1步:ProxyLessNAS:搜索最適宜的模型架構
MIT: ProxyLessNAS: Direct Neural Architecture Search on Target Task and Hardware
剛才講到,當把模型部署在手機,頭盔,智能手表,手環(huán)等移動端設備的時候,我們不僅希望模型的準確度高,還希望它具有低的延遲和低的耗電量。以往的做法是將相同的模型不加改進而直接部署在多種設備上面,比如下圖:
圖3:相同的模型不加改進而直接部署在多種設備上這種做法的優(yōu)點是簡單快捷,不需要任何額外的設計成本;但是這種做法的缺點是沒有考慮到不同硬件設備之間的差異性:比如GPU的并行度 (Degree of Parallelism)比CPU要高,cache size更大,內(nèi)存帶寬 (Memory bandwidth,單位時間里存儲器所存取的信息量,也稱為存儲器在單位時間內(nèi)讀出/寫入的位數(shù)或字節(jié)數(shù))性能也有不同。因此使用同樣的模型得到的結果往往是次優(yōu)的。
ProxyLessNAS解決的就是這個問題,即希望針對不同的硬件設備專業(yè)化神經(jīng)網(wǎng)絡模型,以在目標硬件設備上面獲得更好的準確率和較高的硬件效率。
圖4:針對不同的硬件設備專業(yè)化神經(jīng)網(wǎng)絡模型為每個硬件設計專門的深度學習模型代價是十分高昂的,往往需要請一個組的深度學習專家來進行模型設計和調參,顯然是無法承受的。于是我們考慮使用AutoML的方法,自動化地設計神經(jīng)網(wǎng)絡的模型,來替代人類專家進行神經(jīng)網(wǎng)絡架構的設計,一定程度上能夠解決人力資源不足的問題。
但是,神經(jīng)架構搜索的成本是十分高昂的,谷歌提出的NASNet在小規(guī)模數(shù)據(jù)集CIFAR-10上面搜索一次所需要的時間,換算成單塊GPU大約需要5年。所以,考慮到這樣巨大的計算資源的要求,之前的神經(jīng)架構搜索算法大多采用基于代理 (Proxy)的方法。
代理任務 (Proxy Task)相比于目標任務 (Target Task),一般具有:
更小的數(shù)據(jù)集 (e.g. CIFAR→ImageNet)
訓練更少的epochs
更小的搜索空間
使用更淺的模型。
總之,代理任務相當于是目標任務的縮小簡化版。之后,把代理任務搜索得到的結果遷移到目標任務上面,如下圖所示:
圖5:代理任務相當于是目標任務的縮小簡化版這樣做的問題有3點:
在代理任務上搜索得到的最優(yōu)結果在目標任務上是次優(yōu)的,尤其是當考慮Latency時。
需要堆疊重復的單元,限制了塊的多樣性,從而降低了性能。
不能根據(jù)目標任務的實際硬件要求進行優(yōu)化。
ProxyLessNAS提出的動機就是為了解決以上的3點限制,作者希望能直接在目標任務和硬件 ( target task and hardware)上搜索出最優(yōu)模型的架構,而避免使用代理Proxy,這解決了上面的第1個問題。同時,ProxyLessNAS不去堆疊重復的單元,每個block都可以被搜索,這解決了上面的第2個問題。最后,ProxyLessNAS還能考慮目標硬件的Latency,這解決了上面的第3個問題。ProxyLessNAS實現(xiàn)的結果如下圖:
圖6:ProxyLessNAS首先簡述ProxyLessNAS的做法:
把NAS的過程視為路徑級剪枝的過程 (Path-level Pruning)。首先訓練一個包含所有的操作的超網(wǎng)絡 (over-parameterized network)。每個操作有自己的二值化架構參數(shù)和權重參數(shù),并采樣梯度下降的方法訓練二值化的架構參數(shù),那些架構參數(shù)比較低的操作到最后將會被剪掉。
在訓練這個超網(wǎng)絡的時候,由于操作數(shù)量很多,會導致GPU顯存不足 (GPU memory explosion),這個問題很常見,因為GPU顯存會隨著候選操作的數(shù)量呈線性增長。解決的辦法是每次只激活一條路徑進行訓練,即:每個操作的架構參數(shù)是二值化的。每次更新參數(shù)時,只允許一個操作處于激活狀態(tài)。這樣一來,GPU的顯存的需求的復雜度就會從?變?yōu)?。
在One-Shot NAS方法中:
在DARTS方法中:
二值化就是每次只激活一條路徑,表達式是:
圖7:同時學習權重參數(shù)和二值化的架構參數(shù)圖7所表達的含義就是每次只激活一條路徑進行更新參數(shù)。具體怎么更新呢?
首先取一個batch的數(shù)據(jù),根據(jù)?式采樣出一個?,這時候就相當于只激活了一條路徑,其他未被激活的路徑的參數(shù)被freeze了。
使用training set 來update采樣的這條路徑的參數(shù),如上圖左所示。
再根據(jù)?式采樣出一個?,使用validation set 來update架構參數(shù),如上圖右所示。
上述3步迭代執(zhí)行。
更新架構參數(shù)時,首先要明確這里的架構參數(shù)是什么?答案是:?,這些?通過?的操作得到?,再通過采樣得到?,最后,?再參與計算圖。所以,在反向傳播時,我們手里有的只是???晌覀円嬎愕氖?。
那么具體的方法是:
在反向傳播時,以上所有的參數(shù)都已知了,于是可以求出?。
但這樣做也存在一個問題,即你需要保存所有的?,使得GPU memory變成了?,即顯存使用量依然與?相關。
為了解決這個問題,作者采取的做法是:
首先根據(jù)(3)式sample出2條路徑,屏蔽其他的路徑,這樣強制使得?。
采樣之后,?和?將會被重置。
根據(jù)(4)式更新這2條路徑的架構參數(shù)?,更新完后,乘上一個系數(shù),保持二者之和不變,即始終保持未被采樣的路徑的架構參數(shù)之和不變。
一個采樣路徑被增強(路徑權重增加),另一個采樣路徑被衰減(路徑權重降低),而所有其他路徑保持不變。以這種方式,不管?的值如何,在架構參數(shù)的每個更新步驟中只涉及兩條路徑,從而將存儲器需求降低到訓練緊湊模型的相同水平。
說白了,就是我更新架構參數(shù)的時候不更新所有的架構參數(shù),只采樣2條路徑,更新這2條路徑的架構參數(shù),同時保持未被采樣的路徑的架構參數(shù)之和不變。
除此之外,為了解決第3個問題,就必須把延遲Latency作為目標函數(shù)要考慮的部分。但是,Latency這個指標是不可微分的 (non-differentiable),因此,得想個辦法把Latency這東西變得可微分。
做法是:首先在目標硬件上收集各種候選操作的延遲Latency,構成一個數(shù)據(jù)集,去搭建一個延遲預測的模型。這樣一來,基于這個模型就可以獲得網(wǎng)絡的延遲預測期望值。這個期望值就可以作為一個正則項,整合到損失函數(shù)當中,通過梯度進行直接的優(yōu)化。
假設網(wǎng)絡一共有?個Block,對于第?個Block來講,我們求出它的Latency的期望值:
式中的?表示第?個候選操作。?表示這個predictor的預測值。
在反向傳播求微分時,表達式就變?yōu)榱?#xff1a;
而式中的?是已知的。
最后,總的網(wǎng)絡的Latency可以寫成:
這一流程可以表示為圖8:
圖8:把Latency變得可微分損失函數(shù)為:
通過調節(jié)超參數(shù)?就能根據(jù)目標任務的實際硬件調整模型的復雜度。
實驗結果:
實驗1: 首先在CIFAR上進行驗證,只使用?的參數(shù)就能達到之前的準確率的效果。
圖9:在CIFAR上進行驗證實驗2: 接著在ImageNet上進行搜索,在實驗中作者使用了3種硬件平臺,分別是mobile phone, GPU 和 CPU。Latency的測試,分別使用:
V100 (GPU,batch size=8)
Intel(R) Xeon(R) CPU E5-2640 v4 (CPU,batch size=1)
Google Pixel 1 phone (mobile phone,batch size=1)
通過下圖10 (mobile phone測試) 可以清晰地看出ProxyLessNAS在延遲和精度方面的提升:
圖10:在ImageNet上進行搜索通過下圖11 (GPU測試) 可以清晰地看出ProxyLessNAS在延遲和精度方面的提升:
圖11:在ImageNet上進行搜索因為對比的網(wǎng)絡都是為mobile phone設計的,所以在GPU上ProxyLessNAS的優(yōu)勢更加明顯。
實驗3: 對比ProxyLessNAS在不同硬件設備上的結果:
一個有趣的發(fā)現(xiàn)是:GPU上搜到的模型只在GPU上高效;CPU上搜到的模型只在CPU上高效;mobile phone上搜到的模型只在mobile phone上高效,這就表明了我們一開始的結論:為不同硬件設計專門化的神經(jīng)網(wǎng)絡的正確性和必要性。
圖12:為不同硬件設計專門化的神經(jīng)網(wǎng)絡圖13:適合不同硬件設備 (GPU,CPU,mobile phone)的專門化的網(wǎng)絡圖13展示了搜索出的適合不同硬件設備 (GPU,CPU,mobile phone)的專門化的網(wǎng)絡。不同硬件平臺在搜索過程中,模型會逐漸表現(xiàn)出不同的特性。
搜索空間的設計方面,為了使網(wǎng)絡可深可淺,候選操作中加入?即可。
比如最上方的代表GPU端最適宜的模型,它傾向于選擇更淺的模型和更大的塊 (shallow and wide model with early pooling)。
比如最中間的代表CPU端最適宜的模型,它傾向于選擇更深的模型和更小的塊 (deep and narrow model with late pooling)。
這是因為GPU比CPU具有高得多的并行性,因此它可以利用大的MBConv操作。
至此,我們完成了AutoML Pipeline的第1步:搜索出適宜該硬件的最佳模型,接下來進入壓縮過程。
2.3:第2步:AMC:壓縮模型,減少參數(shù)量
MIT: AMC: AutoML for Model Compression and Acceleration on Mobile Devices
在神經(jīng)網(wǎng)絡的壓縮過程中,每一層的壓縮比可以是由有經(jīng)驗的工程師來決定。所以,人力資源成為了這項任務的瓶頸。手工壓縮方法需要相關領域的專家知識,需要人工在推理速度,大小與準確率之間權衡,因此人工給出的壓縮比往往是次優(yōu)的。因此,我們希望借助AutoML技術,找到一種自動給出神經(jīng)網(wǎng)絡每層壓縮比的方法,用AI來優(yōu)化AI,以減少人力資源的消耗。這就是AMC (AutoML for Model Compression and Acceleration on Mobile Devices)方法的初衷。
在之前的工作中有許多基于規(guī)則的模型壓縮方法,比如在神經(jīng)網(wǎng)絡的第一層剪枝量小;在FC層中剪枝量大;在對剪枝量比較敏感的層中剪枝量小等等。然而,這樣的剪枝方法是次優(yōu)的。所以我們希望AutoML自動地給出每一層剪枝量的數(shù)值。
AMC通過使用強化學習的方法,設置一個DDPG的agent。壓縮模型的精度對于每一層的稀疏度非常敏感,要求一個細粒度的動作空間。所以,把每一層的剪枝率建模為連續(xù)的數(shù)值 (continuous compression ratio) ,并在強化學習的獎勵信息時,綜合考慮模型的精確度和模型復雜度。在agent運行時,為agent輸入某一個Layer?的相關信息,它可以自動輸出這個Layer的剪枝率?。之后,再為agent輸入下一個Layer?的相關信息,這樣不斷循環(huán)完整個網(wǎng)絡。
AMC針對不同的場景提出了2種compression policy:
對于延遲關鍵型 (Latency-critical) 的AI應用 (手機應用,自動駕駛,廣告排名等),目標是在給定硬件設備資源限制 (FLOPs, latency, and model size)的條件下獲得最高精度。此時作者限制了搜索空間,其動作空間(修剪比例)被限制,從而使代理下的壓縮模型總是在資源預算下。
對于質量關鍵型 (Quality-critical) 的AI應用 (Google Photo等),目標是在不損失精度的前提下得到最小的模型。此時作者定義了一個關于精度和硬件資源的獎勵函數(shù),在不傷害模型精度的情況下能夠探索壓縮限制。
圖14:AMC針對不同的場景提出:不同的方案剪枝的方法分為2類:fine-grained pruning (細粒度剪枝)和structured pruning (粗粒度結構化剪枝)。
Fine-grained pruning [5]就是剪掉權值矩陣 (weight tensor)中的不重要的某個元素,這種方法可以在不損失精度的前提下得到高精度。但是這種細粒度的方法會導致不規(guī)則的稀疏矩陣,且往往需要專門設計的硬件 [6]。一般用于減小模型大小。
Coarse-grained pruning 旨在剪去權重張量中的整個規(guī)則區(qū)域,比如說整個channel,block等等。這里我們研究結構化修剪方法,剪枝每個卷積層和全連接層的輸入通道。這種方法不需要專門設計的硬件。
比如,對于一個卷積層?,細粒度剪枝的稀疏度定義為:?,即0元素的個數(shù)除以總的元素個數(shù)。對于結構化剪枝,壓縮channel數(shù)之后為?稀疏度定義為:?。一般用于模型加速。
圖15:粗粒度剪枝和細粒度剪枝如圖16所示為AMC的整體流程,主要有2部分組成,左側是一個DDPG的強化學習Agent,右側是一個神經(jīng)網(wǎng)絡壓縮的環(huán)境,以channel pruning為例。我們將神經(jīng)網(wǎng)絡的壓縮建模為一個自底向上,逐層進行的過程。
圖16:AMC:自動給出神經(jīng)網(wǎng)絡每層壓縮比的方法狀態(tài)空間:
其中:
該層的kernel的維度為:?。
該層的輸入為?。
是第幾個Layer。
是該層的計算量。
Reduced是先前層減少的計算量。
Rest是下面層的剩余的總數(shù)量。
狀態(tài)空間里的每一維都會歸一化到[0, 1]。
動作空間:
作者提出使用連續(xù)的動作空間?,支持更細粒度的和更精確的壓縮。
環(huán)境 Environment:
硬件設備就相當于是強化學習的Environment,給RL Agent反饋,使之滿足資源約束。
搜索協(xié)議:
資源受限型壓縮: 通過限制動作空間(每層的稀疏比),我們可以精確地到達目標壓縮比。我們使用以下的獎勵:
這個獎勵并沒有提供model size reduction的激勵,因此我們可以通過限制動作空間來達到目標壓縮比。下面的算法描述了該過程:在最開始幾層作者允許任意的壓縮比?。用最大的壓縮比壓縮完接下來所有的層后,如果網(wǎng)絡的壓縮比滿足給定的硬件限制,則使用?對這一層進行壓縮。否則就增大?。
圖17:資源受限型壓縮算法精度保證型壓縮: 通過調整獎勵函數(shù),我們可以精確地發(fā)現(xiàn)壓縮的極限而無精度損失。
這個獎勵函數(shù)對誤差更敏感,與此同時,它提供了一個對于減少運算量或模型大小的激勵。agent可以自動化地找到壓縮的極限。
AMC的具體算法是:
圖18:AMC的具體算法實驗結果:
實驗1:CIFAR-10:
作者在 CIFAR-10 上對 AMC 進行了全面分析,以驗證 2 種搜索策略的有效性。 CIFAR 數(shù)據(jù)集包括 50k 訓練和 10k 測試 10 個類別的 32×32 微小圖像。 作者將訓練圖像分成 45k / 5k 訓練/驗證。 在驗證圖像上獲得準確性獎勵。 作者的方法具有很高的計算效率:RL 可以在 1 小時內(nèi)在單個 GeForce GTX TITAN Xp GPU 上完成搜索。
圖19:CIFAR-10實驗結果AMC 得到的最佳裁剪方式如上圖19所示為在 CIFAR-10 上進行的FLOPs-Constrained Compression的實驗。對比了三個經(jīng)驗策略:uniform 為均勻設置壓縮比,deep,shallow 分別表示大尺度裁剪深層或淺層參數(shù)。使用獎勵?準確地找到稀疏度,并裁剪 Plain-20 和 ResNet-56的 50%參數(shù),并將其與經(jīng)驗剪枝方法進行比較。 結果是AMC 得到的最佳裁剪方式不同于人工設定的裁剪它學習了瓶頸結構。
如上圖20所示為在 CIFAR-10 上進行的Accuracy-Guaranteed Compression的實驗。使用獎勵?。AMC在壓縮60%的參數(shù)量的前提下基本沒有精確度上的損失。
圖20:AMC大幅超過了手工設計的剪枝方式實驗2:ImageNet:
為了得到滿意的性能,作者采用:剪枝-finetune迭代的方法,一共迭代4次。在這4次中整個模型的總密度設置為[50%,35%,25%和 20%]。。對于每個階段,在給定整體稀疏度條件下, AMC確定每個層的稀疏度。 然后根據(jù)某個策略對模型進行剪枝和finetune 30個epoch。
根據(jù)這個思路,作者將 ImageNet 上 ResNet-50 壓縮率增加到5倍(人工調參得到的模型壓縮率為 3.4,如下圖所示)而不會損失模型精度(原始 ResNet50 的[top-1,top-5] 準確度= [76.13%,92.86%]; AMC 壓縮后模型的準確度= [76.11%,92.89%])。下圖21為每個塊的密度信息,我們可以發(fā)現(xiàn) AMC 的密度分布與手工設定模型壓縮的結果完全不同,這表明 AMC 可以充分探索設計空間并分配稀疏度。
圖21:ImageNet 上 ResNet-50 壓縮率增加到5倍每個階段每層的密度如下圖22所示。峰顯示出不同層的剪枝率的大小,3×3 卷積層的剪枝率較大,因為其具有較高的冗余度。而對于 1×1 卷積,結構更緊,稀疏度較低。
圖22:每個階段每層的密度下圖為AMC與其他SOTA剪枝方法 (FP,RNP,SPP,CP)的對比:AMC超過了基于規(guī)則的剪枝方法。
圖23:AMC超過了基于規(guī)則的剪枝方法至此,我們完成了AutoML Pipeline的第2步:對搜索得到的模型進行壓縮,下面是量化過程。
2.4:HAQ:進一步量化模型,減小內(nèi)存占用
MIT: HAQ: Hardware-Aware Automated Quantization with Mixed Precision
在傳統(tǒng)的方法中,我們采樣單一精度的量化,即使用相同的比特數(shù)(比如8 bit)對所有層的參數(shù)進行量化。如下圖所示:
圖24:使用相同的比特數(shù)(比如8 bit)對所有層的參數(shù)進行量化但這會帶來一個問題:即是否使用相同的比特數(shù)對于每一層來講都是最優(yōu)的呢?
這個問題的解決方案與AMC十分相似,就是進行Layer-wise的量化過程,即依然使用DDPG的方法來決定每一層的量化精度。
問: 如何確定不同硬件加速器上每一層的權重和輸出值的位寬?
如下圖所示,對于第1層,我們用4 bit表示weight,用5 bit表示activation;對于第2層,我們用6 bit表示weight,用7 bit表示activation;對于第3層,我們用5 bit表示weight,用4 bit表示activation。如果能夠合理地安排每一層的bit數(shù),就可以取得很好的準確率。
圖25:不同的層使用不同的精度而且,最近已經(jīng)有許多硬件設備開始支持混合精度的計算,比如說:
NVIDIA最近推出了支持1位、4位、8位和16位算術運算的圖靈GPU架構:Tensor Core。
Apple的A12 Bionic。
所以有了硬件的支持,下一個問題是如何提供軟件的支持。
圖26:許多硬件設備開始支持混合精度的計算我們回到上面的問題:如何確定不同硬件加速器上每一層的權重和輸出值的位寬?
注意這個問題有3個關鍵詞:
方法要針對不同的硬件設備:hardware-specialized。
方法要是Layer-wise的。
方法要能決定weight和activation的位寬。
首先混合精度要解決的第一個問題是會帶來一個較大的設計空間:我們來計算下這個空間的具體大小:
比如說:每一層的weight參數(shù)有1 bit-8 bit這8種情況。同理,每一層的activation參數(shù)也有1 bit-8 bit這8種情況。那么每一層的參數(shù)有64種情況。假設神經(jīng)網(wǎng)絡有?層,那么一共就有?種情況。
狀態(tài)空間:
再對比一下AMC的狀態(tài)空間:
前8項和最后一項是相同的,只是換了說法,它們分別代表:
第?層的索引。
輸入channel數(shù)。
輸出channel數(shù)。
卷積核尺寸?。
卷積核stride?。
feature map的大小?。
該層的參數(shù):?。
上一層的動作:?。
除此以外,?代表的是這一層是否是Depthwise Convolution。?代表量化的是weight還是activation。與AMC一樣,狀態(tài)空間里的每一維都會歸一化到[0, 1]。
如果這一層是FC層,那么:
動作空間:
與AMC一樣,動作空間也采用連續(xù)值的設計,因為離散值會失去順序信息。從輸出的動作值?到離散的量化精度?的轉化公式為:
式中,?。
量化操作:
假設第?層的某個權值?,量化精度是?bits,我們首先將它truncate到?的范圍內(nèi)。scale factor?。
那么量化結果可以表示為:
比如下圖所示:?,圖中沒有畫出符號位,所以數(shù)值位只剩下了3位。scale factor代表每一個離散值 (比如101)包含的連續(xù)值的寬度。注意為了保證量化結果的正確性,000和111代表的連續(xù)值的范圍區(qū)間與其他值不同。
圖27:量化過程而?的選擇主要是根據(jù)下式,即使得量化后的權值與未量化的權重的分布盡量接近。
為了限制模型的資源消耗,作者模仿AMC中的做法,即:RL agent給出每一層的量化精度?,如果超過了限制,就從頭sequentially減小量化位寬,直到滿足資源限制為止。
獎勵函數(shù):
式中,?是量化以后finetune的模型的精度,?是full-precision模型的精度。
實驗結果:
整體的實驗是基于MobileNet-v1和MobileNet-v2。
實驗1:Latency-Constrained Quantization
下圖為HAQ在MobileNet-v1上的結果:
圖28:MobileNet-v1上的結果下圖為HAQ在MobileNet-v2上的結果:
圖29:MobileNet-v2上的結果
我們可以發(fā)現(xiàn)在端側設備 (Edge:Xilinx Zynq-7020 FPGA) 上和在云(Cloud:Xilinx VU9P) 上搜索得到的結構是非常不同的。在端側設備上HAQ會給depthwise卷積層賦予更低的量化精度,給pointwise卷積層賦予更高的量化精度。而云上前若干層的現(xiàn)象很相似,但是最后幾層恰恰相反,HAQ會給depthwise卷積層賦予更高的量化精度,給pointwise卷積層賦予更低的量化精度。這也鼓勵我們要根據(jù)不同的硬件給出specialized的解決方案,因為它們的特性是不一樣的,具體體現(xiàn)在batch size,memory bandwidth,peak FLOPs等許多方面。
量化的結果如下圖所示:
圖30:ImageNet的量化結果與baseline PACT相比,HAQ獲得了精度和Latency的提升。
實驗2:Energy-Constrained Quantization
圖30:Energy-Constrained Quantization可以清楚地看到,HAQ優(yōu)于基于規(guī)則的量化baseline:它在消耗相似的Energy的同時獲得了
更好的性能。HAQ的能量消耗接近原始的MobileNet-V1模型的一半而幾乎沒有精度損失,證明混合精度在專門化的硬件設備上的有效性。
實驗3:Model Size-Constrained Quantization
這次, 作者用k-means算法將值量化為k個不同的質心,而不是使用線性量化進行壓縮,因為k-means量化可以更有效地減小模型大小。
與韓松老師的Deep Compression的結果對比如下:
圖31:Model Size-Constrained Quantization可以發(fā)現(xiàn)比HAQ比Deep Compression性能好得多:它在相同的模型大小下實現(xiàn)了更高的精度。對于像MobileNets這樣的緊湊模型,Deep Compression會顯著降低性能,尤其是在大幅度量化的情況下,而HAQ可以更好地保持精度。
例如,當Deep Compression將MobileNet-v1的權重量化為2 bit時,精確度從70.90顯著下降到37.62;而HAQ在相同的模型大小下仍然可以達到57.14的精確度。這是因為HAQ通過系統(tǒng)地搜索最優(yōu)量化策略來充分利用混合精度。
圖32:Model Size-Constrained Quantization的量化可視化結果如圖32為Model Size-Constrained Quantization的量化可視化結果。HAQ給depthwise convolution 分配了更多的量化位數(shù),給pointwise convolution 分配了更少的量化位數(shù)。
直觀來說,這是因為前者的參數(shù)個數(shù)比后者少很多。比較圖29和圖32,在不同的優(yōu)化目標下,策略有很大的不同(在延遲優(yōu)化下,depthwise convolution的位數(shù)較少,在模型大小優(yōu)化下,depthwise convolution的位數(shù)較多)。
表明HAQ可以做到針對不用的硬件設備 (云,端側),不同的約束條件 (Latency,Energy,Model size),不同的模型給出最適宜的量化策略。
至此,我們完成了AutoML Pipeline的最后一步量化的工作。總結一下:
流水線的輸入是
模型要部署的目標硬件設備。
約束條件(Latency,Energy Consumption,Model Size,Memory,FLOPs等)。
1 我們先利用AutoML設計為給定的硬件,在給定的條件下設計最適宜的架構。
2 再使用AMC為給定的硬件,在給定的條件下搜索最適宜剪枝的策略,以保持高精度。
3 最后使用HAQ為給定的硬件,在給定的條件下搜索最適宜量化的策略,以保持高精度。
至此,一個AutoML Pipeline完成,輸出最終的模型,縱觀整個過程,每一步都使用了AutoML技術。
自動機器學習流水線的演進
MIT: APQ: Joint Search for Network Architecture, Pruning and Quantization Policy
在上面介紹的自動機器學習流水線中,給定目標硬件設備? 和目標資源約束? ,我們依次對模型進行了架構搜索,結構化剪枝,混合精度量化的過程。這一系列過程進行完后,我們得到了適用于?的最優(yōu)模型,且它的資源消耗滿足?的限制。
自動機器學習流水線的中間過程:
AutoML搜索最適宜的模型架構,最大化精度。
對這個模型進行壓縮,減少參數(shù)量。
對壓縮后的模型進行量化,進一步減少內(nèi)存占用。
不足是:
這一過程分3步進行略微繁瑣。
需要調節(jié)大量的hyper-parameters,超過了可接受的人力范圍。
那么,接下來的想法是:這3步可否合并為一步進行呢?即:聯(lián)合搜索網(wǎng)絡架構,剪枝和量化策略?
我們希望的中間過程:
但是,直接使用NAS聯(lián)合搜索這3個維度會帶來以下的問題:
搜索空間變得很大,使搜索過程很難進行。因為剪枝和量化過程需要finetune的過程,極大增加了搜索的成本,如下圖所示。
每一步都有不同的目標函數(shù),使得流水線最終的策略是次優(yōu)的。浮點模型的最佳神經(jīng)架構對于量化模型可能不是最佳的。
所以,我們可以采用APQ的策略,把架構搜索,剪枝,量化這3步可否合并為一步進行。
問:面對這樣巨大的聯(lián)合搜索空間,如何加快搜索過程?
答:核心思想是訓練一個quantization-aware accuracy predictor加速搜索過程。
圖34:quantization-aware accuracy predictor加速搜索過程但是,訓練一個quantization-aware accuracy predictor并不容易,因為我們需要大量的 (模型,精度) 數(shù)據(jù)集,而每得到這樣的一個樣本,就需要做以下2件事情:
訓練這個模型,得到初始的fp32 weights。
量化并fine-tune得到int8 weights,并驗證Accuracy。
做完這2步 (hundreds of GPU hours),才算得到一組數(shù)據(jù)。而我們要構建這樣一個數(shù)據(jù)集,無疑會花費巨大的成本。
訓練Quantization-Aware的Accuracy Predictor:
所以,為了減少第1步的計算量,這里借鑒One-Shot NAS的方法:訓練一個supernet,其中包含許多個subnet,這些subnet直接繼承supernet的權重,不做任何fine-tune,在驗證集上評估精確度,即可得到一組數(shù)據(jù) (fp32 model, fp32 accuracy)。這樣一來,將計算成本降低至?。利用這些大量的低成本 的數(shù)據(jù)集 (fp32 model, fp32 accuracy), 我們可以訓練出一個Accuracy Predictor (fp32),它的輸入是模型架構,輸出是預測精度。
為了減少第2步的計算量,需要獲得(quantized model, quantized accuracy)的數(shù)據(jù)。這里不能借鑒One-Shot NAS的方法,因為量化的模型,如果不做fine-tune,精度會很差。所以我們使用上一步得到的Accuracy Predictor (fp32),使用少量的高成本 的數(shù)據(jù)集 (int8 model, int8 accuracy) 對它進行fine-tune,類似于遷移到量化數(shù)據(jù)上。
fine-tune結束后,即得到Quantization-Aware的Accuracy Predictor (int8),它的輸入是模型,量化精度,輸出是預測的精確度。整個過程如下圖35所示:
圖35:訓練Quantization-Aware的Accuracy Predictor使用上述的方法,就可以不用去費力地獲得數(shù)據(jù)點:(NN architecture, quantization
policy, quantized accuracy),而省去了復雜的訓練過程。
我們得到了Quantization-Aware Accuracy Predictor以后,就可以利用它,輸入模型的架構,即可得到模型的accuracy,這一過程可以表示為:
下一步要做的就是把這三個自變量進行編碼,對搜索空間進行建模:
搜索空間: once-for-all network
Backbone設置為MobileNetV2,kernel size={3, 5, 7},channel number={4B, 6B, 8B}
depth={2 stages, 3 stages, 4 stages},once-for-all network的性質有:
對于每個提取的子網(wǎng)絡,可以直接評估性能,而無需重新訓練,因此訓練成本只需支付一次。
支持operator,channel的搜索。
由于once-for-all network的網(wǎng)絡訓練的性質,很難同時實現(xiàn)這兩個目標:因為如果搜索空間變得太大,精度近似將是不準確的。
為了解決這個問題,我們采用Progressive Shrinking (PS) 算法來訓練一次性網(wǎng)絡。具體來說,我們首先在once-for-all network的網(wǎng)絡中訓練一個具有最大kernel大小、channel數(shù)量和depth的完整子網(wǎng)絡,并將其用作teacher,從once-for-all network的網(wǎng)絡中逐步發(fā)展更小的子網(wǎng)絡樣本。在蒸餾過程中,經(jīng)過訓練的子網(wǎng)絡仍然會更新權重,以防止精度損失。Progressive Shrinking (PS)算法有效降低了一次性網(wǎng)絡訓練過程中的方差。通過這樣做,我們可以確保從一勞永逸的網(wǎng)絡中提取的子網(wǎng)絡保持競爭精度,而無需重新訓練。
有了搜索空間的定義,具體的編碼方式是:
將depthwise convolution和pointwise convolution的kernel size,channel number,quantization bits進行編碼成one-hot vector,再concate在一起。作為這個block的encoding。
例如: 一個block有3個選擇的kernel size大小 (3,5,7)和4個選擇的channel number (16,24,32,40),如果我們選擇kernel size = 3,channel number = 32,那么我們得到兩個向量[1,0,0]和[0,0,1,0],我們將它們concate在一起,并使用[1,0,0,0,1,0]來表示這個塊的體系結構。 假設pointwise/depthwise層的weights/activations 的位寬選擇是4或8,我們使用[1,0,0,1,0,1,1,0]來表示量化策略的選擇(4,8,8,4)。 那么對于一個5層網(wǎng)絡,我們可以用一個75-dim (5×(3+4+2×4)=75)的向量來表示這樣的編碼。
在我們的設置中,kernel size的選擇是[3,5,7],channel number的選擇取決于每個塊的基本通道號,位寬的選擇是[4,6,8],總共有21個塊要設計。
Quantization-Aware Accuracy Predictor的結構如下圖所示:隱藏層為400個神經(jīng)元。
左側為Full-precision accuracy predictor,右側為Quantization-Aware Accuracy Predictor。輸入層添加了量化的編碼,利用左側網(wǎng)絡的預訓練權重,加上(int8 model, int8 accuracy)的數(shù)據(jù)集,進行fine-tune后得到。值得注意的是不需要很多(int8 model, int8 accuracy)的數(shù)據(jù)集,這極大地縮小了訓練的成本。
圖36:Quantization-Aware Accuracy Predictor這樣,得到了Quantization-Aware Accuracy Predictor以后,也建模了編碼方式,我們就能根據(jù)遺傳算法在三個維度上聯(lián)合搜索最適宜的架構。為了衡量Latency和Energy的信息,作者仿照ProxyLessNAS,首先構建一個查找表,其中包含不同架構配置和位寬下每層的Latency和Energy。需要這些信息時直接查表即可。在遺傳算法迭代的過程中,Latency和Energy超過限制的個體將會被直接排除掉。遺傳算法具體如下:
圖37:APQ算法APQ的具體流程如下圖38所示:
圖38:APQ方法流程1 首先訓練好一個once-for-all network?。
2 利用?生成用于訓練Full-precision accuracy predictor的數(shù)據(jù)集?和生成用于訓練Quantization-Aware Accuracy Predictor的數(shù)據(jù)集?。
3 使用數(shù)據(jù)集?訓練Full-precision accuracy predictor?。
4 使用Full-precision accuracy predictor在數(shù)據(jù)集?上finetune得到Quantization-Aware Accuracy Predictor?。
5 根據(jù)遺傳算法首先初始化一代,共?個樣本。
6 使用?選出這一代的精英Topk。
7 變異出?個下一代新個體,雜交出?個下一代新個體。
8 循環(huán)進入第6步,循環(huán)?次。
9 從精英Topk中選出最優(yōu)個體作為結果輸出。
量化方案:
與HAQ一致,設權值為?,量化精度為?,則量化之后的權值在?為:
實驗結果:
整體的實驗是基于ImageNet,BitFusion的硬件平臺。
實驗1:與MobileNetV2+HAQ的對比:
圖39:與MobileNetV2+HAQ的對比實驗2: 與Multi-Stage Optimized Model的對比:
圖40:與Multi-Stage Optimized Model的對比實驗3: Predictor-Transfer的對比實驗
圖41:Predictor-Transfer的對比實驗作者嘗試了使用Predictor-Transfer技術與不使用的對比,當使用Predictor-Transfer時,左圖顯示可以獲得更快和更高的收斂速度,而右圖顯示需要更少的數(shù)據(jù)量。使用Predictor-Transfer時,我們可以使用少于3000個數(shù)據(jù)點實現(xiàn)85%的pair-wise accuracy (從候選數(shù)據(jù)集隨機選擇2個樣本,Predictor能夠正確識別哪一個更好的比例),而如果沒有這種技術,至少需要4000個數(shù)據(jù)。
圖42:APQ在精確度上超過了SOTA可以發(fā)現(xiàn),APQ在精確度上超過了SOTA,且極大地減少了?排放和云計算的邊際成本。
至此,我們完成了對AutoML Pipeline的優(yōu)化過程。
總結:
本文介紹了自動機器學習流水線 (AutoML Pipeline),它的輸入是給定的硬件條件和資源限制,輸出是最優(yōu)的模型,主要分為架構搜索,剪枝,混合精度量化三個部分。還介紹了它的改進,即聯(lián)合搜索三個部分的最優(yōu)策略。
參考文獻:
[1] ProxyLessNAS: Direct Neural Architecture Search on Target Task and Hardware
[2] AMC: AutoML for Model Compression and Acceleration on Mobile Devices
[3] HAQ: Hardware-Aware Automated Quantization with Mixed Precision
[4] APQ: Joint Search for Network Architecture, Pruning and Quantization Policy
[5] EIE: efficient inference engine on compressed deep neural network
[6] Deep compression: Compressing deep neural networks with pruning, trained quantization and huffman coding
作者:科技猛獸
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統(tǒng)計學習方法》的代碼復現(xiàn)專輯 AI基礎下載機器學習的數(shù)學基礎專輯 獲取本站知識星球優(yōu)惠券,復制鏈接直接打開: https://t.zsxq.com/qFiUFMV 本站qq群704220115。加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【机器学习】模型压缩大杀器!详解高效模型设计的自动机器学习流水线的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【学术相关】以前写过水论文怎么办?
- 下一篇: 强烈推荐几个我常置顶阅读清华、哈工大的平