国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

深度學(xué)習(xí)編譯器模型訓(xùn)練負(fù)載均衡優(yōu)化方法

2024-01-11 13:15趙雅倩李仁剛郭振華
計算機(jī)與生活 2024年1期
關(guān)鍵詞:編譯器線程流水

王 麗,高 開,趙雅倩,李仁剛,曹 芳,郭振華

浪潮電子信息產(chǎn)業(yè)股份有限公司 高效能服務(wù)器與存儲技術(shù)國家重點(diǎn)實驗室,濟(jì)南 250000

對于計算密集型的人工智能(artificial intelligence,AI)訓(xùn)練任務(wù),隨著AI算法模型參數(shù)從千萬級增至千億級,單個AI 硬件設(shè)備的算力和內(nèi)存遠(yuǎn)遠(yuǎn)不能滿足深度學(xué)習(xí)模型訓(xùn)練的需求,模型訓(xùn)練并行化成為增強(qiáng)其應(yīng)用時效性的迫切需求。近年來面向AI分布式訓(xùn)練的硬件加速器層出不窮,如中央處理器(central processing unit,CPU)、圖形處理器(graphic processing unit,GPU)、現(xiàn)場可編程門陣列(field programmable gate array,F(xiàn)PGA)、AI 芯片等,為AI 算法模型并行訓(xùn)練提供了硬件基礎(chǔ)。同時,國內(nèi)外研究人員也在致力于推出適用于不同應(yīng)用場景的深度學(xué)習(xí)框架,主要 有TensorFlow[1]、PyTorch[2]、MXNet[3]、PaddlePaddle[4]等。隨著深度學(xué)習(xí)框架和AI 硬件設(shè)備的持續(xù)多樣化,單純基于手工優(yōu)化來實現(xiàn)AI 算法模型在深度學(xué)習(xí)框架和AI 硬件設(shè)備之間的高效映射,越來越容易出現(xiàn)性能瓶頸。

為了充分利用各種硬件資源,減輕手動優(yōu)化每個硬件運(yùn)行模型的負(fù)擔(dān),研究人員試圖通過深度學(xué)習(xí)編譯器解決框架的靈活性和性能之間的矛盾[5]。深度學(xué)習(xí)編譯器的通用設(shè)計架構(gòu)如圖1所示,其主要功能是基于編譯優(yōu)化技術(shù)將不同深度學(xué)習(xí)框架描述的AI 算法模型在底層各種AI 硬件設(shè)備上生成有效的代碼實現(xiàn),并根據(jù)模型規(guī)范和硬件體系結(jié)構(gòu)完成對生成代碼的高度優(yōu)化,解決了手工優(yōu)化帶來的AI模型的性能和效率問題。

圖1 深度學(xué)習(xí)編譯器通用設(shè)計架構(gòu)Fig.1 General design architecture of deep learning compiler

對于AI 模型并行訓(xùn)練,研究人員需要將計算任務(wù)映射到多個AI 加速設(shè)備上并行計算,基于深度學(xué)習(xí)編譯器完成模型訓(xùn)練任務(wù)到底層硬件設(shè)備自動高效映射的同時,如何實現(xiàn)訓(xùn)練任務(wù)在多個加速器上的負(fù)載均衡,從而進(jìn)一步提升訓(xùn)練效率,已經(jīng)成為深度學(xué)習(xí)編譯器面臨的難點(diǎn)問題。當(dāng)前,業(yè)界針對大規(guī)模AI 并行訓(xùn)練提出了各種并行優(yōu)化方法,以提高模型訓(xùn)練的效率。其中PipeMare[6]、Wavelet[7]、Chimera[8]等基于流水并行優(yōu)化方法盡可能減少訓(xùn)練過程中設(shè)備閑置時間,以提高硬件設(shè)備資源利用率;Taskflow[9]、Gavel[10]等通過設(shè)計不同的調(diào)度算法和策略,實現(xiàn)模型訓(xùn)練任務(wù)在多GPU 上的高效分配。但是,上述研究考慮了整體訓(xùn)練效率的優(yōu)化,沒有分析模型訓(xùn)練期間硬件設(shè)備之間的負(fù)載均衡問題,且主要面向深度學(xué)習(xí)框架進(jìn)行,在當(dāng)前的深度學(xué)習(xí)編譯器中尚沒有涉及。

本文致力于研究面向模型訓(xùn)練的深度學(xué)習(xí)編譯器計算圖負(fù)載均衡優(yōu)化方法。目前業(yè)界已經(jīng)提出幾種主流深度學(xué)習(xí)編譯器,例如Google XLA[11](accelerated linear algebra,加速線性代數(shù)編譯器)、Apache TVM[12]和Glow[13]等,主要面向AI 應(yīng)用進(jìn)行圖層級或算子級編譯優(yōu)化。其中,Google XLA 旨在為TensorFlow 提供后端的靈活性支持,其集成在TensorFlow內(nèi)部,基于TensorFlow 前端接口實現(xiàn)對模型訓(xùn)練任務(wù)的支持,XLA 編譯器支持算子融合等圖層級優(yōu)化,但對于流水調(diào)度、負(fù)載均衡等優(yōu)化需要基于TensorFlow 的分布式訓(xùn)練策略實現(xiàn);TVM、Glow 主要面向推理應(yīng)用場景進(jìn)行算子級編譯優(yōu)化,對于訓(xùn)練任務(wù)的支持處于開發(fā)階段;nGraph[14]目前作為核心映射模塊集成到Intel 高性能推理引擎OpenVINO[15]中,轉(zhuǎn)向推理應(yīng)用進(jìn)行性能優(yōu)化,不再支持AI 算法模型訓(xùn)練任務(wù),因此,當(dāng)前主流深度學(xué)習(xí)編譯器均無法實現(xiàn)面向AI模型訓(xùn)練任務(wù)的圖層級負(fù)載均衡優(yōu)化。

針對以上問題,本文結(jié)合訓(xùn)練任務(wù)的性能瓶頸特點(diǎn),提出面向模型訓(xùn)練的深度學(xué)習(xí)編譯器計算圖負(fù)載均衡優(yōu)化方法,包括數(shù)據(jù)加載與模型訓(xùn)練的負(fù)載均衡優(yōu)化設(shè)計、計算圖分層調(diào)度優(yōu)化設(shè)計以及計算圖分層自動流水優(yōu)化設(shè)計,完成了模型訓(xùn)練任務(wù)中CPU 與后端設(shè)備之間以及后端設(shè)備內(nèi)部任務(wù)調(diào)度的負(fù)載均衡優(yōu)化,從而提高了模型訓(xùn)練任務(wù)從深度學(xué)習(xí)框架到AI硬件設(shè)備映射的計算性能和硬件設(shè)備資源利用率,并提升了系統(tǒng)整體能效。本文的貢獻(xiàn)主要有以下三點(diǎn):

(1)提出數(shù)據(jù)加載與模型訓(xùn)練的負(fù)載均衡優(yōu)化設(shè)計方法,為數(shù)據(jù)加載提供最優(yōu)的并行線程數(shù),在CPU 負(fù)載最小的情況下,實現(xiàn)數(shù)據(jù)加載與模型訓(xùn)練的負(fù)載均衡。同時,通過數(shù)據(jù)搬運(yùn)與模型訓(xùn)練之間的多線程流水并行控制,掩蓋計算設(shè)備等待數(shù)據(jù)搬運(yùn)時間,提高模型訓(xùn)練任務(wù)的整體性能。

(2)提出計算圖分層調(diào)度優(yōu)化設(shè)計方法,通過啟發(fā)式分層查找算法自動尋找計算圖的分層和算子調(diào)度策略,得到計算圖的最優(yōu)分層,實現(xiàn)編譯器中計算圖在后端設(shè)備上的負(fù)載均衡,并通過子圖并行調(diào)度,進(jìn)一步提升了計算性能。

(3)提出計算圖分層自動流水優(yōu)化設(shè)計方法,提出分層后計算子圖間的并行流水設(shè)計,解決訓(xùn)練過程中反向計算和參數(shù)更新的依賴,利用二分查找算法自動優(yōu)化微批次劃分,實現(xiàn)計算圖分層流水并行計算,進(jìn)一步提高計算過程中AI設(shè)備的資源利用率。

