曠視張祥雨:高效輕量級深度模型的研究和實踐 | AI ProCon 2019

  • 2019 年 10 月 7 日
  • 筆記

基礎模型是現代視覺識別系統中一個至關重要的關注點。基礎模型的優劣主要從精度、速度或功耗等角度判定,如何設計模型應對複雜應用場景是非常重要的課題。

近日,由新一代人工智能產業技術創新戰略聯盟(AITISA)指導,鵬城實驗室、北京智源人工智能研究院支持,專業中文 IT 技術社區 CSDN 主辦的 2019 中國 AI 開發者大會(AI ProCon 2019)在北京舉辦。在計算機視覺技術專題,曠視研究院主任研究員、基礎模型組負責人張祥雨主要從輕量級架構、模型裁剪、模型搜索三大思路講述了高效輕量級深度模型的研究和實踐。

輕量級架構是模型設計最簡單,也是最徹底的做法。而模型裁剪的思路是,先設計一個相對比較重量級的架構,但是通過一些模型裁剪的方法裁下來,得到一個能在端上實時跑的模型。模型搜索則利用模型搜索的方法自動完成模型設計和設備匹配。

其中,張祥雨重點講述了模型搜索。在他看來,目前模型搜索在輕量級模型設計領域,已逐漸成為最重要的研究方向之一。模型搜索在模型結構的排列組合、結構超參數的調優方面,相對人工設計有明顯優勢,不過搜索空間設計的好壞很大程度上依靠人工經驗。他同時指出,人工設計在網絡基本單元挖掘等方面目前仍不可替代,不過,目前已經有相關的NAS工作進行初步嘗試。

他還提到模型搜索所面臨的的問題和挑戰,這包括精度、效率和靈活性的權衡,搜索空間設計,模型搜索的穩定性、可解釋性和可重現性以及複雜Pipeline下高效的模型搜索與流程優化。

此外,張祥雨也提到模型設計的其他思路,比如低精度量化,浮點運算通常比較慢,相反用低精度運算可以實現很明顯的模型加速。通過知識蒸餾或高效的底層實現也可以進行模型加速,他們會使用以上六種甚至更多的方案綜合進行模型的設計。

以下為張祥雨演講內容實錄,A科技大本營(ID:rgznai100)整理:

曠視研究院基礎模型組是偏研發類的部門,主要是為其他各個部門提供優質的基礎模型,對算法本身的創新性和實用性都有比較高的要求。

視覺理解中,特徵表示是最為關鍵的問題。在深度學習之前的手工設計時代,為了完成了一個視覺理解的任務,通常情況下特徵抽取是最重要的模塊。進入深度學習時代後這個觀點仍然沒變,特徵仍然是我們物體識別最重要的點。

模型設計概述

深度學習時代,我們把抽取特徵的結構稱為基礎模型,CNN是目前在視覺上使用最廣泛的模型,我們要進行一項物體檢測,比較典型的任務是都需要一個非常強力的基礎模型作為支撐,這個基礎模型是現代視覺識別系統的一個最為關鍵的點。

基礎模型是最為關鍵的點有兩層含義:第一,一個好的基礎模型對整個系統的性能提升是決定性的,從精度或者從準確率來說優秀的基礎模型起到了本質的作用。第二,從模型的實用性來說,搞深度學習的都知道基礎模型通常佔據了視覺系統的絕大部分運行時間,也吃了絕大多數運行功耗和存儲。不管從精度還是從速度或功耗的角度,基礎模型都是視覺系統的核心部分。

為了研究一個非常好的深度基礎模型,我們總是會從精度和實用性兩個維度進行探索,這兩個維度通常來講有一定的互斥。我們都知道從2015年的AlexNet開始,在準確率這個角度得到了非常大的發展,到了打敗人類的精度。然而準確度的提升並沒有同步帶來實用性的提升,大家從右邊圖可以明顯看出來,準確度藍色這條線在不斷提升,Error在不斷下降,但計算複雜度也在持續上升。典型的比賽模型計算複雜度可能要到4GFLOPs以上,典型的手機端實時模型是小於100MFLOPs,中間有好幾個數量級。

另外,學術界習慣用理論計算量來衡量複雜度。但理論複雜度低的模型並不總是伴隨着實際複雜度低。模型的實用性很多時候和具體的業務需求和目標的平台都有關。舉個例子,最適合分類的模型並不適合於做檢測和做分割,我們要把GPU的產品落地到一個ARM或者手機芯片端,模型結構有非常大的不同,面對非常複雜的需求我們如何針對特定的任務和平台設計最好的模型?

