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

讓深度學(xué)習(xí)進(jìn)入移動(dòng)端,蘑菇街在移動(dòng)端的深度學(xué)習(xí)優(yōu)化實(shí)踐

原創(chuàng)
人工智能 深度學(xué)習(xí)
深度學(xué)習(xí)是機(jī)器學(xué)習(xí)中一種基于對(duì)數(shù)據(jù)進(jìn)行表征學(xué)習(xí)的方法,與傳統(tǒng)靠手工設(shè)計(jì)特征的機(jī)器學(xué)習(xí)算法不同,深度學(xué)習(xí)能根據(jù)不同任務(wù)自動(dòng)學(xué)習(xí)數(shù)據(jù)的特征。

【51CTO.com原創(chuàng)稿件】深度學(xué)習(xí)是機(jī)器學(xué)習(xí)中一種基于對(duì)數(shù)據(jù)進(jìn)行表征學(xué)習(xí)的方法,與傳統(tǒng)靠手工設(shè)計(jì)特征的機(jī)器學(xué)習(xí)算法不同,深度學(xué)習(xí)能根據(jù)不同任務(wù)自動(dòng)學(xué)習(xí)數(shù)據(jù)的特征。

目前深度學(xué)習(xí)在語(yǔ)音、圖像、視頻處理上已經(jīng)取得了令人印象深刻的進(jìn)步,但是它通常需要功能強(qiáng)大的電腦才可以運(yùn)行,如果它出現(xiàn)在我們的手機(jī)上呢?

2017 年 12 月 1 日-2 日,由 51CTO 主辦的 WOTD 全球軟件開(kāi)發(fā)技術(shù)峰會(huì)在深圳中州萬(wàn)豪酒店隆重舉行。

本次峰會(huì)以軟件開(kāi)發(fā)為主題,黃文波先生在軟件性能優(yōu)化專(zhuān)場(chǎng)與來(lái)賓分享"深度學(xué)習(xí)在移動(dòng)端的優(yōu)化實(shí)踐"的主題演講,為大家詳細(xì)闡述深度學(xué)習(xí)模型在移動(dòng)端的設(shè)計(jì)和優(yōu)化策略等問(wèn)題。

討論涉及到如下三個(gè)方面:

  • 為什么做深度學(xué)習(xí)的優(yōu)化
  • 深度學(xué)習(xí)在移動(dòng)端的優(yōu)化實(shí)踐
  • 總結(jié)

為什么做深度學(xué)習(xí)的優(yōu)化?

深度學(xué)習(xí)近年來(lái)雖然特別火,但是由于計(jì)算量巨大,其對(duì)應(yīng)的模型動(dòng)輒就有上百兆。

要想把深度學(xué)習(xí)放在只能分配出幾十兆空間給單個(gè) App 的手機(jī)上,我們就需要從算法層面上極致地縮小其模型。

這兩年來(lái),深度學(xué)習(xí)的發(fā)展趨勢(shì)是將大部分應(yīng)用都放置到云端,而使用的設(shè)備一般是 GPU。

但是如果真要實(shí)現(xiàn) AI,單靠云端的算法是遠(yuǎn)遠(yuǎn)不夠的,因?yàn)樵谝恍?yīng)用的場(chǎng)景中,計(jì)算必須在本地進(jìn)行。

例如:蘋(píng)果的 Face ID,如果僅放在云端,那么一旦手機(jī)沒(méi)有了信號(hào),用戶豈不是無(wú)法使用手機(jī)了?

同理,無(wú)人駕駛需要及時(shí)響應(yīng)外部環(huán)境,包括識(shí)別車(chē)外的人、交通燈等,那么如果網(wǎng)絡(luò)發(fā)生了延遲,豈不是會(huì)發(fā)生交通事故?因此,許多應(yīng)用都必須將計(jì)算放置在本地。

蘑菇街為什么會(huì)做深度學(xué)習(xí)的優(yōu)化?主要原因有如下幾點(diǎn):

  • 服務(wù)器:我們通過(guò)減少訓(xùn)練、預(yù)測(cè)的時(shí)間,來(lái)縮小模型。節(jié)約 GPU 資源和省電,這對(duì)于深度學(xué)習(xí)來(lái)說(shuō)是非常重要的因素。

