介紹
才不久才剛剛寫了MobileNet v2的博客干毅,它來(lái)自Google蓬网。而今天看過(guò)了ShuffleNet v2瘸味,很是感慨切端。這篇來(lái)自Face++ Sun, Jian團(tuán)隊(duì)的paper與Google團(tuán)行們的作品相比真正是有著鴻泥之別啊型将。Google的paper大多立足于理論挖掘寂祥,提出些似是而非的東東,然后再用實(shí)驗(yàn)結(jié)果立圖去證其非偽七兜,確實(shí)難懂丸凭,一般情況你不反復(fù)讀個(gè)兩、三遍是不會(huì)吃透的腕铸。惜犀。Face++的則立足于實(shí)際(可能是因?yàn)橹袊?guó)人寫的英文比較合乎國(guó)人的思維習(xí)慣吧),一點(diǎn)點(diǎn)狠裹,娓娓道來(lái)向拆,一切看上去順理成章,翻過(guò)一遍就能讓人恍然大悟酪耳,對(duì)其妙處更是擊節(jié)贊賞半天不已浓恳。
以往的移動(dòng)端的CNN設(shè)計(jì)在考慮計(jì)算節(jié)省時(shí)都直接致力于優(yōu)化整體網(wǎng)絡(luò)計(jì)算所需的Flops刹缝。但實(shí)際上一個(gè)網(wǎng)絡(luò)模型的訓(xùn)練或推理過(guò)程Flops等計(jì)算只是其時(shí)間的一部分,其它像內(nèi)存讀寫/外部數(shù)據(jù)IO操作等都會(huì)占不小比例的時(shí)間颈将。為實(shí)際生產(chǎn)考慮梢夯,我們不應(yīng)只限于去片面追求理論Flops的減少,更應(yīng)該去看所設(shè)計(jì)的網(wǎng)絡(luò)實(shí)際部署在不同類型芯片上時(shí)卻具有的實(shí)際時(shí)間消耗晴圾。
在ShuffleNet v2這篇paper中颂砸,作者們重點(diǎn)分析了影響在GPU/ARM兩種平臺(tái)上CNN網(wǎng)絡(luò)計(jì)算性能的幾個(gè)主要指標(biāo),并提出了一些移動(dòng)端CNN網(wǎng)絡(luò)設(shè)計(jì)的指導(dǎo)準(zhǔn)則(呵呵死姚,這一點(diǎn)做法像是來(lái)自于Inception系列或者M(jìn)obileNet系列文章叭伺摇),最終將這些指導(dǎo)準(zhǔn)則應(yīng)用于ShuffleNet v1網(wǎng)絡(luò)的改良就行成了本篇所講的ShuffleNet v2都毒。在分類與目標(biāo)檢測(cè)等通用任務(wù)時(shí)與其它流利移動(dòng)端網(wǎng)絡(luò)相比色罚,它都取得了不俗的性能。
高效CNN網(wǎng)絡(luò)設(shè)計(jì)的幾個(gè)指導(dǎo)準(zhǔn)則
這篇Paper讓做網(wǎng)絡(luò)優(yōu)化的工程師讀起來(lái)會(huì)感覺(jué)特別親切账劲,因?yàn)樗銐虻刭N地氣戳护,像極了平時(shí)對(duì)應(yīng)用程序的優(yōu)化過(guò)程。即先對(duì)應(yīng)用程序進(jìn)行hotspots分析瀑焦,看時(shí)間主要耗在了哪里腌且。然后就分析各個(gè)hotspot的原因,再針對(duì)性地提出優(yōu)化辦法以減少整體所需的時(shí)間從而達(dá)到最終的性能指標(biāo)榛瓮。
CNN網(wǎng)絡(luò)時(shí)間消耗分析
下圖中分析了ShuffleNet v1與MobileNet v2這兩個(gè)移動(dòng)端流行網(wǎng)絡(luò)在GPU/ARM兩種平臺(tái)下的時(shí)間消耗分布铺董。
從上圖中可看出Conv等計(jì)算密集型操作占了其時(shí)間的絕大多數(shù),但其它像Elemwise/Data IO等內(nèi)存讀寫密集型操作也占了相當(dāng)比例的時(shí)間禀晓,因此像以往那樣一味以FLOPs來(lái)作為指導(dǎo)準(zhǔn)則來(lái)設(shè)計(jì)CNN網(wǎng)絡(luò)是不完備的柄粹,雖然它可以反映出占大比例時(shí)間的Conv操作。
高效CNN網(wǎng)絡(luò)設(shè)計(jì)的四個(gè)準(zhǔn)則
- 當(dāng)輸入匆绣、輸出channels數(shù)目相同時(shí)驻右,conv計(jì)算所需的MAC(memory access cost)最為節(jié)省。
作者們?cè)趐aper中從理論與實(shí)驗(yàn)上證明了此一準(zhǔn)則的有效崎淳。以下關(guān)系表示了MAC與FLOPs(B)及輸入堪夭、輸出channels數(shù)目之間的關(guān)系。
下表為其實(shí)驗(yàn)佐證拣凹。
- 過(guò)多的Group convolution會(huì)加大MAC開(kāi)銷森爽。
下面公式表明了在Group convolution操作中MAC與g之間的正比例關(guān)系。
下表結(jié)果則為其實(shí)驗(yàn)佐證嚣镜。
- 網(wǎng)絡(luò)結(jié)構(gòu)整體的碎片化會(huì)減少其可并行優(yōu)化的程序爬迟。
下表為作者在GPU/ARM兩種平臺(tái)上設(shè)計(jì)的分析并行/串行兩種網(wǎng)絡(luò)碎片方式對(duì)整體FPS所可能具有的影響。
- Element-wise操作會(huì)消耗較多的時(shí)間菊匿,不可小視付呕。
Element-wise操作是一種典型的memory access密集操作计福。所以它對(duì)整個(gè)網(wǎng)絡(luò)計(jì)算所需的時(shí)間影響也挺大,不可輕視徽职。下表為使用Element-wise操作前后網(wǎng)絡(luò)所具有的FPS結(jié)果象颖。
ShuffleNet v2
ShuffleNet v1分析
在ShuffleNet v1的操作中充滿了對(duì)上述章節(jié)介紹過(guò)的四個(gè)設(shè)計(jì)準(zhǔn)則的違反。首先它使用了bottleneck 1x1 group conv與module最后的1x1 group conv pointwise模塊姆钉,使得input channels數(shù)目與output channels數(shù)目差別較大说订,違反了上述規(guī)則一與規(guī)則二;其次由于它整體網(wǎng)絡(luò)結(jié)構(gòu)中過(guò)多的group conv操作的使用從而違反了上述規(guī)則三潮瓶;最后類似于Residual模塊中的大量Element-wise sum的使用則進(jìn)而違反了上述規(guī)則四陶冷。
ShuffleNet v2的設(shè)計(jì)
ShuffleNet v2中棄用了1x1的group convolution操作,而直接使用了input/output channels數(shù)目相同的1x1普通conv毯辅。它更是提出了一種ChannelSplit新的類型操作埂伦,將module的輸入channels分為兩部分,一部分直接向下傳遞悉罕,另外一部分則進(jìn)行真正的向后計(jì)算赤屋。到了module的末尾立镶,直接將兩分支上的output channels數(shù)目級(jí)連起來(lái)壁袄,從而規(guī)避了原來(lái)ShuffleNet v1中Element-wise sum的操作。然后我們?cè)賹?duì)最終輸出的output feature maps進(jìn)行RandomShuffle操作媚媒,從而使得各channels之間的信息相互交通嗜逻。。精彩至極缭召,看至此處已然拍案叫絕栈顷。
跟ShuffleNet v1一樣,它也提供了一種需要downsampling的模塊變形嵌巷。為了保證在下采樣的時(shí)候增加整體輸出channels數(shù)目萄凤,它取消了模塊最開(kāi)始時(shí)的RandomSplit操作,從而將信處向下分別處理后再拼結(jié)搪哪,使得最終outptu channels數(shù)目實(shí)現(xiàn)翻倍靡努。
說(shuō)了一大通,更是直接看下圖吧晓折。下圖中的a/b為原ShuffleNet v1中具有的兩種模塊結(jié)構(gòu)惑朦。圖c/d則為ShuffleNet v2中的模塊設(shè)計(jì)。
下表為ShuffleNet v2的整體網(wǎng)絡(luò)結(jié)構(gòu)漓概。它亦具有MobileNet系列模型中所使用過(guò)的縮減系數(shù)來(lái)控制accuracy與efficiency之間的平衡漾月。
實(shí)驗(yàn)結(jié)果
下表中涵蓋了Paper中進(jìn)行的廣泛實(shí)驗(yàn)。從中可看出ShuffleNet v2相對(duì)其它移動(dòng)端網(wǎng)絡(luò)所具有的分類精度及計(jì)算效率上的性能優(yōu)勢(shì)胃珍。
參考文獻(xiàn)
- ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design, Ningning-Ma, 2018