<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>

          OSDI 2021 PET 論文解讀(代碼生成相關(guān)工作)

          共 8258字,需瀏覽 17分鐘

           ·

          2022-06-29 00:41

          今天來(lái)閱讀一篇OSDI 2021的論文,《PET: Optimizing Tensor Programs with Partially Equivalent Transformations and Automated Corrections》。

          • 論文鏈接:https://pacman.cs.tsinghua.edu.cn/~whj/pubs/Pet.pdf
          • 開(kāi)源代碼鏈接: https://github.com/thu-pacman/PET

          之前也讀過(guò)OSDI 2020的 《Ansor : Generating High-Performance Tensor Programs for Deep Learning》這篇論文,如果說(shuō)Ansor是在更微觀的角度做代碼生成,那么這篇PET就可以說(shuō)是在更宏觀的角度做代碼生成了。

          無(wú)論是 Ansor 還是 PET 我個(gè)人認(rèn)為都相當(dāng)驚艷,我之前對(duì) Ansor 的論文解讀在這個(gè)倉(cāng)庫(kù)中:https://github.com/BBuf/tvm_mlir_learn 。感興趣的小伙伴可以讀一下,而本篇文章就來(lái)閱讀一下 PET 。

          0x1. 標(biāo)題和作者

          PET標(biāo)題和作者

          標(biāo)題可以翻譯為:基于部分等價(jià)變換和自動(dòng)校正來(lái)優(yōu)化張量化程序。作者團(tuán)隊(duì)來(lái)自清華,CMU和FaceBook等。這篇論文的一作王豪杰來(lái)自清華大學(xué)。后面會(huì)介紹到這篇論文在生成突變程序集合時(shí),要維護(hù)K個(gè)效率最高的突變程序時(shí),使用了ASO中的代價(jià)模型和評(píng)估方式,所以作者有賈志豪大神也不奇怪。

          0x2. 摘要

          現(xiàn)有的框架在圖層做優(yōu)化一般都是基于等價(jià)變換,也就時(shí)說(shuō)變換前后的程序是完全等價(jià)的。這里等價(jià)的意思是給定相同的輸入,那么變換前后的程序一定可以得到相同的輸出。而這篇論文挖了一個(gè)新坑,即做了一個(gè)新的框架PET,在優(yōu)化過(guò)程中允許出現(xiàn)部分等價(jià)的變換,并且設(shè)計(jì)了一個(gè)高效的搜索算法去組合完全等價(jià)以及部分等價(jià)的變換以探索更大的搜索空間。并且最終結(jié)果也比較好。

          0x3. 介紹

          這里需要先說(shuō)明一個(gè)名詞的含義,統(tǒng)計(jì)特性。統(tǒng)計(jì)特性的意思就是變換前后程序是完全數(shù)學(xué)等價(jià)的特性。目前TVM,以及TensorFlow,PyTorch,TensorRT等框架的變換優(yōu)化或者叫 Pass 都是滿足這個(gè)特性的。而部分等價(jià)變換不要求變換前后的程序保持這個(gè)統(tǒng)計(jì)特性,也就是允許變換后的程序和原程序在相同輸入時(shí)輸出的某些位置的元素是不等的。支持部分等價(jià)變換可以 (1)改變輸入Tensor的shape和排列順序以提高計(jì)算效率(2)使用效率更高的算子代替效率更低的算子(3)對(duì)圖結(jié)構(gòu)進(jìn)行變換獲得更多的高效優(yōu)化機(jī)會(huì)。但要支持部分等價(jià)變換也有兩個(gè)挑戰(zhàn)。第一個(gè)就是如果直接使用部分等價(jià)變換會(huì)降低模型精度,因此有必要校正那些不等的張量區(qū)域,但是快速識(shí)別哪些區(qū)域是不等的并且產(chǎn)生校正Kernel是一項(xiàng)很難的任務(wù)并且要標(biāo)注出輸出的哪些位置在變換前后是不等的也是一個(gè)難題。第二個(gè)就是應(yīng)用了部分等價(jià)比變換之后張量程序的搜索空間擴(kuò)大了,生成候選的張量化程序的算法必須仔細(xì)管理其計(jì)算復(fù)雜度。程序優(yōu)化器(后面有單獨(dú)的一節(jié)講)必須平衡部分等價(jià)變換帶來(lái)的好處以及因?yàn)樗氲念~外開(kāi)銷,并結(jié)合完全等價(jià)變換來(lái)獲得高性能的張量化程序。

          這篇論文提出了一個(gè)全新的部分等價(jià)變換來(lái)優(yōu)化張量化程序的框架PET,PET主要由3部分組成。

          • Mutation generator。突變產(chǎn)生器。對(duì)于一個(gè)輸入張量化程序,這是用來(lái)產(chǎn)生部分等價(jià)變換的輸出張量化程序的。每一個(gè)突變程序和輸入程序在相同輸入的情況下,輸出Tensor的形狀都是一樣的,但某些區(qū)域的值可以不一樣。
          • Mutation corrector。突變校正器。PET的突變矯正器檢查原始程序和突變程序之前等價(jià)性并自動(dòng)生成校正Kernel。并將校正Kernel應(yīng)用于輸出張量以保證整個(gè)變換是符合統(tǒng)計(jì)特性的。另外PET也盡可能的融合校正Kernel和張量計(jì)算Kernel,以減少因?yàn)橐胄U齂ernel帶來(lái)的額外開(kāi)銷。檢查和校正部分等價(jià)變換是非常困難的,因?yàn)檩敵鰪埩靠赡馨噙_(dá)百萬(wàn)個(gè)元素,并且每個(gè)輸出元素可能都和大量的輸入元素有關(guān)。如果挨個(gè)去驗(yàn)證,開(kāi)銷會(huì)非常大。PET的一個(gè)關(guān)鍵貢獻(xiàn)就是發(fā)現(xiàn)了一套嚴(yán)謹(jǐn)?shù)臄?shù)學(xué)理論,大大簡(jiǎn)化了這個(gè)驗(yàn)證過(guò)程(將這個(gè)過(guò)程的復(fù)雜度降低到了常數(shù)級(jí)別)。不是測(cè)試輸出張量的所有位置,PET只需要測(cè)試幾個(gè)有代表性的位置就可以完成驗(yàn)證。
          • Program Optimizer。首先一個(gè)模型被切分成多個(gè)子圖,然后對(duì)每個(gè)子圖應(yīng)用部分等價(jià)變換來(lái)獲得更多的優(yōu)化機(jī)會(huì)。最后在整個(gè)模型的各個(gè)子圖的邊界部分應(yīng)用一系列后優(yōu)化,包括冗余消除和算子融合等以達(dá)到整體的最佳性能。

          貢獻(xiàn)方面其實(shí)就是上面這三點(diǎn),我們先提一下PET在幾個(gè)模型上進(jìn)行評(píng)估的性能。對(duì)于ResNet-18提升了1.2倍,對(duì)于CSRNet和BERT提升了2.5倍。

          0x4. 背景和想法來(lái)源

          這一節(jié)沒(méi)什么好講的,感覺(jué)和Introduction有一點(diǎn)重復(fù),我們只講講圖1,幫助大家理解什么是部分等價(jià)變換。首先圖1長(zhǎng)這樣:

          圖1

          首先(a)代表一個(gè)普通的卷積操作,其中是輸入Tensor,它的數(shù)據(jù)排布可以記作:[b, c, h, w],即批量大小,輸入通道數(shù),輸入特征圖長(zhǎng)度和寬度。然后部分等價(jià)變換也就是圖(b)通過(guò)一個(gè)reshape和transpose把圖中批量方向的相鄰兩個(gè)特征圖拼起來(lái)了,也就是這樣:[b, c, h, w] -> reshape -> [b / 2, 2, c, h, w] -> transpose -> [b / 2, c , h, w, 2] 。也就是圖中的 ,然后和原卷積核做卷積操作之后得到,再利用reshape和transpose將輸出特征圖還原為原始的輸入特征圖大小。注意經(jīng)過(guò)這個(gè)變換之后我們發(fā)現(xiàn)輸出Tensor在邊界部分存在和原始卷積的輸出Tensor數(shù)值不相等的情況,所以還需要對(duì)不相等的邊界部分進(jìn)行校正,即(c)圖展示的意思。

          后面幾節(jié)我們會(huì)詳細(xì)講解如何確定數(shù)值不相等的部分是哪些以及如何對(duì)這些數(shù)值不相等的區(qū)域進(jìn)行校正,現(xiàn)在不理解也沒(méi)關(guān)系。

          0x5. 設(shè)計(jì)總覽

          PET是第一個(gè)利用部分等價(jià)變換去優(yōu)化張量化程序的框架,它利用了張量化程序的多線性性質(zhì)。這里首先要解釋一下什么是Multi-linear tensor programs (MLTPs) 即多線性張量化程序,后面我們一律用MLTPs的說(shuō)法。一個(gè)擁有n個(gè)輸入張量的Op,如果對(duì)于每一個(gè)輸入都是線性的那么就稱這個(gè)Op是多線性的:

          線性的定義

          其中X和Y是具有和相同形狀的任意張量,是任意標(biāo)量。深度學(xué)習(xí)模型一般由線性(Conv,MatMul)和非線性(例如ReLU,Sigmoid)的算子所組成,PET框架中使用的線性算子如Table1所示:

          PET使用的多線性算子

          注意這個(gè)表是可以擴(kuò)展的。一個(gè)程序是多線性張量化程序(MLTP)當(dāng)且僅當(dāng)程序中的所有的Op都是多線性的。接下來(lái)我們講講PET的設(shè)計(jì)總覽,也就是Figure2。

          PET總覽

          首先原始的張量化程序輸入到PET框架中,然后PET首先把這個(gè)程序分解成一些小的子程序來(lái)降低每個(gè)子程序的搜索復(fù)雜度。對(duì)于每一個(gè)子程序,PET的Mutation Generator會(huì)通過(guò)為子程序的MLTPs產(chǎn)生可能的變體來(lái)發(fā)現(xiàn)部分等價(jià)變換變體程序。每個(gè)變體程序和原子程序擁有相同的輸入輸出Shape。為了保持端到端的數(shù)值正確性,PET的Mutation Corrector檢查原始程序和突變程序有哪些區(qū)域是不等的,并自動(dòng)生成校正Kernel進(jìn)行校正,PET利用了嚴(yán)格的數(shù)學(xué)理論來(lái)簡(jiǎn)化了這個(gè)富有挑戰(zhàn)性的任務(wù)。

          校正后的突變體被發(fā)送到 PET 的程序優(yōu)化器,它將現(xiàn)有的完全等價(jià)變換與部分等價(jià)變換結(jié)合起來(lái),構(gòu)建一個(gè)程序優(yōu)化的綜合搜索空間。 優(yōu)化器為每個(gè)子程序評(píng)估一組豐富的突變體,并在它們的邊界上應(yīng)用后期優(yōu)化,以便在搜索空間中發(fā)現(xiàn)高度優(yōu)化的候選程序。

          0x6. Mutation Generator

          這一節(jié)主要描述了Mutation Generator的算法實(shí)現(xiàn)流程并描述了幾種生成的典型突變模式。Mutation Generator的算法如下圖所示:

          Mutation Generator Algorithm

          首先有一個(gè)原始的多線性張量化程序MLTP ,以及一個(gè)算子集合O。需要輸出的是一個(gè)合法的突變程序集合。接下來(lái),定義了一個(gè)表示原始的MLTP中的所有輸入Tensor。然后M初始化為空的集合。接下來(lái)執(zhí)行BUILD這個(gè)DFS算法進(jìn)行突變程序集合的生成。然后看到第8-9行也就是DFS算法的返回條件,當(dāng)的輸入輸出形狀完全相同時(shí)說(shuō)明當(dāng)前的突變程序是合法的,可以將這個(gè)突變程序加入到集合中。然后當(dāng)n<depth,這個(gè)depth是DFS遞歸的深度可以繼續(xù)遍歷集合O中的op進(jìn)行突變也即第11行,然后再遍歷每一個(gè)輸入Tensor ,如果輸入Tensor 對(duì)于當(dāng)前op來(lái)說(shuō)是合法的,就將op添加到集合中然后就是DFS的常規(guī)操作了。

          接下來(lái)介紹了三種典型的變體程序,我們簡(jiǎn)單介紹一下。

          • Reshape + Transpose。 上面的Figure1我們已經(jīng)講解了這種變體,通過(guò)Reshape和Transpose的結(jié)合可以改變Tensor的數(shù)據(jù)排布,比如讓輸入特征圖的寬度更大對(duì)并行計(jì)算有好處。另外reshape和transpose經(jīng)常連用,所以在PET里面將這兩個(gè)操作合成一個(gè)叫作 reshape & transpose 。這個(gè)融合減少了突變體的大小并允許探索更大,更復(fù)雜的突變體。
          • Single-operator mutants。 PET可以將不高效的算子替換成高效的算子,比如將Dilated Conv變成普通的卷積以大大加速其計(jì)算效率。如Figure3所示:
          Dialated Conv通過(guò)Mutation Generator變成普通的Conv計(jì)算以獲得加速

          這里可以獲得加速的原因是因?yàn)镈ilated Conv在一些加速庫(kù)中一般沒(méi)有得到太大的優(yōu)化,而普通的卷積則被深度優(yōu)化過(guò),所以加速效果會(huì)十分明顯。注意到這里仍然有校正的過(guò)程。

          • Multi-operator mutants。 這里就是將個(gè)算子集合替換為另外一個(gè)高效的算子集合。比如InceptionV3里面一些具有相似的輸出形狀的張量對(duì)應(yīng)的算子可以被組合成一個(gè)更大的卷積以提高GPU的利用率并減少Kernel Launch的開(kāi)銷。

          0x7. Mutation Corrector

          PET中最重要的一環(huán)應(yīng)該就是這個(gè)Mutation Corrector。設(shè)計(jì)突變校正器主要有兩個(gè)挑戰(zhàn)。第一:輸出張量可能會(huì)非常大,可能涉及多達(dá)數(shù)百萬(wàn)個(gè)需要等價(jià)驗(yàn)證的元素。單獨(dú)驗(yàn)證輸出張量的每個(gè)元素是不可行的。第二:每個(gè)輸出元素的驗(yàn)證可能依賴大量的輸入元素比如矩陣乘算子中一個(gè)輸出元素是兩個(gè)輸入矩陣的一行和一列的內(nèi)積,兩者的數(shù)量都可能達(dá)到上千。為了解決這兩個(gè)挑戰(zhàn),PET提出了2個(gè)數(shù)學(xué)理論。

          0x7.1 理論基礎(chǔ)

          我這里不完全按照論文的寫(xiě)作來(lái)講,而是按照我自己的理解來(lái)講,講得更加通俗不那么理論化。首先我們可以看一下一個(gè)的卷積可以由如下公式進(jìn)行表示:

          3x3卷積的公式描述

          其中分別表示輸入Tensor和卷積Kernel,然后 分別表示輸入Tensor 通道數(shù),長(zhǎng)寬。求和符號(hào)上方和下方的數(shù)字分別表示求和區(qū)間的上限和下限。然后對(duì)于這個(gè)卷積的輸出Tensor來(lái)講每一個(gè)元素都對(duì)應(yīng)了一個(gè)求和區(qū)域。對(duì)于上面定義的卷積算子,計(jì)算左上角的輸出位置即只涉及一個(gè)的Kernel,即,因?yàn)樵撐恢脹](méi)有左鄰居或者上鄰居。論文將求和區(qū)域相同的位置叫作一個(gè)Box,對(duì)于這個(gè)卷積例子來(lái)說(shuō)所有的Box可以表示為Figure 4。

          3x3卷積的例子共有9個(gè)boxes

          同一個(gè)Box的所有輸出位置具有相同的求和區(qū)間并且共享相似的數(shù)學(xué)性質(zhì),PET在檢查程序等效性時(shí)會(huì)利用這些屬性。PET不需要在所有單獨(dú)的位置上驗(yàn)證2個(gè)MLTP的等價(jià)性,只需要驗(yàn)證它們?cè)诿總€(gè)Box的m+1個(gè)特性位置的等價(jià)性即可,其中m表示輸出張量的維數(shù) 。這個(gè)定理的證明論文提到是通過(guò)對(duì)比以及關(guān)于輸入變量的系數(shù)矩陣完成的,我們這里不關(guān)心具體的證明過(guò)程,只需要知道基于這個(gè)定理在做等效性驗(yàn)證時(shí)就可以避免檢查所有的輸出元素即可,者大大降低了校正檢查的復(fù)雜度。

          第二個(gè)定理的意思是如果兩個(gè)擁有個(gè)輸入張量的MLTPs在特定位置 v 不等效,那么在一個(gè)范圍為F的分布下進(jìn)行隨機(jī)采樣作為輸入時(shí)這個(gè)位置v對(duì)這個(gè)兩個(gè)MLTPs產(chǎn)生相同的輸出值的概率是,其中表示F的范圍,在這個(gè)論文中是一個(gè)很大的素?cái)?shù)即。

          有了上述兩個(gè)定理,PET只需要在很少的位置進(jìn)行驗(yàn)證就可以確定哪些位置是和原始程序不等價(jià)的了。下圖展示了定理1和定理2對(duì)需要驗(yàn)證的輸入元素?cái)?shù)量的影響。

          Table2

          0x7.2 Mutation Correction算法

          有了上述兩個(gè)定義就可以引出Mutation Correction算法。此算法分為以下三個(gè)步驟:

          • Step 1: Box propagation。第一步通Box Propagation計(jì)算給定MLTP的值。PET為張量的每個(gè)維度維護(hù)一組分割點(diǎn),以識(shí)別Box的邊界。對(duì)于多線性算子,根據(jù)輸入張量的分割點(diǎn)以及算子類型和超參數(shù)來(lái)推斷輸出張量的分割點(diǎn),F(xiàn)igure5展示了Figure1中的突變例子的Box傳播過(guò)程。
          框傳播算法示例
          • Step 2: Random testing for each box pair。第二步就是對(duì)于輸入MLTP 和它的變體 應(yīng)用上一小節(jié)介紹的定理來(lái)判斷哪些區(qū)域是數(shù)值等效的。根據(jù)定理1首先要選取m+1個(gè)位置,對(duì)于Figure5中的例子m=4。然后對(duì)于m+1個(gè)位置都要基于隨機(jī)數(shù)據(jù)檢查次,這樣誤判的可能性就變成,其中,是一個(gè)可調(diào)的超參數(shù)用來(lái)平衡程序檢查的開(kāi)銷和出錯(cuò)的可能性。
          • Step 3: Correction kernel generation。最后一步就是對(duì)于所有輸出Tensor數(shù)值不等的區(qū)域自動(dòng)生成校正Kernel。為了減少校正Kernel的開(kāi)銷,PET盡可能的將校正Kernel和已有的計(jì)算Kernel融合起來(lái)。

          0x7.3 融合Correction Kernels

          這里就是對(duì)上面Step3的一個(gè)解釋。請(qǐng)看Figure6:

          Figure6

          Figure6(a)表示一個(gè)標(biāo)準(zhǔn)的卷積過(guò)程。然后Figure6(b)表示在Figure6(a)上應(yīng)用一個(gè)部分等效變換。Conv-2是校正Kernel,這里和Conv-1是共享權(quán)重的,所以我們可以把conv1-conv2融合起來(lái)變成一個(gè)conv-1-2,如Figire6(c)所示。具體來(lái)說(shuō)這個(gè)融合操作就是將 聯(lián)合到一個(gè)單獨(dú)的Tensor并將Conv-1-2的輸出結(jié)果分解成。這里的聯(lián)合和分解只包含數(shù)據(jù)拷貝,可以用reshape和transpose來(lái)做到。

          0x8. Program Optimizer

          這一節(jié)介紹了PET中的程序優(yōu)化器,它可以通過(guò)將等效變換和部分等效變換結(jié)合起來(lái)探索一個(gè)更大的程序優(yōu)化搜索空間。首先程序優(yōu)化器將輸入程序分解成幾個(gè)更小尺寸的子程序并傳給Mutation Generator。然后為了優(yōu)化每個(gè)子程序,PET在一個(gè)豐富的搜索空間中通過(guò)調(diào)整參與突變的Op集合以及DFS搜索算法的迭代次數(shù)找到最好的變體程序。最后,把所有優(yōu)化后的子程序縫合到一起的時(shí)候會(huì)跨邊界應(yīng)用額外的后優(yōu)化包括算子融合,消除冗余Op等等。下面的算法2描述了程序優(yōu)化器的整個(gè)流程:

          程序優(yōu)化器的流程

          整個(gè)算法流程并不復(fù)雜,首先第8行把整個(gè)程序切開(kāi),切成一些子程序。對(duì)于每一個(gè)子程序我們都使用GETMUTANTS函數(shù)為這個(gè)子程序產(chǎn)生突變程序集合記作mutants(對(duì)應(yīng)第9行),然后初始化一個(gè)新的棧。再遍歷原始的棧,對(duì)其中的每個(gè)程序,基于剛才獲得的突變結(jié)果,對(duì)中的子程序進(jìn)行突變獲得一個(gè)新的突變程序,再把推導(dǎo)新的棧中。最后再更新原始的棧開(kāi)完成當(dāng)前子程序的突變。

          最后,選取棧中表現(xiàn)最好的程序進(jìn)行后優(yōu)化即獲得了最終的結(jié)果。

          在整個(gè)算法流程中還需要注意幾個(gè)細(xì)節(jié)。

          • Detail1. 如何切分原程序。論文將分線性的Op比如ReLU,Sigmoid等作為切分點(diǎn)。這也是PET的一個(gè)限制吧,只能突變多線性算子構(gòu)成的子圖。
          • Detail2. 算法中的棧需要保留性能最高的K個(gè)子程序,這里利用了之前的一篇論文TASO的代價(jià)模型以及性能評(píng)估方法。
          • Detail3. 為了平衡子程序突變過(guò)程中的搜索空間大小和搜索需要的時(shí)空成本,PET的程序優(yōu)化器引入了兩個(gè)超參數(shù)。一個(gè)是突變的迭代輪次,即算法2的第23行。還有就是當(dāng)子程序的Op個(gè)數(shù)超過(guò)d(這里取4)時(shí),PET通過(guò)枚舉最多d個(gè)Op的所有可能組合將子程序拆分成更小的Op子集,并且突變只發(fā)生在這個(gè)子集并保持其它Op不變。對(duì)應(yīng)算法2的26行。
          • Detail4. PET的程序優(yōu)化器和完全等價(jià)變換是完全兼容的。通過(guò)組合完全等價(jià)變換和部分等價(jià)變換可以探索更大的搜索空間。

          這一節(jié)最后還講了一下Post-Optimizations 。上面提到過(guò),最后所有的子程序突變體需要縫合到一起。除了連接它們的輸入和輸出張量之外,PET還跨子程序邊界執(zhí)行了一些后優(yōu)化以進(jìn)一步提升程序性能。可以注意到PET的變異生成器產(chǎn)生了大量的Reshape和Transpose(R/T)算子,尤其是在子程序的開(kāi)頭和結(jié)尾。所以這里有機(jī)會(huì)跨子程序融合這些R/T算子并進(jìn)一步融合上述子程序優(yōu)化中排除的非線性算子。Figure7為我們展示了一個(gè)包含兩個(gè)優(yōu)化子程序的例子,為了優(yōu)化子程序的邊界,PET首先通過(guò)重排非線性算子和R/T算子將兩個(gè)子程序之間的R/T算子組合在一起。如Figure7(b)所示,這種重排正確性是完全保證的。重排還允許PET將非線性的激活算子和其它算子進(jìn)行融合,比如將Conv和ReLU融合到Conv-ReLU中,如Figure7(c)所示。

          后優(yōu)化示例

          因此這里包含三種優(yōu)化:

          • 逆消除。我們消除了任何可以相互抵消的 R/T 運(yùn)算符對(duì),因此等效于無(wú)操作。 我們將每個(gè)這樣的對(duì)稱為逆組,并在后優(yōu)化過(guò)程中直接刪除它們。 逆組的一個(gè)例子是圖 7(b) 中的 R/T-E 和 R/T-G
          • 算子融合。 如圖 7(c) 所示,PET 將剩余的連續(xù) R/T 算子融合為單個(gè)算子(例如,R/T-DH)以降低Kernel Launch的成本。 張量化程序中的非線性激活也與 R/T 或其他線性算子融合。 算子融合是最常用的非線性算子的程序優(yōu)化。 PET 能夠恢復(fù)切分原始的張量化程序時(shí)損失的大部分效率。
          • 預(yù)處理。 如果所有輸入張量都是靜態(tài)已知的,我們會(huì)預(yù)處理任何算子。 例如,在圖 7(b) 中,R/T-B 和 R/T-I 都可以在卷積權(quán)重張量 w1 和 w2 上進(jìn)行預(yù)處理。其實(shí)這就是常量折疊。

          0x9. 實(shí)現(xiàn)

          他們的代碼是開(kāi)源的,大約有13000行C++代碼和1000行Python代碼。如果你對(duì)這個(gè)工作感興趣的話可以去研究源碼。地址見(jiàn):https://github.com/thu-pacman/PET 。

          10. 評(píng)估

          論文給出的實(shí)驗(yàn)結(jié)果是相當(dāng)豐富的,這里就不仔細(xì)講每一種實(shí)驗(yàn)結(jié)果圖表了。只講一個(gè)最重要的實(shí)驗(yàn)結(jié)果圖:

          PET在多種網(wǎng)絡(luò)上的性能表現(xiàn)

          在ResNet-18,CSRNet,InceptionV3,BERT,ResNet33D-18上相比于目前一些流行的框架均有顯著優(yōu)勢(shì),不過(guò)可惜這里沒(méi)有和PyTorch的結(jié)果進(jìn)行對(duì)比。

          實(shí)驗(yàn)部分還提到PET可以輕易的和TVM以及Ansor相結(jié)合,進(jìn)一步提升生成的張量化程序的效率。在PET中可以將cuDNN/cuBLAS/TVM/Ansor等流行的優(yōu)化庫(kù)以及代碼生成編譯器作為它的后端來(lái)生成高效的張量化程序。Figure12展示了這些框架作為后端時(shí)一些常見(jiàn)的單算子的加速效果:

          不同框架或者庫(kù)作為后端時(shí)一些常見(jiàn)的單算子的加速效果

          這里感覺(jué)說(shuō)明了PET的擴(kuò)展性是比較好的,可以結(jié)合大多數(shù)先進(jìn)的代碼生成類工作以及手工優(yōu)化的算子庫(kù)。

          11. 結(jié)論

          這篇論文提出了PET,也是一個(gè)將部分等價(jià)變換應(yīng)用在張量化程序上的DNN框架。通過(guò)應(yīng)用部分等價(jià)變換可以探索更大的程序搜索空間并在大多數(shù)流行的深度學(xué)習(xí)網(wǎng)絡(luò)上取得不錯(cuò)的加速效果。這篇論文的實(shí)驗(yàn)部分是非常扎實(shí)的,推薦大家學(xué)習(xí)一下。


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

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  丁香久月婷婷 | 午夜97 | 亚洲无码一区在线 | 91美女在线观看 | 天堂网在线视频 |