移動(dòng)設(shè)備上的實(shí)時(shí)深度學(xué)習(xí)
2017年,在移動(dòng)應(yīng)用的深度學(xué)習(xí)方面取得了一些重大進(jìn)展。2017年4月,谷歌發(fā)布了輕量級(jí)神經(jīng)網(wǎng)絡(luò)MobileNets。2017年6月,蘋(píng)果公司發(fā)布了Core ML,支持在移動(dòng)設(shè)備上運(yùn)行機(jī)器學(xué)習(xí)模型。除此之外,最近發(fā)布的一些高端設(shè)備配備了GPU,它們運(yùn)行機(jī)器學(xué)習(xí)甚至比MacBook Pro還要快。
深度學(xué)習(xí)已經(jīng)無(wú)處不在。在這篇文章里,我將會(huì)介紹深度學(xué)習(xí)在現(xiàn)實(shí)世界中的應(yīng)用情況,并見(jiàn)識(shí)一下它們的速度到底有多快。
MobileNets應(yīng)用
我們最近開(kāi)發(fā)了一種新的深度神經(jīng)網(wǎng)絡(luò),叫作MobileUNet,用于解決語(yǔ)義切分問(wèn)題。它的設(shè)計(jì)極其簡(jiǎn)單,它在U-Net中使用了MobileNets。這里只列出其中關(guān)鍵的點(diǎn),更多細(xì)節(jié)可以參考它的GitHub倉(cāng)庫(kù)。
- 它由編碼器和解碼器組成。
- 編碼器使用了MobileNets,缺少用于分類的全連接層。
- 解碼器使用卷積轉(zhuǎn)置進(jìn)行升采樣(upsample)。
在開(kāi)發(fā)該項(xiàng)目時(shí),我們主要關(guān)心它的推理速度。我們知道深度神經(jīng)網(wǎng)絡(luò)在GPU上跑得更快一些,但如果運(yùn)行在移動(dòng)設(shè)備上會(huì)怎樣呢?
這也就是為什么我們使用了MobileNets。
- 它使用深度卷積塊(depthwise conv block)來(lái)加快推理速度。
- 它具有更高的準(zhǔn)確性和推理速度比率。
- 它提供了一些參數(shù)用于在準(zhǔn)確性和速度之間做出權(quán)衡。
我們可以得到較為理想的結(jié)果,如下圖所示。
速度與準(zhǔn)確性
在介紹MobileUNet的性能之前,我想先澄清幾個(gè)一般性的概念。
是否所有的卷積(如Conv2D、DepthwiseConv2D和Conv2DTranspose)在不同的處理器上都有相同的速度表現(xiàn)?
答案是否定的。在不同的處理器上,有些操作會(huì)很快,有些會(huì)很慢。CPU和GPU之間的區(qū)別是很容易區(qū)分出來(lái)的,即使是不同的GPU之間也存在優(yōu)化差異。
下圖展示了普通的卷積塊和深度卷積塊之間的差別。
深度卷積塊和普通卷積塊在CPU上的表現(xiàn)差別很大,但在GPU上的差別卻小了很多。
因此,如果你想要發(fā)布基于移動(dòng)設(shè)備的深度學(xué)習(xí)應(yīng)用,最好先在主流的設(shè)備上做一下測(cè)試。接下來(lái),我要分享一下MobileUNet的各種指標(biāo)。
我們主要使用了以下幾個(gè)設(shè)備。
- iPhone 6 Plus
- iPhone 7 Plus
- iPhone 8 Plus
- Sony Xperia XZ(驍龍820)
MobileNets提供了一個(gè)叫作alpha的參數(shù)用于控制速度和準(zhǔn)確性之間的比率,所以我們也在MobileUNet里使用了這個(gè)參數(shù)。我們選擇了4個(gè)alpha值(1、0.75、0.5和0.25)和4種尺寸的圖像(224、192、160、128)。
下圖是速度對(duì)比。
讓人感到驚訝的是,速度最快的并不是iPhone 8 Plus,而是iPhone 7 Plus。iPhone 7 Plus真的很快,在實(shí)時(shí)應(yīng)用方面完全沒(méi)有問(wèn)題。iPhone 6 Plus和驍龍820就沒(méi)那么快了,特別是當(dāng)alpha值很大的時(shí)候就更慢了。
下圖是準(zhǔn)確性對(duì)比。
在alpha達(dá)到0.25時(shí),準(zhǔn)確性開(kāi)始急速下降。準(zhǔn)確性隨著alpha的值和圖像尺寸呈線性下降。所以,我們不使用alpha 0.25這個(gè)值。
下圖展示了在驍龍820上運(yùn)行的速度和準(zhǔn)確性。
如果速度對(duì)于我們來(lái)說(shuō)很重要,那么就可以考慮左上角那個(gè),尺寸為128,準(zhǔn)確性為0.875 IoU,alpha值為0.5。如果更看重準(zhǔn)確性,那么可以選擇尺寸為192、alpha值為0.5的那個(gè)。
當(dāng)然,我們也可以為不同的設(shè)備使用不同的模型,但這樣會(huì)增加復(fù)雜性。
現(xiàn)在讓我們來(lái)看看為什么iPhone 7 Plus會(huì)比iPhone 8 Plus更快。
之前已經(jīng)說(shuō)過(guò),速度取決于每個(gè)處理器。iPhone 7 Plus的GPU比iPhone 8 Plus的GPU更加契合我們的神經(jīng)網(wǎng)絡(luò),為此我做了一個(gè)實(shí)驗(yàn)。
我們將MobileUNet的編碼器和解碼器分為不同的部分,并測(cè)試它們的性能。
很明顯,解碼器部分是iPhone 8 Plus的瓶頸所在。我們?cè)诮獯a器中使用了Conv2DTranspose,iPhone 7 Plus的GPU針對(duì)Conv2DTranspose進(jìn)行過(guò)優(yōu)化,而iPhone 8 Plus則沒(méi)有。
用于基準(zhǔn)測(cè)試的腳本放在了Gist上。
結(jié)論
在移動(dòng)設(shè)備上使用深度學(xué)習(xí)已經(jīng)成為一種趨勢(shì),在不久的將來(lái),深度學(xué)習(xí)的應(yīng)用會(huì)越來(lái)越方便。
但不是所有的設(shè)備都配備了高端GPU,所以進(jìn)行性能調(diào)優(yōu)是很有必要的。因?yàn)椴煌奶幚砥骶哂胁煌奶攸c(diǎn),所以一定要使用真實(shí)的設(shè)備進(jìn)行性能測(cè)試。
性能測(cè)試本身并不難,甚至不需要使用訓(xùn)練過(guò)的模型,我們完全可以使用未訓(xùn)練的模型找出性能的瓶頸。