朱墨儒,高仲合
(曲阜師范大學 軟件學院,山東 曲阜 273165)
云資源的管理與調度是云計算的關鍵技術之一,而負載預測有利于云資源高效管理、系統(tǒng)安全和穩(wěn)定運行,在虛擬機遷移與調度、任務執(zhí)行時間計算及優(yōu)化用戶服務過程中發(fā)揮著重要作用[1]。
目前,多數(shù)負載預測算法是對負載時序數(shù)據(jù)進行分析建模,通過負載歷史記錄來進行負載的短期預測。文獻[2]通過隱馬爾科夫模型(Hidden Markov Model,HMM)輔助優(yōu)化資源負載預測。文獻[3]通過c-c法確定嵌入維度,并通過支持向量機預測下一時刻的資源負載。但是,由于負載數(shù)據(jù)影響因素的復雜性和噪音的干擾,以上算法在云資源負載未來一段時間內的預測上表現(xiàn)并不理想。為提高較長期負載預測準確度,本文采用Seq2seq模型進行云資源負載預測。
循環(huán)神經(jīng)網(wǎng)絡(Recurrent Neural Network,RNN)是一種具有“記憶”功能的特殊神經(jīng)網(wǎng)絡,其在神經(jīng)網(wǎng)絡的基礎上將某些隱層作為循環(huán)層,保存每一時刻循環(huán)層的輸出并作為下一時刻該循環(huán)層的輸入。這種特殊的屬性使得其在處理時序數(shù)據(jù)上具有獨特的優(yōu)勢[4]。
RNN的結構如圖1所示。
圖1 RNN及其展開結構
圖1中,t表示時間,xt表示t時刻輸入,st表示t時刻記憶信息,ot表示t時刻輸出,U、V、W分別表示輸入層、輸出層、循環(huán)層權重,則任意時刻輸出ot可表示為:
其中f、g為激活函數(shù)。
可以看到,RNN的歷史信息通過st保存,這種結構使得其具有記憶功能,非常適合用來處理負載時間序列數(shù)據(jù)。對于每一時刻,輸入為當前時刻負載,輸出為下一時刻負載[5]。
Seq2seq模型是基于RNN網(wǎng)絡建立的用于處理輸入輸出數(shù)據(jù)為時間序列的模型,其輸入和輸出均為時間序列,包含編碼(encode)和解碼(decode)兩個過程,常采用兩種異構的RNN網(wǎng)絡[6]。Seq2seq的結構如圖2所示。
圖2中輸入序列長度為3,輸出序列長度也為3,表示以t時刻之前的3個時刻的狀態(tài)預測t時刻之后的3個時刻的狀態(tài)。
圖2 Seq2seq模型結構
Seq2seq在自然語言處理(Natural Language Processing,NLP)方面有不錯的表現(xiàn)[7],但針對時間序列預測的情況,如果采用同構RNN網(wǎng)絡,模型會將上一時刻輸出作為下一時刻輸入,每個時間節(jié)點的網(wǎng)絡結構都相同。如果第一步預測有些許偏差,之后的預測誤差會迅速增大。如果采用異構RNN網(wǎng)絡,模型長期預測準確率提高的同時,短期預測的準確率會降低。所以,將Seq2seq模型用于負載預測需要進行部分改動。
考慮到RNN網(wǎng)絡對于短期預測往往有著不俗的表現(xiàn),本文在RNN模型的基礎上為其增加了一個調節(jié)層來修正多步預測的誤差,組成了同構的Seq2seq模型,以修正短期負載預測的偏差,并且提高長期負載預測的準確率。此外,充分利用已知信息,將已知的輸入作為每一時刻調節(jié)層的輸入來使輸出序列的誤差達到最小。結構如圖3所示。
圖3 用于負載預測的Seq2seq模型結構
圖3中對于處理負載預測問題,不需記錄龐雜的歷史負載數(shù)據(jù),只需保存歷史狀態(tài)信息st-1,通過獲取當前負載,即可預測未來一段時間的負載。
此處模型的訓練分為兩步。
第一步,訓練一步預測的RNN網(wǎng)絡。RNN網(wǎng)絡的反向傳播采用基于時間的反向傳播算法(Backpropagation Through Time,BPTT),這就導致傳播深度與樣本數(shù)據(jù)大小成正比,于是要對樣本數(shù)據(jù)進行劃分,以加速訓練速度。為防止梯度爆炸和梯度消失,本文采用門循環(huán)控制單元(Gated Recurrent Unit,GRU)[8]組成的RNN網(wǎng)絡,結構如圖4所示。
圖4 GRU結構
它通過“更新門”和“重置門”控制所要記憶的信息。不僅記憶能力優(yōu)越,而且訓練速度很快。
第二步是為訓練好的GRU網(wǎng)絡添加調節(jié)層。本文采用一個深度神經(jīng)網(wǎng)絡作為調節(jié)層,并且采用dropout[9]過程以一定概率使調節(jié)層神經(jīng)元失活,以提高模型的泛化能力。分步訓練可以提高模型收斂速度,且使循環(huán)層與調節(jié)層不會互相影響,以發(fā)揮各個層的最大優(yōu)勢。
本文選用Google clusterdata 2011數(shù)據(jù)集中連續(xù)140 h CPU利用率的時序數(shù)據(jù)對算法進行驗證,時間序列樣本總計1 688個數(shù)據(jù)點,實驗將前1 000數(shù)據(jù)點作為訓練集,將后688個數(shù)據(jù)點作為驗證集。Seq2seq模型的建立采用Google的TensorFlow學習框架進行。
實驗的衡量標準采用平均絕對值誤差(Mean Absolute Deviation,MAD),公式如下:
其中yi*為預測值,yi為真實值。
將本文中用于負載預測的Seq2seq模型的預測結果同傳統(tǒng)Seq2seq模型及調優(yōu)后的支持向量機(Support Vector Machine,SVM)的預測結果作比較,SVM作為經(jīng)典非線性問題的解決方法,其整體預測效果比起傳統(tǒng)Seq2seq模型要好,隨機抽取連續(xù)100個樣本點的一步預測結果對比如圖5所示,五步預測結果對比如圖6所示。
實驗在全部測試集上的結果對比如表1所示。
圖5 一步預測結果對比
圖6 五步預測結果對比
表1 云計算資源負載預測性能對比表
由結果可以看出,傳統(tǒng)Seq2seq模型在短期預測與長期預測上誤差非常均衡,非常適合用來作長期預測,但整體準確率上卻不如SVM算法。在短期預測上用于負載預測的Seq2seq模型與SVM的性能相差不大,但對于較長期的預測,負載預測Seq2seq模型的表現(xiàn)明顯優(yōu)于SVM。所以,對于較長期的預測,負載預測Seq2seq模型顯然更加適用。
Seq2seq模型在負載較長期的預測上的優(yōu)越表現(xiàn),可以提升云資源實現(xiàn)負載均衡的效果,并可以進一步用來預測一段時間內的平均負載預測,對提升QoS質量也有非常大的作用。通過調整Seq2seq模型的損失函數(shù)權重,可實現(xiàn)不同負載預測需求。在實際負載數(shù)據(jù)采樣過程中,可通過減小采樣間隔獲取更加準確的負載變化,對于資源負載異常的監(jiān)測也有非常大的幫助。