模型設計應用案例,這是我們的手機解鎖業務。手機解鎖這個應用非常簡單,拿出手機,我們現在提供人臉解鎖,50毫秒內發生的內容要經過哪些步驟呢?第一步我們要做人臉檢測,判斷畫面里有沒有臉以及臉的位置,看起來是非常簡單的,但是考慮到手機大部分時候都在口袋裡,大家都知道檢測算法對計算的資源消耗通常也最大,如果你反覆運行檢測任務手機很快就會發熱。雖然第一步檢測看起來是非常簡單的任務,但是具體到手機解鎖業務也有很多具體需求。緊接着我們需要對人臉屬性進行判斷,最典型的是視線有沒有盯着手機。

第三步要進行活體檢測,判斷是不是靠一個相片或屏幕進行的攻擊。最後一步進行比對識別,最後出一個驗證結果。

所有這些步驟都涉及一個識別問題,不同步驟使用的模型特點和任務也是不同的。檢測需要處理很大分辨率的(圖像),需要跑到一個非常高的速度;而對於人臉識別和活體檢測任務,實時性要求相對低一些(因為用戶不可能總是盯着這個手機),但是要求精準度非常高。所以如何設計模型應對不同的應用場景也是非常重要的課題。

高效模型設計的基本思路

我簡單介紹一下我們團隊在高效模型設計的基本思路,主要有六點。

第一點最簡單,我們直接設計一個輕量級架構,這是最簡單也是最徹底的做法。第二種思路,我們可以設計一個相對比較重量級的架構,但是通過一些模型裁剪的方法把它裁下來,得到一個能在端上實時跑的。第三種可以建立一種模型搜索,利用模型搜索的方法自動完成模型設計和設備匹配。還有一些其他的思路,比如低精度量化,浮點運算通常比較慢,相比之下,使用低精度可以實現很明顯的加速。我們還可以用知識蒸餾或高效的底層實現進行模型加速,曠視會使用這六種甚至更多的方案綜合進行模型的設計。

輕量級架構

我主要分享前三種思路。首先是輕量級架構,輕量級架構是什麼意思?大家會關注很多論文,這些論文為了達到很高的精度或處於學術界的考慮,會設計一個比較複雜的模型。而在具體實踐中,通常我們會綜合考慮設備的運行時間和任務特性進行統籌,綜合使用多種設計思想。這裡我們總結出了兩個輕量級模型設計的總體原則:

第一個原則是我們要在有限的計算複雜度實現儘可能高的模型表示能力。學術界提出了很多解決方案。比如採用高效的卷積計算方式如Xception、MobileNet v1等提出了深度可分離卷積;還有一些工作着眼於增加有效的通道數量,例如Bottleneck結構(ResNeXt等);以及引入特徵復用(如DenseNet,Res2Net)等思路。

我們前年提出的ShuffleNet v1網絡模型就遵循了這樣的設計思路。它採用深度可分離卷積+多層分組卷積的結構單元,在較小的複雜度下實現較高的模型能力,同時儘可能提高通道數量。但是這種結構會帶來一些副作用,比如通道之間缺少信息交流,因此我們引入了通道重排的操作來解決這一問題。

這個結構在移動端可以非常高效的執行。但我們現在已經不使用了,這個模型雖然理論複雜度較低,但是在高並行的設備(如GPU)實際效率並不好。主要原因是裏面使用了大量的分組卷積,這在GPU上執行非常低效。

由此我們引入了第二個設計原則。我們認為要想設計一個高效的模型不能只考慮理論複雜度,還需要儘可能在設備上有更高的實際執行速度。例如對於很多模型,雖然理論上卷積運算佔據了大部分複雜度,但是實際執行時其他操作也會佔用大量時間。影響實際執行速度的因素不僅有理論計算量,還有計算/訪存比、模塊並行度、設備特性/實現效率等。