1 背景介紹

深度學(xué)習(xí)編譯器前端優(yōu)化是基于高層中間表示(intermediate representation,IR)的圖層級優(yōu)化,雖然不同深度學(xué)習(xí)編譯器前端計算圖在高層IR 的數(shù)據(jù)表示和算子定義上有所不同,但獨(dú)立于硬件的前端優(yōu)化均可以分為節(jié)點(diǎn)級、塊級和數(shù)據(jù)流級三個層次,每個層次的優(yōu)化方法都采用深度學(xué)習(xí)特有的編譯優(yōu)化技術(shù),減少計算冗余,提高算法模型在圖層級的性能。

節(jié)點(diǎn)級優(yōu)化包括節(jié)點(diǎn)消除和張量消除優(yōu)化方法,編譯器根據(jù)計算圖判斷不參與計算的無用節(jié)點(diǎn)和張量,并進(jìn)行刪除[5,12]。塊級優(yōu)化包括代數(shù)簡化以及算子融合、算子分解等神經(jīng)網(wǎng)絡(luò)相關(guān)優(yōu)化方法,編譯器分析計算圖中各算子之間的基本運(yùn)算關(guān)系,利用結(jié)合律、交換律等基本方式調(diào)整計算順序,簡化計算,執(zhí)行算子融合,提升計算性能[16-17]。近期Rammer[18]、DNNFusion[19]、Unity[20]等工作將代數(shù)簡化、算子融合、并行優(yōu)化等技術(shù)結(jié)合,聯(lián)合優(yōu)化,加速了模型訓(xùn)練。數(shù)據(jù)流級優(yōu)化包括公共表達(dá)式消除、數(shù)據(jù)布局轉(zhuǎn)換、靜態(tài)內(nèi)存分配等優(yōu)化方法[21],編譯器基于公共表達(dá)式消除、死代碼消除等數(shù)學(xué)優(yōu)化盡可能減少重復(fù)和無用計算,并結(jié)合就地內(nèi)存共享和標(biāo)準(zhǔn)內(nèi)存共享的方式,執(zhí)行靜態(tài)內(nèi)存規(guī)劃優(yōu)化,以實現(xiàn)內(nèi)存緩沖區(qū)重用,Zhao 等[21]最新研究通過優(yōu)化數(shù)據(jù)布局,消除通信過程中數(shù)據(jù)子集的相互移動,提升了模型訓(xùn)練過程中通信效率。

針對上述編譯優(yōu)化方法,各深度學(xué)習(xí)編譯器具有不同的實現(xiàn)方式。表1 統(tǒng)計了面向AI 模型訓(xùn)練任務(wù)的深度學(xué)習(xí)編譯器前端優(yōu)化方法,以及主流深度學(xué)習(xí)編譯器對各優(yōu)化方法的支持。統(tǒng)計表明,現(xiàn)有深度學(xué)習(xí)編譯器采用基本一致的編譯前端優(yōu)化方法,包括節(jié)點(diǎn)級優(yōu)化、塊級優(yōu)化和數(shù)據(jù)流控制優(yōu)化,而對于AI 算法模型訓(xùn)練過程中,需要考慮的計算圖負(fù)載均衡優(yōu)化并未涉及。

表1 編譯器前端優(yōu)化方法Table 1 Front-end optimization methods of compiler

為了實現(xiàn)深度學(xué)習(xí)編譯器對模型訓(xùn)練任務(wù)的支持,進(jìn)一步提升模型訓(xùn)練任務(wù)在編譯器中的計算性能,同時降低系統(tǒng)整體能耗,本文提出了面向模型訓(xùn)練任務(wù)的計算圖負(fù)載均衡優(yōu)化方法。該方法從系統(tǒng)全局的角度對計算圖進(jìn)行分層劃分,并且實現(xiàn)分層劃分后計算子圖間的流水并行調(diào)度,使得整個編譯優(yōu)化過程處于負(fù)載均衡狀態(tài),以提高AI 硬件設(shè)備的資源利用率,主要包括數(shù)據(jù)加載與模型訓(xùn)練負(fù)載均衡優(yōu)化、計算圖分層調(diào)度優(yōu)化以及計算圖分層自動流水優(yōu)化。

數(shù)據(jù)加載與模型訓(xùn)練負(fù)載均衡優(yōu)化主要是解決CPU上數(shù)據(jù)讀取任務(wù)和后端AI硬件設(shè)備上模型訓(xùn)練任務(wù)之間的負(fù)載不均衡問題。一般通過開啟多線程流水控制,掩蓋數(shù)據(jù)讀取的時間,以提高模型訓(xùn)練的性能和效率。AI 算法模型訓(xùn)練過程中,數(shù)據(jù)搬運(yùn)的復(fù)雜度顯著提高,容易帶來計算開銷無法覆蓋傳輸開銷的問題,因此數(shù)據(jù)加載也是影響整體訓(xùn)練性能的關(guān)鍵因素。OneFlow[22]在計算圖中顯式地表達(dá)數(shù)據(jù)搬運(yùn),將模型訓(xùn)練任務(wù)過程中的數(shù)據(jù)讀取、數(shù)據(jù)傳輸?shù)容斎胼敵觯╥nput output,IO)操作封裝成與計算圖同一標(biāo)準(zhǔn)的計算子圖,實現(xiàn)數(shù)據(jù)搬運(yùn)與模型訓(xùn)練之間的自動流水并行控制,為深度學(xué)習(xí)框架在AI 模型訓(xùn)練中性能優(yōu)化開啟了新的思路;TensorFlow[1]通過建立文件名隊列和任務(wù)隊列,采用多線程流水控制的方式從文件名隊列中讀取圖片數(shù)據(jù),進(jìn)行數(shù)據(jù)解析,并將解析后的數(shù)據(jù)加入任務(wù)隊列中為訓(xùn)練任務(wù)提供輸入數(shù)據(jù),實現(xiàn)了數(shù)據(jù)加載與訓(xùn)練任務(wù)的并行流水。但是上述實現(xiàn)均沒有考慮數(shù)據(jù)加載過程中的多線程數(shù)量優(yōu)化問題,僅通過開啟固定單線程或者最大線程數(shù)的方式實現(xiàn)數(shù)據(jù)加載與模型訓(xùn)練的流水并行,并沒有解決數(shù)據(jù)加載與模型訓(xùn)練的負(fù)載均衡問題,容易帶來AI 設(shè)備資源的利用不均衡,降低AI算法模型的訓(xùn)練效率。

計算圖分層調(diào)度優(yōu)化以及分層自動流水優(yōu)化屬于計算子圖在后端設(shè)備上調(diào)度的負(fù)載均衡優(yōu)化。Xiao、Woo 等[23-24]提出面向分布式訓(xùn)練的GPU 并行調(diào)度系統(tǒng),旨在提高大規(guī)模分布式集群中模型訓(xùn)練的GPU 設(shè)備資源利用率,但以上研究主要針對數(shù)據(jù)并行訓(xùn)練任務(wù);Gpipe[25]、DAPPLE[26]、Chimera[8]等工作提出細(xì)粒度流水并行優(yōu)化設(shè)計方案,盡可能減少流水并行訓(xùn)練過程中GPU 設(shè)備空閑時間,提高硬件設(shè)備資源利用率以及模型訓(xùn)練性能。但在當(dāng)前的深度學(xué)習(xí)編譯器系統(tǒng)中,調(diào)度優(yōu)化主要涉及內(nèi)存調(diào)度以及硬件指令相關(guān)的循環(huán)調(diào)度,在編譯前端對計算圖進(jìn)行模型并行訓(xùn)練相關(guān)的計算圖分層和流水并行調(diào)度優(yōu)化在當(dāng)前主流深度學(xué)習(xí)編譯器中尚未涉及。

2 計算圖負(fù)載均衡優(yōu)化