例如 Alpha GO 下一盤(pán)棋,需要 1920 個(gè) CPU 到 280 多個(gè) GPU,其耗費(fèi)的電費(fèi)約為 3000 美元。同樣,蘑菇街就算使用的是 GPU,其電費(fèi)也有上萬(wàn)元。

  • 移動(dòng)端:實(shí)時(shí)響應(yīng)需求。通過(guò)本地化運(yùn)行處理,我們不需要將圖片傳到服務(wù)器上,也不會(huì)侵犯用戶的隱私。

CNN(卷積神經(jīng)網(wǎng)絡(luò))基礎(chǔ)

深度學(xué)習(xí)對(duì)于圖像處理的理念是:經(jīng)過(guò)層層濾波與篩選,最終得到結(jié)果。

它的典型流程為:輸入(INPUT)經(jīng)過(guò)卷積層(CONV)和激活層(RELU)的特征提取,再經(jīng)過(guò)池化層(Polling)的壓縮與降維,最后由全連接層(FC)連接所有的特征,并輸出圖像歸屬類(lèi)型的概率。

如上圖所示左邊的圖片經(jīng)過(guò)了多層處理后,最后得出它屬于 car 的概率最高,因此我們可以認(rèn)為它是一輛車(chē)。

該示例只有 10 層左右,而在實(shí)際場(chǎng)景中,層數(shù)會(huì)更多,甚至能達(dá)到 100 多層。

對(duì)于上方簡(jiǎn)易示圖的識(shí)別,實(shí)際上它經(jīng)歷了 CNN 的成百上千萬(wàn)次計(jì)算,才最終得到結(jié)果。

深度學(xué)習(xí)應(yīng)用挑戰(zhàn)

深度學(xué)習(xí)領(lǐng)域的發(fā)展趨勢(shì)是:隨著其網(wǎng)絡(luò)日漸加深和大數(shù)據(jù)驅(qū)動(dòng)所導(dǎo)致的數(shù)據(jù)激增,訓(xùn)練結(jié)果的準(zhǔn)確率也會(huì)越來(lái)越高。

伴隨著網(wǎng)絡(luò)越來(lái)越深,會(huì)出現(xiàn)一個(gè)問(wèn)題:深度學(xué)習(xí)模型越來(lái)越大,用于計(jì)算所需耗費(fèi)的資源也就越來(lái)越多。

與此同時(shí),由于手機(jī)不像服務(wù)器可以使用性能強(qiáng)大的 GPU,因此手機(jī)的計(jì)算性能受到了限制。

另外,由于手機(jī)上 CPU 和電池容量暫時(shí)無(wú)法被突破,其功耗也會(huì)相應(yīng)地受到限制。

深度學(xué)習(xí)在移動(dòng)端的優(yōu)化實(shí)踐

模型壓縮的兩類(lèi)方式

將深度學(xué)習(xí)放置到手機(jī)上,可以從兩個(gè)方面入手:

  • 模型壓縮,現(xiàn)有的模型一般具有 100M~200M,其準(zhǔn)確率非常高。因此我們?cè)谀玫侥P秃螅枰M(jìn)行壓縮。
  • 設(shè)計(jì)網(wǎng)絡(luò),將網(wǎng)絡(luò)設(shè)計(jì)得非常小,同時(shí)保證網(wǎng)絡(luò)具有很強(qiáng)的表達(dá)能力。

模型壓縮

在算法層面對(duì)模型的壓縮主要采取了三種方式:

  • 剪枝(Pruning)
  • 量化(Quantization)
  • 霍夫曼編碼(Huffman Encoding)

剪枝的方法較為直觀,它的思想是:在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),每個(gè)神經(jīng)元會(huì)有一個(gè)權(quán)重,而權(quán)重具有大小之分。其中權(quán)重小的表示對(duì)最終結(jié)果的影響力非常小。