那麼,考慮了實際執行速度以後我們能不能設計一些更好的模型?這裡我們提出了一些設計準則。第一,我們在設計卷積的時候可以讓它的輸入輸出通道數量儘可能接近,在相同的計算量下可以做到訪存量最小。第二,需要謹慎使用分組卷積,因為分組卷積大幅提升了內存訪問量,還增加了高效實現的難度。第三,要設法減少網絡碎片。碎片化操作一大特點是計算量少訪存量大,不太容易實現非常高的並行,所以這種操作也要儘可能減少。第四,逐元素運算不可忽視。雖然算理論複雜度的時候不會計算在內,但是運行的時候也會帶來很多開銷。

基於這些原則大家再重新審視一下學術界的模型,我們可以看到很多模型並不適合落地使用。它們普遍違反了高效執行的準則,並不適合在目前大部分設備上使用。那麼什麼樣的結構在設備上更為高效呢?

這是我們去年提出的ShuffleNet v2的結構,它在設計的時候綜合考慮了前面說的四點原則,所以它在設備上可以得到非常高的速度。它用了特徵復用的特性,保證高速度的同時還有非常高的精度。從這個圖表可以看出,相對谷歌的MobileNet系列,v2這個結構無論在ARM還是GPU端都達到了最優精度和速度的權衡。最近我們對v2進行了進一步增強,比如引入一些AutoML的技術和Swish以後,v2達到了更高的精度。這個模型在我們公司的絕大多數產品得到了廣泛使用。

剛剛是說在小模型方面,v2在大模型方面也有非常好的發揮。把ShuffleNet v2的大小擴展到比較大尺寸以後,和目前學術界最好的模型相比,我們發現達到相同精度的時候理論計算量減了將近一半。另外這個模型不只適用於分類,它在檢測上幫助我們拿到了去年COCO的四個項目冠軍。例如,COCO物體檢測單模型性能達到mmAP 56%+。

大家可能會質疑我們在公司里刷大模型有什麼用,其實是非常有用的。雖然不能直接部署在業務端,但是這種大模型的精度非常高,它可以代替人工完成很大一部分數據清洗的任務。此外藉助模型蒸餾技術,大模型還可以可以帶動小模型達到非常高的性能。

前面回顧了模型設計的幾個指導原則。模型設計是不是只有這幾個原則呢?當然不是了,模型設計是非常細碎的,在實際業務中針對不同平台和不同業務場景都需要設計。對於不同平台來說,我們公司的很多產品橫跨雲端芯三大平台。在雲上我們會選擇結構規則、並行度很高的大模型,比如最原始的ResNet,雖然已經是比較老的模型,但是它在GPU上運行效率非常高,主要在雲上使用。在端上靠ShuffleNet系列,可以平衡精度和速度。而在芯片上我們自己有相關的芯片研發,會選擇量化後的模型進行部署。

前面說的是平台。而對於任務來說,我們需要針對不同的任務設計不同的模型。舉個例子,前不久我們提出了ThunderNet模型,達到了detection最大的速度和精度的平衡。它的設計要點是專門考慮了detection模型的具體要求:首先在骨幹網絡上繼續使用ShuffleNet v2,這是一個修改版,針對detection的具體要求進行了專門的優化。detection head部分則使用了一個LightHead R-CNN。相比於業界廣泛使用的SSD系列,ThunderNet實現了數量級的提升,無論是速度還是精度都超過了目前最好的水平。

對於語義分割任務,我們也提出了高性能模型DFANet,它是我們在手機拍攝這條產品線的模型經過整理歸納之後發表的。它的設計要點包括:首先,在骨幹網絡上使用了Xception,因為語義分割需要非常大的感受野,Xception的結構更適合做語義分割的任務。其次,我們通過多尺度特徵融合和特徵復用實現高性能。

這裡給大家展示一些結果。相對於業界廣泛使用的模型,DFANet實現了精度和速度的全面提升。這個網絡已經落地到我們的手機算法產品中,用於手機端的單攝虛化。它的技術原理非常簡單,就是一個語義分割,分割出前景和背景,只要你分割得足夠準確,我們就可以模擬出一種長焦攝像頭的背景虛化效果來突出前景。聽起來很簡單,但是實現難度很大,主要原因是需要在手機這樣一個低功耗的設備上實現非常高速度的實時分割,而且分割得必須非常精準。當然這裡還配合了一些其他的技術。

前面我說的大部分模型已經開源,這裡給出一些資源。

ShuffleNet v1

https://github.com/megvii-model/ShuffleNet-Series/tree/master/ShuffleNetV1

ShuffleNet v2

https://github.com/megvii-model/ShuffleNet-Series/tree/master/ShuffleNetV2

