深度神經網路的壓縮與加速

深度學習大講堂發表於2020-06-29

議題1

機器學習平臺是公有云中增長最快的服務之一。是否有必要考慮將網路壓縮演算法整合為線上的機器學習服務,其中有哪些挑戰與機遇?

王雲鶴:國內沒有像谷歌那樣計算的叢集,進化演算法這種東西確實好,收斂性很好保證,效能也好,但是計算代價大。現在面臨著一個問題,無論是網路壓縮也好,無論是AutoML也好,還有NAS也好,能否落地的關鍵問題是,大家用這樣的雲服務費用對最終產生的這種實際價值相比,到底哪個價值更高。如果我們找同學去對一些模型做精細調參的話,就可以達到模型壓縮的雲服務,自動化的技術,這種技術的競爭力是不夠的,所以說如何把這些能壓縮的技術,把壓縮時間、壓縮成本去做的更低,我認為這個是現在面臨的最大的挑戰。

餘家輝:這邊兩個問題說是否有必要,答案肯定有必要,可以看到機器平臺學習上已經有一些相應的應用,一些服務,付費的一些應用。其中有哪些挑戰呢?我想補充一點,我們現在很多比如像AutoML或者是pruning的演算法,很多時候是在視覺的應用上做的,其實真正的應用場景上不僅是視覺還有一些語音、視覺處理的問題。這些問題上,是否現有的演算法能得到一個比較好的結果,這還是非常確定的。所以這也是一個非常大的挑戰。

程健:現在公有云的機器學習的服務,確實比較常見,把網路壓縮整合進去,肯定會有很大的需求,但是這裡面可能會遇到一些挑戰,這些挑戰來自於什麼呢?第一,現在很多網路壓縮的方法,特別是一些比較精細的方法,不一定能完全自動化,這裡面還有很多引數要去設定,包括不同應用場景下,引數會有很大的不同。這個是我認為是在雲服務裡面,可能會遇到的一個挑戰。第二,現在很多網路壓縮的模型方法,實際上需要大量的資料的,因為雲服務的話,可能有很多行業對這個資料,尤其是大量的資料放到雲上去做訓練會有顧慮。當然如果是一些通用的問題,比如像一些比較常見的應用場景,這個問題可能會稍微小一點。但是實際上,現在大家如果需要用到雲服務,往往是對這個演算法還不太熟,或者是傳統的行業裡面需要部署。在這些行業裡面,資料有的時候還是非常珍貴的。

議題2

大多數網路壓縮演算法在GPU叢集上進行訓練學習,其壓縮後的神經網路,如何 “無縫” 部署到其他“低功耗”裝置上,如手機上的NPU、IoT裝置上的微控制器、FPGA等?

程健:在很多邊緣端應用都是這種模式來做的,訓練是在GPU上訓練。我們面向的物件是IOT裝置上來做這個事情,往往用的多的還是在邊緣端,對雲端壓縮的需求沒有那麼高。那這種情況下怎麼去做呢?我認為有幾個方面,第一個方面是在雲端去做訓練的時候,目標函式怎麼去最佳化。這個我認為要考慮到在邊緣端上的裝置情況,比如邊緣端頻寬的問題,如何處理資料的傳輸,包括它上面對功耗的訴求等等。這個問題有很多的文章,實際上是考慮在做壓縮訓練的時候,已經考慮到了資源受限的情況。第二個方面,現在有越來越多的工作,已經把雲端和邊緣端底層的硬體打通了,這樣的話可以進行一些無縫的轉化,也可以直接部署。當然效率現在有一些會有受限,尤其是對現在壓縮裡面的一些方法,不是所有的都能無縫地轉化過來。量化是做的相對比較好一點的方法,其他的像剪枝、蒸餾這些方法,不一定能夠做的這麼好。

餘家輝:我補充一點,評論裡有說這項工作是髒活累活,因為你在GPU上訓練,很多時候不能得到端上的延遲及記憶體上的功耗等等,有一類做法是先訓練另外一個神經網路,把一個神經網路的architecture對映到對應的端上。有了這樣的一個神經網路之後,可以拿這個神經網路做一個代理,在GPU做一些壓縮、剪枝,用這種代理相當於得到一個目標,有了這個目標之後,可以做一個調節作用,在GPU上訓練的network可以部署到這個端上,它也不一定是髒活累活。

議題3

近年ICLR CVPR ICCV論文中,有指出壓縮網路受網路結構影響,跟使用pretrained引數並沒有很大關係,使用隨機初始化也能達到好的效果。這是否意味著結構的重要性遠遠大於引數初始化?

