自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

為模型減減肥:談?wù)勔苿?dòng)/嵌入式端的深度學(xué)習(xí)

開發(fā) 開發(fā)工具
為深度學(xué)習(xí)模型「減肥」時(shí)不僅要看模型計(jì)算量還要看模型大小,本文對(duì)對(duì)模型壓縮進(jìn)行了深度解讀。

1. 為什么要為深度學(xué)習(xí)模型減肥

隨著深度學(xué)習(xí)的發(fā)展,神經(jīng)網(wǎng)絡(luò)模型也越來越復(fù)雜,常用的模型中 VGG 系列網(wǎng)絡(luò)的計(jì)算量可以達(dá)到 30-40 GOP(1GOP=109 運(yùn)算)。這些神經(jīng)網(wǎng)絡(luò)通常運(yùn)行在 GPU 上,但是如果我們要在移動(dòng)/嵌入式端也實(shí)現(xiàn)深度學(xué)習(xí),那么這樣巨大的模型是絕對(duì)跑不動(dòng)的。移動(dòng)/嵌入式端的計(jì)算能力往往只有桌面級(jí) GPU 的 1/100 到 1/1000,換句話說在 GPU 上一秒 40 幀的深度學(xué)習(xí) CV 算法在移動(dòng)/嵌入式端一秒只有 0.04-0.4 幀,這樣的性能會(huì)極大影響用戶體驗(yàn)。

常用深度學(xué)習(xí)網(wǎng)絡(luò)運(yùn)算量

常用深度學(xué)習(xí)網(wǎng)絡(luò)運(yùn)算量

在移動(dòng)/嵌入式端跑深度學(xué)習(xí)模型,除了運(yùn)行速度之外,能效比(energy efficiency)也是關(guān)鍵指標(biāo)。能效比指的是一次運(yùn)算所需消耗的能量,它決定了移動(dòng)/嵌入式端運(yùn)行深度學(xué)習(xí)算法時(shí)電池能用多久。能效比與深度學(xué)習(xí)模型息息相關(guān),我們下面將會(huì)看到深度學(xué)習(xí)模型的大小會(huì)決定運(yùn)行算法時(shí)的片外內(nèi)存訪問頻率,從而決定了能效比。

2. 怎樣的模型才能算「身材苗條」?

正如我們減肥不僅要看體重還要看體脂率一樣,為深度學(xué)習(xí)模型「減肥」時(shí)不僅要看模型計(jì)算量還要看模型大小。

模型計(jì)算量是衡量深度學(xué)習(xí)是否適合在移動(dòng)或嵌入式端計(jì)算的最重要指標(biāo),通常用 GOP 單位來表示。例如,流行的 ResNet-18 的計(jì)算量大約是 4 GOP,而 VGG-16 則為大約 31 GOP。移動(dòng)和嵌入式端的硬件計(jì)算能力有限,因此模型所需的計(jì)算量越大,則模型在移動(dòng)端運(yùn)行所需要的時(shí)間就越長。為了能讓使用深度學(xué)習(xí)的應(yīng)用順暢運(yùn)行,模型運(yùn)算量當(dāng)然是越小越好。除此之外,深度學(xué)習(xí)每次運(yùn)算都是需要花費(fèi)能量的,模型運(yùn)算量越大則完成一次 inference 需要的能量也就越大,換句話說就是越費(fèi)電。在電池量有限的移動(dòng)和嵌入式端,模型一次 inference 所花費(fèi)的能量必須精打細(xì)算,因此深度學(xué)習(xí)模型計(jì)算量不能太大。

如果說計(jì)算量對(duì)模型來說是最簡單直接的「體重」的話,那么模型大小就是略微有些復(fù)雜和微妙的「體脂率」。深度學(xué)習(xí)模型大小主要決定的是該模型做一次 inference 所需要的能量。那么模型大小與 inference 所消耗的能量有什么關(guān)系呢?首先,我們知道,深度學(xué)習(xí)模型必須儲(chǔ)存在內(nèi)存里面,而內(nèi)存其實(shí)還分為片上內(nèi)存和片外內(nèi)存兩種。片上內(nèi)存就是 SRAM cache,是處理器集成在芯片上用來快速存取重要數(shù)據(jù)的內(nèi)存模塊。片上內(nèi)存會(huì)占據(jù)寶貴的芯片面積,因此處理器中集成的片上內(nèi)存大小通常在 1-10 MB 這個(gè)數(shù)量級(jí)。片外內(nèi)存則是主板上的 DDR 內(nèi)存,這種內(nèi)存可以做到容量很大(>1 GB),但是其訪問速度較慢。