為了充分利用深度學(xué)習(xí)編譯器后端各種AI硬件資源,滿足計算密集型模型訓(xùn)練任務(wù)的算力需求,研究人員需要采用大規(guī)模AI硬件協(xié)同計算提高模型訓(xùn)練速率,實現(xiàn)模型訓(xùn)練任務(wù)到底層硬件設(shè)備的高效映射。目前單一的局部優(yōu)化算法能夠帶來局部性能提升,但系統(tǒng)整體的計算負(fù)載難以達(dá)到均衡狀態(tài),導(dǎo)致AI 設(shè)備加速器計算效率低下,降低了AI 計算平臺的硬件資源利用率。

本文從編譯器系統(tǒng)全局負(fù)載均衡的角度出發(fā),針對目前主流深度學(xué)習(xí)編譯器有限支持模型訓(xùn)練任務(wù),以及模型訓(xùn)練過程中設(shè)備之間和設(shè)備內(nèi)部資源利用不均衡等特點(diǎn),搭建了面向AI 模型訓(xùn)練的深度學(xué)習(xí)編譯器框架,并提出了計算圖負(fù)載均衡優(yōu)化策略,主要包括以下兩個方面:第一,通過數(shù)據(jù)加載與模型訓(xùn)練的負(fù)載均衡優(yōu)化技術(shù)提供數(shù)據(jù)讀取階段最優(yōu)并行線程數(shù),實現(xiàn)CPU 上數(shù)據(jù)加載任務(wù)和后端設(shè)備上模型計算任務(wù)之間的負(fù)載均衡;第二,通過計算圖的分層調(diào)度優(yōu)化以及多級分層后的自動流水優(yōu)化技術(shù)實現(xiàn)計算圖在后端設(shè)備內(nèi)部調(diào)度的負(fù)載均衡。

2.1 面向模型訓(xùn)練的深度學(xué)習(xí)編譯器

本文首先搭建自研深度學(xué)習(xí)編譯器Mofang。Mofang 是基于開源編譯器nGraph[14]開發(fā)的一套面向模型訓(xùn)練任務(wù)的深度學(xué)習(xí)編譯器框架,主要實現(xiàn)模型訓(xùn)練任務(wù)從編譯器前端到編譯器后端AI硬件設(shè)備的解耦化映射,其前端支持Tensorflow、PaddlePaddle、ONNX 格式訓(xùn)練模型的導(dǎo)入,后端支持Intel CPU、NVIDIA V100 GPU以及F10a FPGA加速設(shè)備。

Mofang 充分利用nGraph 提供的框架bridge(轉(zhuǎn)換層)解耦機(jī)制,通過bridge 層將不同框架的AI 算法模型輸入轉(zhuǎn)換至使用其高層中間表示語言描述的統(tǒng)一格式(High-Level IR),并對其進(jìn)行硬件無關(guān)的優(yōu)化,實現(xiàn)了計算圖重構(gòu)。由于nGraph 由同時支持訓(xùn)練和推理的軟件生態(tài),改變?yōu)橹恢С滞评砣蝿?wù),且移除了分布式通信接口,本文基于nGraph 添加CPU、GPU、FPGA等AI硬件加速設(shè)備的分布式通信算子接口,并集成OpenMPI、NCCL等優(yōu)化版的通信算子庫,實現(xiàn)了深度學(xué)習(xí)編譯器對AI 分布式訓(xùn)練任務(wù)的支持,Mofang整體實現(xiàn)架構(gòu)如圖2所示。

圖2 Mofang深度學(xué)習(xí)編譯器整體架構(gòu)Fig.2 Overall architecture of Mofang deep learning compiler

為了提升模型訓(xùn)練的性能以及后端設(shè)備資源利用率,本文在Mofang 框架中實現(xiàn)了數(shù)據(jù)加載與模型訓(xùn)練的負(fù)載均衡、計算圖分層調(diào)度以及分層后自動流水優(yōu)化等編譯優(yōu)化技術(shù),其中數(shù)據(jù)加載與模型訓(xùn)練的負(fù)載均衡優(yōu)化在Mofang 自定義前端實現(xiàn),計算圖分層以及分層后自動流水優(yōu)化基于Mofang高層中間表示實現(xiàn)。

2.2 數(shù)據(jù)加載與模型訓(xùn)練的負(fù)載均衡

本節(jié)首先分析了目前深度學(xué)習(xí)框架中數(shù)據(jù)加載和模型訓(xùn)練任務(wù)之間的調(diào)度流程。為了解決數(shù)據(jù)加載的性能瓶頸問題,現(xiàn)有框架通常在CPU 上開啟多線程并行讀取數(shù)據(jù),以提高數(shù)據(jù)加載的效率,使其能夠滿足模型訓(xùn)練過程的數(shù)據(jù)讀取需求,數(shù)據(jù)加載與模型訓(xùn)練兩個階段通過建立數(shù)據(jù)隊列緩存的方式實現(xiàn)流水并行執(zhí)行,主流深度學(xué)習(xí)框架TensorFlow 中數(shù)據(jù)加載與模型訓(xùn)練流水并行的實現(xiàn)流程如圖3 所示。TensorFlow 數(shù)據(jù)加載過程首先建立文件名隊列和數(shù)據(jù)隊列,由左至右分為文件名獲取、寫入文件名隊列、按照文件名讀取數(shù)據(jù)、解析數(shù)據(jù)、將數(shù)據(jù)寫入數(shù)據(jù)隊列五個階段。其中按照文件名讀取數(shù)據(jù)和解析數(shù)據(jù)的過程采用啟動固定數(shù)量的CPU 線程的方式并行執(zhí)行,以保證數(shù)據(jù)讀取和解析的速率能夠滿足訓(xùn)練任務(wù)獲取數(shù)據(jù)的需求,訓(xùn)練模塊只需要按照流程從數(shù)據(jù)隊列中讀取解析后的數(shù)據(jù),執(zhí)行計算過程,減少了訓(xùn)練階段等待數(shù)據(jù)加載的時間消耗。

圖3 TensorFlow深度學(xué)習(xí)框架中的數(shù)據(jù)加載Fig.3 Data loading in TensorFlow deep learning framework

對于不同的模型訓(xùn)練任務(wù),模型訓(xùn)練性能存在較大的差異,單純開啟固定線程數(shù)進(jìn)行數(shù)據(jù)加載的方式容易導(dǎo)致數(shù)據(jù)加載與模型訓(xùn)練任務(wù)負(fù)載不均衡。例如,當(dāng)數(shù)據(jù)加載速度過快,超過模型訓(xùn)練模塊的數(shù)據(jù)讀取需求時,會導(dǎo)致數(shù)據(jù)隊列緩存溢出;而數(shù)據(jù)加載過慢,不能滿足模型訓(xùn)練模塊的數(shù)據(jù)讀取需求時,會出現(xiàn)訓(xùn)練過程等待數(shù)據(jù)的問題,降低了訓(xùn)練性能。

本文測試了在CPU 上開啟不同數(shù)量的線程時數(shù)據(jù)讀取模塊的性能,統(tǒng)計結(jié)果如表2所示。線程開啟數(shù)量與讀取性能在一定范圍內(nèi)呈現(xiàn)線性增長的趨勢,但是當(dāng)開啟最大CPU線程數(shù)64時,數(shù)據(jù)讀取解析性能呈現(xiàn)下降趨勢。這是因為此時開啟最大的線程數(shù),會占用更多CPU 硬件資源,影響系統(tǒng)整體運(yùn)行,導(dǎo)致數(shù)據(jù)讀取性能下降。

表2 線程數(shù)量對數(shù)據(jù)讀取性能的影響Table 2 Impact of the number of threads on data read performance

