<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          增量推理:一種CNN加速的新思路

          共 9816字,需瀏覽 20分鐘

           ·

          2021-02-25 22:04

          ↑ 點擊藍(lán)字?關(guān)注極市平臺

          作者丨RESUMMER@知乎(已授權(quán))
          來源丨h(huán)ttps://zhuanlan.zhihu.com/p/339278582
          編輯丨極市平臺

          極市導(dǎo)讀

          ?

          本文以視頻目標(biāo)檢測(ORV),基于遮擋的CNN解釋(OBE)這兩個任務(wù)為例講解了增量推理的工作原理和流程以及單個層的批量增量如何推理擴(kuò)展到整個CNN。?>>加入極市CV技術(shù)交流群,走在計算機(jī)視覺的最前沿

          一. 傳統(tǒng)的CNN加速思路

          在圖像識別領(lǐng)域,現(xiàn)在的CNN往往都是結(jié)構(gòu)很復(fù)雜的,動輒就有幾百萬的網(wǎng)絡(luò)參數(shù),輸入數(shù)據(jù)集也逐漸由低分辨圖片變成高分辨率圖片或是視頻。在這種情況下,完成1次前向推理,計算量是非常大的,需要的時間也會很長。更不用說,對于某些應(yīng)用場景(比如視頻目標(biāo)識別等)需要不斷地發(fā)起再推理(re-inference),這就對模型的速度提出了更高的要求。客觀來說,早期的CNN研究的主要關(guān)注點是提高模型的精度,在ImageNet比賽的推動下,大家通過增加網(wǎng)絡(luò)的層數(shù)以及對網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行微調(diào)(比如添加dropout、Inception結(jié)構(gòu)等),使得模型能夠在ImageNet數(shù)據(jù)集上取得越來越高的準(zhǔn)確率,但這也帶來了網(wǎng)絡(luò)參數(shù)的膨脹和計算量的劇增等問題。對于這些參數(shù)量和計算量都非常大的CNN模型,往往就只能在PC端或云端進(jìn)行部署,巨大的計算量和功耗使得這些網(wǎng)絡(luò)無法用于智能手機(jī)、嵌入式設(shè)備等平臺。

          在這種情況下,CNN加速越來越受到研究者們的重視,大家開始考慮能不能在犧牲一定模型精度的基礎(chǔ)上加快模型的速度,以及降低模型的功耗。最開始,CNN加速先是出現(xiàn)在軟件層面,大家一般有兩種思路:一是對現(xiàn)有的模型(如VGGNet、ResNet等)進(jìn)行精簡,刪除模型中的某些部分;二是重新設(shè)計結(jié)構(gòu)簡單的模型(如MobileNet等),更專注于提出一些新的層結(jié)構(gòu)。再后來,大家覺得CPU和GPU都不是專門為CNN設(shè)計的計算平臺,在執(zhí)行CNN推理時的效率實際上是不高的,于是紛紛開始設(shè)計專用于CNN的硬件加速器(即硬件層面的CNN加速)。這些硬件加速器最開始主要是在FPGA平臺上實現(xiàn)的(即FPGA加速器),并且一般使用HLS來生成電路。到后來,為了獲得更高的能效比,F(xiàn)PGA加速器的設(shè)計開始轉(zhuǎn)向RTL級(使用Verilog或VHDL),并逐漸遷移到ASCI上(即ASCI加速器)。

          二. 什么是增量推理?

          但是,我們現(xiàn)在要討論的CNN加速思路和傳統(tǒng)的思路都是不同的,我們把它稱為增量推理(Incremental Inference)。一般來說,增量推理主要適用于這樣一種情形:任務(wù)需要重復(fù)執(zhí)行CNN推理,而且輸入圖片的變化是很小的(PS:視頻也可以看做連續(xù)的圖片)。很顯然,我們上面提到的視頻目標(biāo)檢測(Object Recognition in Videos,ORV)就是這種類型的任務(wù),除了ORV,基于遮擋的CNN解釋(Occlusion-Based Explanations, OBE)也屬于這類任務(wù)。在這里,我們主要討論這兩種任務(wù),其它類似的任務(wù)就不再贅述了。

          圖1

          OBE其實就是一種解釋CNN為什么能完成識別的方法,除了OBE,CNN解釋還有基于梯度的CNN解釋(Gradient-Based Explanations, GBE)和基于傳播的CNN解釋(Propagation-Based Explanations, PBE)等常用的方法。大家都知道CNN能對輸入圖片進(jìn)行分類或者識別,但是很少有人知道CNN為什么能做到這一些,以及CNN是如何工作的,而CNN解釋就是為了解決這些問題而提出來的。

          圖1給出了OBE一般的工作流程:①. 先對原本的輸入圖像(這里是視網(wǎng)膜的OCT圖像)進(jìn)行前向推理,得到病人的眼睛發(fā)生糖尿病性視網(wǎng)膜病變的預(yù)測概率,如圖1(a)所示;②. 然后,在圖像上放置1個小的方形遮擋片遮擋住一部分像素,再進(jìn)行一次前向推理,得到1個新的預(yù)測概率,如圖1(b)所示。一般而言,由于遮擋了原圖的一小部分像素,預(yù)測概率會發(fā)生改變;③. 接著,通過移動遮擋片的位置,我們可以得到遮住原圖不同位置的預(yù)測概率。根據(jù)預(yù)測概率的大小,對相應(yīng)的遮擋片的位置進(jìn)行上色(顏色越紅表示概率越大,顏色越藍(lán)表示概率越?。?,我們就可以得到一幅概率變化的靈敏度熱力圖(sensitivity heatmap),如圖1(c)所示。熱力圖的紅色/橘色區(qū)域其實就標(biāo)注出來了輸入圖像中對輸出影響很大的區(qū)域,對OCT圖像而言,這些區(qū)域往往就是病變區(qū)域。

          圖2

          ORV就比較好理解了,它其實就是使用CNN來識別出視頻中的物體。ORV一般用于安全監(jiān)視、交通監(jiān)控、野外動物種類追蹤等應(yīng)用場景,對于這些應(yīng)用場景,攝像頭的位置和角度是固定的,因此拍攝到的視頻的背景往往都是固定不變的。在這種情況下,由于視頻的每幀圖像是不變的或漸變的,我們需要關(guān)注的其實只是圖像中變化的部分。圖2給出了一個使用跟蹤攝像機(jī)來追蹤野外動物的應(yīng)用,可以看到,在沒有動物進(jìn)入攝像機(jī)的“視野”時,視頻圖像的畫面是不變的,恒定為背景畫面(即環(huán)境背景);在動物進(jìn)入攝像機(jī)的“視野”后,圖像發(fā)生了變化,CNN可以檢測到這種變化,并使用紅框圈出了變化區(qū)域,且能一直跟蹤動物的移動;最后,動物離開了攝像機(jī)的“視野”,視頻畫面又回到了最初的背景畫面。

          現(xiàn)在,我們回到最開始的那個問題,什么是增量推理?概括來說,增量推理就是在處理輸入變化不大的數(shù)據(jù)集時(比如OBE中的遮擋圖片集和ORV中的固定視角視頻),只對后續(xù)圖片的變化區(qū)域進(jìn)行再推理,而不再對整張圖片進(jìn)行再推理。這樣,我們就可以在進(jìn)行再推理時,省去大量的冗余計算,從而降低CNN推理的運(yùn)算量和功耗,提高CNN推理的執(zhí)行速度。在這種情況下,我們就不能再把CNN模型當(dāng)做1個“黑盒子”,只關(guān)心它的輸入和輸出,而必須關(guān)注它的執(zhí)行過程,搞清楚輸入的變化是如何在CNN模型的各層之間傳播的(即“拆盒子”)。

          三. 增量推理的工作流程

          事實上,如果我們把ORV中的變化區(qū)域視為遮擋片,那么ORV其實也可以看做一種特殊的OBE,只不過它的遮擋片(即變化區(qū)域)的大小不是固定的,可以是大小不一的長方形。因此,我們在闡述增量推理的工作流程時,為了簡單,就只討論目標(biāo)任務(wù)為OBE的情況(因為目標(biāo)任務(wù)為ORV的情況是類似的)。由于下文會進(jìn)行公式推導(dǎo),我們這里先給出本文中會用到的一些符號和其相應(yīng)的意義(如表1)。

          表1

          假定CNN f中的某個層(或DAG)為l,其張量轉(zhuǎn)換函數(shù)為T:l。OBE的輸入圖片為I:img,使用網(wǎng)絡(luò)f對I:img進(jìn)行處理,得到的分類標(biāo)簽為L。將以RGB格式給出的遮擋片記作φ,遮擋片的步長為Sφ,遮擋片的位置集合為G。將位置為(x,y)的遮擋片φ(注:(x,y)是遮擋片左上角的位置坐標(biāo))放置在原圖片I:img上,那么我們就可以得到遮擋圖片I'x,y:img。OBE的工作流程在上一節(jié)已經(jīng)介紹過了,簡單來說,就是使用CNN處理遮擋圖片集,從而得到2維的輸出熱力圖M。在這里,我們將OBE的工作流程概況為如下公式:

          可以看到,公式(1)和公式(2)是在計算輸出熱力圖M的寬度WM和高度HM,公式(3)則預(yù)定義了一個大小和輸出熱力圖一樣的集合M。公式(4)-(6)其實就是在進(jìn)行OBE計算,公式(4)用于遍歷集合G中的所有遮擋片位置(x,y),公式(5)則用于將遮擋片φ放置在原圖I:img的位置(x,y)處,得到對應(yīng)的遮擋圖片I'x,y:img,公式(6)則是對遮擋圖片I'x,y:img進(jìn)行CNN推理,得到熱力圖M在點(x,y)處的像素值??梢钥吹剑诒闅v完遮擋片所有可能的位置后,就能得到完整的輸出熱力圖M。值得注意的是,上面的推導(dǎo)都是基于CNN是在完成分類(或回歸)的任務(wù),而不適用于圖像分割識別等任務(wù)。

          四. CNN層的數(shù)據(jù)流

          眾所周知,CNN模型是由各種各樣的層組成的,每個層能夠?qū)⑤斎霃埩哭D(zhuǎn)換成另一個張量。比如,卷積層使用具有權(quán)重參數(shù)(需要在訓(xùn)練期間學(xué)習(xí))的濾波器從圖像中提取特征;池化層對輸入特征圖進(jìn)行下采樣,進(jìn)一步篩選出重要的特征;BZ層對輸入張量進(jìn)行歸一化操作;激活層使用非線性函數(shù)(比如ReLU)對像素單元進(jìn)行激活,引入非線性;全連接層則會把層內(nèi)的每個節(jié)點都與上一層的所有輸出節(jié)點連接起來,把前邊提取到的特征綜合起來,起到“分類器”的作用。事實上,根據(jù)CNN層在進(jìn)行張量變換時的空間特性,我們可以將CNN層分為3類:①. 在全局環(huán)境上進(jìn)行變換的層(即全局環(huán)境粒度),比如全連接層;②. 在每個像素單元上進(jìn)行變換的層(即單元粒度),比如ReLU和BZ層;③. 在局部空間環(huán)境上進(jìn)行變換的層(即局部環(huán)境粒度),比如卷積層和池化層。

          這種分類標(biāo)準(zhǔn)其實是比較好理解的。對于全局環(huán)境粒度的層(比如全連接層),下一層每個像素點的更新都與上一層所有的像素點有關(guān),只要上一層有1個像素點發(fā)生變化,下一層所有像素點都必須進(jìn)行更新,因此這種層是不適用于增量推理的。對于單元粒度的層(比如ReLU和BZ層),輸出像素點其實就是輸入像素點在某個函數(shù)上的映射,因此如果1個輸入像素點改變,只會改變對應(yīng)的那個輸出像素點。對這種層使用增量推理是比較簡單直接的,我們只需要對發(fā)生變化的輸入像素點進(jìn)行函數(shù)變換即可。對于局部空間環(huán)境粒度的層(比如卷積層和池化層),我們需要使用方形的濾波器逐窗口地對輸入圖像進(jìn)行卷積運(yùn)算(注:池化層可以看做1種特殊的卷積運(yùn)算,其權(quán)重參數(shù)不需要進(jìn)行學(xué)習(xí)),當(dāng)輸入像素點發(fā)生變化后,它會影響到周圍幾個卷積窗口。對這種層使用增量推理要困難一些,我們必須確定哪些卷積窗口受到了影響,并對相應(yīng)的輸出像素點進(jìn)行更新。

          圖3

          圖3給出了常見的CNN模型中3種類型的層的計算量的占比,可以看到,全局環(huán)境粒度的層和單元粒度的層的占比的都是比較低的,有些模型甚至沒有全局環(huán)境粒度的層,因此我們選擇不對全局環(huán)境粒度的層進(jìn)行加速。至于單元粒度的層,由于對其進(jìn)行加速是很簡單的,我們也不對其進(jìn)行討論??梢钥吹剑覀冃枰剡M(jìn)行研究的就是局部空間粒度的層(以卷積層為主),這種層占據(jù)了CNN模型中絕大部分的計算量(超過90%)。

          五. 單個層的增量推理

          圖4

          圖4給出了一個常見的CNN模型的關(guān)鍵層簡單圖示,其中標(biāo)注的單元(黑框/紅色背景)展示了1個輸入像素點的變化是如何在后續(xù)層中進(jìn)行傳播的。圖4(a)表示的是卷積層,我們使用的卷積核大小為3×3×CI:l,由于發(fā)生變化的像素點正好在輸入圖像的邊角處,因此只會有4個卷積窗口受到影響,最后就只有4個輸出像素點需要進(jìn)行更新。圖4(b)表示的是ReLU激活層,根據(jù)上面的分析,這1層也只會更新那4個位置的像素點,將小于0的點置為0,而大于0的點則不做變動。圖4(c)表示的是最大池化層,使用的卷積核大小為2×2×1,因此會挑選出上一層那4個發(fā)生變動的像素點中最大的像素點作為輸出。

          圖5

          但是,上面的例子畢竟只是特例(注:指發(fā)生變化的像素點出現(xiàn)在輸入圖像的邊角處),因此我們在下面將繼續(xù)討論在一般情況下如何確定局部環(huán)境粒度的層(主要指卷積層和池化層)的輸入和輸出更新片(update patches)。在這里,由于公式推導(dǎo)會用到一些新的記號,我們在表2中給出了這些補(bǔ)充的記號和其相應(yīng)的意義。如圖5,假設(shè)輸入遮擋片(input patch)的位置為(xIφ:l,yIφ:l,),其高度為HIφ:l,寬度為WIφ:l。那么,使用公式(13)和(14)就能計算出輸出更新片的橫坐標(biāo)xOφ:l和寬度WOφ:l,使用公式(15)和(16)就能計算出輸入更新片的橫坐標(biāo)xRφ:l和寬度WRφ:l。其實這4個公式只計算了x維的參數(shù),但計算y維的參數(shù)的公式是與之類似的,因此這里也不再贅述。可以看到,輸入更新片其實就是在輸入遮擋片的四周擴(kuò)展(Wκ:l-1)排像素單元,輸出更新片其實就是對輸入更新片進(jìn)行CNN推理而得到的結(jié)果。

          表2

          在計算出輸入更新片和輸出更新片的位置和范圍后,我們還需要計算輸出更新片的像素值矩陣(如公式(17) - (19))??梢钥吹?,公式(17)其實就是在輸入圖像I:l上截取出輸入更新片所在的區(qū)域,并將其記為μ;公式(18)就是在輸入更新片所在的區(qū)域上放置輸入遮擋片φI:l,從而得到完整的輸入更新片μ;公式(19)就是使用CNN的層l對輸入更新片μ進(jìn)行CNN推理,從而得到輸出更新片的像素值矩陣φO:l。在知道輸出更新片的位置、范圍和像素值矩陣后,我們就完全確定了輸出更新片,也即完成了層l的增量推理。

          但是,上面的公式(13)-(19)也不是完美的,它們只適用于發(fā)生變化的像素點在輸入圖像中間的情況。對于發(fā)生變化的像素點在輸入圖像邊緣處的情況,我們還必須特別地進(jìn)行考慮。為了說明的簡單,我們這里以1維情況進(jìn)行說明。如圖6所示,在某些特殊的情況下,會出現(xiàn)輸出更新片的實際范圍比理論計算小的情況。在圖6(a)和(b)中,濾波器大小和步長是一樣的,此時如果輸入遮擋片的位置在1個卷積窗口內(nèi)(如圖6(a)),那么就會出現(xiàn)輸出更新片的實際范圍比理論計算小的情況;但如果輸入遮擋片在兩個卷積窗口的交界處(如圖6(b)),那么輸出更新片的實際范圍就是和理論計算相符的。在圖6(c)和(d)中,輸入更新片在濾波器邊界處(這里設(shè)置濾波器大小為3,步長為2),此時如果輸入更新片只與兩個卷積窗口相交(如圖6(c)),那么就會出現(xiàn)輸出更新片的實際范圍比理論計算小的情況;而如果輸入更新片與3個卷積窗口相交(如圖6(d)),那么輸出更新片的實際范圍就是和理論計算相符的。

          圖6

          那么,我們該如何處理這些特殊情況呢?我們的做法是將這些情況也當(dāng)做普通情況處理,因為在這些特殊情況下,輸出更新片的實際范圍總是理論范圍的子集。我們將特殊情況視作普通情況進(jìn)行處理,雖然會額外計算一些不需要進(jìn)行更新的輸出像素點,從而產(chǎn)生冗余運(yùn)算,但為了不進(jìn)一步增加增量推理算法的復(fù)雜度,這點冗余運(yùn)算是可以容忍的。此外,在有些情況下(特別是在進(jìn)行批量增量推理時),可能會出現(xiàn)輸出更新片越界的情況,這時我們還必須對輸出更新片進(jìn)行平移(如公式(20),這里也省去了y維的公式)。

          六. 整個CNN的增量推理

          在確定了單個層的增量推理后,我們就可以自然而然地將單個層的增量推理擴(kuò)展到整個CNN中來(即整個CNN的增量推理)。對于只有1條數(shù)據(jù)通路的CNN,前1層的輸出就是下1層的輸入,對于這種CNN層,進(jìn)行擴(kuò)展是很簡單的。唯一值得注意的是,如果數(shù)據(jù)流到達(dá)全局環(huán)境粒度的層,那么就會失去像素更新的局部性,這時就不能再使用增量推理了,而必須改用全局推理。但是,有些CNN是不止一條數(shù)據(jù)通路的(如某些DAG CNN),對于這種CNN,在某些層會出現(xiàn)“數(shù)據(jù)匯集”的情況,這主要分為兩種類型:單元級加法(element-wise addition)和深度級串聯(lián)(depth-wise concatenation)。

          單元級加法其實就是將幾個所有維度都相同的3維輸入分張量加起來,從而得到總的輸入張量,總的輸入張量的維度是不會改變的;深度級串聯(lián)則是將幾個高度和寬度都相同的3維輸入分張量串聯(lián)起來,從而得到總的輸入張量,總的輸入張量的深度是會發(fā)生變化的。對于這兩種情況,如果不止1個輸入分張量有像素點發(fā)生變化,那么總的輸入張量就會有多個輸入遮擋片,我們該如何處理這種情況呢?

          圖7

          圖7給出了單元級加法的簡單實例,這里只是兩個輸入分張量的相加??梢钥吹剑斎敕謴埩?的輸入遮擋片的位置為(xIφ1:l,yIφ1:l),高度為HIφ1:l,寬度為WIφ1:l;而輸入分張量2的輸入遮擋片的位置為(xIφ2:l,yIφ2:l),高度為HIφ2:l,寬度為WIφ2:l。對于這種情況,我們的處理辦法是:先在總的輸入圖像上找到一個大的方形窗口(稱為“輸入更新窗口”),這個方形窗口正好能將2個輸入分張量的輸入更新片圈起來,然后再對這個方形窗口進(jìn)行增量推理。雖然這樣也會計算一些不需要進(jìn)行更新的輸出像素點,從而引入一些計算冗余,但相比于增加算法的復(fù)雜度,這點計算冗余是可以容忍的。

          公式(21)給出了計算輸出更新窗口的橫坐標(biāo)和寬度的方法(這里也省去了y維的公式),可以看到,如果我們用1個方形窗口(稱為“輸入遮擋窗口”)將2個輸入遮擋片圈起來,那么輸入更新窗口的坐標(biāo)和范圍其實和這個輸入遮擋窗口是一樣的。很顯然,這種處理方法可以用于更復(fù)雜的單元級加法或深度級串聯(lián)的應(yīng)用場景,我們只需要將輸入更新窗口擴(kuò)展為3維的輸入更新塊,讓輸入更新塊能把所有發(fā)生變化的像素點都圈起來即可。

          七. 批量增量推理

          在使用GPU進(jìn)行CNN推理時,我們經(jīng)常會使用批量推理,因為這樣可以利用GPU高并行度的特性,從而得到更高的輸入吞吐量和更短的執(zhí)行時間。但是,使用GPU進(jìn)行批量增量推理是有條件限制的,并不是所有應(yīng)用場景都是可用的。對于OBE和離線ORV,由于所有輸入圖片數(shù)據(jù)都存儲在本地內(nèi)存上,因此我們可以并行處理這些輸入圖片。在這種情況下,我們只要先對原圖片先進(jìn)行全局推理(full inference),保存推理過程中的中間數(shù)據(jù),就能在這些中間數(shù)據(jù)的基礎(chǔ)上進(jìn)行批量增量推理(Batched Incremental Inference)。但是對于實時ORV,由于圖片數(shù)據(jù)是實時獲取的,一般就不能進(jìn)行批量增量推理。

          圖8給出了對層l進(jìn)行批量推理的算法流程。可以看到,步驟2-5是在計算n個輸出更新片的位置和范圍(批量大小為n);步驟6-10則是通過1個for循環(huán),給出n個輸入更新片的像素值矩陣(或像素值張量)μ;步驟11是對n個輸入更新片進(jìn)行批量增量推理;步驟12-13則用于返回n個輸出更新片的參數(shù)(位置、范圍和像素值矩陣)??梢钥吹?,這個算法流程其實就是對單個層的增量推理算法進(jìn)行了擴(kuò)展。由于上面已經(jīng)介紹了如何將單個層的批量增量推理擴(kuò)展到整個CNN,為了簡便,我們這里就不再重復(fù)討論如何將單個層的批量增量推理擴(kuò)展到整個CNN,畢竟這兩者是非常類似的。

          圖8

          八. 增量推理的加速比

          對于CNN加速,我們最關(guān)心的指標(biāo)應(yīng)該就是加速比了。那么,增量推理能帶來多大的加速比呢?由于CNN模型絕大部分的計算量都在卷積層(超過90%),因此我們這里近似地將CNN中卷積層的計算量作為整個CNN的計算量。假設(shè)1個卷積層的輸入圖片尺寸為(CI:l, HI:l, WH:l),卷積核尺寸為(CI:l, HK:l, WK:l),輸出圖片尺寸為(CO:l, HO:l, WO:l),那么如果使用全局推理(如公式(9)),這個卷積層需要進(jìn)行Q:l=(CI:l · HK:l · WK:l) (CO:l · HO:l · WO:l)次乘積累加運(yùn)算(MAC)。然后,將CNN f中的所有卷積層的計算量加起來(如公式(10)),就能得到近似的CNN總的計算量Q。

          如果我們改用增量推理(如公式(11)),假設(shè)輸入更新片的尺寸為(CI:l, Hφ:l, Wφ:l),那么卷積層將只需要進(jìn)行Qinc:l=(CI:l · HK:l · WK:l) (CO:l · Hφ:l · Wφ:l)次乘積累加運(yùn)算。使用Q:l除以Qinc:l,就能得到單個卷積層的理論加速比為(HO:l · WO:l)/(Hφ:l · Wφ:l)。同樣地,將CNN f中所有卷積層的增量推理計算量加起來(如公式(12)),就能得到近似的CNN總的增量推理計算量Qinc,那么CNN的理論加速比就是Q/Qinc。可以看到,理論加速比Q/Qinc與很多參數(shù)有關(guān),比如輸入遮擋片的大小和位置,CNN層的參數(shù)(卷積核尺寸和步長)等。

          圖9給出了一些常見的CNN模型隨輸入遮擋片大小(步長為1)的增加,理論加速比的變化曲線??梢钥吹?,VGG-16取得了最高的加速比,而DenseNet-121的加速比則是最低的,并且絕大部分CNN的加速比都在2×到3×之間。之所以會出現(xiàn)這種差異,主要原因是因為不同CNN模型的結(jié)構(gòu)是差異很大的。正是因為VGG-16的卷積核尺寸和步長都很小,在使用全局推理時的計算量會非常高,我們使用增量推理才取得了最高的加速比。可能一般的2×到3×的加速比看起來并不算高,但是增量推理能在不改變輸出圖像質(zhì)量的前提下達(dá)到這個加速比,還是很難能可貴的。如果想要獲得更高的加速比,我們可以在增量推理的基礎(chǔ)上,進(jìn)一步引入“近似推理”(approximate inference)。通過犧牲一定程度的輸出圖像質(zhì)量,可以讓加速比增大至8×左右,但我們這里不再對“近似推理”作詳細(xì)介紹。

          圖9

          為了獲得增量推理的實際加速比,我們使用PyTorch對增量推理算法進(jìn)行了實現(xiàn),并分別在CPU和GPU上進(jìn)行了測試。測試結(jié)果表明,對于非批量增量推理(即批量大小為1),實際加速比是和理論值相符的。但是,對于批量增量推理,只能在CPU上獲得與理論值相符的實際加速比,批量增量推理在GPU上的執(zhí)行速度甚至比全局推理還要慢。為什么會出現(xiàn)這種情況呢?這主要是因為GPU在執(zhí)行算法1中第7行的for循環(huán)時(如圖8),為了生成n個輸入更新片(將用于后續(xù)的批量增量推理),必須按順序地逐個將數(shù)據(jù)從GPU內(nèi)存的一個地方復(fù)制到其它地方。這種順序內(nèi)存拷貝(sequential memory copies)需要耗費(fèi)大量時間,使得批量增量推理無法很好地利用GPU高并行度的特點,從而導(dǎo)致批量增量在GPU上出現(xiàn)執(zhí)行速度慢、吞吐量小等問題。為了解決這個問題,我們通過編寫1個自定義CUDA核(使用C語言)對PyTorch進(jìn)行了擴(kuò)展,從而讓GPU在進(jìn)行輸入準(zhǔn)備時,能并行地從GPU內(nèi)存中拷貝數(shù)據(jù)。這其實就是1種為分片張量(注:這里指存儲在不同位置的張量數(shù)據(jù))而定制的并行for循環(huán),通過引入這種處理機(jī)制,我們最后在GPU上也獲得了與理論值相符的實際加速比。

          九. 寫在最后

          說實話,已經(jīng)很久沒寫文章了,一是覺得麻煩(PS:懶得真實),而是覺得沒什么好寫的(PS:當(dāng)然是因為菜)。這篇文章,很多人可能以為是篇翻譯,但實際上大家如果看過原文就會發(fā)現(xiàn),文中基本上沒有對原文段落的直接翻譯,完全是用自己的話把原作者的idea又?jǐn)⑹隽艘槐?,這叫做“本科論文寫作”(PS:此處筆誤,應(yīng)是“讀書筆記”)應(yīng)該更為合適。

          最近因為成都的疫情,學(xué)校又封校了,平安夜和圣誕節(jié)也被關(guān)在學(xué)校里,我覺得實在枯燥而無聊,就提鍵(PS:“提筆”確實不太合適)寫了這篇文章。

          參考文獻(xiàn)

          [1] Supun Nakandala, Kabir Nagrecha, Arun Kumar, and Yannis Papakonstantinou. 2020. Incremental and Approximate Computations for Accelerating Deep CNN Inference. ACM Trans. Database Syst. 45, 4, Article 16(December 2020), 42 pages.



          推薦閱讀


          綜述:輕量級CNN架構(gòu)設(shè)計

          2021-02-17

          擦除:提升 CNN 特征可視化的 3 種重要手段

          2021-02-16

          網(wǎng)絡(luò)架構(gòu)設(shè)計:CNN based和Transformer based

          2021-02-08



          # CV技術(shù)社群邀請函?#

          △長按添加極市小助手
          添加極市小助手微信(ID : cvmart2)

          備注:姓名-學(xué)校/公司-研究方向-城市(如:小極-北大-目標(biāo)檢測-深圳)


          即可申請加入極市目標(biāo)檢測/圖像分割/工業(yè)檢測/人臉/醫(yī)學(xué)影像/3D/SLAM/自動駕駛/超分辨率/姿態(tài)估計/ReID/GAN/圖像增強(qiáng)/OCR/視頻理解等技術(shù)交流群


          每月大咖直播分享、真實項目需求對接、求職內(nèi)推、算法競賽、干貨資訊匯總、與?10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動交流~


          △點擊卡片關(guān)注極市平臺,獲取最新CV干貨

          覺得有用麻煩給個在看啦~??
          瀏覽 46
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91精品国产乱码久久 - | 亚洲黄色免费大全 | daxiangjiaojiujiu | 性巴骚麦一二三区视频 | 91亚洲精品久久久久久久久久久久 |