尚紹法,蔣 林*,李遠(yuǎn)成,朱 筠
(1.西安科技大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,西安 710600;2.西安郵電大學(xué) 電子工程學(xué)院,西安 710121)
隨著卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)在計(jì)算機(jī)視覺領(lǐng)域的廣泛應(yīng)用與快速發(fā)展,用戶對邊緣設(shè)備上CNN 模型推理的精度和速度要求越來越高[1-2]。因此,在異構(gòu)系統(tǒng)架構(gòu)(Heterogeneous System Architecture,HAS)上對CNN 的推理過程進(jìn)行加速成為了當(dāng)前的研究熱點(diǎn)[3]。
當(dāng)前,影響HSA 上CNN 模型推理加速的主要因素有模型劃分和任務(wù)調(diào)度,學(xué)者們主要從這兩方面對CNN 模型推理加速方法展開研究。從模型劃分的角度來看,現(xiàn)有CNN模型劃分方法以conv、maxpool2d 等基本算子為最小單位,通過建立性能評價(jià)模型與延遲最小化約束等方法實(shí)現(xiàn)CNN 模型的自動(dòng)劃分。文獻(xiàn)[4]中提出了一種基于遺傳算法的自動(dòng)化張量劃分CNN 模型推理加速算法,在給定精度損失范圍內(nèi)自動(dòng)調(diào)優(yōu),找出最優(yōu)的卷積張量分解方案,有效提升了CNN 推理速度。文獻(xiàn)[5]中提出了一種基于深度強(qiáng)化學(xué)習(xí)的計(jì)算圖劃分CNN 推理加速方法DistrEdge,將劃分過程建模為馬爾可夫決策過程,通過綜合分析CNN 特征與設(shè)備計(jì)算特性,利用深度強(qiáng)化學(xué)習(xí)作出最佳劃分決策,提升了CNN 在邊緣設(shè)備上的推理速度。文獻(xiàn)[6]中基于遞歸搜索算法實(shí)現(xiàn)計(jì)算圖的自動(dòng)劃分,將CNN 模型劃分后映射到多個(gè)GPU 上,使推理過程中總通信成本最小化,從而提升模型整體的推理速度。文獻(xiàn)[7]中在異構(gòu)平臺(tái)上對神經(jīng)網(wǎng)絡(luò)算子進(jìn)行大規(guī)模評估,通過調(diào)整分區(qū)比率實(shí)現(xiàn)CNN 的動(dòng)態(tài)分區(qū),提高邊緣設(shè)備上的異構(gòu)資源利用率,有效提升了CNN 模型的推理速度。
從任務(wù)調(diào)度的角度來看,文獻(xiàn)[8]中提出了一種基于深度強(qiáng)化學(xué)習(xí)的任務(wù)調(diào)度與資源分配方法,通過基于貪心策略的流水線調(diào)度算法解決了移動(dòng)邊緣計(jì)算的任務(wù)調(diào)度問題,使用強(qiáng)化學(xué)習(xí)優(yōu)化服務(wù)器的資源分配,有效提升了系統(tǒng)的計(jì)算速度。文獻(xiàn)[9]中提出了一種融合流水線并行和數(shù)據(jù)并行的CNN 多任務(wù)訓(xùn)練系統(tǒng)HetPipe,使用異構(gòu)的GPU 集群以流水線的方式執(zhí)行訓(xùn)練,通過數(shù)據(jù)并行獲得更高的模型收斂速度。文獻(xiàn)[10]中提出了一種針對異構(gòu)多核CPU 的流水線推理加速方法Pipe-it,將卷積層劃分并卸載至多個(gè)CPU 集群,將卷積的并行化限制在指定集群中,減小通信開銷,提高了CNN 模型的整體推理速度。文獻(xiàn)[11]中提出了一種基于動(dòng)態(tài)規(guī)劃的啟發(fā)式的模型流水線并行加速方法MadPipe,通過更精準(zhǔn)地估計(jì)內(nèi)存需求以及支持將非連續(xù)的CNN 層分配給處理器,實(shí)現(xiàn)負(fù)載平衡,提高了CNN 模型的訓(xùn)練速度。
目前該領(lǐng)域的研究工作取得了一定成果,但仍需進(jìn)一步改進(jìn),主要有以下兩方面:
1)目前模型劃分主要有張量劃分和圖劃分兩種方法。張量劃分會(huì)帶來高昂的通信成本,圖劃分需要耗費(fèi)大量的時(shí)間探索最優(yōu)劃分方案。因此,如何在HSA 平臺(tái)下快速完成對CNN 的最優(yōu)劃分仍值得研究。
2)目前CNN 模型加速的任務(wù)調(diào)度策略對象大多側(cè)重于CPU、GPU 等其他加速器的單一設(shè)備。然而,不同硬件適合執(zhí)行不同類型的模型算子。因此,如何設(shè)計(jì)異構(gòu)平臺(tái)的任務(wù)調(diào)度策略,實(shí)現(xiàn)異構(gòu)設(shè)備協(xié)同推理加速是重要的研究內(nèi)容。
綜上所述,本文提出了一種自適應(yīng)的CNN 模型劃分和調(diào)度方法?;诘湫虲NN 的結(jié)構(gòu)、計(jì)算量和參數(shù)量分布特征,針對關(guān)鍵算子對模型進(jìn)行自適應(yīng)劃分,降低設(shè)備間的通信消耗,增加模型調(diào)度的靈活性。使用關(guān)鍵路徑-貪婪搜索算法,自適應(yīng)地選擇子圖的最優(yōu)運(yùn)行負(fù)載以提高推理速度。為充分驗(yàn)證本文的優(yōu)化方法,使用ImageNet 數(shù)據(jù)集[12]和張量虛擬機(jī)(Tensor Virtual Machine,TVM)[13]跨設(shè)備調(diào)度機(jī)制,在CPU-GPU 異構(gòu)平臺(tái)對CNN 模型推理進(jìn)行加速驗(yàn)證。實(shí)驗(yàn)結(jié)果表明,與TVM 的推理機(jī)制相比,本文方法可以有效提升CNN 模型的推理速度。
為了深入研究CNN 模型的特征,本文選擇三種不同類型的CNN 模型GoogLeNet、ResNet18 和VGG16,從模型結(jié)構(gòu)和計(jì)算量/參數(shù)量分布兩個(gè)角度對不同結(jié)構(gòu)的CNN 模型進(jìn)行特征分析。
圖1 給出了三種CNN 模型的網(wǎng)絡(luò)結(jié)構(gòu),并分析VGG16、ResNet18 和GoogLeNet 三種CNN 模型的結(jié)構(gòu)特征??梢钥闯觯珻NN 模型是由多種不同的算子組成。由于卷積層和全連接層通常是CNN 模型訓(xùn)練和推理時(shí)計(jì)算開銷和存儲(chǔ)開銷最大的部分。本文將通過這兩種算子對CNN 模型結(jié)構(gòu)進(jìn)行分析,將模型結(jié)構(gòu)中重復(fù)的類conv_relu_maxpool2d 結(jié)構(gòu)定義為Conv_Block,全連接層定義為Fc,殘差結(jié)構(gòu)定義為Residual_Block,Inception 分支結(jié)構(gòu)定義為Inception_Block。
圖1 三種典型CNN模型結(jié)構(gòu)Fig.1 Structures of three typical CNN models
表1 總結(jié)了這三類典型CNN 模型的組成結(jié)構(gòu)??梢钥闯?,CNN 模型是由很多結(jié)構(gòu)相同的組件組成,組件之間的依賴關(guān)系簡單且易于表示。因此,基于CNN 模型中的重復(fù)組件,設(shè)計(jì)模型劃分策略,將計(jì)算圖根據(jù)層與層之間或分支的輸入輸出關(guān)鍵算子劃分成子圖集,實(shí)現(xiàn)粗計(jì)算粒度與相對較低的數(shù)據(jù)通信量。
表1 三類CNN模型的組成結(jié)構(gòu)Tab.1 Composition structures of three CNN models
為更好地平衡設(shè)備的計(jì)算負(fù)載和存儲(chǔ)負(fù)載,本文對CNN模型的計(jì)算量和參數(shù)量分布情況進(jìn)行統(tǒng)計(jì)分析。由于池化層和歸一化層沒有可學(xué)習(xí)參數(shù)和乘累加運(yùn)算,計(jì)算量與整個(gè)網(wǎng)絡(luò)相比可忽略不計(jì),因此本文主要對卷積層和全連接層進(jìn)行分析。通過解析TVM 的Let 表達(dá)式完成參數(shù)的自動(dòng)化提取,算法1 描述了CNN 模型的參數(shù)量和計(jì)算量的統(tǒng)計(jì)過程。
首先,將深度學(xué)習(xí)框架PyTorch 中導(dǎo)出的預(yù)訓(xùn)練好的CNN 模型M作為算法的輸入;其次,使用TVM 中的Relay/Transform 模塊將模型計(jì)算圖轉(zhuǎn)化為Let 表達(dá)式;然后,對表達(dá)式進(jìn)行遞歸遍歷,獲取模型的算子op;最后,通過判斷算子的類型對算子的參數(shù)進(jìn)行提取。根據(jù)式(1)、(2)分別統(tǒng)計(jì)單個(gè)卷積層的參數(shù)量pconv和計(jì)算量Fconv。使用式(3)、(4)分別統(tǒng)計(jì)單個(gè)全連接層的計(jì)算量FFc和參數(shù)量pFc。
其中:Ci為卷積層的輸入數(shù)據(jù)X的通道數(shù);Kw×Kh為卷積核尺寸;Co為卷積層的輸出通道數(shù);W×H為輸出特征圖的尺寸;I為全連接層的輸入特征數(shù);O為輸出特征數(shù)。使用算法1 對PyTorch 框架下三種類型的CNN 模型GoogLeNet、ResNet18 和VGG16 各部分的計(jì)算量和參數(shù)量進(jìn)行統(tǒng)計(jì)。
三種典型CNN 模型的計(jì)算量和參數(shù)量分布情況如圖2所示。其中:橫坐標(biāo)c_1、c_2 等表示卷積層;Fc 表示全連接層;In_3a、In_3b 等表示Inception 網(wǎng)絡(luò)中的分支子模塊;縱坐標(biāo)表示網(wǎng)絡(luò)模型各部分的計(jì)算量和參數(shù)量在整個(gè)網(wǎng)絡(luò)模型中所占比例。從圖2 可以看出,CNN 模型的計(jì)算量占比不均勻,整體呈現(xiàn)中間多,兩端少的趨勢。其中,卷積層的計(jì)算量占據(jù)全網(wǎng)絡(luò)計(jì)算量的99%以上,而全連接層的計(jì)算量只占據(jù)了不到全網(wǎng)絡(luò)計(jì)算量的1%,甚至可以忽略不計(jì)。參數(shù)量的分布整體呈遞增趨勢,其中,VGG16 模型的全連接層參數(shù)量已經(jīng)占據(jù)全網(wǎng)絡(luò)參數(shù)量的89.4%。隨著推理過程的進(jìn)行,模型組件的局部訪存計(jì)算比也逐漸增大。
圖2 三種CNN模型計(jì)算量和參數(shù)量分布Fig.2 Distribution of computational amount and parameters of three CNN models
算法1 參數(shù)量和計(jì)算量統(tǒng)計(jì)。
輸入 預(yù)訓(xùn)練模型M;
輸出 卷積層參數(shù)量pconv,卷積層計(jì)算量Fconv,全連接層參數(shù)量pFc,全連接層計(jì)算量FFc。
為了獲取CPU 與GPU 的通信性能特征,本文對不同數(shù)據(jù)大小進(jìn)行點(diǎn)對點(diǎn)批量傳輸?shù)膸捄脱舆t測試。實(shí)驗(yàn)平臺(tái)選 用PCIe3.0 連 接Intel Xeon Gold 6248R CPU 和Nvidia Quadro P2200 GPU,它的通信特征如圖3 所示,CPU 與GPU 之間的數(shù)據(jù)傳輸延遲與數(shù)據(jù)大小呈線性關(guān)系,數(shù)據(jù)傳輸速率在數(shù)據(jù)大小為150 KB 時(shí)就達(dá)到峰值。因此,CNN 模型在GPU上執(zhí)行時(shí)產(chǎn)生的高昂通信延遲是探索異構(gòu)環(huán)境下子圖調(diào)度方案時(shí)的關(guān)鍵影響因素之一。
圖3 CPU與GPU間的通信消耗Fig.3 Consumption of communication between CPU and GPU
為解決調(diào)度方案設(shè)備資源利用率低的問題,本文提出了一種面向異構(gòu)平臺(tái)的CNN 推理模型自適應(yīng)劃分和調(diào)度方法,總體流程如圖4 所示。在模型劃分方面,提出基于關(guān)鍵算子的CNN 推理模型的自適應(yīng)劃分方法,對CNN 模型結(jié)構(gòu)進(jìn)行階段和分支的自適應(yīng)劃分,減少模型劃分的評估開銷,降低搜索最優(yōu)模型劃分策略的復(fù)雜度。在任務(wù)調(diào)度方面,提出基于關(guān)鍵路徑的最優(yōu)子模型調(diào)度配置搜索算法。通過子模型在異構(gòu)設(shè)備上的性能實(shí)測,自適應(yīng)選取最優(yōu)執(zhí)行設(shè)備,從而減少模型推理時(shí)間。最后,通過TVM 深度學(xué)習(xí)編譯器將模型按照優(yōu)化方案部署到對應(yīng)的硬件后端進(jìn)行驗(yàn)證。
圖4 本文方法的總體流程Fig.4 Overall flow of the proposed method
根據(jù)CNN 推理模型結(jié)構(gòu)、計(jì)算量/參數(shù)量的特征分析結(jié)果,maxpool、Concatenate 等算子是CNN 推理模型中重復(fù)結(jié)構(gòu)或分支結(jié)構(gòu)的依賴算子,將這些算子作為關(guān)鍵算子對CNN推理模型進(jìn)行自適應(yīng)劃分。模型劃分方法主要基于有向無環(huán)圖的拓?fù)渑判?,具體劃分步驟如下:
步驟1 將從PyTorch 框架中導(dǎo)出的預(yù)訓(xùn)練CNN 模型通過TVM 框架轉(zhuǎn)化為適合解析處理的Let 表達(dá)式。
步驟2 用子算法1 遞歸遍歷圖劃分算法SplitGraph(),在遍歷過程中判斷并記錄當(dāng)前算子信息。若為關(guān)鍵算子,則將之前記錄的算子信息轉(zhuǎn)化為IRModule 類型,生成子模型;否則,使用Let 表達(dá)式對算子封裝,重復(fù)步驟2。
步驟3 將得到的子模型添加到子模型集Split_mods中,若模型還沒有遍歷結(jié)束,繼續(xù)執(zhí)行步驟2,直到模型遍歷結(jié)束,返回子模型集Split_mods。
具體模型劃分過程如算法2 所示。
算法2 基本塊模型劃分算法。
輸入 預(yù)訓(xùn)練CNN 模型M;
輸出 模型劃分后得到的子模型集Split_mods。
TVM 的分支模型劃分方法如圖5(a)所示,它需要人工標(biāo)記模型劃分節(jié)點(diǎn),然后使用TVM 中的PartitionGraph()函數(shù)以主干模型與子模型相結(jié)合的方式實(shí)現(xiàn)原始CNN 模型推理效果。子模型S2、S3 的輸入輸出都依賴于主干模型S1,導(dǎo)致主干模型的計(jì)算過程需要獲得子模型的計(jì)算結(jié)果才可以繼續(xù)進(jìn)行計(jì)算,設(shè)備資源被主干模型持續(xù)占用,靈活性差,限制了模型的任務(wù)調(diào)度。針對此問題,本文提出改進(jìn)的分支結(jié)構(gòu)模型劃分方法,如圖5(b)所示。將分支結(jié)構(gòu)模型的輸入和輸出依賴劃分至兩個(gè)子模型S1 和S3 中。分支結(jié)構(gòu)模型推理結(jié)束后,輸出數(shù)據(jù)無須傳回設(shè)備0 就可以繼續(xù)執(zhí)行下一階段的模型推理,模型調(diào)度的靈活性得到增強(qiáng)。
圖5 兩種模型劃分方法效果對比Fig.5 Comparison between two model partitioning methods
針對改進(jìn)的模型劃分方式生成的子模型,可以設(shè)計(jì)更加靈活的任務(wù)調(diào)度策略,設(shè)備之間的任務(wù)堵塞問題將得到改善。模型劃分使CNN 模型的各個(gè)階段也可以在不同設(shè)備后端運(yùn)行,充分利用硬件設(shè)備的計(jì)算訪存特性,從而提高模型整體推理速度。以圖6 為例,使用三個(gè)硬件后端對圖5 表示的兩種模型劃分方式執(zhí)行調(diào)度推理。圖6 中的子模型顏色與圖5 保持一致,灰色部分表示不同設(shè)備間的子模型數(shù)據(jù)轉(zhuǎn)移的時(shí)間消耗。從圖6 可以看出,劃分策略①中的子模型S1在推理過程中需要獲取依賴子圖S2、S3 的輸出結(jié)果,然后才可以繼續(xù)執(zhí)行推理過程。子圖S1 長時(shí)間占用設(shè)備Worker1,且當(dāng)多任務(wù)推理時(shí),任務(wù)2 中的子圖S2 和S3 由于要等待S1的輸出,導(dǎo)致設(shè)備Worker2 和Worker3 的資源利用率不高,會(huì)經(jīng)常處于空閑狀態(tài)。而劃分策略②產(chǎn)生的子圖,會(huì)弱化子圖之間的依賴關(guān)系,并減小子圖的規(guī)模。當(dāng)任務(wù)1 中子圖S1 執(zhí)行推理結(jié)束,將輸出數(shù)據(jù)轉(zhuǎn)移到Worker3 后,無須等待,可以連續(xù)執(zhí)行推理任務(wù)2。且Worker2 和Worker3 的利用率也會(huì)大大提高,避免子圖長時(shí)間占用硬件資源或硬件資源空閑情況的發(fā)生,從而實(shí)現(xiàn)多任務(wù)推理加速。
圖6 兩種模型劃分方法的調(diào)度效果對比Fig.6 Comparison of scheduling effect between two model partitioning methods
基于關(guān)鍵算子的CNN 推理模型自適應(yīng)劃分方法,避免了復(fù)雜的劃分策略搜索工作。采用后續(xù)遍歷算法識(shí)別關(guān)鍵算子,根據(jù)不同CNN 推理模型的特征自動(dòng)實(shí)現(xiàn)模型的自適應(yīng)劃分,大大提高了模型劃分的效率,也降低子模型之間的通信成本。劃分后的子模型還可以利用深度學(xué)習(xí)編譯器TVM 對子模型進(jìn)行圖級優(yōu)化,如算子融合和后端代碼優(yōu)化,以進(jìn)一步提高子模型在單個(gè)設(shè)備上的運(yùn)行效率,從而最小化整個(gè)模型的推理延遲。
為了提高異構(gòu)平臺(tái)的資源利用率,本文針對推理模型自適應(yīng)劃分后得到的子模型集Split_mods,提出了一種基于關(guān)鍵路徑和貪婪算法的自適應(yīng)模型調(diào)度方法。由于關(guān)鍵路徑是數(shù)據(jù)流圖中從源節(jié)點(diǎn)到末節(jié)點(diǎn)計(jì)算時(shí)間最長的路徑[14],所以,提高位于關(guān)鍵路徑上的關(guān)鍵節(jié)點(diǎn)的推理速度,就會(huì)提高數(shù)據(jù)流圖的整體推理速度。對于順序處理階段中的每個(gè)子圖,優(yōu)先選擇子圖在關(guān)鍵路徑上執(zhí)行速度更快的設(shè)備[15-17]。對于多分支結(jié)構(gòu)的子圖,將該階段代價(jià)最大的子圖添加到關(guān)鍵路徑中。具體步驟如下:
步驟1 對劃分后的子模型集合,在異構(gòu)平臺(tái)的不同硬件后端上進(jìn)行性能實(shí)測。為了減小硬件性能波動(dòng)的影響,取10 次實(shí)驗(yàn)平均值,獲取較準(zhǔn)確的推理時(shí)間。
步驟2 根據(jù)性能實(shí)測的結(jié)果,自適應(yīng)地選擇不同子模型的最優(yōu)運(yùn)行負(fù)載。
步驟3 為更好地解決模型運(yùn)行時(shí)不可預(yù)測的系統(tǒng)資源調(diào)度問題,引入一種基于關(guān)鍵路徑和貪婪算法的任務(wù)調(diào)度校正方案,對CNN 推理模型計(jì)算圖的關(guān)鍵路徑上的子圖進(jìn)行優(yōu)先排序,根據(jù)實(shí)際推理時(shí)間對調(diào)度方案進(jìn)行校正。
使用算法2 對VGG16 模型進(jìn)行自適應(yīng)劃分,得到5 個(gè)卷積塊C_(ii=1,2,3,4,5)和1 個(gè)全連接塊FC。將這些子模型放置在CPU 和GPU 上分別測試模型的推理時(shí)間,結(jié)果如表2所示??梢钥闯觯KC_(ii=1,2,3,4)適合在GPU 上運(yùn)行,模塊C_5 和FC 適合在CPU 上運(yùn)行。
表2 VGG16子模型在不同設(shè)備上的執(zhí)行時(shí)間對比 單位:msTab.2 Comparison of execution time of VGG16 submodels on different devices unit:ms
模型在GPU 上執(zhí)行推理時(shí),需要將模型數(shù)據(jù)從內(nèi)存拷貝至GPU,計(jì)算完成后將結(jié)果傳回CPU 進(jìn)行處理。因此,當(dāng)模型計(jì)算量很大,而參數(shù)量小時(shí),適合在GPU 上運(yùn)行,利用GPU 強(qiáng)大的并行計(jì)算能力執(zhí)行矩陣的快速運(yùn)算,隱藏?cái)?shù)據(jù)傳輸消耗的時(shí)間,從而提升模型推理速度;但是當(dāng)模型計(jì)算量小而參數(shù)量大時(shí),模型在GPU 上運(yùn)行的數(shù)據(jù)傳輸延時(shí)遠(yuǎn)大于計(jì)算延時(shí),反而不如在CPU 上運(yùn)行。在選擇運(yùn)行設(shè)備時(shí),需要判斷降低的計(jì)算延時(shí)是否能夠隱藏?cái)?shù)據(jù)的傳輸開銷。
圖7 顯示了四種調(diào)度策略,策略①是模型在CPU 上運(yùn)行;策略②是模型在GPU 上運(yùn)行,計(jì)算延遲顯著降低,所以隱藏了設(shè)備間的數(shù)據(jù)傳輸延時(shí),整體速度與策略①相比得到提升[18-20];策略③將劃分后的子圖放置在異構(gòu)設(shè)備上,在GPU 上放置子圖{1,3,5},在CPU 上放置子圖{2,4,6},平衡了模型在GPU 上的計(jì)算收益與數(shù)據(jù)傳輸開銷,整體上推理速度與策略②相比得到提升;策略④通過不斷校正為子圖選擇最佳的運(yùn)行設(shè)備,如子圖2 在GPU 上運(yùn)行時(shí)間優(yōu)于CPU,將子圖2 放置在GPU 上模型整體的推理速度與策略④相比,推理時(shí)間得到縮短[21-23]。當(dāng)執(zhí)行x輪校正而不減少執(zhí)行時(shí)間時(shí),修正步驟終止。模型調(diào)度配置算法如算法3 所示。
圖7 異構(gòu)平臺(tái)的調(diào)度策略Fig.7 Scheduling strategies for heterogeneous platforms
算法3 模型調(diào)度運(yùn)行時(shí)配置算法。
輸入 算法2 得到的子模型集合Split_mods,預(yù)訓(xùn)練模型參數(shù)params,運(yùn)行設(shè)備的編譯器targets,運(yùn)行設(shè)備dev;
輸出 模型配置m_config。
2.3.1 時(shí)間復(fù)雜度分析
1)算法2 的時(shí)間復(fù)雜度主要由子算法1 遞歸搜索算法SplitGraph()中的子模型遍歷和子模型封裝兩部分組成。時(shí)間復(fù)雜度分別如下:
子模型遍歷階段的時(shí)間復(fù)雜度主要取決于CNN 模型的層數(shù)。設(shè)CNN 模型的層數(shù)為n,則子模型遍歷階段的時(shí)間復(fù)雜度為:
子模型封裝階段的時(shí)間復(fù)雜度主要取決于子模型的層數(shù)。設(shè)子模型的層數(shù)為mi(i=1,2,…,k),因此子模型封裝階段的時(shí)間復(fù)雜度為:
綜上可知,算法2 的時(shí)間復(fù)雜度為:
2)算法3 主要由子模型的輸入輸出依賴配置、預(yù)訓(xùn)練參數(shù)配置、最優(yōu)運(yùn)行設(shè)備配置三部分組成。
子模型的輸入輸出依賴配置階段的時(shí)間復(fù)雜度主要取決于子模型依賴的獲取。設(shè)子模型集合的大小為l,在配置每個(gè)子模型的輸入依賴時(shí),需要遍歷所有子模型的輸出依賴,以此保證每個(gè)子模型輸入依賴配置的正確性與完整性。因此子模型輸入輸出依賴配置階段的時(shí)間復(fù)雜度為:
子模型的預(yù)訓(xùn)練參數(shù)配置階段的時(shí)間復(fù)雜度主要取決于子模型參數(shù)的獲取。設(shè)CNN 模型的預(yù)訓(xùn)練參數(shù)量為p,則子模型參數(shù)獲取階段的時(shí)間復(fù)雜度為:
子模型運(yùn)行設(shè)備配置階段的時(shí)間復(fù)雜度主要取決于子模型集合的遍歷。因此子模型運(yùn)行設(shè)備配置階段的時(shí)間復(fù)雜度為:
綜上可知,算法3 的時(shí)間復(fù)雜度為:
由于通常情況下l>2,因此算法3 的時(shí)間復(fù)雜度近似為:
2.3.2 通信復(fù)雜度分析
1)算法2 通過后序遍歷算法識(shí)別CNN 推理模型中的關(guān)鍵算子,通過分析算子輸入輸出的數(shù)據(jù)大小變化,可以發(fā)現(xiàn)如maxpool2d 等算子的輸出數(shù)據(jù)規(guī)模小于輸入數(shù)據(jù)規(guī)模。所以,根據(jù)這些關(guān)鍵算子進(jìn)行模型劃分,在進(jìn)行跨設(shè)備數(shù)據(jù)傳輸時(shí)可以縮短通信延時(shí)。
2)算法3 中通過性能實(shí)測與校正算法選擇子模型最優(yōu)的運(yùn)行設(shè)備dev。如圖2 所示,由于預(yù)訓(xùn)練模型包含大量的預(yù)訓(xùn)練參數(shù),這些預(yù)訓(xùn)練參數(shù)在模型中分布不均。圖2(a)中能明顯地看出全連接層的參數(shù)量占據(jù)了預(yù)訓(xùn)練參數(shù)的89.4%,計(jì)算量卻不到全網(wǎng)絡(luò)計(jì)算量的1%。此時(shí),若將全連接層放置在GPU 上運(yùn)行會(huì)造成通信延時(shí)遠(yuǎn)大于計(jì)算延時(shí),從而延長推理模型在GPU 上的推理時(shí)間。性能實(shí)測能更準(zhǔn)確地根據(jù)不同后端硬件特性選擇子模型的最優(yōu)運(yùn)行設(shè)備。通過跨設(shè)備調(diào)度充分利用異構(gòu)資源降低預(yù)訓(xùn)練參數(shù)傳輸至設(shè)備的通信時(shí)間,然后利用校正算法根據(jù)整個(gè)CNN 模型的推理時(shí)間決策最優(yōu)的運(yùn)行設(shè)備,避免設(shè)備間頻繁數(shù)據(jù)傳輸。從而降低CNN 模型在推理過程中總通信延時(shí),加快推理。
本文實(shí)驗(yàn)的測試平臺(tái)的配置如表3 所示。
表3 測試平臺(tái)配置信息Tab.3 Experimental platform configuration information
本文使用PyTorch 框架中提供的預(yù)訓(xùn)練CNN 模型作為測試實(shí)驗(yàn)的測試集,模型參數(shù)如表4 所示。選用VGG11、AlexNet、MobileNet、SqueezeNet、ResNet18 和GoogLeNet,這6個(gè)結(jié)構(gòu)和深度不同的網(wǎng)絡(luò)作為實(shí)驗(yàn)對比的測試對象[24]。PyTorch 框架的預(yù)訓(xùn)練模型采用網(wǎng)絡(luò)公開數(shù)據(jù)集ImageNet 對神經(jīng)網(wǎng)絡(luò)模型進(jìn)行訓(xùn)練,具有完整的模型參數(shù),因此直接使用預(yù)訓(xùn)練模型進(jìn)行推理測試。TVM 是優(yōu)化CNN 模型推理的深度學(xué)習(xí)編譯器,在模型定義和后端代碼生成之間進(jìn)行了高度優(yōu)化。將本文方法在CPU 和GPU 上與TVM 和傳統(tǒng)的PyTorch 實(shí)現(xiàn)進(jìn)行了性能比較。從數(shù)據(jù)集中隨機(jī)抽取10 張圖片,對圖片進(jìn)行格式化,格式化后的數(shù)據(jù)作為CNN 模型的輸入數(shù)據(jù)。
表4 不同模型的卷積層、分類層的計(jì)算量與參數(shù)量Tab.4 Computational amount and parameters of convolutional and classification layers of different models
首先,將每張圖片的大小轉(zhuǎn)化為224×224×3 的矩陣數(shù)據(jù);其次,使用均值方差歸一化方法,對圖像數(shù)據(jù)進(jìn)行歸一化處理;然后,使用TVM 從PyTorch 框架加載預(yù)訓(xùn)練好的CNN模型,以歸一化后的圖片數(shù)據(jù)作為模型輸入數(shù)據(jù);最后,選擇批大?。╞atch size)為1 來表示CNN 推理中的一個(gè)常見情況。為了進(jìn)行可靠的測量,對每個(gè)配置運(yùn)行100 次,統(tǒng)計(jì)平均延遲。
表5 為VGG11、AlexNet、ResNet18 三種不同結(jié)構(gòu)CNN 模型的模型劃分和運(yùn)行設(shè)備的選擇結(jié)果??梢钥闯觯疚姆椒梢愿鶕?jù)不同模型的特征自動(dòng)實(shí)現(xiàn)對不同CNN 模型的模型劃分,然后針對不同子模型的計(jì)算特性和訪存特性基于性能實(shí)測與校正算法自適應(yīng)地決策出子模型的最優(yōu)運(yùn)行設(shè)備。
表5 CNN模型劃分與設(shè)備分配Tab.5 Partitioning and device assignment of CNN models
以AlexNet 為例,它由32 個(gè)基本算子組成。使用算法2將模型劃分為0-3、4-7、8-17 和18-31 四個(gè)子模型,然后通過在硬件平臺(tái)進(jìn)行性能實(shí)測以及關(guān)鍵路徑校正算法決策出第1 個(gè)和第4 個(gè)子模型更適合在CPU 上運(yùn)行,第2 個(gè)和第3 個(gè)子模型更適合在GPU 上運(yùn)行。
設(shè)TVM 優(yōu)化后的模型在GPU 上的推理時(shí)間為Ttvm,本文方法的模型推理時(shí)間為Tour,優(yōu)化方法加速比為Sour,則加速比計(jì)算公式為:
圖8 給出不同CNN 模型在不同測試環(huán)境下的推理執(zhí)行時(shí)間。與TVM(CPU)和TVM(GPU)相比,本文方法分別獲得了45.45%~311.46% 和5.88%~19.05% 的速度提升。與PyTorch(CPU)和PyTorch(GPU)相比,本文方法在CPU 和GPU 上分別獲得了118.18%~958.82%和9.09%~105.88%的速度提升。因?yàn)楸疚姆椒▽悩?gòu)平臺(tái)的優(yōu)勢與深度學(xué)習(xí)編譯器TVM 所作的優(yōu)化結(jié)合起來,使CPU 和GPU 的收益最大化,通過子圖調(diào)度策略優(yōu)化,降低了模型推理中的通信開銷和計(jì)算延遲。
圖8 不同模型執(zhí)行時(shí)間對比Fig.8 Comparison of execution time of different models
為驗(yàn)證模型深度不同時(shí)本文方法的加速效果,將本文方法與傳統(tǒng)TVM 推理方法在CPU 和GPU 上的推理時(shí)間進(jìn)行對比。預(yù)訓(xùn)練模型選取5 個(gè)模型結(jié)構(gòu)相同但深度不同的CNN模 型 :ResNet18、ResNet34、ResNet50、ResNet101 和ResNet152。對比結(jié)果如圖9 所示。隨著ResNet 模型深度增加,模型在TVM-CPU 運(yùn)行方式下的執(zhí)行時(shí)間也在變長。因?yàn)镃PU 訪存帶寬比GPU 高,但矩陣運(yùn)算速度比GPU 低,因此對計(jì)算密集型算子更敏感。在TVM-GPU 運(yùn)行方式下,當(dāng)ResNet 模型深度相對較?。ㄈ?8、34)時(shí),執(zhí)行時(shí)間變化較小。這是因?yàn)镃NN 模型的深度較淺時(shí),GPU 的計(jì)算核心沒有滿載。當(dāng)模型深度加深時(shí),計(jì)算量增加,GPU 的計(jì)算核心利用率提高,使GPU 單位時(shí)間內(nèi)的計(jì)算速度提升。本文方法結(jié)合CPU 和GPU 的硬件特性優(yōu)勢,將訪存計(jì)算比高的子圖卸載到CPU,訪存計(jì)算比低的子圖卸載至GPU,充分發(fā)揮了CPU 的訪存帶寬高、GPU 計(jì)算能力強(qiáng)的優(yōu)勢。當(dāng)模型深度較深時(shí),子圖數(shù)量增多,調(diào)度算法的策略搜索空間也會(huì)增大,從中選擇出優(yōu)于TVM-GPU 運(yùn)行方式的最優(yōu)模型運(yùn)行策略,故本文方法的模型推理時(shí)間最短。
圖9 不同深度的CNN模型推理執(zhí)行時(shí)間對比Fig.9 Comparison of inference execution time of CNN models with different depths
影響本文方法性能的另一個(gè)因素是輸入數(shù)據(jù)的批大小。本文用批大小為{2,4,8,16,32}的輸入數(shù)據(jù)進(jìn)行測試實(shí)驗(yàn),實(shí)驗(yàn)結(jié)果如圖10 所示。與TVM(GPU)相比,在批處理規(guī)模較小時(shí)本文方法的推理速度提升更明顯。例如,在批大小為2 時(shí)速度提升了22.86%。但隨著批處理規(guī)模的增加,速度提升效果在逐漸減弱。當(dāng)批大小為32 時(shí),本文方法幾乎沒有速度提升。因?yàn)殡S著推理任務(wù)數(shù)量的增多,任務(wù)調(diào)度面臨的系統(tǒng)進(jìn)程環(huán)境更加復(fù)雜,多設(shè)備協(xié)同計(jì)算會(huì)遇到更頻繁的資源競爭、任務(wù)堵塞問題,而GPU 更適合大批量任務(wù)的執(zhí)行。
圖10 不同批大小下CNN模型的推理執(zhí)行時(shí)間延遲對比結(jié)果Fig.10 Comparison of CNN models inference excution time with different batch sizes
為了驗(yàn)證本文自適應(yīng)劃分調(diào)度方法的先進(jìn)性,在6 種CNN 模型上與EOP(Efficient Operator Partition)方法[7]進(jìn)行對比,對比結(jié)果如圖11 所示??梢钥闯?,與EOP 相比,在VGG11、MobileNet、ResNet18 和SqueezeNet 這4 個(gè)模型上,本文方法分別獲得了9.33%、25.00%、26.50%和8.43%的速度提升。在GoogLeNet 模型上兩者推理速度相當(dāng),在AlexNet模型上本文方法的推理速度略有下降。EOP 通過調(diào)整分區(qū)比率來尋找最優(yōu)的模型劃分方案,沒有充分利用TVM 算子融合優(yōu)化方法。隨著模型的規(guī)模增大,子模型的推理延遲增大,從而導(dǎo)致整個(gè)模型的推理延遲也增大。
圖11 本文方法與EOP方法的推理執(zhí)行時(shí)間對比Fig.11 Comparison of inference execution time between proposed method and EOP method
圖12 展示了本文方法與傳統(tǒng)Tensorflow 和TVM 在GPU上的推理時(shí)間對比??梢钥闯?,性能提升與本文方法對PyTorch 平臺(tái)生成的CNN 模型推理性能提升效果相當(dāng)。本文提出的自適應(yīng)優(yōu)化方法與深度學(xué)習(xí)平臺(tái)無關(guān),主要基于CNN模型的計(jì)算圖表示進(jìn)行自適應(yīng)劃分調(diào)度,然后使用TVM 深度學(xué)習(xí)編譯器對優(yōu)化方案實(shí)現(xiàn)模型部署,對其他深度學(xué)習(xí)平臺(tái)理論上應(yīng)該都具有不同程度的優(yōu)化效果。
圖12 本文方法與Tensorflow框架的推理執(zhí)行時(shí)間對比Fig.12 Comparison of inference execution time between proposed method and Tensorflow method
為緩解CNN 模型在異構(gòu)平臺(tái)中推理時(shí)硬件設(shè)備利用率低、延遲高的問題,本文提出了一種異構(gòu)平臺(tái)的CNN 推理模型自適應(yīng)劃分和調(diào)度方法。該方法根據(jù)不同CNN 推理模型中的關(guān)鍵算子進(jìn)行自適應(yīng)劃分,劃分速度比傳統(tǒng)基于評估的模型劃分算法更快,推理過程中設(shè)備間的通信消耗更小。通過在異構(gòu)平臺(tái)上對子模型的推理延遲進(jìn)行性能實(shí)測,根據(jù)測試結(jié)果自適應(yīng)選擇最優(yōu)運(yùn)行設(shè)備,提高子模型的推理速度。配置子模型的輸入輸出依賴,保證原始CNN 推理模型的推理效果,將本文提出的算法與TVM 編譯器算子優(yōu)化方法融合,使推理速度進(jìn)一步提升。實(shí)驗(yàn)結(jié)果表明,本文方法對小批量推理任務(wù)的加速效果明顯,并且對深度更深的網(wǎng)絡(luò)具有更好的加速效果,但對大批量推理任務(wù)的推理速度優(yōu)化不足。在后續(xù)工作中,將對多設(shè)備協(xié)同調(diào)度中出現(xiàn)的任務(wù)負(fù)載不均衡和任務(wù)堵塞等異常情況進(jìn)行研究,提高設(shè)備利用率,降低大批量推理任務(wù)的推理延遲。