TensorFlow 等深度學(xué)習(xí)框架通過人工經(jīng)驗去定義各個階段的線程數(shù)量來實現(xiàn)流水,最常用的方式是針對性能瓶頸模塊開啟最大線程數(shù)來提高整體性能。根據(jù)表2統(tǒng)計結(jié)果,開啟最大線程數(shù)的方式容易導(dǎo)致占用過多CPU 資源,存在大量的資源浪費(fèi),而且會影響其他程序運(yùn)行。因此在實際模型訓(xùn)練任務(wù)中,需要根據(jù)不同的數(shù)據(jù)批處理大?。╞atch_size)、AI硬件設(shè)備類型以及AI硬件設(shè)備數(shù)量等對性能瓶頸階段設(shè)置不同的線程數(shù)量,才能夠使整個系統(tǒng)的流水處于負(fù)載均衡狀態(tài),提高硬件資源利用率。通常情況下,訓(xùn)練時batch_size越大,使用的硬件設(shè)備數(shù)量越多,階段3 模型訓(xùn)練的性能就會越高,因此在CPU 上需要開啟的處理數(shù)據(jù)讀取的線程數(shù)量越多。

為了更直觀地分析數(shù)據(jù)加載與模型訓(xùn)練過程的整體性能瓶頸,本文對整個過程進(jìn)行多階段劃分,如圖4 所示。數(shù)據(jù)加載與模型訓(xùn)練過程主要分為三個階段,其中階段1 為文件名讀取,階段2 為數(shù)據(jù)的讀取解析,階段3為模型訓(xùn)練。目前主流深度學(xué)習(xí)編譯器中,階段1 和階段2 以多線程的方式運(yùn)行在CPU 處理器上,第三階段模型訓(xùn)練過程經(jīng)過前端和后端優(yōu)化后運(yùn)行在編譯后端AI 硬件設(shè)備上。在AI 模型訓(xùn)練任務(wù)中,數(shù)據(jù)讀取階段的耗時最多,容易成為整個流水過程的性能瓶頸;而不同的優(yōu)化方法以及AI 硬件設(shè)備對階段3模型訓(xùn)練的性能影響較大,容易導(dǎo)致三個階段的負(fù)載不均衡。

圖4 數(shù)據(jù)加載與模型訓(xùn)練階段劃分Fig.4 Data loading and model training phase division

針對上述問題,本文針對深度學(xué)習(xí)編譯器的自定義前端提出一種自動調(diào)整線程數(shù)量的方法,進(jìn)一步優(yōu)化數(shù)據(jù)讀取解析階段的線程數(shù)量,從而實現(xiàn)三個階段的負(fù)載均衡。

本文提出反向查找的方法自動尋找數(shù)據(jù)讀取階段線程的最優(yōu)配置,即找出整個系統(tǒng)達(dá)到最佳性能時數(shù)據(jù)讀取階段需要開啟的最少線程數(shù)量。假設(shè)當(dāng)數(shù)據(jù)批處理大小為batch_size時,第三階段經(jīng)過特定后端優(yōu)化之后的預(yù)估時間為T3,第二階段每個線程處理一個數(shù)據(jù)的預(yù)估時間為T2,第一階段的預(yù)估時間為T1。假設(shè)CPU 的最大線程數(shù)量MAX_thread,線程加速比為?n,如果第二階段在CPU上開啟了n個線程,在流水執(zhí)行狀態(tài)下,那么整個系統(tǒng)的消耗時間就是執(zhí)行時間最長的階段的時間,如式(1)。因此,本文研究如何開啟最少的線程數(shù),即n盡可能得小,使得整個系統(tǒng)的時間T最小。系統(tǒng)整體時間T的計算公式如下所示:

由于在batch_size固定時,對于同一種AI加速器,T1和T3是固定的,對于式(1),變形后有:

要使得T最小,則有:

在滿足式(4)下選取n的最小正整數(shù)即是最優(yōu)解。

通過上述方法選取的數(shù)據(jù)讀取階段的線程數(shù),能夠在滿足第三階段模型訓(xùn)練數(shù)據(jù)讀取需求的同時,盡可能地節(jié)省CPU的資源占用,使得CPU在負(fù)載最小的情況下,數(shù)據(jù)加載與模型訓(xùn)練兩個階段的任務(wù)達(dá)到負(fù)載均衡的狀態(tài),即提高了CPU 的資源利用率,減少CPU資源浪費(fèi),進(jìn)一步節(jié)省了系統(tǒng)的能耗。

2.3 計算圖分層調(diào)度優(yōu)化

深度學(xué)習(xí)編譯器中模型訓(xùn)練通常以計算圖的方式在后端AI 硬件設(shè)備上進(jìn)行調(diào)度,由于計算圖參數(shù)逐漸增大,算子間依賴關(guān)系愈加復(fù)雜,容易出現(xiàn)算子調(diào)度不均衡,模型訓(xùn)練過程中后端設(shè)備資源利用率波動較大的問題[27]。傳統(tǒng)的順序調(diào)度算法、貪心調(diào)度算法以及算子的變形融合優(yōu)化(TASO(tensor algebra superoptimizer for deep learning)[28])技術(shù)都存在算子調(diào)度不均衡的問題。本文提出了計算圖的分層調(diào)度優(yōu)化算法重新規(guī)劃算子間依賴關(guān)系,使得計算圖每個階段算子的調(diào)度達(dá)到負(fù)載均衡狀態(tài)。

本文以InceptionV3 的部分網(wǎng)絡(luò)結(jié)構(gòu)(圖5)為例說明不同的調(diào)度算法對算子調(diào)度順序以及設(shè)備利用率的影響。該網(wǎng)絡(luò)結(jié)構(gòu)包括五個卷積操作,每個卷積的通道數(shù)和卷積核大小不盡相同。圖6 展示了深度學(xué)習(xí)編譯器常用的卷積算子的變形融合優(yōu)化,首先通過補(bǔ)零擴(kuò)展卷積核的方式把1×1 的卷積擴(kuò)展為3×3的卷積如圖6(a)所示,再通過簡單堆疊的方式把具有同樣卷積核的Conv(a)、Conv(b)和Conv(d)三個卷積合并為一個卷積Conv(a)(b)(d)。合并后的網(wǎng)絡(luò)結(jié)構(gòu)如圖6(b)所示,卷積合并優(yōu)化之后需要增加一個split 算子,用來處理合并算子的輸出,優(yōu)化之后的計算圖在執(zhí)行過程中減少了兩次內(nèi)核的啟動,能夠獲得相應(yīng)的性能提升。

圖5 InceptionV3模塊Fig.5 InceptionV3 module

圖6 深度學(xué)習(xí)編譯器卷積算子合并優(yōu)化Fig.6 Deep learning compiler convolution operator merging optimization

