1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        曠視MegEngine是如何將31*31的大核卷積計(jì)算速度提高10倍的

        共 3497字,需瀏覽 7分鐘

         ·

        2022-06-08 08:30


        來源:DeepHub IMBA

        本文約3400字,建議閱讀5分鐘

        “大內(nèi)核的cnn可以勝過小內(nèi)核的cnn”這可能是今年來對于CNN研究最大的成果了。


        2021年提議的Vision Transformer(VIT)已成為計(jì)算機(jī)視覺深度學(xué)習(xí)領(lǐng)域的一個(gè)有前途的研究主題。隨著VIT的研究變得更加深入,一些研究人員受到VIT的大型接收領(lǐng)域的啟發(fā),將卷積網(wǎng)絡(luò)也改造成具有更大的接收場來提高效率。根據(jù)有效的接收場(ERF)理論,ERF的大小與內(nèi)核大小和模型深度的平方根成正比。這意味著通過堆疊層來實(shí)現(xiàn)大ERF的有效性不如增加卷積內(nèi)核大小。因此,研究人員提出了包含大型卷積內(nèi)核新的CNN結(jié)構(gòu)。該網(wǎng)絡(luò)可以達(dá)到與VIT相同的準(zhǔn)確性?!按髢?nèi)核的cnn可以勝過小內(nèi)核的cnn”這可能是今年來對于CNN研究最大的成果了。

        內(nèi)核帶來了更多的計(jì)算和參數(shù)


        CNN中最常見的卷積內(nèi)核大小是3x3、5x5、7x7。一般情況下如果卷積內(nèi)核的大小超過9x9就將其確定為“大”。卷積內(nèi)核的大小增加了n,參數(shù)數(shù)量和浮點(diǎn)操作(FLOPS)的數(shù)量將大約增加n平方。這就是研究人員在探索CNN新結(jié)構(gòu)時(shí)首先不考慮大型內(nèi)核卷積的主要原因。如下圖所示,逐通道卷積(又稱深度卷積)可以將FLOPs和參數(shù)數(shù)量減少到密集卷積的1/(輸入通道數(shù)量)。這就是為什么大多數(shù)研究人員將大核卷積設(shè)計(jì)為深度卷積,這樣既可以獲得大核卷積的好處,又不需要大幅增加參數(shù)和FLOPs。


        但是在相同的FLOPs限制下,研究人員發(fā)現(xiàn),他們的大核深度卷積神經(jīng)網(wǎng)絡(luò)比傳統(tǒng)的網(wǎng)絡(luò)運(yùn)行得慢得多。

        MegEngine團(tuán)隊(duì)發(fā)現(xiàn),通過適當(dāng)?shù)膬?yōu)化,當(dāng)內(nèi)核尺寸越來越大時(shí),深度卷積幾乎不需要任何成本。本文就是對他們研究成果的介紹。

        如何尋找大核卷積的優(yōu)化空間?


        為了回答這個(gè)問題,我們需要將Roofline 模型作為背景。如下圖所示,roofline模型用于描述在計(jì)算平臺(tái)的算力和帶寬的限制下,程序所能達(dá)到的理論性能上界。


        roofline模型的示意圖,有三個(gè)重要概念:

        • 算力:每秒所完成的浮點(diǎn)運(yùn)算次數(shù),單位為FLOP/s或GFLOP/s
        • 帶寬:每秒所完成的內(nèi)存讀取量,單位為Byte/s或GByte/s
        • 計(jì)算密度:又稱訪存比,是算力與帶寬的比值,即每字節(jié)讀取所完成的浮點(diǎn)運(yùn)算量,單位為FLOP/Byte

        “roofline”是指TP對IM的圖的形狀。設(shè)備的理論峰決定了“屋頂”的高度(藍(lán)線)。同時(shí),“屋頂”(紅線)的斜率是設(shè)備的最大訪問帶寬。這兩條彩色線的連接也分隔兩種類型的應(yīng)用,計(jì)算結(jié)合和內(nèi)存結(jié)合的瓶頸的分離。

        當(dāng)應(yīng)用程序的計(jì)算密度I超過最大IM時(shí),其性能只能達(dá)到計(jì)算設(shè)備的理論峰值TP。應(yīng)用程序的最大性能P顯然與計(jì)算密度I成正比。這種類型的應(yīng)用程序稱為計(jì)算綁定。當(dāng)應(yīng)用程序的計(jì)算密度小于IM時(shí),性能是由設(shè)備的最大帶寬和計(jì)算密度確定的。這種類型的應(yīng)用程序稱為內(nèi)存綁定。與計(jì)算綁定方案相反,增加設(shè)備帶寬或增加內(nèi)存綁定應(yīng)用程序的計(jì)算密度可能會(huì)導(dǎo)致應(yīng)用程序性能的線性增加。

        針對密集卷積的優(yōu)化已經(jīng)達(dá)到了瓶頸

        到現(xiàn)在為止,很多的研究已經(jīng)探索對密集卷積的優(yōu)化技術(shù),包括Direct, im2col/implicit GEMM, Winograd and FFT。

        在本文中使用NVIDIA 2080TI GPU作為計(jì)算設(shè)備在roofline模型的背景下進(jìn)行分析。該計(jì)算設(shè)備的L2高速緩存帶寬為2.16TB/s,理論峰值性能為4352 FFMA核心 * 1.545 GHz * 2 = 2 = 13.447 tflops。我們假設(shè)CUDA中每個(gè)線程的輸出數(shù)據(jù)都積累在寄存器中,L1緩存達(dá)到100%,同時(shí)忽略了寫回輸出的過程。由于現(xiàn)代計(jì)算設(shè)備的設(shè)計(jì)足以在實(shí)際卷積計(jì)算中同時(shí)支持許多耗時(shí)的訪問操作,還假設(shè)L2緩存達(dá)到100%,并達(dá)到L2緩存的最大帶寬。本文使用的卷積輸入形狀為(n, ic, ih, iw)。內(nèi)核是(oc, ic, kh, kw),輸出是(n, oc, oh, ow)。

        im2col/implicit GEMM是最經(jīng)典的密集卷積優(yōu)化方法,在im2col轉(zhuǎn)換之后,將卷積轉(zhuǎn)換為一個(gè)矩陣乘法問題,其中??=oc,??=??×oh×ow,??=ic×kh×kw,如下圖所示。


        矩陣乘法在cuBLAS等計(jì)算庫中已經(jīng)得到了很好的優(yōu)化。特別是當(dāng)矩陣足夠大時(shí),性能可以接近設(shè)備的理論峰。我們在此簡要分析了使用Roofline模型的性能。

        為了充分利用硬件結(jié)構(gòu),通常將矩陣乘法的計(jì)算劃分為塊,這樣可以使多級(jí)存儲(chǔ)能夠滿負(fù)荷工作,從而獲得最大的內(nèi)存訪問帶寬。

        如下圖所示,給定CUDA中的每個(gè)Thread Block處理BM×BN的輸出:

        • 內(nèi)核塊大小為BM×BK
        • 輸入塊大小為BK×BN
        • 計(jì)算的次數(shù)是BM×BN×BK×2
        • 內(nèi)存訪問為(BM×BK+BN×BK)×4
        • 計(jì)算密度為BM×BN×2/(BM+BN)×4

        根據(jù)Roofline模型的描述,設(shè)備的IM計(jì)算為IM=TP/??=13.447/2.16=6.225 FLOPs/byte。為了達(dá)到硬件的理論峰值,我們只需要保證計(jì)算密度大于IM即可。設(shè)BM=32, BN=32,則計(jì)算密度達(dá)到8 FLOPs/byte,明顯大于IM。但是該應(yīng)用程序?qū)儆贑ompute Bound區(qū)域,這意味著沒有性能優(yōu)化的空間。我們可以肯定地得出VGG時(shí)代的舊結(jié)論:“隨著內(nèi)核尺寸的增長,時(shí)間也是線性的增加”。


        Depthiswise Conv不是同一情況

        隨著內(nèi)核大小的增長,計(jì)算的數(shù)量隨著密度或深度的增長而增長。由于Cudnn在Depthiswise Conv上的性能趨勢確實(shí)顯示出類似的結(jié)論,因此許多人認(rèn)為先前關(guān)于密集的Conv的結(jié)論在Depthiswise Conv上也有效。

        這其實(shí)是錯(cuò)誤的歸納總結(jié),因?yàn)镈epthiswise Conv的前提條件就核傳統(tǒng)的密集卷積不一樣。

        我們用im2col/implicit GEMM 方法分析Depthiswise Conv。由于Depthiswise Conv會(huì)逐通道的計(jì)算,因此可以將其視為一組單通道卷積,通道數(shù)等于組的大小。在IM2COL轉(zhuǎn)換之后,我們將獲得一個(gè)批處理的GEMV,對于下圖所示。


        保持與密集塊相同的塊大小,每個(gè)批的GEMV如下圖所示。此時(shí)的計(jì)算密度為BN×2/(1+????)×4=BN/(2×BN+2)。給定BN=1,最大計(jì)算密度為0.25 FLOPs/byte,遠(yuǎn)小于IM 6.225。這意味著現(xiàn)在在內(nèi)存限制區(qū)。盡管有一些方法可以使GEMV更快,但“向量x矩陣”的布局注定是內(nèi)存受限的應(yīng)用程序。


        接下來,我們將分析Direct方法。例如,讓一個(gè)warp的所有32個(gè)線程都計(jì)算輸出oh*ow,內(nèi)核大小為kh*kw:

        • 浮點(diǎn)運(yùn)算次數(shù)=oh×ow×khkw×2 FLOPs
        • 內(nèi)存訪問數(shù)= ?(kh×kw+(oh+kh?1)×(ow+kw?1))×4 bytes
        • 內(nèi)核大小:kh×kw
        • 輸入大小:(oh+kh?1)×(ow+kw?1)
        • 計(jì)算密度=(oh×ow×kh×kw×2)/{(kh×kw+(oh+kh?1)×(ow+kw?1))×4}

        如果每個(gè)線程計(jì)算4個(gè)輸出,那么當(dāng)內(nèi)核大小為3x3時(shí),一次warp可以計(jì)算4x32個(gè)輸出。此時(shí)計(jì)算密度為(4×32×3×3×2)/(3×3+6×34)×4=2.7 FLOPs/byte。最大性能為2.16*2.7 = 5.84 TFLOPS遠(yuǎn)低于13.447 TFLOPS的理論峰值。所以為了增加計(jì)算密度可以增加每次經(jīng)紗計(jì)算的輸出次數(shù)。但是由于卷積本身的輸出大小以及有限的計(jì)算資源(例如每個(gè)流多處理器中的寄存器文件),所以并不能無限的增加。

        總結(jié)一下在im2col和direct方法中的發(fā)現(xiàn):深度卷積是一種Memory Bound操作。增加內(nèi)核大小不會(huì)大幅改變內(nèi)存訪問的數(shù)量,計(jì)算的時(shí)間應(yīng)該保持不變,這就是他與傳統(tǒng)的密集卷積最大的區(qū)別。但是上面的研究的好的方向是在適當(dāng)?shù)膬?yōu)化下,深度卷積的內(nèi)核大小幾乎可以隨意增加。

        MegEngine的表現(xiàn)


        與理論分析不同的是,在實(shí)際應(yīng)用是發(fā)現(xiàn)隨著內(nèi)核大小的增加,cuDNN的性能會(huì)變得很差。

        輸入形狀:(64,384,32,32)
        輸出形狀:(64,384,32,32)
        設(shè)備:2080 ti


        這就是MegEngine針對大核深度卷積進(jìn)行密集優(yōu)化的原因,如果增加核的大小,需要使計(jì)算時(shí)間與理論預(yù)測的一樣。與PyTorch相比,使用MegEngine時(shí)訓(xùn)練時(shí)間僅為10%。


        有興趣的話可以看看曠視的MagEngine?
        https://github.com/MegEngine/MegEngine

        編輯:黃繼彥




        瀏覽 42
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            久精品视频在线 | 在线观看av的网站 | 全黄裸片武则天一级在线播放 | 手机在线看成人片 | 欧美一级激情 | 一级片视频免费看 | 成人网站在线看。 | 一级欧美生活片 | 四虎在线免费观看 | 天堂8a 中文在线 |