因此在 2015 年剛開(kāi)始研究時(shí),有人提出在不會(huì)影響到最終結(jié)果的情況下,將這些小的權(quán)重砍掉(Remove)了。

前面提到的“砍”權(quán)重的做法對(duì)于內(nèi)存是很不友好的。例如卷積里有 3×3 的矩陣,如果僅部分被砍的話,實(shí)際計(jì)算還要去往被砍處,從而造成了內(nèi)存的不連續(xù)。

因此有人提出將 Filter 一并砍掉,在將整個(gè) 3×3 全部砍掉之后再予以訓(xùn)練,以達(dá)到較好的效果。

2017 年,有人提出通過(guò)對(duì)每個(gè)通道添加一個(gè) scale 因子對(duì)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,然后選擇把 scale 值比較小的卷積全部砍掉(如上圖中橙色處所示),以方便對(duì)內(nèi)存進(jìn)行高效地操作。

除了砍掉網(wǎng)絡(luò),我們還可以通過(guò)量化來(lái)將其做得更小。如上圖所示的 3×3 權(quán)重,在實(shí)際存儲(chǔ)時(shí)權(quán)重都是浮點(diǎn)數(shù)(Float),而存儲(chǔ)每個(gè)浮點(diǎn)數(shù)都需要 32 比特位。

因此量化的思想是把這 9 個(gè)浮點(diǎn)值進(jìn)行聚類(lèi),分別聚到四個(gè)類(lèi)中,那么我們?cè)诖娓↑c(diǎn)時(shí)就只需要存這四個(gè)浮點(diǎn)數(shù)即可。

對(duì)于這些值的表達(dá),我們可以通過(guò) Index 來(lái)實(shí)現(xiàn)。由于此處已聚了四個(gè)類(lèi),我們?cè)?Index 時(shí),只需兩個(gè)便可以表達(dá)了,即 2 的 2 次方正好是 4,正好表達(dá)出了四個(gè)數(shù)。

想必大家在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)時(shí)都了解過(guò)霍夫曼編碼。它的思想是:由于部分權(quán)重的出現(xiàn)次數(shù)遠(yuǎn)高于其他權(quán)重,因此對(duì)于出現(xiàn)次數(shù)較多的權(quán)重,我們可以用更少的比特位來(lái)編碼。

而對(duì)于出現(xiàn)次數(shù)較少的權(quán)重,則用較大的比特位來(lái)表達(dá)。那么該方法可以在總體 Index 為已知的角度,直接用固定的位數(shù)進(jìn)行存儲(chǔ),從而節(jié)約了空間。

模型壓縮的流程是:進(jìn)行 channel 級(jí)別的權(quán)重剪枝→對(duì)權(quán)重進(jìn)行量化→聚類(lèi)到固定的幾個(gè)類(lèi)中→將量化后的 Index 通過(guò)霍夫曼編碼進(jìn)行進(jìn)一步壓縮。

設(shè)計(jì)網(wǎng)絡(luò)

另一個(gè)壓縮的思路是設(shè)計(jì)小網(wǎng)絡(luò),它主要有三種方式:

  • SqueezeNet
  • MobileNet
  • ShuffleNet

SqueezeNet 的核心思想是在做下一個(gè) 3×3 的卷積時(shí),先進(jìn)行一個(gè) 1×1 的卷積,將以前的 64 維降到 16 維,然后在此 16 維的基礎(chǔ)上再進(jìn)行 3×3 的卷積。

這樣就相當(dāng)于在做 3×3 的卷積之處比原來(lái)降低了 4 倍,也就是將模型降低到原來(lái)的四分之一。

谷歌于 2017 年 3 月提出了一個(gè)較小的模型 MobileNets。它主要采取了 Group 的策略,核心思想是:不再與前面的所有層進(jìn)行操作,只跟對(duì)應(yīng)的上一層通道做卷積。

例如:以前的權(quán)重是 3×3×32,再乘以前面的 32 個(gè)通道,就是有兩個(gè) 32 相乘。

通過(guò)使用 Group,我們只需一個(gè) 32,因?yàn)楹竺娉说氖?1(跟每一個(gè)通道相乘),此處比原來(lái)減少了 32 倍。

