趙嘉豪,周 贛,黃 莉,陸春艷,陶曉峰,馮燕鈞
(1. 東南大學(xué) 電氣工程學(xué)院,江蘇 南京 210096;2. 南瑞集團(tuán)有限公司(國(guó)網(wǎng)電力科學(xué)研究院有限公司),江蘇 南京 211106)
在智能電網(wǎng)時(shí)代,隨著智能電表的廣泛使用和各類傳感器的普及,電力用戶側(cè)的數(shù)據(jù)呈指數(shù)級(jí)增長(zhǎng)。由于數(shù)據(jù)驅(qū)動(dòng)的計(jì)算業(yè)務(wù)的快速擴(kuò)展,現(xiàn)有用電信息采集系統(tǒng)在統(tǒng)計(jì)實(shí)時(shí)性和分析智能化方面面臨著巨大挑戰(zhàn),如何高效處理和充分挖掘海量用電數(shù)據(jù)已成為一個(gè)亟需解決的問(wèn)題。電力負(fù)荷預(yù)測(cè)是用電數(shù)據(jù)挖掘分析的重要業(yè)務(wù)場(chǎng)景之一,影響到電力系統(tǒng)發(fā)電與用電量之間的平衡。精確、高效的負(fù)荷預(yù)測(cè)結(jié)果有利于提高電網(wǎng)調(diào)度水平和安全穩(wěn)定運(yùn)行狀況[1]。
電力負(fù)荷預(yù)測(cè)主要包括2 個(gè)環(huán)節(jié):用電數(shù)據(jù)的獲取及預(yù)處理,計(jì)算模型的訓(xùn)練及結(jié)果預(yù)測(cè)。通常,數(shù)據(jù)獲取方案都是在中央處理器(CPU)支撐的關(guān)系型數(shù)據(jù)庫(kù)上執(zhí)行的。在面對(duì)數(shù)據(jù)規(guī)模較大的查詢、計(jì)算時(shí),傳統(tǒng)的數(shù)據(jù)庫(kù)(如Oracle),受限于硬件成本與CPU 計(jì)算能力,常以較長(zhǎng)的響應(yīng)時(shí)間為代價(jià)換取較高的吞吐量,通常在數(shù)據(jù)的獲取和預(yù)處理方面耗時(shí)較長(zhǎng)。另一方面,負(fù)荷預(yù)測(cè)是人工智能技術(shù)在電力系統(tǒng)應(yīng)用最廣泛、深入的應(yīng)用。眾多學(xué)者對(duì)采用人工智能模型預(yù)測(cè)電力負(fù)荷展開(kāi)了大量研究,主要方法有神經(jīng)網(wǎng)絡(luò)[2]、支持向量機(jī)[3]和集成學(xué)習(xí)[4]等。其中,以XGBoost 為代表的集成學(xué)習(xí)方法,在負(fù)荷預(yù)測(cè)中取得了良好的效果。文獻(xiàn)[5]對(duì)比分析了隨機(jī)森林(RF)、貝葉斯和K最近鄰(KNN)等模型,證明XGBoost在電力負(fù)荷預(yù)測(cè)方面具有優(yōu)越性。文獻(xiàn)[6-8]將XGBoost 與模型融合技術(shù)相結(jié)合,采用組合預(yù)測(cè)的方式提高了預(yù)測(cè)精度。然而隨著負(fù)荷數(shù)據(jù)和模型規(guī)模的增長(zhǎng),算法復(fù)雜程度也逐漸提升,基于人工智能方法的預(yù)測(cè)模型的訓(xùn)練過(guò)程變得極為耗時(shí),執(zhí)行效率同樣受限于CPU 的計(jì)算資源。雖然傳統(tǒng)的負(fù)荷預(yù)測(cè)應(yīng)用大部分集中于批量數(shù)據(jù)的離線訓(xùn)練和隨后的在線預(yù)測(cè),但是單純的批處理學(xué)習(xí)方法無(wú)法實(shí)時(shí)整合規(guī)模日益增長(zhǎng)的用電信息,也不能在短期負(fù)荷預(yù)測(cè)問(wèn)題中及時(shí)進(jìn)行新樣本的增量訓(xùn)練[9]。因此,為了滿足用電大數(shù)據(jù)分析的要求,除了增加分布式并行機(jī)的節(jié)點(diǎn)數(shù)量,一種更高效的解決方案是使用計(jì)算能力更強(qiáng)的新型硬件和執(zhí)行性能更高的計(jì)算框架,以提高整體預(yù)測(cè)方案的執(zhí)行效率。
近年來(lái),圖形處理器(GPU)由于其在浮點(diǎn)計(jì)算速度和存儲(chǔ)帶寬方面的優(yōu)勢(shì),已被成功應(yīng)用于許多科學(xué)計(jì)算領(lǐng)域[10-12]。在數(shù)據(jù)庫(kù)計(jì)算上,有學(xué)者設(shè)計(jì)了GPU 數(shù)據(jù)庫(kù)來(lái)加速數(shù)據(jù)的查詢和計(jì)算[13-15]。在人工智能相關(guān)模型的訓(xùn)練上,主流神經(jīng)網(wǎng)絡(luò)框架如Tensorflow、Pytorch都支持GPU為其底層數(shù)學(xué)運(yùn)算進(jìn)行模型加速。但是之前學(xué)者在基于人工智能方法進(jìn)行負(fù)荷預(yù)測(cè)的工作中,通常只使用GPU 加速模型的訓(xùn)練過(guò)程,并未應(yīng)用在數(shù)據(jù)集的獲取和處理上。而負(fù)荷計(jì)算不僅支撐了負(fù)荷預(yù)測(cè)應(yīng)用的開(kāi)展,也是用電信息采集系統(tǒng)日常運(yùn)營(yíng)維護(hù)的基本內(nèi)容。由于更新頻率較高,其計(jì)算效率的提高十分重要。
基于以上問(wèn)題,本文提出并實(shí)現(xiàn)了一種基于中央處理器-圖形處理器(CPU-GPU)異構(gòu)計(jì)算框架下全流程加速的高性能用電負(fù)荷預(yù)測(cè)方法,其充分利用CPU-GPU 異構(gòu)體系的計(jì)算資源,并行化加速了用電負(fù)荷數(shù)據(jù)的預(yù)處理和預(yù)測(cè)模型的訓(xùn)練。本文首先將用電數(shù)據(jù)的計(jì)算從數(shù)據(jù)庫(kù)轉(zhuǎn)移到GPU 設(shè)備上進(jìn)行并行化處理,并提出結(jié)合OpenMP 多線程技術(shù)實(shí)現(xiàn)在多臺(tái)GPU 上同時(shí)完成多個(gè)并行計(jì)算任務(wù)。然后,對(duì)多個(gè)臺(tái)區(qū)負(fù)荷數(shù)據(jù)統(tǒng)一建模預(yù)測(cè),在進(jìn)行K均值(K-means)聚類分析后利用GPU 加速XGBoost 模型的訓(xùn)練計(jì)算,從而預(yù)測(cè)臺(tái)區(qū)未來(lái)的日負(fù)荷數(shù)據(jù)。最后,實(shí)際算例結(jié)果表明,結(jié)合多線程技術(shù)的基于GPU實(shí)現(xiàn)的并行計(jì)算方案具有高效的計(jì)算效率和良好的擴(kuò)展性,基于K-means-XGBoost的臺(tái)區(qū)負(fù)荷預(yù)測(cè)模型在高效執(zhí)行的同時(shí)也保證了預(yù)測(cè)準(zhǔn)確性,CPUGPU異構(gòu)計(jì)算框架滿足了海量用電數(shù)據(jù)實(shí)時(shí)統(tǒng)計(jì)和充分挖掘的要求。
CPU-GPU 異構(gòu)計(jì)算框架一般由1 臺(tái)CPU 和a臺(tái)GPU 組成,CPU 和GPU 之間通過(guò)PCI-Express 總線進(jìn)行通信和數(shù)據(jù)傳輸,如圖1 所示。1 臺(tái)GPU 包含c臺(tái)流式多處理器SM(Streaming Multiprocessor),每臺(tái)SM 上有著成百上千的流處理器SP(Streaming Processor)資源,即計(jì)算核心單元,因此GPU可以提供比多核CPU 更高的并行度和更強(qiáng)的浮點(diǎn)計(jì)算能力。SM 采用單指令多線程SIMT(Single Instruction Multiple Thread)方式來(lái)管理其中的線程,GPU可以通過(guò)調(diào)度更多的SM 和數(shù)量眾多的線程實(shí)現(xiàn)更細(xì)粒度的數(shù)據(jù)級(jí)并行。
圖1 CPU-GPU異構(gòu)計(jì)算框架和CUDA編程模型Fig.1 CPU-GPU heterogeneous computing framework and CUDA programming model
NVIDIA 公司于2007 年推出了GPU 的統(tǒng)一計(jì)算架構(gòu)(CUDA)模型[16],使原本負(fù)責(zé)圖形處理的GPU也可進(jìn)行通用的科學(xué)計(jì)算。CUDA模型為CPU-GPU異構(gòu)計(jì)算框架的實(shí)現(xiàn)提供了支持。其中,CPU 作為主機(jī)端(Host)運(yùn)行,而GPU 作為設(shè)備端(Device)配合CPU 協(xié)同處理。CPU 程序調(diào)用GPU 上運(yùn)行的CUDA內(nèi)核函數(shù)(Kernel)時(shí),每個(gè)內(nèi)核函數(shù)占用SM 上的1 個(gè)線程網(wǎng)格(Grid),每個(gè)線程網(wǎng)格包含b個(gè)線程塊(block),每個(gè)線程塊以32 個(gè)線程(thread)為1 組的線程束(warp)形式進(jìn)行調(diào)度,線程束總數(shù)為d。通過(guò)設(shè)定內(nèi)核函數(shù)啟用的線程塊數(shù)量和每個(gè)線程塊中的線程數(shù)量,可以使得每個(gè)線程對(duì)不同數(shù)據(jù)并行執(zhí)行相同的計(jì)算命令。同時(shí),為了更好地利用GPU 的內(nèi)存帶寬優(yōu)勢(shì),可以通過(guò)“合并訪存”的高效機(jī)制來(lái)掩蓋線程的訪存延遲,其實(shí)現(xiàn)的要求是同步執(zhí)行的線程束中每個(gè)線程的讀取和存儲(chǔ)地址必須連續(xù)。
在用電信息采集系統(tǒng)中,用電數(shù)據(jù)存儲(chǔ)于Oracle等關(guān)系型數(shù)據(jù)庫(kù)中。由于用電信息采集系統(tǒng)數(shù)據(jù)量日益增大,一直以來(lái)基于數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程的用電采集統(tǒng)計(jì)計(jì)算工作的耗時(shí)也與日俱增。本文提出將計(jì)算任務(wù)轉(zhuǎn)移到GPU 設(shè)備上,以GPU 并行計(jì)算的方法來(lái)改進(jìn)原有串行的數(shù)據(jù)庫(kù)計(jì)算方案。
在數(shù)據(jù)交互方式的設(shè)計(jì)上,通過(guò)Oracle 調(diào)用接口OCI(Oracle Call Interface)實(shí)現(xiàn)負(fù)荷數(shù)據(jù)的接收和計(jì)算結(jié)果的回傳。OCI 是Oracle 數(shù)據(jù)庫(kù)最底層的原生接口,其將結(jié)構(gòu)化查詢語(yǔ)言(SQL)和高級(jí)編程語(yǔ)言相結(jié)合,性能上具有高度的開(kāi)發(fā)靈活性、較高的執(zhí)行效率和強(qiáng)健的安全性。本文采用短鏈接的方式為每條數(shù)據(jù)庫(kù)執(zhí)行指令都進(jìn)行一次數(shù)據(jù)庫(kù)連接與端口操作。另外,考慮到數(shù)據(jù)交互的通用性及易維護(hù)性,選擇了可擴(kuò)展標(biāo)記語(yǔ)言(XML)文件作為存儲(chǔ)表格信息的載體,實(shí)現(xiàn)數(shù)據(jù)內(nèi)容和流程管理的分離。
由于用電信息采集系統(tǒng)具有通信延遲性,采集到的用戶數(shù)據(jù)通常是混亂的。用電數(shù)據(jù)的計(jì)算業(yè)務(wù)往往圍繞多張表格進(jìn)行數(shù)據(jù)查找、匹配。遍歷排序是一種邏輯性強(qiáng)的操作,而海量數(shù)據(jù)的移動(dòng)又是內(nèi)存綁定的操作??紤]到CPU 擅長(zhǎng)處理復(fù)雜邏輯運(yùn)算,GPU擅長(zhǎng)處理計(jì)算密集型的任務(wù),本文先在CPU端進(jìn)行數(shù)據(jù)重排序預(yù)處理,然后交由GPU 完成相應(yīng)的數(shù)值計(jì)算。選取用戶ID 作為數(shù)據(jù)記錄的區(qū)分標(biāo)識(shí),在CPU 上將原始數(shù)據(jù)按照用戶ID 大小順序排列得到一個(gè)排序向量P,排序結(jié)果和原始數(shù)據(jù)一起從CPU 內(nèi)存拷貝到GPU 內(nèi)存,然后在GPU 上執(zhí)行原始數(shù)據(jù)實(shí)際排序的內(nèi)存操作。GPU上內(nèi)核函數(shù)執(zhí)行重排序任務(wù)的原理是賦值操作,即以1個(gè)線程執(zhí)行1條記錄的數(shù)據(jù)賦值,將1 片內(nèi)存中的數(shù)據(jù)按照向量P重新寫(xiě)入另一塊內(nèi)存中,完成表格的重新構(gòu)建。由于表格是按列讀取的,連續(xù)的線程負(fù)責(zé)連續(xù)的數(shù)據(jù),寫(xiě)入內(nèi)存是合并訪存的。
考慮到采集數(shù)據(jù)的缺失,表格的重排序操作并不意味著可以直接進(jìn)行數(shù)據(jù)匹配,而為后續(xù)的表格掃描和建立映射提供了方便。以日負(fù)荷量計(jì)算為例進(jìn)行計(jì)算說(shuō)明,日負(fù)荷計(jì)算取電能表2 天的底碼相減乘以綜合倍率,底碼包括正(反)向有(無(wú))功功率的尖峰平谷示值。假設(shè)電能表采集數(shù)據(jù)來(lái)自測(cè)量點(diǎn)數(shù)據(jù)表A和日凍結(jié)電能表B,表A中的每條記錄最多對(duì)應(yīng)表B 中的2 條記錄。本文采用并行掃描的方式建立表A 和表B之間的映射關(guān)系,通過(guò)二分法尋找2個(gè)表中ID 相同的記錄,并將其數(shù)據(jù)位置存儲(chǔ)在1 個(gè)映射索引Map中。附錄A圖A1中的算法1解釋了在GPU上實(shí)現(xiàn)并行掃描生成映射索引的計(jì)算原理。
通過(guò)并行掃描完成數(shù)據(jù)匹配之后,進(jìn)一步根據(jù)映射索引對(duì)負(fù)荷數(shù)據(jù)進(jìn)行數(shù)值計(jì)算,內(nèi)核函數(shù)的設(shè)計(jì)方式如附錄A 圖A1 中的算法2 所示。在確定當(dāng)前ID 存在2 條數(shù)據(jù)記錄后,啟動(dòng)1 個(gè)線程根據(jù)映射索引獲取兩日的負(fù)荷數(shù)據(jù)和綜合倍率,完成1 個(gè)ID對(duì)應(yīng)的負(fù)荷數(shù)據(jù)計(jì)算。由于硬件限制,GPU 可調(diào)用的實(shí)際線程數(shù)量遠(yuǎn)小于需要處理的數(shù)據(jù)量,這里需要更新線程索引進(jìn)行迭代計(jì)算。
為了解決更大規(guī)模數(shù)據(jù)的并行計(jì)算,本文通過(guò)OpenMP 多線程技術(shù)設(shè)計(jì)了多臺(tái)GPU 完成多個(gè)并行計(jì)算任務(wù)的調(diào)度機(jī)制。OpenMP 是用于共享內(nèi)存并行系統(tǒng)的多處理器程序設(shè)計(jì)的一套指導(dǎo)性編譯處理方案,提供了對(duì)并行算法的高層抽象描述。OpenMP采用fork-join 的執(zhí)行模式,開(kāi)始時(shí)只存在一個(gè)主線程,當(dāng)需要進(jìn)行并行計(jì)算時(shí),派生出若干個(gè)分支線程來(lái)執(zhí)行并行任務(wù),當(dāng)并行代碼執(zhí)行完成后,分支線程匯合,并把控制流程交給單獨(dú)的主線程。在本文的異構(gòu)計(jì)算方案中,CPU 主線程先根據(jù)計(jì)算業(yè)務(wù)合理劃分?jǐn)?shù)據(jù),然后開(kāi)啟OpenMP 多線程并設(shè)定與GPU設(shè)備數(shù)量相等的CPU 線程,CPU 的線程編號(hào)和GPU的設(shè)備編號(hào)進(jìn)行綁定。此時(shí),相應(yīng)計(jì)算業(yè)務(wù)的數(shù)據(jù)流通過(guò)CPU 線程控制傳輸?shù)浇壎ǖ腉PU 內(nèi)存中,實(shí)現(xiàn)計(jì)算數(shù)據(jù)的獨(dú)立;CPU的1個(gè)線程負(fù)責(zé)1個(gè)業(yè)務(wù)的GPU 計(jì)算流程,實(shí)現(xiàn)計(jì)算流程的獨(dú)立。這樣就實(shí)現(xiàn)了CPU 多線程控制多個(gè)GPU 同時(shí)開(kāi)展并行計(jì)算任務(wù)。在所有獨(dú)立計(jì)算業(yè)務(wù)完成后,不同GPU 設(shè)備上的計(jì)算結(jié)果進(jìn)行拼接匯總,回傳到CPU 端,最后通過(guò)OCI寫(xiě)入數(shù)據(jù)庫(kù)。
多線程多GPU 并行計(jì)算框架同樣適用于單一計(jì)算業(yè)務(wù)的執(zhí)行。當(dāng)單一計(jì)算業(yè)務(wù)的數(shù)據(jù)量過(guò)大而超過(guò)GPU 單卡內(nèi)存時(shí),可將業(yè)務(wù)數(shù)據(jù)分拆到多臺(tái)GPU 設(shè)備上進(jìn)行計(jì)算,最后將各個(gè)計(jì)算結(jié)果進(jìn)行拼接得到總體的計(jì)算結(jié)果。
基于GPU 的并行計(jì)算加速了用電數(shù)據(jù)的獲取,縮短了用電信息的處理時(shí)間。利用計(jì)算結(jié)果中的負(fù)荷數(shù)據(jù)可以進(jìn)一步開(kāi)發(fā)臺(tái)區(qū)負(fù)荷預(yù)測(cè)應(yīng)用。不同于神經(jīng)網(wǎng)絡(luò)算法,XGBoost 是一種通過(guò)多個(gè)分類回歸樹(shù)(CART)的迭代計(jì)算擬合殘差的集成學(xué)習(xí)算法[17],在眾多回歸預(yù)測(cè)問(wèn)題上表現(xiàn)出較好的效果。由于XGBoost 具有良好的可擴(kuò)展性和并行性,能夠有效解決大數(shù)據(jù)的快速處理問(wèn)題,針對(duì)大數(shù)據(jù)環(huán)境下的電力負(fù)荷預(yù)測(cè)具有較好的應(yīng)用前景。
XGBoost 是優(yōu)化后的樹(shù)集成模型,通過(guò)對(duì)梯度提升樹(shù)(GBDT)的改進(jìn)力爭(zhēng)將速度和效率發(fā)揮到極致。XGBoost 從數(shù)學(xué)角度可建立一個(gè)泛函優(yōu)化問(wèn)題,如式(1)所示,對(duì)n個(gè)樣本建立Kt棵樹(shù)的目標(biāo)函數(shù)L(Φ)分為損失函數(shù)和正則化項(xiàng)2 個(gè)部分。損失函數(shù)項(xiàng)l(y?i-yi)表示訓(xùn)練誤差,即樣本i的預(yù)測(cè)值y?i和真實(shí)值yi的差距,鼓勵(lì)模型盡量擬合訓(xùn)練數(shù)據(jù);正則化項(xiàng)Ω(fk)表達(dá)式如式(2)所示,表示模型fk復(fù)雜程度越低,泛化能力越強(qiáng)。
式(8)中等號(hào)右側(cè)第1、2 項(xiàng)分別表示左、右子樹(shù)分裂后產(chǎn)生的增益;第3 項(xiàng)為不進(jìn)行子樹(shù)分裂的增益,最后一項(xiàng)為對(duì)引入新葉子的懲罰項(xiàng),對(duì)樹(shù)進(jìn)行了剪枝。
為了提高計(jì)算效率,XGBoost 可以在GPU 上實(shí)現(xiàn)決策樹(shù)的生成,從而加速訓(xùn)練過(guò)程。如附錄B 算法所示,針對(duì)葉子節(jié)點(diǎn)的分裂方式,GPU先并行計(jì)算得到特征的梯度直方圖,然后對(duì)直方圖進(jìn)行并行掃描,通過(guò)并行前綴和操作來(lái)計(jì)算每個(gè)特征和每個(gè)分位數(shù)的分割增益,從而獲得最佳分裂點(diǎn)[18-19]。值得注意的是,單棵樹(shù)的生成仍然是具有時(shí)序依賴性的。但是,在每次迭代中需要計(jì)算每個(gè)訓(xùn)練樣本對(duì)于目標(biāo)函數(shù)的一階和二階梯度,而GPU 在浮點(diǎn)計(jì)算速度和內(nèi)存帶寬方面具有巨大優(yōu)勢(shì),在這些指標(biāo)的計(jì)算上也表現(xiàn)出更高的效率。
在訓(xùn)練模型前,合理的特征工程對(duì)于預(yù)測(cè)效果的提升至關(guān)重要。區(qū)域用電情況往往按照劃分的臺(tái)區(qū)進(jìn)行采集。傳統(tǒng)的統(tǒng)計(jì)方法只能對(duì)單一臺(tái)區(qū)單獨(dú)建模分析,無(wú)法解決區(qū)域性的用電負(fù)荷預(yù)測(cè)問(wèn)題。考慮區(qū)域內(nèi)多臺(tái)區(qū)用電情況的多樣性,首先通過(guò)K-means 聚類算法進(jìn)行臺(tái)區(qū)聚類分析,然后采用XGBoost 模型對(duì)區(qū)域內(nèi)多個(gè)臺(tái)區(qū)的日負(fù)荷情況進(jìn)行統(tǒng)一建模預(yù)測(cè)。K-means 聚類算法根據(jù)距離相似性將樣本集x聚類成K個(gè)簇Ci(i=1,2,…,K),Ci的均值向量μi為該簇的聚類中心,迭代過(guò)程中每分配一個(gè)樣本會(huì)重新計(jì)算當(dāng)前聚類中心,直至聚類中心不再變化,即誤差平方和E最小。
本文選取附錄C 表C1 所示的臺(tái)區(qū)特征作為聚類分析輸入數(shù)據(jù),通過(guò)主成分分析(PCA)進(jìn)行特征降維后,選擇多個(gè)聚類數(shù)量,并根據(jù)肘部法則找到畸變程度得到極大改善的臨界點(diǎn),也即取斜率變化較大的拐點(diǎn)作為效果最好的聚類數(shù)量。
針對(duì)聚類結(jié)果,對(duì)于每一類別臺(tái)區(qū)進(jìn)行模型訓(xùn)練。本文通過(guò)人工經(jīng)驗(yàn)選擇了歷史負(fù)荷數(shù)據(jù)、天氣信息、時(shí)間規(guī)則3 個(gè)方面特征作為輸入數(shù)據(jù),從而預(yù)測(cè)未來(lái)一天的日負(fù)荷數(shù)據(jù),所選的輸入特征如附錄C 表C2 所示。歷史負(fù)荷數(shù)據(jù)除了選擇前一天和前一周的負(fù)荷數(shù)據(jù),還對(duì)過(guò)去一周的負(fù)荷和負(fù)載率做均值處理,使得輸入數(shù)據(jù)更加平滑。天氣信息包括了每個(gè)臺(tái)區(qū)每日的平均溫度和平均濕度。時(shí)間規(guī)則信息包含了預(yù)測(cè)目標(biāo)對(duì)應(yīng)的星期、日期、月度、季節(jié)以及是否屬于節(jié)假日。為了防止各個(gè)連續(xù)數(shù)據(jù)間互相影響,對(duì)于時(shí)間規(guī)則的特征采用獨(dú)熱編碼(one-hot)的離散處理形式。
本文提出的基于CPU-GPU 異構(gòu)計(jì)算框架實(shí)現(xiàn)的用電負(fù)荷預(yù)測(cè)方案如附錄C 圖C1 所示。本方案涉及CPU 和GPU 之間的任務(wù)分配,其設(shè)計(jì)原則是:復(fù)雜的邏輯運(yùn)算和流程控制任務(wù)在CPU 上完成,密集型的數(shù)值計(jì)算任務(wù)在GPU 上并行完成,同時(shí)盡量減少CPU 和GPU 之間的數(shù)據(jù)流動(dòng)開(kāi)銷。因此,在異構(gòu)計(jì)算方案中,CPU負(fù)責(zé)完成用電信息的獲取、預(yù)處理和負(fù)荷數(shù)據(jù)的清洗、臺(tái)區(qū)聚類分析、特征構(gòu)造及生成數(shù)據(jù)集等環(huán)節(jié),并通過(guò)OpenMP 多線程動(dòng)態(tài)分配計(jì)算任務(wù);GPU 負(fù)責(zé)完成用電信息統(tǒng)計(jì)數(shù)據(jù)的并行計(jì)算和XGBoost 算法的模型訓(xùn)練等環(huán)節(jié),GPU 的Kernel1—KernelN表示為計(jì)算業(yè)務(wù)進(jìn)行重排序賦值、并行掃描建立映射、數(shù)值計(jì)算等操作設(shè)計(jì)的CUDA內(nèi)核函數(shù)。
算例數(shù)據(jù)來(lái)自深圳市2018年43254個(gè)臺(tái)區(qū)的用電信息。實(shí)驗(yàn)測(cè)試平臺(tái)操作系統(tǒng)為Ubuntu 16.08,服務(wù)器硬件配置為2臺(tái)NVIDIA K40C GPU和1臺(tái)Intel XeonE5 CPU,軟件配置為Oracle 11.2,CUDA 9.0。
首先,本文在實(shí)驗(yàn)平臺(tái)進(jìn)行用電信息中的日負(fù)荷量和日負(fù)荷極值的并行計(jì)算,配置的2 臺(tái)GPU 分別負(fù)責(zé)1 個(gè)計(jì)算任務(wù)。日負(fù)荷極值的并行計(jì)算流程與日負(fù)荷量計(jì)算大致相同,不同的是數(shù)值計(jì)算的內(nèi)核函數(shù)改為負(fù)荷極值的計(jì)算方式,即提取每塊電能表一天最大/最小的負(fù)荷和電壓電流值。算例相關(guān)數(shù)據(jù)表格如表1 所示。測(cè)試內(nèi)容A 為多卡并行計(jì)算,序號(hào)1、2 用于日負(fù)荷量計(jì)算,序號(hào)1、3、4 用于日負(fù)荷極值計(jì)算。測(cè)試內(nèi)容B 為針對(duì)3 個(gè)不同規(guī)模數(shù)據(jù)量算例進(jìn)行的單卡計(jì)算性能測(cè)試,序號(hào)5 由數(shù)據(jù)表KH_CLDZB_1、CJ_RDJDNL_1組成;序號(hào)6、7的數(shù)據(jù)量分別約為序號(hào)5 的2、3 倍,2 個(gè)測(cè)試的總數(shù)據(jù)量都已達(dá)到GB級(jí)別。
表1 數(shù)據(jù)說(shuō)明Table 1 Data explanation
針對(duì)測(cè)試內(nèi)容A,表2 比較了CPU-GPU 異構(gòu)計(jì)算方案與Oracle 數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程串行計(jì)算方案的性能,2 種方案的總耗時(shí)分別為55.34、655.80 s。從表中結(jié)果可看出,相比Oracle 數(shù)據(jù)庫(kù)計(jì)算方案,CPUGPU 異構(gòu)計(jì)算方案雖然犧牲了一定的時(shí)間進(jìn)行數(shù)據(jù)交互和預(yù)處理,但是在GPU 端加速了用電信息的業(yè)務(wù)計(jì)算。業(yè)務(wù)1、2 的數(shù)值計(jì)算部分在數(shù)據(jù)庫(kù)方案中分別需要232.24、423.56 s,而在GPU 上實(shí)現(xiàn)計(jì)算僅耗時(shí)1.73 s 和1.78 s(表2 中CPU-GPU 異構(gòu)計(jì)算方案業(yè)務(wù)1 和業(yè)務(wù)2 的時(shí)間同行統(tǒng)計(jì),表示分別在2 臺(tái)GPU 上同時(shí)進(jìn)行并行計(jì)算,在最后的總時(shí)間中只計(jì)入耗時(shí)最長(zhǎng)的業(yè)務(wù)計(jì)算時(shí)間),效率均提高了2 個(gè)數(shù)量級(jí)。同時(shí),由于本文采用多線程技術(shù)拓展了多個(gè)GPU 并行計(jì)算的流程,在CPU-GPU 異構(gòu)計(jì)算方案中業(yè)務(wù)1 和業(yè)務(wù)2 分別在2 臺(tái)GPU 上同時(shí)進(jìn)行并行計(jì)算,實(shí)際總時(shí)間只計(jì)以單個(gè)GPU 上耗時(shí)最長(zhǎng)的業(yè)務(wù)時(shí)間(即業(yè)務(wù)2),這進(jìn)一步提高了用電數(shù)據(jù)的計(jì)算效率,使得總體計(jì)算流程的加速比達(dá)到了11.85 倍。表3進(jìn)一步比較了不同數(shù)據(jù)規(guī)模下單臺(tái)GPU 并行計(jì)算的性能情況,測(cè)試1—3 分別對(duì)表1 中測(cè)試內(nèi)容B的3 組數(shù)據(jù)進(jìn)行了日負(fù)荷計(jì)算,對(duì)應(yīng)的計(jì)算總耗時(shí)分別為31.53、161.69、225.94 s。由上述分析可知測(cè)試1 中相同規(guī)模的數(shù)據(jù)在Oracle 數(shù)據(jù)庫(kù)中計(jì)算需要232.24 s,在CPU-GPU異構(gòu)計(jì)算方案中只耗時(shí)31.53 s,而在數(shù)據(jù)量擴(kuò)大約3倍的測(cè)試3中也僅耗時(shí)225.94 s,仍小于Oracle 數(shù)據(jù)庫(kù)計(jì)算方案所需的時(shí)間,這體現(xiàn)了CPU-GPU 異構(gòu)計(jì)算方案在處理計(jì)算密集型任務(wù)時(shí)的優(yōu)越性。
表2 CPU-GPU異構(gòu)計(jì)算方案與Oracle數(shù)據(jù)庫(kù)計(jì)算方案性能分析Table 2 Performance analysis for CPU-GPU heterogeneous computing scheme and Oracle database computing scheme
表3 日負(fù)荷計(jì)算性能分析Table 3 Performance analysis for daily load calculation
根據(jù)CPU-GPU 異構(gòu)計(jì)算方案中日負(fù)荷量的計(jì)算結(jié)果,采用XGBoost 模型實(shí)現(xiàn)多臺(tái)區(qū)負(fù)荷預(yù)測(cè)。負(fù)荷數(shù)據(jù)來(lái)自于2018 年深圳市的日用電負(fù)荷記錄,預(yù)測(cè)目標(biāo)為未來(lái)一天的日負(fù)荷數(shù)據(jù),預(yù)測(cè)時(shí)段為2019 年1 月1 日至1 月7 日。數(shù)據(jù)集按照80%比例劃出訓(xùn)練集,其余為驗(yàn)證集,測(cè)試集為預(yù)測(cè)日期的真實(shí)數(shù)據(jù)。
4.2.1 實(shí)驗(yàn)評(píng)價(jià)指標(biāo)
為了評(píng)估預(yù)測(cè)方法的性能,評(píng)價(jià)指標(biāo)采用均方根誤差eRMSE、平均絕對(duì)誤差eMAE、平均絕對(duì)百分比誤差eMAPE和決定系數(shù)λR2,計(jì)算式分別見(jiàn)式(11)—(14)。
式中:yˉ為整體樣本的平均值。eRMSE、eMAE和eMAPE描述了預(yù)測(cè)值和真實(shí)值之間的偏差情況,指標(biāo)越小表示預(yù)測(cè)效果越好。λR2描述了模型對(duì)數(shù)據(jù)的擬合程度,指標(biāo)越接近1表示模型擬合得越好。
4.2.2 數(shù)據(jù)處理
由于通信錯(cuò)誤或者數(shù)據(jù)丟失等原因,歷史負(fù)荷信息中有異常數(shù)據(jù)存在,其將影響預(yù)測(cè)模型的預(yù)測(cè)精度。本文通過(guò)數(shù)據(jù)清洗剔除了缺失較多(缺失率大于90%)的臺(tái)區(qū)樣本。在清洗后的43 052 個(gè)有效臺(tái)區(qū)樣本中,先對(duì)缺失值采用相鄰日期數(shù)據(jù)的平均值進(jìn)行填充,然后基于正態(tài)分布檢測(cè)出異常數(shù)據(jù)點(diǎn),根據(jù)文獻(xiàn)[20]提供的方法,針對(duì)不同的出錯(cuò)原因進(jìn)行以下幾種數(shù)據(jù)修正方式:①對(duì)大事故日負(fù)荷或明顯負(fù)荷曲線異常的日負(fù)荷進(jìn)行剔除或用正常曲線置換;②采用數(shù)據(jù)橫向?qū)Ρ确椒ㄏ捎诓蓸渝e(cuò)誤帶來(lái)的負(fù)荷毛刺;③對(duì)于某些時(shí)段的異常負(fù)荷數(shù)據(jù),由現(xiàn)場(chǎng)人員根據(jù)經(jīng)驗(yàn)進(jìn)行修正。
4.2.3K-means-XGBoost方法的預(yù)測(cè)結(jié)果分析
對(duì)預(yù)處理后的臺(tái)區(qū)負(fù)荷數(shù)據(jù)進(jìn)行K-means 聚類分析,如圖2 所示,根據(jù)肘部法則選擇K=3 作為最佳聚類數(shù)。3個(gè)類別的臺(tái)區(qū)數(shù)量分別為7767、14788和20497。
圖2 不同聚類數(shù)量的誤差曲線Fig.2 Error curve of different numbers of clusters
本文同時(shí)選擇了長(zhǎng)短時(shí)記憶神經(jīng)網(wǎng)絡(luò)(LSTM)和RF模型進(jìn)行了負(fù)荷預(yù)測(cè)。LSTM 改進(jìn)了傳統(tǒng)的循環(huán)神經(jīng)網(wǎng)絡(luò),通過(guò)輸入門(mén)、遺忘門(mén)和輸出門(mén)來(lái)決定數(shù)據(jù)的更新和丟棄,解決了訓(xùn)練中梯度爆炸和梯度消失的問(wèn)題,可用于學(xué)習(xí)時(shí)間序列長(zhǎng)短期依賴信息。RF 模型則是一種組合決策樹(shù)模型,通過(guò)有放回的重復(fù)采樣方式排列組合多個(gè)決策樹(shù),然后根據(jù)多個(gè)樹(shù)的結(jié)果進(jìn)行投票決定最后的結(jié)果。利用交叉驗(yàn)證和網(wǎng)格搜索法對(duì)XGBoost、LSTM 和RF 模型參數(shù)進(jìn)行尋優(yōu),選定的參數(shù)配置如附錄C 表C3 所示。模型的訓(xùn)練都在GPU 上進(jìn)行。LSTM 和RF 通過(guò)Tensorflow搭建,GPU 加速了底層的數(shù)學(xué)運(yùn)算。XGBoost 通過(guò)GPU 加速構(gòu)建決策樹(shù),提高了葉子節(jié)點(diǎn)對(duì)特征的分裂選擇。
表4 給出了3 個(gè)模型在不同類別臺(tái)區(qū)上的預(yù)測(cè)效果和總計(jì)算時(shí)間。在預(yù)測(cè)精度上,從評(píng)價(jià)指標(biāo)可以看出XGBoost 模型在3 個(gè)臺(tái)區(qū)類別上的預(yù)測(cè)誤差都小于LSTM 和RF 模型,對(duì)于數(shù)據(jù)的擬合程度也優(yōu)于LSTM 和RF 模型。圖3 描述了從每個(gè)類別中各隨機(jī)抽取3個(gè)臺(tái)區(qū)的負(fù)荷預(yù)測(cè)情況,其中XGBoost模型的預(yù)測(cè)結(jié)果更接近真實(shí)數(shù)值曲線。這是由于XGBoost模型對(duì)損失函數(shù)進(jìn)行二階泰勒級(jí)數(shù)展開(kāi),優(yōu)化過(guò)程使用了一階和二階導(dǎo)數(shù)信息進(jìn)行更新迭代,使模型訓(xùn)練更充分。在計(jì)算效率上,借助GPU加速的XGBoost模型的計(jì)算耗時(shí)是最少的,只需要41.786 s就完成了模型訓(xùn)練。這是由于本身樹(shù)形結(jié)構(gòu)的生成效率就高很多,而GPU 并行計(jì)算加速了貪心算法對(duì)葉子節(jié)點(diǎn)分裂特征的選擇,進(jìn)一步加快了算法的迭代過(guò)程。綜合分析,基于XGBoost模型的電力負(fù)荷預(yù)測(cè)在預(yù)測(cè)精度和計(jì)算時(shí)間2個(gè)方面的指標(biāo)都優(yōu)于其他方法,表現(xiàn)出良好的性能。
表4 負(fù)荷預(yù)測(cè)模型性能分析Table 4 Performance analysis for load forecasting model
圖3 臺(tái)區(qū)負(fù)荷預(yù)測(cè)結(jié)果Fig.3 Results of station load forecasting
本文研究了CPU-GPU 異構(gòu)計(jì)算框架下的高性能用電負(fù)荷預(yù)測(cè)方法,將GPU 應(yīng)用在了電力負(fù)荷預(yù)測(cè)的數(shù)據(jù)獲取和模型訓(xùn)練上,實(shí)現(xiàn)了GPU 并行加速的用電負(fù)荷數(shù)據(jù)計(jì)算和臺(tái)區(qū)負(fù)荷預(yù)測(cè)。算例結(jié)果表明,結(jié)合OpenMP 多線程技術(shù)的GPU 并行計(jì)算方案對(duì)業(yè)務(wù)處理的效率更高,結(jié)合K-means 聚類分析的基于XGBoost 算法的多臺(tái)區(qū)負(fù)荷預(yù)測(cè)方案在預(yù)測(cè)精度和計(jì)算效率上都表現(xiàn)出良好的性能。此外,在實(shí)際生產(chǎn)環(huán)境中,本文提出的異構(gòu)計(jì)算方案綜合考慮了海量用電數(shù)據(jù)的統(tǒng)計(jì)實(shí)時(shí)性和挖掘充分性的要求,在更大規(guī)模的用電計(jì)算業(yè)務(wù)和短期負(fù)荷預(yù)測(cè)應(yīng)用中有較好的應(yīng)用前景,為新一代計(jì)算業(yè)務(wù)數(shù)據(jù)中臺(tái)的硬件選型提供了參考和借鑒。
附錄見(jiàn)本刊網(wǎng)絡(luò)版(http://www.epae.cn)。