ShuffleNet v2+

https://github.com/megvii-model/ShuffleNet-Series/tree/master/ShuffleNetV2

ShuffleNet v2 Large

https://github.com/megvii-model/ShuffleNet-Series/tree/master/ShuffleNetV2.Large

模型搜索

前面說了輕量級架構的設計思路。那麼在高效輕量級模型設計領域還有哪些思路?目前最火的是使用模型搜索,利用機器來代替人工自動完成模型設計。過去,輕量級模型設計是一個非常依靠經驗的勞動,我前面提到的所有項目背後都有一大批非常優秀的工程師,他們憑藉對模型、算法和業務的理解,對每個模型分別進行非常細緻的調優,才形成了一個性能非常高的模型和算法。

我們不禁要問,既然輕量級模型設計如此複雜,有沒有更簡單、通用的方法,使用統一的自動化算法代替人工來完成如此高要求的模型設計任務?近年發展出來的AutoML技術被寄予厚望。AutoML旨在使用一個機器學習算法設計另一個機器學習系統。傳統機器學習裏面有很多超參數,進入神經網絡時代以後超參數就更多了,比如對於網絡結構要怎麼連才最好,這是搜索空間非常大的超參。針對它我們應用AutoML,這個叫神經網絡架構搜索(NAS)。此外架構超參數如通道數等也是搜索的關鍵點。其他的像數據增廣方法、激活函數等也都是可以搜的。

這裡列出了NAS和人工架構的一些性能對比,可見自動化模型在性能上有明顯優勢。2017年谷歌的NASNet算法首次打敗人工,從此AutoML和NAS一發而不可收。從文獻上大家也可以看出,2017年AutoML爆發之後,如今有超過200篇文章討論了AutoML和架構搜索。

我簡單說一下AutoML和NAS在業務上的應用。模型搜索的文章在學術界文章很多,但是在目前應用上尚有很多問題,其中主要問題可以抽象為這三個關鍵詞,一個是效率,一個是性能,一個是靈活性。在性能方面,我們在業務中通常不能只對其中的某一塊進行優化,要對整個算法流程進行總的優化;怎麼實現複雜環境下的搜索是非常難的問題。靈活性方面,現在基於梯度的搜索算法在靈活性方面非常差,例如,很多任務要求算法在某個型號的設備上的執行時間不能太長,功耗不能太高,加入這些限制後,我們發現大部分搜索算法的使用還是非常不方便的。

我們總結和對比了學術界的主要算法在工業落地上的主要優缺點。大家會發現目前沒有一種算法適合實際使用的需求。

鑒於此,我們提出了一種更適合應用落地的算法叫Single Path One-Shot NAS,對效率、準確度、靈活性進行了很大程度上的改良,使得搜索流程大幅簡化,很多時候只需要付出比正常訓練一個模型2倍左右的時間,就可以得到精度好很多,並且可以在具體設備上高效執行的模型。

大家會發現這個算法還是非常通用的,既可以進行一個網絡結構單元的搜索,也可以進行通道數的搜索,還可以進行混合精度量化的搜索。該算法在我們雲端芯全系列的模型上都可以實現非常高效率的搜索。並且和之前SOTA相比,不管是搜索速度還是最終得到的模型精度都有比較明顯的提升。

我給出一個應用的具體案例:用它做一個物體檢測模型的搜索。物體檢測模型包含很多關鍵的結構單元,比如圖像預處理、FPN特徵融合等。

這裡給出一個對骨幹網絡搜索的例子。Detection模型的骨幹網絡搜索是一個非常困難的任務,因為每次我們改了基礎模型,後面的特徵就都變了,需要重新訓練一遍,反覆迭代需要非常長的時間。我們大致測算了一下,採樣類似谷歌NASNet這種搜索方法,把算法運行完成需要將近一年時間,無法實現有效的搜索。但是使用了前面介紹的Single-Path One-Shot搜索算法之後,模型搜索只需要走一遍就可以高效完成,只需要進行一次完整運行就可以實現顯著的效果提升。

這是搜索過程中的圖示,隨着迭代的進行大模塊會退到後面,小模塊會移到前面,這符合我們對檢測系統的認知。這張圖展示了系統性能,大家會發現相對於業界普遍使用的基礎模型如ResNet等,我們搜出的DetNAS模型在相同的計算量下實現了性能極大程度的提升。