如果后面的通道數(shù)越多,如 512,則會(huì)比原來(lái)相應(yīng)地減少 512 個(gè),所以這是非??捎^的。

2017 年 7 月,F(xiàn)ace++ 團(tuán)隊(duì)提出了更進(jìn)一步的做法 ShuffleNet。考慮到在通道大的時(shí)候,1×1 的卷積到 1024 或者 2048 的計(jì)算量也會(huì)很大,因此它將 1×1 的卷積也進(jìn)行了 Group 操作。

在分組之后,我們單獨(dú)地進(jìn)行 1×1 的卷積,并且隨即將順序打亂。這樣便可以把通道與通道之間的關(guān)系表達(dá)進(jìn)去。

這個(gè)是我們?cè)诠_(kāi)數(shù)據(jù)集 ImageNet 上的數(shù)據(jù)集實(shí)驗(yàn)。我們將原大小為 98M 的模型,通過(guò)模型壓縮后降到了 49M,而在權(quán)重的量化之后,繼續(xù)減到了 15M。

在整個(gè)過(guò)程中,Top-1 從 75% 變成 72.4%,該降幅比較少,而業(yè)界一般準(zhǔn)確率是在 75%~76%??梢?jiàn)這個(gè)實(shí)驗(yàn)是比較可觀和可用的。

上圖的結(jié)果源自蘑菇街自己的實(shí)際數(shù)據(jù)。當(dāng)前我們的數(shù)據(jù)樣本大致是 1200 萬(wàn),通過(guò)“剪枝”之后,Top-1 基本保持在 48%。

而 Top-5 降低了 1 個(gè)點(diǎn),從 82.2% 降至 81.5%,但是模型的大小則從 86M 降到了 31M;同時(shí) Inference Time 為 45 毫秒。這就意味著效率提升了一倍。

另一個(gè)嘗試是語(yǔ)意分割網(wǎng)絡(luò)。蘑菇街基于服裝的特點(diǎn)對(duì)人體的各個(gè)部位進(jìn)行了“分割”,包括手、腳、鞋子、衣服、褲子等。該語(yǔ)義分割模型的基礎(chǔ)網(wǎng)絡(luò)為 MobileNet,最終模型只有 13M。

移動(dòng)端優(yōu)化實(shí)踐

在將模型做得足夠小之后,我們又是如何讓它跑在手機(jī)之上的呢?

在手機(jī)上做深度學(xué)習(xí)時(shí),由于計(jì)算量非常大,我們不應(yīng)該將訓(xùn)練放在手機(jī)上,而是仍然交給 GPU 來(lái)實(shí)現(xiàn)。而在訓(xùn)練完成之后,我們?cè)賹⒛P筒渴鸬绞謾C(jī)端。

如今業(yè)界常用且好用的深度學(xué)習(xí)框架包括:

  • Facebook 推出的 Caffe2,亞馬遜選用的 MXNet。不過(guò)我們?cè)囉孟聛?lái)發(fā)現(xiàn),它們?cè)谑謾C(jī)上的實(shí)際性能表現(xiàn)卻不盡人意,對(duì)于一張圖的識(shí)別可能需要 8~9 秒。
  • NCNN 是騰訊開(kāi)源的框架,而 MDL 則是百度開(kāi)源的移動(dòng)端深度學(xué)習(xí)框架。
  • CoreML 是蘋(píng)果在 2017 年 WWDC 上發(fā)布的在手機(jī)上的深度學(xué)習(xí)框架。
  • Tensorflow Lite 是谷歌在 2017 年 I/O 大會(huì)上發(fā)布的開(kāi)源產(chǎn)品。

那么對(duì)于一個(gè)網(wǎng)絡(luò),我們是否非要將 Inference 與訓(xùn)練網(wǎng)絡(luò)做得一樣呢?如今業(yè)界大部分框架的做法的確如此,例如 NCNN 和 MDL,它們都是直接把訓(xùn)練好的網(wǎng)絡(luò)轉(zhuǎn)到手機(jī)上運(yùn)行。

