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