本節(jié)首先基于傳統(tǒng)深度學(xué)習(xí)框架使用的貪心算法進(jìn)行算子變形融合優(yōu)化前后,AI 硬件設(shè)備的資源利用率分析?;谒惴ㄔ恚澬乃惴看螌⒆畲笙薅鹊卣{(diào)度可調(diào)度的算子,而不考慮算子的負(fù)載均衡問題。在原始的網(wǎng)絡(luò)結(jié)構(gòu)中(圖5),Conv(a)、Conv(b)、Conv(d)同時獲取輸入數(shù)據(jù),不存在依賴關(guān)系,因此在第一階段,貪心算法會同時調(diào)度Conv(a)、Conv(b)和Conv(d)三個算子,此時三個算子的調(diào)度存在激烈的資源競爭,GPU 的資源利用率會達(dá)到頂峰;而在第二階段只調(diào)度Conv(c)一個算子,由于計算量小,GPU的利用率大幅降低,導(dǎo)致GPU 硬件資源利用不足,存在資源浪費(fèi)。

經(jīng)過卷積算子變形融合技術(shù)優(yōu)化后,貪心算法在第一階段會調(diào)度合并后的算子Conv(abd),由于該算子通道數(shù)量合并為三個卷積的通道數(shù)量之和,在調(diào)度該算子時同樣會占用大量的GPU 內(nèi)存資源,第二階段調(diào)度的算子也只有一個,同樣會由于Conv(c)算子的計算量小,導(dǎo)致資源利用率不高。因此,算子變形融合優(yōu)化不能解決計算圖前后算子的調(diào)度不均衡問題。

基于以上問題,本文提出算子分層調(diào)度優(yōu)化策略,該策略重新定義算子的調(diào)度依賴關(guān)系,使整個計算圖的調(diào)度達(dá)到均衡狀態(tài),如圖7所示。首先根據(jù)計算圖卷積算子的數(shù)據(jù)依賴關(guān)系,對計算圖執(zhí)行分層操作,算子Conv(a)和算子Conv(d)為第一層,算子Conv(b)和算子Conv(c)為第二層;然后根據(jù)算子卷積核和通道數(shù)等參數(shù)特點(diǎn),將第一層中的算子Conv(a)和算子Conv(d)進(jìn)行算子變形融合優(yōu)化,形成合并算子Conv(a)(d)。為了提高第二階段AI 設(shè)備的資源利用率,將第二層的算子Conv(b)和算子Conv(c)執(zhí)行并行計算,計算圖第一層和第二層由于存在數(shù)據(jù)依賴關(guān)系,執(zhí)行串行調(diào)度。

圖7 算子分層調(diào)度優(yōu)化策略Fig.7 Operator hierarchical scheduling optimization strategy

為了保證層與層之間的串行調(diào)度,本文在層之間增加新的result節(jié)點(diǎn),插入result節(jié)點(diǎn)后的整個計算圖如圖8所示,該節(jié)點(diǎn)負(fù)責(zé)上一層計算結(jié)果的匯總和下一層輸入數(shù)據(jù)的分發(fā)。

圖8 插入result節(jié)點(diǎn)增加層間依賴后的計算圖Fig.8 Calculation graph after inserting result node to add interlayer dependencies

為了解決復(fù)雜計算圖中,計算圖高效分層劃分問題,本文提出了一種啟發(fā)式分層查找算法,自動計算查找計算圖的最優(yōu)分層策略。假設(shè)計算圖G的所有算子節(jié)點(diǎn)集合為V,從V的頂點(diǎn)開始按照算子依賴遍歷整個計算圖,得到一個子集U,子集U將V分成U和V-U兩部分。計算圖的最優(yōu)調(diào)度延遲用cost來表示,那么狀態(tài)轉(zhuǎn)移公式為:

即V的最優(yōu)延遲是所有可能分層U的延遲和剩余頂點(diǎn)集V-U的最優(yōu)延遲之和的最小值。

對于每一種可能的分層U,給出一個啟發(fā)式評價函數(shù)來評估分層的好壞。該啟發(fā)式函數(shù)如式(6)所示,通過計算分層后的兩層的計算量差別來評估分層結(jié)果的質(zhì)量。

其中,com(U)為分層U的計算量。

具體來說,整個分層包括以下實施步驟:

(1)枚舉計算圖V所有可能的算子分層{U0,U1,…,Um}。

(2)根據(jù)啟發(fā)評價函數(shù)τ計算所有可能分層的評估指標(biāo),按照指標(biāo)由小到大排序,設(shè)定閾值φ,若對于Ui,τi>φ,則刪除對應(yīng)的分層Ui,得到新的集合{U i,Ui+1,…,Uj}。

(3)通過仿真模擬預(yù)估出每層的耗時,劃分后的每層都有兩種調(diào)度策略:貪心調(diào)度和順序調(diào)度。根據(jù)預(yù)估結(jié)果選擇耗時較小的調(diào)度策略。預(yù)估每層的時間消耗時,將每層的輸入I、層的圖結(jié)構(gòu)G、調(diào)度策略S作為輸入?yún)?shù),該層的耗時T為在某種調(diào)度策略下完成整個層計算的時間。

(4)根據(jù)分層后的模擬預(yù)估數(shù)據(jù),選擇出兩層耗時之和最小的分層{Uk},將該分層結(jié)果{Uk}作為第一次分層的最優(yōu)結(jié)果。

(5)對于(4)得到的最優(yōu)分層[Uk,V-Uk]。將Uk和V-Uk分別賦值給V,重復(fù)(1)(2)(3)(4)。

(6)若分層之后的所有可能分層的耗時之和都大于未分層前耗時,即?Ui∈{Ui,Ui+1,…,Uj},cost(V-Ui)+cost(Ui)≥cost(V),則分層結(jié)束。

圖9是啟發(fā)式分層的流程示意圖,首先從第一個節(jié)點(diǎn)a開始廣度優(yōu)先遍歷,遍歷過程中需要保證圖的連續(xù)性,禁止跳躍節(jié)點(diǎn)。枚舉出所有可能的分層U∈{{a},{a,b},{a,c},…,{a,b,c}}。通過啟發(fā)式評價函數(shù)得到不同分層的指標(biāo){τ1,τ2,…,τm},通過τi>φ條件剔除評價較差的分層得到子集{τ2,τ3}。對子集中所有可能的分層結(jié)果,通過仿真模擬預(yù)估出每種情況下的調(diào)度耗時cost(U)和cost(V-U)。最后選擇耗時之和最小的分層,即完成第一輪分層。完成第一輪的最優(yōu)分層之后,分別對U和V-U重復(fù)上述過程。直到下一次所有可能的分層預(yù)估耗時之和都不小于未分層之前的耗時,此時結(jié)束整個分層優(yōu)化,詳細(xì)流程見算法1。

圖9 啟發(fā)式分層查找算法Fig.9 Heuristic hierarchical search algorithm

算法1啟發(fā)式分層查找算法

啟發(fā)式分層查找算法的主要計算量集中在尋找計算圖的所有可能分層上,本文進(jìn)一步分析評估啟發(fā)式查找算法的時間復(fù)雜度,以更直接地統(tǒng)計計算圖可能分層的數(shù)量。本文給出以下定義:計算圖的寬度w,即在圖中可以找到最多w個算子同時并行執(zhí)行;計算圖的長度h,即在圖中能夠找到最多h個算子必須串行執(zhí)行。

通過設(shè)置合適的啟發(fā)式評價函數(shù)的閾值,可以降低啟發(fā)式搜索算法的復(fù)雜度,假設(shè)通過啟發(fā)式函數(shù)剔除一半的可能分層,則算法的時間復(fù)雜度降低為O((N/w+1)w)。

為了更好地評估啟發(fā)式分層查找算法自動尋找計算圖分層調(diào)度優(yōu)化策略的執(zhí)行效率,本節(jié)分析了典型神經(jīng)網(wǎng)絡(luò)模型的時間復(fù)雜度和經(jīng)過啟發(fā)式算法優(yōu)化之后的時間復(fù)雜度,結(jié)果如表3所示。數(shù)據(jù)分析顯示啟發(fā)式分層查找算法可以大大降低搜索的復(fù)雜度。

表3 不同模型的時間復(fù)雜度Table 3 Time complexity of different models

2.4 計算圖分層自動流水優(yōu)化

計算圖分層調(diào)度策略可以有效地優(yōu)化算子的調(diào)度順序,減緩后端設(shè)備利用率的波動。深度學(xué)習(xí)編譯器中計算圖在經(jīng)過分層調(diào)度優(yōu)化之后,每層的計算量分布相對均衡,模型訓(xùn)練過程中后端設(shè)備的利用率趨于平穩(wěn),但是遠(yuǎn)遠(yuǎn)達(dá)不到100%。

為了進(jìn)一步提高編譯器后端設(shè)備的資源利用率,本文基于分層調(diào)度優(yōu)化提出了多級自動流水優(yōu)化策略。通過在層與層之間添加多個Result 數(shù)據(jù)緩存節(jié)點(diǎn),實現(xiàn)層與層間的流水計算,如圖10所示。首先在層與層中間添加兩個Result 節(jié)點(diǎn)Result0 和Result1。模型訓(xùn)練過程中,在T0階段,第一層讀取第一批次數(shù)據(jù)(Batch_0)進(jìn)行計算,并把計算好的結(jié)果傳遞給Result0 節(jié)點(diǎn);在T1 階段,第二層讀取Result0的數(shù)據(jù)進(jìn)行第二層的計算,同時第一層讀取第二批次輸入數(shù)據(jù)(Batch_1)進(jìn)行計算,并將計算結(jié)果傳遞給Result1,為下一階段的第二層計算提供輸入數(shù)據(jù);第二層只需交替從Result0 和Result1 節(jié)點(diǎn)讀取輸入數(shù)據(jù)。因此在計算圖劃分為兩層的情況下,從T1 階段開始,計算圖第一層和第二層即可實現(xiàn)層間流水計算,后端設(shè)備需要同時計算第一層和第二層,進(jìn)一步提高了硬件設(shè)備的資源利用率。

