本發(fā)明屬于圖像處理,特別涉及一種卷積算子融合的方法。
背景技術(shù):
1、現(xiàn)有技術(shù)中深度神經(jīng)網(wǎng)絡(luò)已經(jīng)成為移動設(shè)備上許多主要應(yīng)用的核心推動力。為了達(dá)到高精確度,dnn模型變得越來越深,有數(shù)百甚至數(shù)千的算子層,導(dǎo)致推理需要高內(nèi)存和高計(jì)算要求。算子融合(或內(nèi)核/層融合)是許多先進(jìn)dnn執(zhí)行框架的關(guān)鍵優(yōu)化,如tensorflow、tvm和mnn,旨在提高dnn推理的效率。算子融合屬于圖像優(yōu)化,算子融合可以達(dá)到減少整個graph中node的數(shù)量,以減少從一個node到另一個node之間的數(shù)據(jù)搬運(yùn)的目的,從而減少在底層推理過程中需要耗費(fèi)的時(shí)間。
2、然而,現(xiàn)有技術(shù)的主要缺陷在于:在算子融合過程中,或是將常見的算子組合進(jìn)行融合,如卷積和bn;或者是某些熱點(diǎn)算子組合子圖進(jìn)行融合,卻沒有將多個卷積算子進(jìn)行融合的。
3、此外,現(xiàn)有技術(shù)中的常用術(shù)語包括:
4、算子:深度學(xué)習(xí)算法由一個個計(jì)算單元組成,我們稱這些計(jì)算單元為算子(operator,簡稱op),包括:conv,pooling,activation等。
5、節(jié)點(diǎn):神經(jīng)網(wǎng)絡(luò)的基本計(jì)算單元是神經(jīng)元,同城成為節(jié)點(diǎn)(node)。它接收來自其他節(jié)點(diǎn)或外部源的輸入并計(jì)算輸出。
技術(shù)實(shí)現(xiàn)思路
1、為了解決上述問題,本申請的目的在于:在本方法中,會根據(jù)底層降低計(jì)算時(shí)間的需求,遍歷整個graph圖,判斷遍歷到的node節(jié)點(diǎn)是否符合融合的要求,若是符合要求,就將需要進(jìn)行融合的多個卷積,融合為一個新的算子。
2、具體地,本發(fā)明提供一種卷積算子融合的方法,所述方法包括以下步驟:
3、s0,先明確需要進(jìn)行融合的算子類型,即先確定要融合的卷積的類型,這樣在后續(xù)進(jìn)行融合時(shí)能夠選擇正確的卷積進(jìn)行融合;
4、s1,先遍歷整個graph圖,所述graph圖理解為有向無環(huán)圖,找到符合n個算子順序串聯(lián)的子圖結(jié)構(gòu),這里的n是需要融合起來的算子的個數(shù);s2,在找到該子圖后,分別取出n個算子中對應(yīng)的權(quán)重h和w、步長strides、輸入輸出權(quán)重位寬、激活屬性,判斷該算子是否符合要融合的條件,這里說的取出的屬性,即是從graph圖中取出的卷積算子的以上的參數(shù)的值,取出屬性與判斷條件的關(guān)系也就是取出kernel對應(yīng)的值,判斷是否符合融合條件;
5、如果不符合,則跳過該子圖,跳過該子圖后會繼續(xù)下一個符合結(jié)構(gòu)的子圖,并判斷該子圖是否符合融合條件,符合的進(jìn)行融合,不符合的繼續(xù)找下一個子圖或直至整個graph圖結(jié)束;
6、符合的話,則進(jìn)行下一步步驟s3;
7、s3,符合卷積融合的條件,則創(chuàng)建一個新的節(jié)點(diǎn)node,并命名一個新的算子名稱,取出n個卷積內(nèi)的所有屬性,進(jìn)行重命名后放到新節(jié)點(diǎn)中,然后給新節(jié)點(diǎn)連接對應(yīng)的輸入和輸出,在graph圖中的每個節(jié)點(diǎn)都有輸入節(jié)點(diǎn)的名稱信息,通過每個節(jié)點(diǎn)的輸入名稱理解節(jié)點(diǎn)之間的關(guān)聯(lián)關(guān)系,所述連接即是將子圖的輸入設(shè)置為新節(jié)點(diǎn)的輸入,將子圖的輸出節(jié)點(diǎn)的原始輸入刪除,并將新節(jié)點(diǎn)設(shè)置為子圖輸出節(jié)點(diǎn)的輸入,這樣就將新節(jié)點(diǎn)插入到graph圖中,使其在圖中有對應(yīng)的連接關(guān)系,并將圖中的需要融合的節(jié)點(diǎn)刪除。
8、所述步驟s0中所述先確定要融合的卷積的類型,是因?yàn)楫?dāng)前是對多個卷積進(jìn)行融合,卷積有標(biāo)準(zhǔn)卷積、深度卷積即對輸入的每個通道獨(dú)立進(jìn)行卷積運(yùn)算、pointconvolution即權(quán)重寬高為1x1的普通卷積、膨脹卷積即在卷積核里面的元素直接插入空格來膨脹內(nèi)核形成膨脹卷積,那么就需要先確定要融合的卷積的類型。
9、所述步驟s0中進(jìn)行卷積的融合,根據(jù)卷積的不同分類,有普通卷積和深度卷積,包括需要對point?convolution-深度卷積-point?convolution這三個進(jìn)行融合。
10、所述步驟s1中,所述有向無環(huán)圖即無回路的有向圖,即在圖論中,如果一個有向圖無法從某個頂點(diǎn)出發(fā)經(jīng)過若干條邊回到該點(diǎn),則這個圖是一個有向無環(huán)圖。
11、所述步驟s1中所述n在point_convolution、depthwise_convolution和point_convolution三個卷積融合中n為3,point_convolution、depthwise_convolution和point_convolution三個算子融合,這里的point_convolution是指權(quán)重的h,w為1的普通卷積,depthwise_convolution就是深度卷積;若是進(jìn)行其他子圖的融合則對應(yīng)設(shè)置n,假設(shè)對depthwise_convolution和point_convolution進(jìn)行融合的話,n就是2。
12、所述n無論將多少個算子進(jìn)行融合,進(jìn)行融合的大步驟不變,只會是其中小步驟中子圖結(jié)構(gòu)或者判斷是否進(jìn)行融合的條件的變化。
13、所述步驟s2中,在卷積的計(jì)算過程中需要知道輸入大小,權(quán)重kernel的大小,步長stride,并且會將卷積根據(jù)不同的芯片進(jìn)行量化,所以還需要獲取芯片類型信息,量化位寬bitwidth,激活類型action_type信息,所以判斷這些卷積是否能否融合就需要獲取以上參數(shù)。
14、所述步驟s2中,所述判斷條件是:深度卷積的權(quán)重寬高是3,3;三個卷積的步長寬高均為1;三個卷積的輸入位寬,輸出位寬,權(quán)重位寬均為8;三個卷積的激活均為none或relu或relu6。
15、所述步驟s2中,所述步驟s2中,理解成graph圖中包含多個卷積,而一個卷積中包含多個參數(shù)鍵值對,包括kernel:1,1;stride:1,1,所述取出屬性與判斷條件的關(guān)系也就是取出kernel對應(yīng)的值1,1。
16、所述步驟s3中,所述融合的節(jié)點(diǎn)刪除即減少節(jié)點(diǎn)的方式就是將三個卷積融合為一個卷積,從而達(dá)到減少兩個節(jié)點(diǎn)的目的,將point?conv-depthwise?conv-point?conv三個節(jié)點(diǎn)融合成了一個new?conv節(jié)點(diǎn),對整個graph圖來說,就減少了兩個節(jié)點(diǎn)。
17、由此,本申請的優(yōu)勢在于:將多個卷積算子進(jìn)行融合為一個新的算子,從而減少graph中的節(jié)點(diǎn)數(shù),減少節(jié)點(diǎn)之間的數(shù)據(jù)搬運(yùn),和底層推理時(shí)的耗時(shí)。
1.一種卷積算子融合的方法,其特征在于,所述方法包括以下步驟:
2.根據(jù)權(quán)利要求1所述的一種卷積算子融合的方法,其特征在于,所述步驟s0中所述先確定要融合的卷積的類型,是因?yàn)楫?dāng)前是對多個卷積進(jìn)行融合,卷積有標(biāo)準(zhǔn)卷積、深度卷積即對輸入的每個通道獨(dú)立進(jìn)行卷積運(yùn)算、point?convolution即權(quán)重寬高為1x1的普通卷積、膨脹卷積即在卷積核里面的元素直接插入空格來膨脹內(nèi)核形成膨脹卷積,那么就需要先確定要融合的卷積的類型。
3.根據(jù)權(quán)利要求2所述的一種卷積算子融合的方法,其特征在于,所述步驟s0中進(jìn)行卷積的融合,根據(jù)卷積的不同分類,有普通卷積和深度卷積,包括需要對point?convolution-深度卷積-point?convolution這三個進(jìn)行融合。
4.根據(jù)權(quán)利要求1所述的一種卷積算子融合的方法,其特征在于,所述步驟s1中,所述有向無環(huán)圖即無回路的有向圖,即在圖論中,如果一個有向圖無法從某個頂點(diǎn)出發(fā)經(jīng)過若干條邊回到該點(diǎn),則這個圖是一個有向無環(huán)圖。
5.根據(jù)權(quán)利要求1所述的一種卷積算子融合的方法,其特征在于,所述步驟s1中所述n在point_convolution、depthwise_convolution和point_convolution三個卷積融合中n為3,point_convolution、depthwise_convolution和point_convolution三個算子融合,這里的point_convolution是指權(quán)重的h,w為1的普通卷積,depthwise_convolution就是深度卷積;若是進(jìn)行其他子圖的融合則對應(yīng)設(shè)置n,假設(shè)對depthwise_convolution和point_convolution進(jìn)行融合的話,n就是2。
6.根據(jù)權(quán)利要求4所述的一種卷積算子融合的方法,其特征在于,所述n無論將多少個算子進(jìn)行融合,進(jìn)行融合的大步驟不變,只會是其中小步驟中子圖結(jié)構(gòu)或者判斷是否進(jìn)行融合的條件的變化。
7.根據(jù)權(quán)利要求6所述的一種卷積算子融合的方法,其特征在于,所述步驟s2中,在卷積的計(jì)算過程中需要知道輸入大小,權(quán)重kernel的大小,步長stride,并且會將卷積根據(jù)不同的芯片進(jìn)行量化,所以還需要獲取芯片類型信息,量化位寬bitwidth,激活類型action_type信息,所以判斷這些卷積是否能否融合就需要獲取以上參數(shù)。
8.根據(jù)權(quán)利要求7所述的一種卷積算子融合的方法,其特征在于,所述步驟s2中,所述判斷條件是:深度卷積的權(quán)重寬高是3,3;三個卷積的步長寬高均為1;三個卷積的輸入位寬,輸出位寬,權(quán)重位寬均為8;三個卷積的激活均為none或relu或relu6。
9.根據(jù)權(quán)利要求8所述的一種卷積算子融合的方法,其特征在于,所述步驟s2中,所述步驟s2中,理解成graph圖中包含多個卷積,而一個卷積中包含多個參數(shù)鍵值對,包括kernel:1,1;stride:1,1,所述取出屬性與判斷條件的關(guān)系也就是取出kernel對應(yīng)的值1,1。
10.根據(jù)權(quán)利要求9所述的一種卷積算子融合的方法,其特征在于,所述步驟s3中,所述融合的節(jié)點(diǎn)刪除即減少節(jié)點(diǎn)的方式就是將三個卷積融合為一個卷積,從而達(dá)到減少兩個節(jié)點(diǎn)的目的,將point?conv-depthwiseconv-point?conv三個節(jié)點(diǎn)融合成了一個new?conv節(jié)點(diǎn),對整個graph圖來說,就減少了兩個節(jié)點(diǎn)。