林紹輝:我個人的觀點是這個問題需要看是在什麼樣的任務上進行,其實競爭比較激烈的是ICLR裡面2019年有兩篇paper的關於初始化的問題。其實得看不同的任務,舉個例子,影像分類上面,如果你壓縮之後的模型比較規則的話,比如你做一些channel的pruning,每層剪的個數是跟原始的網路結構成倍數關係的,不是那種雖說結構化剪枝但不是呈正比例的關係。比如說對MobileNet,你把它的width設成原來的0.5倍,這種是一種純比例的關係,如果是這樣的結構去做training-from-scratch的話,效果與用pre-train的方法相比是差不多的。所以在這個問題上面,我認為結構決定了效能。如果對於更為複雜的任務,比如一些影片理解或者是行為分析上面的問題,這樣的模型可能還是依賴於pretrained一些模型,特別是依賴於那種資料級比較大的pre-train,我記得就是做一些video understanding很多方法都必須得在Kinetics資料集上面做pre-train,pre-train完後遷移到另外一些action recognition具體的任務上面的時候,它的效果就會得到大大的提高,但是如果沒有用這樣的pre-train的技術,效果非常不好,這個也是我做過很多實驗得出來的一個結論。

譚明奎:這個問題是這樣的,首先結構的重要性是非常重要的。一個不好的結構,壓縮也好,量化也好,肯定是有一個上限的,上限是由結構來決定的。但是我不太同意這幾篇論文的觀點,因為我們做實驗可以充分證明,一個好的pre-train的引數,是能夠遠遠超過所謂的隨機化的,當然我也相信其他幾位老師做的實驗和結果。但是我認為良好的pre-train的模型,肯定是比較好的。我相信論文的結果肯定是正確的,那麼為什麼會出現這個問題?原因可能是我們現在去pre-train的這個模型不夠好,有兩個方面,第一個我們的資料或者是超引數導致模型本身來講,可能baseline這個模型本身就不夠理想。Pre-train的時候,所有的引數都很重要,無論是剪枝、壓縮,都會對模型起到作用。舉個例子,有10個學生,我們讓10個學生都參與,這個時候把其中一個學生拿走,就會對全體產生影響。但是如果有10個同學做這個任務,有5個同學就可以把這個活幹完,剩下的5個同學可能就沒什麼重要性,這個時候再把那5個同學移走,是沒什麼影響的。所以這裡我認為,在壓縮的時候,實際上如何去訓練這個pre-train的模型是非常重要的。這個包括兩個,包括剪枝也好,包括量化也好,都是要在進一步進行思考的,這是我的一個觀點。所以我對這幾篇論文的觀點,我持保留的意見。

議題4

我們可以透過NAS(Neural Architecture Search)技術搜尋的到一個體積小並且效能不錯的神經網路模型,那麼進行網路壓縮技術研究的意義在哪裡?

林紹輝:這個問題好像說NAS可以解決一切問題,好像現在使用NAS就可以什麼東西都能做到非常好。但是我認為有一個問題需要思考,就是NAS搜出來的模型是否是可信的。還有是關於它的泛化性問題。舉個簡單的例子,NAS搜出來的模型,是否是脆弱的容易受攻擊的呢?這個目前來說好像還是比較少的paper去分析,基本上都是NAS搜出來比較小,在任務上面獲得一個非常好的效能,沒有去考慮更加深層次的本身的模型的脆弱性或者是可信度的問題。另外一個就是泛化能力如何,不是單純的指,比如在image classification任務上面搜到一個好的模型,直接遷移到另外一個例如 object detection框架上面,而是指在不同的任務之間模型能否直接可以無縫地操作,而不應該是再遷移過去,這個是我認為泛化性的另外一個問題。

王雲鶴:我剛好想談一下第三點。在最開始ICLR那篇paper討論剪枝之後pre-train的這個問題,那個實驗,前面的老師講的非常好,可能是他找的那個baseline沒有那麼好,如果有同學做過student的框架出來的話,我們的student network是直接透過channel去做一個等比例的縮減,去得到比如除以2除以4這樣的結果。baseline如果冗餘度非常高的話,其實網路的精度沒有那麼差,無論是你用一些原來的feature也好,還是用重新訓的話,基本上是差不多的。我們看到這個paper之後也去試了一下,尤其在一些拍照的任務上面,或是一些商場模型上去試了一下,比如GAN或super resolution。保留和不保留原來的feature pruning出來的全值的時候,精度會差的非常多,尤其是在這種super resolution上面,保留全值精度會比原來好很多。第四個問題,我想說的是另外一個問題,NAS主要測試的是architecture,就是這一層有什麼,那一層有什麼,層級之間是怎麼相連的,這個力度要比我們的feature pruning更高一級。在很多的實際應用裡面,我們會先用NAS去找一個大概的框架,在NAS找到大概的框架的情況下,之後我們還是要去做feature pruning,去識別NAS出來的模型裡面哪些的channel是沒有必要的,透過這樣的技術,兩個結合的話,我覺得會產生一個更好的結果。

譚明奎:無論是NAS也好,還是我們給定任意一個非常棒的結構也好,是不是我們在一個數集上重新訓練就能得到一個好模型呢?答案是不一定。這裡面有一個很重要的因素就是在於初始化,如果初始化不夠理想,或者在最佳化的過程中不小心收斂到一個不太好的點,就會產生模型冗餘。也就是說,即便是好的結構,模型冗餘風險還是存在的。在實際應用中,從工程應用的角度來講,還是值得去做一下pruning。當然,我們根據應用場景,綜合運用各種壓縮手段,比如把組合各種技巧,最終得到相對較好的模型,在各種效能指標方面達到一個平衡。