但是我們發(fā)現(xiàn)在訓(xùn)練的時(shí)候,需要做一些梯度計(jì)算和反向傳播,而在 Inference 時(shí),我們實(shí)際上并沒(méi)有必要做反向傳播。

上圖中是一個(gè)典型 CNN 網(wǎng)絡(luò)里的單個(gè) Block(塊),從 Convolution 到 BN(BachNormalization)再到 Relu。

這三層在存儲(chǔ)時(shí)對(duì)于內(nèi)存的需求非常大,實(shí)際上我們完全可以將它們合為一層,從而減少內(nèi)存的使用,并加快速度。

在具體實(shí)現(xiàn)過(guò)程中,我們將 BN 放到 Convolution 里的轉(zhuǎn)變是不需要改動(dòng)框架代碼的。但是如果要把 Relu 放入 Convolution,則需要修改此框架的源代碼。

優(yōu)化卷積計(jì)算

由于深度學(xué)習(xí)在處理圖像時(shí),大部分的計(jì)算都涉及到卷積,因此比較直觀的做法就是直接進(jìn)行 3×3 Filter。

因?yàn)閿?shù)據(jù)和圖像在內(nèi)存里的存儲(chǔ)是連續(xù)的,從而導(dǎo)致了讀取時(shí)經(jīng)常需要到各處跳轉(zhuǎn),這造成了指針跨度巨大,極大降低了 cache 命中率。

所以大部分的卷積算法優(yōu)化都采取將 Filter 乘法轉(zhuǎn)化成傳統(tǒng)的矩陣乘法。如上圖右側(cè)所示,原來(lái) 7x7 矩陣和 3x3 矩陣分別被轉(zhuǎn)化成了 25×9 的矩陣和 9×1 矩陣。

我們通過(guò)直接對(duì)大型矩陣進(jìn)行乘法操作,便可得到結(jié)果,且該結(jié)果跟原來(lái)是一模一樣的。這也是目前許多針對(duì)矩陣運(yùn)算的加速庫(kù)所普遍采用的優(yōu)化方式。

2017 年 MEC 算法被推出,由于原來(lái) 7×7 矩陣的轉(zhuǎn)化率 25×9 中存在著冗余和復(fù)制,該算法把它變換成為 5×21。就數(shù)量級(jí)而言,該 5×21 比 25×9 降低約一倍的內(nèi)存,其性能更為直觀。

浮點(diǎn)運(yùn)算定點(diǎn)化

由于深度學(xué)習(xí)模型的權(quán)重和特征圖的值是浮點(diǎn)數(shù),而計(jì)算機(jī)對(duì)于浮點(diǎn)的運(yùn)算能力遠(yuǎn)不及定點(diǎn)的運(yùn)算,例如:計(jì)算 3+2 和 3.0+2.0 的速度肯定是不一樣的,因此我們需要將傳過(guò)來(lái)的浮點(diǎn)數(shù)先給轉(zhuǎn)化成定點(diǎn)數(shù)。

例如:如果權(quán)重的大部分都是 0.1 或 0.2 的話,那么我們通過(guò)求最小、最大值的方式將其映射到了 0 到 2 上,而 0 到 2 正好是一個(gè)字節(jié),因此一個(gè) 8 位就能夠予以表達(dá)了。

如此,我們?cè)谟?jì)算 Convolution 矩陣相乘時(shí),完全可以直接使用典型的矩陣來(lái)進(jìn)行計(jì)算,其速度會(huì)比使用浮點(diǎn)數(shù)計(jì)算快很多。

當(dāng)然,在計(jì)算完成之后,我們還需將結(jié)果轉(zhuǎn)換成浮點(diǎn)數(shù)予以輸出。

除了上述提到的優(yōu)化卷積的核心方法,我們還能怎么進(jìn)化呢?

  • 再牛的核心算法,都不如硬件實(shí)現(xiàn)來(lái)得直接。此處主要是針對(duì)蘋(píng)果產(chǎn)品,蘋(píng)果在做圖像識(shí)別時(shí)使用的就是自己開(kāi)發(fā)的帶有卷積乘法的 GPU 硬件。