當(dāng)計算圖在經(jīng)過分層調(diào)度優(yōu)化之后被劃分的層數(shù)較多時,如果直接進(jìn)行流水并行,會帶來設(shè)備的超負(fù)載問題,如圖11 所示。計算圖被劃分為6 層,且每一層單獨(dú)運(yùn)行時設(shè)備的利用率分別為:0.5、0.4、0.3、0.4、0.5 和0.4,如圖11(a)所示,在沒有流水的情況下,各層依次執(zhí)行計算任務(wù),設(shè)備的利用率十分平穩(wěn)。當(dāng)6層的計算實現(xiàn)完全流水時,設(shè)備資源理論利用率理論上應(yīng)該達(dá)到250%,如圖11(b)所示。此時設(shè)備資源已經(jīng)不能滿足計算需求。

圖11 計算圖分層流水效果Fig.11 Pipeline result after layering of calculation graph

本文設(shè)計多級自動流水策略,通過重新劃分流水級解決設(shè)備的超負(fù)荷問題,如圖12 所示。首先將計算圖的分層劃分為多級流水,每一級流水包含計算圖的多個分層,其中流水級內(nèi)的分層串行執(zhí)行,每級流水中設(shè)備的利用率為該級流水所包含的分層在單獨(dú)計算時設(shè)備利用率的最大值。達(dá)到完全流水狀態(tài)時,設(shè)備性能為所有流水級的性能之和,沒有超過100%。

圖12 多層次合并分級流水效果Fig.12 Pipeline result after multi-layer merging and grading

本文基于Gpipe[25]微批次劃分的方法和多級流水策略,在編譯器中實現(xiàn)AI模型訓(xùn)練流水并行優(yōu)化,利用多級流水策略確定了流水級之后,設(shè)置合理的微批次劃分來構(gòu)建流水。

本文通過建立流水級長度和微批次數(shù)量之間的關(guān)系對Gpipe 中的微批次劃分方法進(jìn)行優(yōu)化,得到最優(yōu)的微批次劃分策略。當(dāng)計算圖的流水級較少時,流水建立過程耗時較短,如果劃分的微批次數(shù)量太多,則會導(dǎo)致劃分后的微批次(micro_batch)太小影響性能。當(dāng)計算圖的流水級較多時,如果微批次數(shù)量較小,則無法充滿整個流水線,因此需要劃分足夠的微批次數(shù)量來掩蓋流水建立的時間消耗。由于每次訓(xùn)練時總的批次大小是固定的,微批次數(shù)量越多,微批次數(shù)據(jù)就越少,設(shè)備的利用率就會變低。因此在微批次劃分時,在保證流水建立的情況下,要盡可能地增大微批次的大小,即選取滿足流水建立的最小的微批次數(shù)量。

假設(shè)流水建立時間占比為Ppipe(batch_num),設(shè)備利用率損耗為Dloss(batch_num),微批次數(shù)量為batch_num,則batch_num需要滿足式(7):

滿足式(7)的batch_num能夠使設(shè)備間的流水效果和設(shè)備的利用率達(dá)到一個均衡的狀態(tài),進(jìn)而整個系統(tǒng)的性能達(dá)到最優(yōu)狀態(tài)。假設(shè)總的處理批量大小為batch_size,設(shè)備最大處理批次為batch_device,流水線長度為pipe_num。流水線建立的時間占比為:

式(7)~(9)聯(lián)合計算得到batch_num,劃分后的微批次大小可以通過式(10)計算得到:

最后為了使計算得到的micro_batch為整數(shù),需要對每個micro_batch進(jìn)行±1微調(diào)。

本文通過微批次二分查找法得到batch_num的最優(yōu)解。batch_num的求解空間為大于1,小于batch_size的正整數(shù),即{1,2,…,batch_size-1,batch_size},通過算法2 在解空間查找得到最優(yōu)解batch_num。假設(shè)模型訓(xùn)練每次處理的總批量batch_size為256,GPU 處理的最大的batch_size為64,對于不同的模型計算得到最優(yōu)的微批次的劃分策略,如表4所示。

表4 不同模型的分層優(yōu)化和微批次劃分Table 4 Hierarchical optimization and micro-batch partitioning for different models

算法2微批次二分查找法

3 實驗

針對AI 模型訓(xùn)練應(yīng)用任務(wù)調(diào)度負(fù)載均衡,本文提出了三種計算圖負(fù)載均衡優(yōu)化方法,在深度學(xué)習(xí)網(wǎng)絡(luò)模型訓(xùn)練過程實驗中得到了有效的驗證。實驗環(huán)境采用AGX-2 GPU服務(wù)器,每臺服務(wù)器上配置了16塊TeslaV100板卡。其他硬件環(huán)境配置如表5所示。

表5 硬件環(huán)境配置Table 5 Hardware environment configuration

軟件環(huán)境方面,本文采用2.1 節(jié)介紹的自研深度學(xué)習(xí)編譯器Mofang進(jìn)行計算圖負(fù)載均衡優(yōu)化整體實驗及性能測試。

3.1 線程數(shù)對數(shù)據(jù)加載的影響

為了更直觀地對比數(shù)據(jù)加載與模型訓(xùn)練的負(fù)載均衡優(yōu)化對訓(xùn)練性能的影響,本節(jié)首先基于Image-Net2012 數(shù)據(jù)集測試了Resnet50 和Resnet18 模型訓(xùn)練時的數(shù)據(jù)加載、模型計算以及整體訓(xùn)練的性能,同時測試了開啟不同數(shù)量的數(shù)據(jù)加載線程對訓(xùn)練性能的影響。

圖13 顯示了數(shù)據(jù)加載線程數(shù)量對Resnet50 模型訓(xùn)練性能的影響,結(jié)果顯示數(shù)據(jù)加載模塊開啟線程數(shù)量的多少不僅影響模型訓(xùn)練的性能,還會影響CPU 的能耗。對于Resnet50 模型,模型計算操作運(yùn)行在GPU 上,性能穩(wěn)定且與數(shù)據(jù)加載線程數(shù)量無關(guān);對于數(shù)據(jù)加載和整體訓(xùn)練過程,當(dāng)線程數(shù)開啟到16之前,數(shù)據(jù)加載和模型整體訓(xùn)練性能隨著線程開啟數(shù)量的增加而線性增加,這是因為此時數(shù)據(jù)加載依然是整體訓(xùn)練的性能瓶頸,因此增加線程數(shù)提高數(shù)據(jù)加載速率能夠提升整體訓(xùn)練的性能;當(dāng)線程數(shù)開啟到16 時,數(shù)據(jù)加載的性能已經(jīng)足夠滿足模型計算的需求,繼續(xù)增加開啟的線程數(shù),整體訓(xùn)練性能不再提升,處于平穩(wěn)狀態(tài),造成了CPU資源浪費(fèi)。

圖13 Resnet50訓(xùn)練時線程數(shù)量對性能的影響Fig.13 Effect of the number of threads on performance of Resnet50 training

圖14 顯示了線程數(shù)量對Resnet18 模型訓(xùn)練性能的影響,由于模型參數(shù)量較小,模型計算性能較高,無論開啟多少線程數(shù)量,數(shù)據(jù)加載的性能都無法滿足模型計算的性能需求,同時可以看到當(dāng)數(shù)據(jù)加載開啟最大線程數(shù)量時,數(shù)據(jù)加載的性能會降低,這是因為開啟的線程數(shù)量過多,線程間存在資源競爭。此時本文啟發(fā)式查找算法自動尋找的最佳線程數(shù)量為48,既能保證數(shù)據(jù)加載的性能最好,又可以降低CPU的利用率。

圖14 Resnet18訓(xùn)練時線程數(shù)量對性能的影響Fig.14 Effect of the number of threads on performance of Resnet18 training

3.2 數(shù)據(jù)加載與模型訓(xùn)練負(fù)載均衡優(yōu)化