餘家輝:評論裡有問工業界現在用NAS的比較多還是網路壓縮技術的比較多。從我觀察的角度來看,現在應該還是用網路壓縮技術比較多,因為畢竟有更長的歷史。NAS相對來說比較新,還有一點非常重要的是,NAS現在所展示的一些應用,目前來看還是非常有限的,比如在視覺上,分類上,檢測上,NAS是不是能在以RNN為基礎的神經網路或者是LSTM相關的,還是很有待去驗證的一件事情。所以目前來看,壓縮技術用的稍微更多。

議題5

遵循“沒有免費午餐”定理,應根據實際問題選擇合適的方法。對於具體的計算機視覺應用場景而言,如何針對性的進行網路壓縮?

王雲鶴:在很多工程專案裡,其實是好多的團隊一起做交付的,可能不同的團隊採用的技術不一樣,最後會根據具體的performance的比評去選擇最好的一個結果。這個實際上很難去直接給定一個計算機視覺的場景,去找到最好的相應解法。根據不同的任務,還是要把常見的網路壓縮的技術先試一下,看一下哪個比較work。比如在底層拍照的相關上面,直接做蒸餾的話,效果不是很明顯,很難去設計一個有效的演算法去把教師神經網路裡面的知識去提純,然後幫助小的拍照模型去訓練。有一些量化的模型,對這種拍照的任務也不友好,比如說做了int 8,可能會有其他的artifacts實現,如果做更低位元的話,由於影像本身就是int 8的資料的形式,可能會對整體的預測也不是很好。但是對於高層語義,分類檢測分割基本上是比較通用的演算法。

林紹輝:計算機視覺任務場景這麼多,很難說一個方法對應著哪個視覺任務就比較能夠work,有很多時候其實都是試出來的。但是如果遇到一些不同的視覺任務,我會有這樣的一種嘗試方式,可能會思考這個視覺任務當中,能不能針對這個視覺任務,提出個比較好的compact block去做這個事情,這個其實我覺得compact block去做這個特定任務下的一些應用的話,我覺得這個效益比較大。因為只要設計好了這樣一個block很多效能上面會有很大的一個改善。我也會去思考這個NAS在這個特定的任務上面能不能夠尋找一種策略,或者是一些問題去做NAS搜尋。首先我會去嘗試一下,其次我可能會去試一下,目前比較成熟一些pruning或者是quantization等等的一些演算法,在上面去進一步驗證一下,這種方式能不能去做。我做過一些SR的工作, quantization直接做上去的時候不是太好,所以如果要去做這個東西,裡面還有很多問題需要去調整。總結一下,如果想把這個任務做好,很多技術不是單一的直接去做,必須得把東西聯合起來,才能夠獲得一個更高倍數的壓縮與加速。

王培松:對於不同的視覺任務來說,有一點也是比較重要的,首先要尋找瓶頸是在哪個地方,是在於memory太大,計算量太大,還是模型儲存太大。比如我們之前在做實際任務的時候,遇到一個問題,做超分的時候,計算量、模型的儲存其實都是OK的,但是memory佔用很大。這樣的話,對於計算量和模型儲存都不是問題,但是對於memory佔用就很是問題。所以首先要找到這個瓶頸到底是在哪個地方,再去針對地做不同的壓縮方案。但是如果知道了這個瓶頸在哪裡,怎麼去解決這個問題,就很難給出指導性的建議了,可能更多地靠嘗試,或是一些經驗性的東西。

觀眾提問

如果想從事網路壓縮方向的工作,需要具備哪些能力?

徐暢:因為程健老師作為高校的博士生導師,我們請程健老師,從招研究生的方面講一下他的要求。

程健:這個問題我談談我的看法,做網路壓縮和深度學習,或者做機器學習,本身並沒有太大的區別。如果數學基礎稍微好一點,程式設計稍微好一點,可能做這個方向入手會更快一點。包括整個深度學習裡面,絕大部分的研究方向,對原來的方向,或者是學科專業,其實並沒有太大的要求。我在招學生的時候,最不看重的就是專業方向,更多的還是要能夠自我學習的能力,對這個方向感興趣願意去做,就一定能做出來。

徐暢:好的,謝謝程健老師。我們請家輝老師從公司的角度來談一下這個問題,如果招員工或者是實習生,需要具備哪些能力。

餘家輝:對於從事網路壓縮方向,從我的角度沒有具體的有哪些能力一定需要的,更像是說做深度學習需要什麼樣的能力,比如數學程式設計基礎,當然還有個人素質,比如艱苦,努力工作這些會比較重要。還有補充一點是說,因為網路壓縮方向,畢竟還是high level的,網路與底層的應用也非常相關。所以在一定程度上,能更多地接觸一些底層的應用,比如這些應用的場景也是非常重要的。

相關文章