我們?cè)诙伍_(kāi)發(fā)時(shí)可以直接調(diào)用它提供的基礎(chǔ)卷積操作,而不必使用任何前面提到的算法。

  • 另外,前面提到的許多框架都是通用的優(yōu)化算法。但是在實(shí)際深度學(xué)習(xí)中,我們根本不需要那么多具有通用性的卷積。

例如:剛才列出的很多網(wǎng)絡(luò),要么是 1×1 的卷積,要么是 3×3 的卷積,基本上不會(huì)出現(xiàn) 2×2 的卷積。

因此我們只需要使用 3×3 的卷積優(yōu)化便可。正如騰訊 NCNN 所采用的特定卷積策略,僅優(yōu)化 3×3 和 1×1 的卷積。我們同樣可以不必考慮其他的矩陣相乘方式,如此便可提高實(shí)現(xiàn)速度。

通過(guò)深入分析,我們發(fā)現(xiàn):騰訊與百度在安卓上的效果差不多。如前所述,由于騰訊針對(duì) 3×3 和 1×1 優(yōu)化采取的是特定卷積,而百度采取的是通用做法,所以后者更耗內(nèi)存。

當(dāng)然兩者性能都在 200 毫秒左右,而對(duì)于開(kāi)源的 Tensorflow Lite,由于它將浮點(diǎn)型轉(zhuǎn)為整型進(jìn)行運(yùn)算,其性能會(huì)比上述兩者更快,只需 85 毫秒,基本可以滿足實(shí)時(shí)性的要求。

針對(duì)深度學(xué)習(xí),蘋(píng)果于 2017 年發(fā)布了 CoreML。它在網(wǎng)上被炒得特別火,其框架如上圖所示,最下面被分化出了負(fù)責(zé)加速的一層 BNNS,它是用 C 語(yǔ)言寫(xiě)的機(jī)器學(xué)習(xí)庫(kù)。

旁邊的 Metal Performance Shaders 屬于蘋(píng)果自己的硬件,它封裝好了與機(jī)器學(xué)習(xí)相關(guān)的底層 API。

二次開(kāi)發(fā)人員可以在 CoreML 的底層基礎(chǔ)上,進(jìn)行適當(dāng)?shù)膽?yīng)用添加。不過(guò)我們并沒(méi)有采用該 CoreML,原因如下:

  • 由于蘋(píng)果比較封閉,它只能提供現(xiàn)成的框架和既定的模型。而計(jì)算機(jī)視覺(jué)的算法開(kāi)發(fā)領(lǐng)域發(fā)展速度非???,我們經(jīng)常需要開(kāi)發(fā)出一些新的層(layer)。因此 CoreML 無(wú)法滿足我們的算法要求。
  • CoreML 的庫(kù)需要調(diào)用最新的 iOS 包,而許多蘋(píng)果手機(jī)的 iOS 版本并未升級(jí)到 iOS11 以上。

所以在 iOS 上,我們是在 MPSCNN 層實(shí)現(xiàn)計(jì)算卷積的,好處在于:

  • Metal 的機(jī)制充分利用了 GPU 資源,而在 iOS 上不會(huì)搶占 CPU 資源。
  • 運(yùn)用蘋(píng)果自己的 Metal 語(yǔ)言去開(kāi)發(fā)新的一層會(huì)非常的方便。

同時(shí)需要注意如下兩點(diǎn):

  • Metal 實(shí)現(xiàn)的是 16 位 Float 數(shù)的計(jì)算,并非 32 位,因此屬于半精度。
  • 其權(quán)重的格式是 NHWC。

有人可能會(huì)質(zhì)疑半精度的計(jì)算準(zhǔn)確率,然而,由于深度學(xué)習(xí)有著非常強(qiáng)的泛化能力,就算減少計(jì)算精度,受到的影響基本上也并不大,同樣可以完成任務(wù)。