片上內(nèi)存,離處理器核心電路很近,因此訪問消費(fèi)的能量很小

片上內(nèi)存,離處理器核心電路很近,因此訪問消費(fèi)的能量很小

片外內(nèi)存,離處理器很遠(yuǎn),一次訪問需要消耗很大能量

片外內(nèi)存,離處理器很遠(yuǎn),一次訪問需要消耗很大能量

更關(guān)鍵的是,訪問片外內(nèi)存所需要的能量是巨大的。根據(jù) Song Han 在論文中的估計(jì),一次片外內(nèi)存訪問消耗的能量是一次乘-加法運(yùn)算的 200 倍,同時(shí)也是一次訪問片上內(nèi)存所需能量的 128 倍。換句話說,一次片外內(nèi)存訪問相當(dāng)于做 200 次乘法運(yùn)算!

當(dāng)然,具體程序中運(yùn)算和內(nèi)存訪問消耗的能量取決于多少次運(yùn)算需要一次內(nèi)存存取。嚴(yán)格的分析方法是 roof-line model,不過我們也可以從 Google 公布的數(shù)據(jù)中去估算深度學(xué)習(xí)模型中運(yùn)算次數(shù)和內(nèi)存訪問次數(shù)的比例。Google 在 TPU 的論文中公布了這個(gè)數(shù)據(jù),從中可見 LSTM 模型內(nèi)存訪問頻率***,平均 64 或 96 次計(jì)算就需要訪問一次內(nèi)存去取權(quán)重(weight)數(shù)據(jù);而 CNN 模型的內(nèi)存訪問頻率相對(duì)***,平均 2888 或 1750 次運(yùn)算才訪問一次內(nèi)存取權(quán)重。這也很好理解,因?yàn)?CNN 充分利用了局部特征(local feature),其權(quán)重?cái)?shù)據(jù)存在大量復(fù)用。再根據(jù)之前的計(jì)算和內(nèi)存訪問能量數(shù)據(jù),如果所有的權(quán)重?cái)?shù)據(jù)都存儲(chǔ)在片外內(nèi)存,那么兩個(gè) CNN 模型計(jì)算時(shí)運(yùn)算和內(nèi)存訪問消耗的能量比是 2:1 和 2.5:1,而在 LSTM0 和 LSTM1 模型計(jì)算時(shí)運(yùn)算和內(nèi)存訪問消耗的能量比是 1:10 和 1:7!也就是說在 LSTM 模型做 inference 的時(shí)候,內(nèi)存訪問消耗的能量占了絕大部份!

因此,我們?yōu)榱藴p小能量消耗,必須減少片外內(nèi)存訪問,或者說我們需要盡可能把模型的權(quán)重?cái)?shù)據(jù)和每層的中間運(yùn)算結(jié)果存儲(chǔ)在片上內(nèi)存而非片外內(nèi)存。這也是為什么 Google TPU 使用了高達(dá) 28MB 片上內(nèi)存的原因。然而,移動(dòng)端和嵌入式系統(tǒng)使用的芯片不能成本太高,因此片上內(nèi)存容量很有限。這樣的話我們就必須從深度學(xué)習(xí)模型大小方面想辦法,盡量減小模型尺寸,讓模型盡可能地能存儲(chǔ)在片上內(nèi)存,或者至少一層網(wǎng)絡(luò)的權(quán)重?cái)?shù)據(jù)可以存在片上內(nèi)存。

3. 為模型減肥的幾種方法