為了驗證數(shù)據(jù)加載與模型訓(xùn)練負(fù)載均衡優(yōu)化技術(shù)的可擴(kuò)展性,本文采用Resnet50網(wǎng)絡(luò)模型和ImageNet 2012訓(xùn)練數(shù)據(jù)集在多GPU板卡上進(jìn)行了分布式訓(xùn)練的驗證。本實驗分別測試了不同Batch_size 和不同GPU 板卡數(shù)量下數(shù)據(jù)加載與模型訓(xùn)練負(fù)載均衡優(yōu)化技術(shù)對模型分布式訓(xùn)練性能的影響。

圖15 對比了不同GPU 板卡數(shù)量下加入負(fù)載均衡優(yōu)化技術(shù)的Mofang 框架、TensorFlow 框架以及TensorFlow經(jīng)nGraph編譯器映射后(TF-ngraph)的分布式訓(xùn)練性能。結(jié)果顯示,隨著GPU 板卡數(shù)量的增加,三種框架中模型的分布式訓(xùn)練的性能均呈現(xiàn)線性增加的趨勢,而本文加入負(fù)載均衡優(yōu)化技術(shù)的Mofang 框架性能與TensorFlow 和TF-ngraph 框架相比,提升3%左右。

圖15 GPU數(shù)量對負(fù)載均衡優(yōu)化性能的影響Fig.15 Effect of the number of GPU on performance of load balancing optimization

圖16 對比了不同batch_size 對加入負(fù)載均衡優(yōu)化技術(shù)的Mofang 框架、TensorFlow 框架以及TFngraph 的分布式訓(xùn)練性能的影響。實驗結(jié)果表明在不同的batch_size下負(fù)載均衡優(yōu)化后的性能比另外兩種框架有2%到8%的提升,在batch_size=2 時性能的提升更加明顯,可以達(dá)到8%左右。這是由于batch_size較小,每次模型訓(xùn)練需要加載的數(shù)據(jù)量小,在CPU 可以開啟足夠的線程來處理數(shù)據(jù)加載模塊;而隨著batch_size 增大,數(shù)據(jù)加載模塊需要開啟的CPU 線程就越多,超出CPU負(fù)載時會存在一定的性能損耗。

圖16 Batch大小對負(fù)載均衡優(yōu)化性能的影響Fig.16 Effect of batch size on performance of load balancing optimization

3.3 計算圖分層調(diào)度優(yōu)化

本節(jié)基于TensorFlow+Mofang 框架對計算圖的各種調(diào)度進(jìn)行了實驗分析,計算圖經(jīng)過不同的調(diào)度優(yōu)化后在TeslaV100 GPU 上進(jìn)行調(diào)度執(zhí)行,不同的調(diào)度模式對應(yīng)算子不同的調(diào)度順序。首先在TensorFlow 中構(gòu)建計算圖,并人為增加算子調(diào)度依賴或者算子優(yōu)化,在確定算子的調(diào)度順序之后分別在GPU平臺上執(zhí)行優(yōu)化后的計算圖,并統(tǒng)計各個階段的耗時和資源占用。

圖17 展示了利用傳統(tǒng)貪心算法進(jìn)行計算圖算子調(diào)度時GPU 的資源利用率測試結(jié)果。數(shù)據(jù)顯示,第一階段由于同時調(diào)度三個算子Conv(a)、Conv(b)、Conv(d),此時GPU 板卡的資源競爭劇烈,GPU 的資源利用率達(dá)到95%,第二階段只調(diào)度Conv(c)算子,GPU 的利用率只有20%左右,第一階段和第二階段的任務(wù)負(fù)載存在嚴(yán)重失衡的現(xiàn)象。圖18展示了經(jīng)過算子合并優(yōu)化后GPU 的資源利用率測試結(jié)果,數(shù)據(jù)顯示,第一階段需要執(zhí)行合并后的(abd)算子,雖然只有一個算子,但該算子計算量并未減小,由于算子合并后內(nèi)核啟動次數(shù)減少GPU 利用率降為90%左右,第二階段同樣調(diào)度Conv(c)算子,資源利用率同樣為20%。綜上,算子合并優(yōu)化技術(shù)沒有解決GPU 資源負(fù)載均衡問題。

圖17 貪心算法實現(xiàn)算子調(diào)度時的資源占用分析Fig.17 Analysis of resource occupancy when greedy algorithm implements operator scheduling

圖18 算子合并優(yōu)化后資源占用分析Fig.18 Analysis of resource occupancy after operator merging optimization

圖19 展示了經(jīng)過計算圖分層調(diào)度優(yōu)化后,各層的資源利用率和執(zhí)行時間。由于第一層的算子數(shù)量由原來的三個算子Conv(a)、Conv(b)、Conv(d)減少為一個合并算子Conv(ad),GPU 的利用率由90%降為70%,執(zhí)行時間由0.2 ms 降為0.16 ms。第二層由調(diào)度一個算子Conv(c)變成同時并行調(diào)度兩個算子Conv(c)和Conv(b),GPU 利用率由20%升為50%,執(zhí)行時間由0.16 ms 上升為0.18 ms。但是整個計算圖的執(zhí)行時間由0.36 ms 減小為0.34 ms。因此經(jīng)過圖分層優(yōu)化之后的算子調(diào)度更加均衡,GPU 的資源利用率在各階段也更加平穩(wěn),同時進(jìn)一步提高了計算性能。

圖19 計算圖分層調(diào)度優(yōu)化后的資源利用率Fig.19 Resource utilization after optimization of hierarchical scheduling of computational graphs

3.4 計算圖分層自動流水優(yōu)化

本節(jié)基于Gpipe 微批次劃分流水算法與本文的分層自動流水算法進(jìn)行對比測試。圖20 為Gpipe 流水示意圖,此時微批次劃分?jǐn)?shù)目為4,流水級為5。從圖中可以看出,整個流水計算過程中由于流水級劃分過多導(dǎo)致流水建立時間較長,設(shè)備空閑等待的時間占比超過了50%,大部分時間GPU 都處在空閑的狀態(tài),帶來了資源的浪費(fèi)。

圖20 微批次數(shù)目為4,5級流水的Gpipe流水效果Fig.20 Gpipe pipeline results with the number of microbatches of 4 and 5-level flow

圖21 展示了經(jīng)過分層多級自動流水優(yōu)化和微批次數(shù)目劃分優(yōu)化之后的流水效果。相比Gpipe,流水級由5 級合并為3 級,微批次劃分的數(shù)量由4 增大為通過微批次劃分查找算法自動查找得到的6,從圖中可以看出流水過程中設(shè)備空閑的時間占比由原來的高于50%降低為25%左右。

為了更好地評估本文中的三種優(yōu)化技術(shù)對不同模型訓(xùn)練性能的影響,本節(jié)選取兩種不同類型的深度學(xué)習(xí)網(wǎng)絡(luò)模型進(jìn)行實驗驗證和性能對比:一種是并行分支較少的網(wǎng)絡(luò)模型,比如Resnet50;第二種是并行分支較多的模型,比如InceptionV3、NasNet、ResNeXt 等。本文分別在上述兩種不同類型的模型中進(jìn)行了數(shù)據(jù)加載與模型訓(xùn)練負(fù)載均衡優(yōu)化、計算圖分層調(diào)度優(yōu)化和計算圖分層自動流水優(yōu)化,并與TensorFlow、TensorFlow-XLA、TensorFlow-ngraph 等未進(jìn)行相關(guān)優(yōu)化的深度學(xué)習(xí)框架或編譯器進(jìn)行性能對比。