上圖展示的是蘋(píng)果 MPSCNN 的設(shè)計(jì)思想。不同于其他常見(jiàn)框架的組織結(jié)構(gòu):它對(duì)權(quán)重以 4 的整數(shù)倍通道數(shù)去進(jìn)行存儲(chǔ)。

例如:有 9 個(gè)通道需要用 3 個(gè) Slices 時(shí),那么到了最后一次 Slice,就只需存儲(chǔ)一個(gè)通道并空閑另外三個(gè)通道,以預(yù)留空間。因此,理解了這個(gè)核心點(diǎn)將有助于我們加快開(kāi)發(fā)的進(jìn)程。

如上圖所示,如果你想用 Metal 來(lái)開(kāi)發(fā)新的一層,而且已經(jīng)有了一定的算法基礎(chǔ),那么上述幾行代碼就夠了。

根據(jù)上圖的 NCNN 與蘋(píng)果 MPSCNN 對(duì)比可知,運(yùn)用開(kāi)源框架的 CPU 耗時(shí)為 110 毫秒,而蘋(píng)果要少于一半,只要 45 毫秒??梢?jiàn)蘋(píng)果的效果確實(shí)不錯(cuò)。

就自行搭建深度學(xué)習(xí)框架而言,我們需要注意如下的策略方面:

  • 優(yōu)化 Inference 網(wǎng)絡(luò)結(jié)構(gòu)。請(qǐng)牢記 Inference 網(wǎng)絡(luò)與 Training 的不同之處。如前所述,通過(guò)將傳統(tǒng)的三層合并為一層,我們能夠大幅降低開(kāi)銷(xiāo)。
  • GPU 加速。由于蘋(píng)果使用 Metal 進(jìn)行封閉存儲(chǔ),因此對(duì)于 GPU 的加速在 iOS 上做得比較好。而其他非 iOS 的安卓生態(tài),目前尚無(wú)較好的 GPU 加速硬件。
  • 指令加速。如今 99% 以上的安卓手機(jī)里都是使用的 ARM 芯片,該芯片能夠提供一些統(tǒng)一的指令集,以供我們實(shí)現(xiàn)底層的加速。
  • 鑒于 CPU 普遍為多核的特點(diǎn),我們也可以采取多線程的方式進(jìn)行加速。
  • 采取內(nèi)存布局優(yōu)化,將傳統(tǒng)的 NCHW(N:number、C:channel、H:height、W:width)多維方式中的 channel 維度放到最后,變成 NHWC 以提高速度。
  • 將浮點(diǎn)運(yùn)算轉(zhuǎn)到定點(diǎn)化,以提升計(jì)算速度。

基于 NCNN 的工具包框架

Mogu Deep Learning Toolkit 是蘑菇街于 2016 開(kāi)發(fā)的僅供公司內(nèi)部使用的深度學(xué)習(xí)工具包。

由于各層都被做得十分專(zhuān)業(yè)極致,其高內(nèi)聚低耦合的特點(diǎn)在網(wǎng)絡(luò)設(shè)計(jì)上顯得非常靈活,對(duì)于專(zhuān)業(yè)人士來(lái)說(shuō)也比較好用。

該工具包的設(shè)計(jì)思想為:在優(yōu)化掉 Training 網(wǎng)絡(luò)的基礎(chǔ)上,我們?cè)谑謾C(jī)上為從網(wǎng)絡(luò)進(jìn)來(lái)的圖片創(chuàng)建一個(gè)網(wǎng)絡(luò)模型→對(duì)它進(jìn)行初始化→通過(guò)前端傳播進(jìn)行Inference→針對(duì)具體的 Task,對(duì)傳播的結(jié)果進(jìn)行諸如 Classification、Detection、Segmentation 等操作→獲取結(jié)果或與其他業(yè)務(wù)相結(jié)合。

上圖是利用該工具包開(kāi)發(fā)的一個(gè)簡(jiǎn)單案例,是用 C++ 實(shí)現(xiàn)的。這是 MobileNet 的一個(gè) Class,我們將全部各層都放入了 Private 中,它只有一個(gè)對(duì)外的接口,通過(guò)初始化便可拿到其結(jié)果。