2016 年可謂是深度學(xué)習(xí)模型減肥元年,那一年大家在被深度學(xué)習(xí)的潛力深深折服的同時(shí)開始認(rèn)真考慮如何在移動(dòng)硬件上跑深度學(xué)習(xí),于是 MIT 的 Viviene Sze 發(fā)表了***款深度學(xué)習(xí)加速芯片 Eyeriss,Bengio 發(fā)表了 Binarized Network,Rastegari 提出了 XOR-Net,Song Han 也發(fā)表了 Deep Compression,可謂是百花齊放。為模型減肥的方法可以分為兩大類:***類是大幅調(diào)整模型結(jié)構(gòu)(包括網(wǎng)絡(luò)拓?fù)溥B接,運(yùn)算等等),直接訓(xùn)練出一個(gè)結(jié)構(gòu)比較苗條的模型;第二類是在已有模型的基礎(chǔ)上小幅修改,通常不涉及重新訓(xùn)練(模型壓縮)。

Bengio 的 Binarized Neural Network 可謂是***類模型的先驅(qū)者,將神經(jīng)元 activation 限制為-1 或 1,從而極大地降低了運(yùn)算量。Google 也于一個(gè)多月前發(fā)表的 MobileNet,使用了 depth-wise convolution 來降低運(yùn)算量以及模型大小。Depthwise convolution 能大幅降低運(yùn)算量,但是同時(shí)不同特征之間的權(quán)重參數(shù)變成線性相關(guān)。理論上減小了自由度,但是由于深度學(xué)習(xí)網(wǎng)絡(luò)本身就存在冗余,因此實(shí)際測(cè)試中性能并沒有降低很多。MobileNet 的計(jì)算量僅為 1GOP 上下,而模型大小只有 4MB 多一些,但能在 ImageNet 上實(shí)現(xiàn) 90% 左右的 top-5 準(zhǔn)確率。在這條路上努力的人也很多,前不久 Face++也發(fā)表了 ShuffleNet,作為 MobileNet 的進(jìn)一步進(jìn)化形式也取得了更小尺寸的模型。未來我們預(yù)期會(huì)有更多此類網(wǎng)絡(luò)誕生。

Google MobileNet 的幾種模型

Google MobileNet 的幾種模型,模型運(yùn)算量大幅降低的同時(shí) top-5 準(zhǔn)確率降低并不多。圖中 1MAC=2OP

第二種方法則是保持原有模型的大體架構(gòu),但是通過種種方法進(jìn)行壓縮而不用重新訓(xùn)練,即模型壓縮。一種思路就是在數(shù)據(jù)編碼上想辦法。大家都知道數(shù)據(jù)在計(jì)算機(jī)系統(tǒng)中以二進(jìn)制形式表示,傳統(tǒng)的全精度 32-bit 浮點(diǎn)數(shù)可以覆蓋非常大的數(shù)字范圍,但是也很占內(nèi)存,同時(shí)運(yùn)算時(shí)硬件資源開銷也大。實(shí)際上在深度學(xué)習(xí)運(yùn)算中可能用不上這么高的精度,所以最簡單直接的方法就是降低精度,把原來 32-bit 浮點(diǎn)數(shù)計(jì)算換成 16-bit 浮點(diǎn)數(shù)甚至 8-bit 定點(diǎn)數(shù)。一方面,把數(shù)據(jù)的位長減小可以大大減少模型所需的存儲(chǔ)空間(1KB 可以存儲(chǔ) 256 個(gè) 32-bit 浮點(diǎn)數(shù),但可以存儲(chǔ) 1024 個(gè) 8-bit 定點(diǎn)數(shù)),另一方面低精度的運(yùn)算單元硬件實(shí)現(xiàn)更簡單,也能跑得更快。當(dāng)然,隨著數(shù)據(jù)精度下降模型準(zhǔn)確率也會(huì)隨之下降,所以隨之也產(chǎn)生了許多優(yōu)化策略,比如說優(yōu)化編碼(原本的定點(diǎn)數(shù)是線性編碼數(shù)字之間的間距相等,但是可以使用非線性編碼在數(shù)字集中的地方使數(shù)字間的間距變小增加精度,而在數(shù)字較稀疏的地方使數(shù)字間距較大。非線性編碼的方法在數(shù)字通訊重要已經(jīng)有數(shù)十年的應(yīng)用,8-bit 非線性編碼在合適的場(chǎng)合可以達(dá)到接近 16-bit 線性編碼的精度)等等。業(yè)界的大部分人都已經(jīng)開始使用降低精度的方案,Nvidia 帶頭推廣 16-bit 浮點(diǎn)數(shù)以及 8-bit 定點(diǎn)數(shù)計(jì)算,還推出了 Tensor RT 幫助優(yōu)化精度。