圖22 展示了歸一化后四種模型經(jīng)過數(shù)據(jù)加載與模型訓(xùn)練負(fù)載均衡優(yōu)化、計算圖分層調(diào)度優(yōu)化和分層自動流水優(yōu)化后的性能。實驗結(jié)果表明兩種不同種類的深度學(xué)習(xí)網(wǎng)絡(luò)模型在經(jīng)過本文提出的三種優(yōu)化之后模型訓(xùn)練的性能均有所提升,由于不同類型的模型中并行分支數(shù)量不一樣,性能的加速比也有所不同。對于Resnet50模型,由于該網(wǎng)絡(luò)模型具有較少的并行分支,分層優(yōu)化和自動流水方法取得的性能提升只有2%左右;對于InceptionV3這種具有較多分支并行的模型,單獨(dú)的分層優(yōu)化方法就可以達(dá)到5%以上的性能提升,將分層優(yōu)化和自動流水兩種優(yōu)化方法結(jié)合使用時,相比其他網(wǎng)絡(luò)模型訓(xùn)練框架性能提升達(dá)到10%左右。最終,本文將三種優(yōu)化技術(shù)在Mofang 中同時使用,相比TensorFlow 深度學(xué)習(xí)框架,Mofang可以提升5%~15%的訓(xùn)練性能。

3.5 資源利用率

為了更好地驗證本文提出的計算圖分層調(diào)度優(yōu)化方法可以實現(xiàn)計算圖算子間的均衡調(diào)度,提高設(shè)備資源的利用率,本實驗在InceptionV3 網(wǎng)絡(luò)模型訓(xùn)練期間使用自研工具Gsee 實時獲取GPU 板卡的資源利用率數(shù)據(jù)。

圖23 統(tǒng)計了InceptionV3 網(wǎng)絡(luò)模型訓(xùn)練過程中分層優(yōu)化前后的GPU 板卡利用率。從實驗結(jié)果可以看出未經(jīng)過分層優(yōu)化前,GPU 的板卡資源利用率波動較大,最大值可以達(dá)到95%,最小值為20%,存在嚴(yán)重的資源利用率不均衡問題。經(jīng)過計算圖分層調(diào)度優(yōu)化后,每個階段的算子的調(diào)度相對均衡,GPU板卡的資源利用率穩(wěn)定在50%~60%,在經(jīng)過多層分級流水優(yōu)化之后GPU 板卡的設(shè)備利用率均達(dá)到90%以上。

圖23 InceptionV3訓(xùn)練過程中GPU板卡利用率對比Fig.23 Comparison of GPU utilization during InceptionV3 training

3.6 系統(tǒng)能耗分析

本節(jié)實驗使用系統(tǒng)采樣的方法統(tǒng)計整個訓(xùn)練過程中CPU 和GPU 板卡的實時能耗,以進(jìn)一步分析本文設(shè)計的優(yōu)化方法對系統(tǒng)整體能耗的影響。

對于CPU 處理器,其開啟的線程數(shù)和能耗基本成正比關(guān)系,線程數(shù)越少,CPU 處理的任務(wù)就相應(yīng)較少,處理器能耗越低。數(shù)據(jù)加載和模型訓(xùn)練負(fù)載均衡優(yōu)化通過開啟滿足模型訓(xùn)練需求的最少的線程數(shù),來盡可能地節(jié)省CPU 的資源占用,達(dá)到了降低CPU處理器能耗的目的。

對于GPU 板卡,本文采用系統(tǒng)采樣的方式統(tǒng)計其設(shè)備能耗。在模型的訓(xùn)練過程中,每隔1 ms 設(shè)置一個采樣點(diǎn),每次采樣時讀取GPU 當(dāng)前的能耗。由于不同優(yōu)化方法,模型訓(xùn)練完成的時間不同,為了實現(xiàn)準(zhǔn)確的數(shù)據(jù)對比,本文統(tǒng)計完成一個epoch 訓(xùn)練時的GPU 設(shè)備能耗。選用InceptionV3 網(wǎng)絡(luò)模型進(jìn)行能耗統(tǒng)計實驗,訓(xùn)練周期為1 個epoch。經(jīng)過數(shù)據(jù)加載和模型訓(xùn)練自動負(fù)載均衡優(yōu)化,CPU 的線程數(shù)由64降低為48,能耗降比達(dá)到25%。

圖24 統(tǒng)計了在不同的優(yōu)化條件下InceptionV3模型訓(xùn)練1 個epoch 時GPU 板卡的能耗變化以及訓(xùn)練1 個epoch 的時間消耗。結(jié)果顯示,采用計算圖分層和流水并行優(yōu)化后,訓(xùn)練1 個epoch 的時間由30 s降低為20 s左右,提高了整體訓(xùn)練的性能。

圖24 InceptionV3訓(xùn)練時GPU板卡能耗變化Fig.24 GPU power consumption changes during InceptionV3 training

本文通過能耗曲線和橫坐標(biāo)圍成的面積來計算GPU 的整體能耗。通過數(shù)學(xué)計算可得,未優(yōu)化時GPU 板卡的能耗為4 138 W,經(jīng)過分層優(yōu)化之后能耗降低為3 521 W,再經(jīng)過分層自動流水優(yōu)化之后能耗降低為3 512 W。實驗結(jié)果表明,本文的分層優(yōu)化算法能有效降低GPU 板卡的整體的能耗,降比達(dá)到15%左右。因此本文的計算圖負(fù)載均衡優(yōu)化策略能夠在提高硬件設(shè)備資源利用率的同時,優(yōu)化模型訓(xùn)練過程中系統(tǒng)整體能耗。

4 結(jié)束語

深度學(xué)編譯器能夠?qū)崿F(xiàn)前端深度學(xué)習(xí)框架與后端AI 硬件設(shè)備之間的解耦化映射,目前深度學(xué)習(xí)編譯器優(yōu)化技術(shù)已經(jīng)成為深度學(xué)習(xí)領(lǐng)域十分重要的分支。本文針對深度學(xué)習(xí)編譯器中前端計算圖的負(fù)載均衡問題提出了三種優(yōu)化技術(shù),分別是數(shù)據(jù)加載與模型訓(xùn)練的負(fù)載均衡、計算圖的分層調(diào)度優(yōu)化和計算圖分層自動流水優(yōu)化。實驗結(jié)果表明經(jīng)過上述優(yōu)化之后,AI模型訓(xùn)練性能與其他框架相比獲得2%到10%的提升,同時還可以通過負(fù)載均衡技術(shù)提高硬件設(shè)備的資源利用率,降低系統(tǒng)整體能耗,促使性能和能耗達(dá)到一個相對平衡的狀態(tài)。

目前本文在計算圖的并行調(diào)度優(yōu)化和能耗優(yōu)化方面做了一些探索性的工作,現(xiàn)階段本文的優(yōu)化前端支持TensorFlow 深度學(xué)習(xí)框架以及編譯時自定義前端,后端支持CPU、GPU、FPGA 等硬件設(shè)備,后續(xù)將繼續(xù)優(yōu)化本文的技術(shù)方案,支持更多的前端深度學(xué)習(xí)框架和后端加速設(shè)備。此外,如何自動尋找計算圖在多種后端設(shè)備上更優(yōu)的聯(lián)合布局以及如何通過負(fù)載均衡技術(shù)進(jìn)一步降低整個系統(tǒng)訓(xùn)練過程中的能耗,也是未來主要的一個工作方向。

猜你喜歡
編譯器線程流水
流水
基于相異編譯器的安全計算機(jī)平臺交叉編譯環(huán)境設(shè)計
流水有心
淺談linux多線程協(xié)作
前身寄予流水,幾世修到蓮花?
通用NC代碼編譯器的設(shè)計與實現(xiàn)
落紅只逐東流水
基于上下文定界的Fork/Join并行性的并發(fā)程序可達(dá)性分析*
Linux線程實現(xiàn)技術(shù)研究
編譯器無關(guān)性編碼在微控制器中的優(yōu)勢
甘孜| 抚顺市| 金阳县| 双流县| 大余县| 北票市| 阳江市| 海晏县| 海城市| 太湖县| 石城县| 宁陵县| 紫阳县| 南木林县| 怀来县| 赣榆县| 郎溪县| 浮梁县| 铜陵市| 虹口区| 定州市| 甘谷县| 丹江口市| 嘉定区| 萨迦县| 临朐县| 大邑县| 友谊县| 肇源县| 安化县| 凤山市| 武冈市| 屏边| 龙川县| 河北区| 苍山县| 沙坪坝区| 中西区| 马公市| 延长县| 隆回县|