這里輸入的是一張圖片,最后 Output 的是該圖片的識(shí)別結(jié)果。

深度學(xué)習(xí)優(yōu)化在業(yè)務(wù)中的嘗試

上圖是我們做的一些實(shí)戰(zhàn):

  • 左圖是用 ImageNet 識(shí)別圖片,它給出了排名第一的可能性是顯示屏,而排名第二的是筆記本。
  • 右圖通過(guò)語(yǔ)義分割,我們使用 MobileNet 作為特征網(wǎng)絡(luò),訓(xùn)練出一個(gè)可以分割的網(wǎng)絡(luò)。

通過(guò)對(duì)圖中人物的分割,我們區(qū)分出了頭發(fā)、衣服、包、鞋子、腿、手等不同部分,以供進(jìn)一步進(jìn)行分析。

其消耗時(shí)間也相當(dāng)可觀,大概在 40 毫秒左右。

上圖左側(cè)展示了我們的另一個(gè)訓(xùn)練模型--識(shí)別領(lǐng)形。通過(guò)圖像識(shí)別的方法,我們分辨出該T恤是圓領(lǐng)還是 v 領(lǐng)、是長(zhǎng)袖還是無(wú)袖。根據(jù)其下方的判斷,它是圓領(lǐng)的概率為 66.7%。

上圖右側(cè)展示的是我們公司內(nèi)部的通訊工具。它被安裝在手機(jī)上,并在本地運(yùn)行,能夠根據(jù)深度學(xué)習(xí)的結(jié)果,執(zhí)行圖片分類(lèi)。

總結(jié)

要想把深度學(xué)習(xí)做到移動(dòng)端上,一定要將算法與工程相結(jié)合。

[[230005]]

黃文波,蘑菇街圖像算法工程師,主要從事深度學(xué)習(xí)相關(guān)工作,包括模型加速壓縮、GAN、藝術(shù)風(fēng)格轉(zhuǎn)換以及人臉相關(guān)應(yīng)用,尤其對(duì)深度學(xué)習(xí)在移動(dòng)端的優(yōu)化有較深入的研究。

【51CTO原創(chuàng)稿件,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文作者和出處為51CTO.com】

責(zé)任編輯:武曉燕 來(lái)源: 51CTO技術(shù)棧
相關(guān)推薦

2017-10-13 17:35:30

深度學(xué)習(xí)移動(dòng)端機(jī)器學(xué)習(xí)

2018-06-29 09:01:51

開(kāi)源技術(shù) 深度學(xué)習(xí)

2017-08-17 09:45:04

模型移動(dòng)嵌入式端

2017-08-28 15:00:02

深度學(xué)習(xí)DeepSense傳感器

2017-11-16 17:26:35

深度學(xué)習(xí)移動(dòng)設(shè)備MobileNets應(yīng)

2021-09-26 13:50:52

AI 數(shù)據(jù)強(qiáng)化學(xué)習(xí)

2020-01-23 15:08:02

開(kāi)源技術(shù) 趨勢(shì)

2018-05-14 12:18:47

AI開(kāi)發(fā)深度學(xué)習(xí)框架

2017-04-21 14:21:53

深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)

2021-03-19 17:59:30

深度學(xué)習(xí)音頻程序

2021-03-29 10:56:51

人工智能深度學(xué)習(xí)

2014-05-26 16:52:29

移動(dòng)前端web組件

2016-12-23 09:09:54

TensorFlowKubernetes框架

2013-12-12 10:59:40

移動(dòng)端產(chǎn)品在線教育移動(dòng)互聯(lián)網(wǎng)

2012-05-23 23:36:09

Google

2021-09-03 09:44:13

移動(dòng)端性能優(yōu)化U-APM

2023-05-26 08:39:44

深度學(xué)習(xí)Alluxio

2020-03-02 17:03:32

深度學(xué)習(xí)人工智能機(jī)器學(xué)習(xí)

2018-03-14 08:10:44

深度學(xué)習(xí)

2019-10-25 10:42:51

框架Web開(kāi)發(fā)
點(diǎn)贊
收藏

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