總結一下,目前在輕量級模型設計這個領域,基於模型搜索的方法已經成為了目前的主流,也是最重要的研究方向之一。在實踐中我們發現模型搜索對設備適配問題,尤其是尋找對於具體設備上運行時間最快、功耗最少的模型,相對於人工有非常大的優勢。但是模型搜索也有很多問題,搜索空間現在還是依靠人工設計,搜索空間的設計非常依賴經驗,並且沒有好的指導原則,這是未來的研究方向和難點。

前面說的兩個模型也已經開源了:

One-Shot Single Path NAS

https://github.com/megvii-model/ShuffleNet-Series/tree/master/OneShot

DetNAS

https://github.com/megvii-model/ShuffleNet-Series/tree/master/DetNAS

模型裁剪

模型裁剪也是設計輕量級模型的非常重要的思想。一句話概括就是先設計一個大的再砍下來。在模型裁剪中有很多種方法,比如可以使用稀疏連接、低秩分解、通道裁剪等。其中通道裁剪是最有效的方法,算法相對簡單,容易得到規整的結構,方便硬件的實現。

我們2017年提出了一個通道裁剪的方法,可以實現對通道的自動化選擇和參數重建。訓練完一個模型以後,不需要進行重新訓練,我們的通道裁剪算法只需要很短時間就可以自動生成比之前快2到4倍左右的模型。

不過,我們在實用中發現這個算法有很多缺陷,其中最大的問題就是它對模型結構的依賴相對來講比較大。比如對於ResNet等對通道數量有很強約束的模型來說,這個通道裁剪方法很難取得比較高的裁剪效果。這是所有類似模型裁剪框架的本質問題。正是因為有這些問題,這兩年基於AutoML和NAS的通道裁剪方法開始興起。

這是我們最新提出的MetaPruning算法。它和之前的算法不一樣,之前的算法通常是為了找最具代表性的特徵,以及選擇哪些通道進行化簡。而MetaPruning的主要目標和NAS比較像,更多的預測化簡後的結構,以及不同層的通道數。基本的思想是構建一個大的網絡,通過PruningNet對內部不同的子網絡進行隨機採樣,只需要經過一次訓練就得到不同的模型。具體算法流程大家可以參考上圖。

從效果來看,對比之前最好的模型裁剪算法,我們的方法可以用更少的優化時間得到更強的模型性能,和進行手工裁剪相比可以達到明顯好的性能和速度。

關於MetaPruning和Channel Pruning我們已經開源,在安防等關鍵任務上得到了落地應用。從我們團隊的使用經驗來說,它們更多的還是在設備適配上面能夠得到非常好的效果,而在模型結構上的改進帶來的性能提升就比較有限。

資源:

MetaPruning

https://github.com/megvii-model/MetaPruning

Channel Pruning

https://github.com/yihui-he/channel-pruning

提問:做模型加速的時候模型的精度肯定會往下降,但是模型的計算精度還是挺重要的,怎麼平衡精度下降多少是業務允許的?

張祥雨:所有業務做的時候都會先定一個基準線,我們當然希望精度越高越好,但是隨着業務應用的不同,並不是所有業務都要精度優先,更多還是需要綜合考慮多種因素。比如對於手機解鎖的應用,一般對活體檢測要求比較高,而對人臉識別的要求不是特別高。每次產品開始立項的時候我們會先定一條線,精度方面只需要達到這個線就可以了,剩下的工作則是在多個維度對算法進行優化。具體到模型化簡的業務流程來說,通常我們會先訓練一個比較大的模型,先保證精度超過預設的這條線,再逐漸往下砍,砍到能夠過線為止。我們去優化算法,需要綜合考慮精度、速度等多個維度,而不是始終要把其中一個push到極致。

提問:您說把骨幹網絡應用到不同的場景中,比如目標檢測等,有什麼一般的原則去微調這些網絡架構?

張祥雨:有些通用的規則,不過很多時候對於每個具體的業務都是不太一樣的。比如某些任務的模型訪存量特別高,這個時候我們通常需要設計一些快速降採樣的模塊,把分辨率快速降下來,同時利用特徵復用的技術在快速降分辨率的同時保證細節不被損失。又比如某些物體檢測任務的問題特點是尺度變化特別劇烈,產品中會涉及非常小的物體也會有非常大的物體,我們一般會用自動化搜索幫你確定神經網絡設計的關鍵要點。