除了編碼優(yōu)化之外,另一個(gè)方法是網(wǎng)絡(luò)修剪(network pruning)。大家知道在深度學(xué)習(xí)網(wǎng)絡(luò)中的神經(jīng)元往往是有冗余的,不少神經(jīng)元即使拿掉對(duì)精度影響也不大。網(wǎng)絡(luò)修建就是這樣的技術(shù),在原有模型的基礎(chǔ)上通過觀察神經(jīng)元的活躍程度,把不活躍的神經(jīng)元?jiǎng)h除,從而達(dá)到降低模型大小減小運(yùn)算量的效果。

當(dāng)然,網(wǎng)絡(luò)修剪和編碼優(yōu)化可以結(jié)合起來。Song Han 發(fā)表在 2016 年 ICLR 上的 Deep Compression 就同時(shí)采用了修剪以及編碼優(yōu)化的方法,從而實(shí)現(xiàn) 35 倍的模型大小壓縮。

Deep Compression 使用的模型壓縮同時(shí)使用了網(wǎng)絡(luò)修剪和編碼優(yōu)化

Deep Compression 使用的模型壓縮同時(shí)使用了網(wǎng)絡(luò)修剪和編碼優(yōu)化

另外,訓(xùn)練新模型和模型壓縮并不矛盾,完全可以做一個(gè) MobileNet 的壓縮版本,從而進(jìn)一步改善移動(dòng)端運(yùn)行 MobileNet 的速度和能效比。

總結(jié)

在移動(dòng)/嵌入式端運(yùn)行的深度學(xué)習(xí)網(wǎng)絡(luò)模型必須考慮運(yùn)行速度以及能效比,因此模型的運(yùn)算量和模型尺寸大小都是越小越好。我們可以訓(xùn)練新的網(wǎng)絡(luò)拓?fù)湟詼p小運(yùn)算量,也可以使用網(wǎng)絡(luò)壓縮的辦法改善運(yùn)行性能,或者同時(shí)使用這兩種辦法。針對(duì)移動(dòng)/嵌入式端的深度學(xué)習(xí)網(wǎng)絡(luò)是目前的熱門課題,隨著邊緣計(jì)算的逐漸興起預(yù)計(jì)會(huì)有更多精彩的研究出現(xiàn),讓我們拭目以待。

【本文是51CTO專欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)文章,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2009-12-23 16:52:26

Linux自學(xué)嵌入式

2018-05-22 10:30:37

深度學(xué)習(xí)蘑菇街移動(dòng)端

2011-06-09 10:28:54

QT 嵌入式

2011-07-05 15:59:18

Qt 嵌入式 linux

2009-12-17 18:38:56

Fedora 7嵌入式

2025-02-17 13:09:59

深度學(xué)習(xí)模型壓縮量化

2010-05-07 15:49:16

ibmdw嵌入式

2010-01-07 10:45:38

嵌入式Linux入門

2011-01-14 13:13:23

嵌入式Linux開發(fā)

2009-05-26 16:04:17

WinCE

2010-03-23 09:08:05

2010-01-12 17:32:40

ARM平臺(tái)

2020-04-22 11:51:41

物聯(lián)網(wǎng)嵌入式編程IOT

2023-04-27 07:06:18

2022-12-14 08:06:08

2009-12-24 17:21:38

嵌入式Linux

2022-01-03 23:33:40

Linux組件系統(tǒng)

2022-01-04 22:19:38

Linux開發(fā)嵌入式

2023-01-04 09:37:16

2016-01-05 10:01:33

Linux嵌入式移動(dòng)Linux
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)