(四川幼儿师范高等专科学校,四川 江油 621700)
在云计算环境下,弹性计算[1]能力使用户按需使用计算资源成为了可能。按需分配计算资源可以有效提高计算资源的使用效率,降低用户的使用成本。然而,应用的计算需求是处于不断变化之中的,当低估应用未来的系统负载时,会因为计算能力欠缺无法保证可靠服务,乃至因为系统负载过大而造成宕机事故[2];当高估未来系统负载时,申请过多的计算资源往往会造成计算资源的浪费,增加企业运行成本[3]。准确预测出应用在未来一段时间内的系统负载成为弹性计算的重要一环。
时序数据[4]是应用运行过程中常见的数据形式,应用在单位时间内的执行指令数、网络连接数磁盘读写数、内存占用率、数据读写量等是常见时序数据,针对具体应用还可能会有在线用户数、单位时间内交易数等指标。这些时序数据描述了应用在运行过程中的负载波动情况。不同应用的负载波动规律往往不是不同的,通过收集并分析应用运行时的负载时序数据可以挖掘出应用负载的波动变化规律并以此预测应用未来的负载情况。
时序预测方法有多种,比如自回归移动平均 (autoregressive integrated moving average, ARIMA)[5]、多元线性回归(multiple linear regression, MLR)[6]和BP神经网络(back propagation neural network, BPNN)[7]。其中平稳自回归模型在应用时需要针对具体时间序列分析其平稳性,并根据差分后平稳性结论给出模型参数,在应用时需要太多人工介入,可用性差。多元线性回归模型可以挖掘出多元时序间的线性关系,无法挖掘非线性关系,拟合误差很大。BP神经网络的预测算法提供了非线性拟合能力并避免了ARIMA模型需要太多人工介入分析的繁琐,但由于BP神经网络模型没有记忆能力,无法解决时序预测中的长跨度依赖的问题。
近年来,深度学习技术的发展给时序数据预测提供了新的解决问题的思路和工具;深度学习模型借助其多层非线性映射层,能够抽象出数据更深层次的潜在规律[8]。循环神经网络(recurrent neural networks, RNN)引入了定向循环,网络会记忆之前的输入信息并应用于当前的计算中,这就产生了时序的概念;长短期记忆网络(long short-term memory, LSTM)[9]是RNN的一种,其解决了传统RNN梯度消失、记忆跨度较短的问题;门控循环单元(gated recurrent unit, GRU)是 LSTM 的变种,其简化了LSTM的门控方式,两者在时序处理上不分伯仲。
本文针对弹性伸缩计算中的应用负载预测提出了使用三层LSTM隐层和一层BP层构成的神经网络结构,使用从实验室服务器上采集到的应用运行监控数据训练模型,并设计对比实验比较其他时间序列预测模型的预测效果。实验表明本文设计的神经网络模型的预测误差更小。
循环神经网络(RNN)[12]在结构上与前馈神经网络非常相似,但是RNN中隐藏层的反馈除了进入输出端,还会进入到下一个时间结点的隐藏层,从而影响下一时间步的各个权重。
RNN网络不同于BP神经网络,其内部存在隐藏状态h,内部状态参与节点输出值得计算,并根据输入值和内部隐藏状态更新隐藏状态。隐藏状态的出现使RNN具有了记忆能力,这意味着历史输入信息能够影响后续的输出结果。RNN的这种特性非常适合于处理具有前后关联特征的时序数据。如图1所示,左边的图是RNN结构的折叠图,右边是RNN结构展开图。从图中可以看出,在每个时间步t,每个神经元同时接收输入层数据x(t)和前一个时间步隐藏层节点的输出h(t)。
图1 RNN结构图
RNN在前向传播的过程中,主要分为输入层到隐藏层、隐藏层到输出层两部分。传播过程为:
输入层→隐藏层:
(1)
隐藏层→输出层:
yt=f(c+Wyht)
(2)
其中:Wx和Wh分别表示输入xt的权重和前一个时间步隐层输出ht-1的权重;Wy是隐藏层输出的权重。
循环神经网络的计算过程虽然添加了上一时刻隐藏层的输入,但是当步长过长时,后面的节点对前面时间节点的感知能力下降,即RNN存在的长期依赖问题。
长短期记忆网络(LSTM)是RNN的一种,解决了普通RNN梯度消失的问题。LSTM神经元内部存在输入门、忘记门、输出门用来计算信息的重要程度,并据此对信息进行筛选。LSTM通过门限控制解决了传统RNN的梯度消失问题[13],这样就为构建大型LSTM网络提供了可能。LSTM能够挖掘时序数据中的长跨度关联关系,是时序处理的理想模型。LSTM是建立在RNN基础上的一种特殊类型的网络结构,它的提出主要是未来克服RNN中存在的长期依赖导致梯度消失而设计的。LSTM 的核心是细胞(cell)的状态,而在LSTM元中内部设计了输入门(Input gate)、输出门(Output gate)和遗忘门(Forget gate),设计“门”的目的是清除或增加信息到细胞状态中。LSTM的内部结构相比RNN更复杂,单个LSTM神经元的具体结构如图2所示。
图2 LSTM内存单元
为了更好地理解LSTM神经元的内部结构,首先对神经元内部的符号进行假设。本文假设h为LSTM单元的输出,c为LSTM内存单元的值,x为输入数据。LSTM单元的更新与前向传播一样,可以分为以下几个步骤。
步骤1:首先,本文先计算当前时刻的输入结点g(t),Wxg,Whg和Wcg分别是输入数据和上一时刻LSTM 单元输出的权值:
(3)
(4)
步骤2:计算输入门的值i(t)。输入门用来控制当前输入数据对记忆单元状态值的影响。所有门的计算受当前输入数据x(t)和上一时刻LSTM单元输出值h(t-1)影响。
(5)
(6)
步骤3:计算遗忘门的值f(t)。遗忘门主要用来控制历史信息对当前记忆单元状态值的影响,为记忆单元提供了重置的方式。
(7)
(8)
步骤4:计算当前时刻记忆单元的状态值c(t)。记忆单元是整个LSTM神经元的核心结点。记忆单元的状态更新主要由自身状态c(t-1)和当前时刻的输入结点的值g(t),并且利用乘法门通过输入门和遗忘门分别对这两部分因素进行调节。乘法门的目的是使LSTM存储单元存储和访问时间较长的信息,从而减轻消失的梯度。
c(t)=f(t)⊗c(t-1)+i(t)⊗g(t)
(9)
其中:⊗表示逐点乘积。
步骤5:计算输出门o(t)。输出门用来控制记忆单元状态值的输出。
(10)
(11)
步骤6:最后计算LSTM单元的输出。
h(t-1)=o(t)⊗tanh(c(t))
(12)
步骤7:更新当前序列索引预测输出。
系统关键负载指标的预测模型如图3所示。模型的输入数据包括CPU、硬盘和网络等负载指标数据,预测输出的负载指标为cpu_usr, net_rcv_pkts, disk_all_tps。预测模型分为归一化层,神经网络层,和逆归一化层。归一化层将各个参数数据转化到[0,1]区间上,逆归一化层将预测所得数据映射到数据原有值域。提供预测功能的神经网络层有分为两部分,LSTM网络层和BP全连接层;LSTM网络层提供对时间序列的特征提取、记忆和特征组合的功能;BP全连接层将最后一层LSTM网络输出的特征向量转化成为输出结果。
图3 关键负载指标预测模型示意图
(13)
由于系统负载指标在数值上不在同一个值域,将数据进行归一化能能够保证训练过程的稳定性,更容易训练得到最优解。归一化层和逆归一化层完成参数在值域上的转化操作。
长短期记忆网络层接受归一化后的时序数据并对时序数据进行特征提取并可以通过其记忆功能在内部状态向量中保留部分和历史输入相关的信息并最终向全连接层提供和未来关键负载指标相关的特征向量。在本模型中LSTM网络层有三层,最下层网络接受归一化的多元时序片段,对其进行特征变换和时序中关键信息的记忆功能,生成的特征向量提供给上层LSTM网络。上层的LSTM网络对下层生成的特征向量进行特征组合、变换、记忆、忘记生成更高一层的特征向量,上层LSTM网络层能够从更大维度上描述时序的特征。上层LSTM网络输出的向量的是下层LSTM网络输出特征向量的组合。由于高层神经网络往往存在梯度消失、梯度爆炸、训练复杂度过于复杂的问题,LSTM的层数不是越多越好,本模型根据模型训练的实际效果使用了三层LSTM网络。由于上层LSTM层所输出的特征向量是下层LSTM层输出特征向量的组合,上层所能表达的特征数多于下层,因此三层LSTM层中的神经元数目从下到上是递增的。这样保证了上层LSTM层能够提取出足够多的特征而又不会因为模型过于复杂造成难以训练的问题。
全连接层位于预测模型的最顶层,完成把最后一层LSTM层产生的特征向量映射为输出向量的功能。由于LSTM层也能够提供分线性函数变换的功能,在该模型中使用单层全连接网络已经能够满足需求。该层没有选择使用LSTM网络层,是因为LSTM为了解决不饱和记忆的问题,门限控制的激活函数倾向于输出0或者1,即完全忘记或者完全记住,这样就会造成输出结果的连续性变差;另一方面,由于最顶层的LSTM节点个数很少,所能够提供的记忆能力十分有限;再者,LSTM网络的结构比全连接层要复杂很多,训练时将更加困难。
神经网络的损失函数为均方误差(mean-square error, MSE)[14]。神经网络的优化方法有很多,如SGD[15]、Adagrad[16]、AdaDelta[17]、Adam[18]等。其中Adam算法整体表现优异,在实际应用中效果良好。
使用实际服务器中应用运行负载指标的时序序列训练模型并分析模型的训练和预测误差。实验中,首先使用不同模型参数分析拟合方均根差,找到相对合理的模型;之后对比其它时序预测模型和本论文中设计的模型的预测效果,验证模型的优点。
超参数选取作为设计神经网络模型的重要一环,对模型的实际输出效果有重大的影响。神经网络的层数、每层中的节点类型、节点个数是影响神经性能的几个重要参数。
图4所示的为应用在运行过程中,归一化后的对不同硬件资源的消耗情况。观察改图不难发现,cpu_user和cpu_sys存在周期性波动的情况,而且两者存在着某种“同步”变化,这就是说这两者之间存在着数值上的关联性。实验中,预测cpu_user,net_rcv_ pkts, disk_all_tps三个指标的未来8个时间单位的负载需求。
图4 关键负载指标时序数据
在表1中的网络参数一栏中从左至右的数字部分表示神经网络层从下至上各层的节点个数,数字后面的L代表该层为长短期记忆网络层,D代表该层为全连接层。分析表中的数据可知:
1)模型最后一层用全连接层会获得比较好的拟合效果;
2)使用三层长短期记忆网络层取到比较好的效果;
3)当模型中的长短期记忆网络层中的节点数从底层到上层逐渐增加效果优于节点数逐渐减少的模型。
对比不同参数条件下的拟合方均根差、模型复杂度选择预测模型中的网络类型和网络节点数量,设计了如图3中的关键负载预测指标模型。
表1 不同参数的模型拟合误差
为了进一步验证论文中设计神经网络预测模型对时间序列的优势,使用不同时序预测模型进行对比。首先从易用性的角度排除了ARIMA模型,ARIMA模型由于需要具体分析时序的平稳性,需要太多人工干预,单一参数的适用性太差。在实验中具体比较了多元线性回归(MLR)、BP神经网络,将图3中的LSTM替换为普通RNN和GRU,不断调整参数达到最优后和论文介绍的模型输出结果进行对比,验证模型的优越性。
表2 不同模型实验结果对比
由于没有备激活函数,不具备拟合非线性函数的能力,只能挖掘输出数据和输入数据之间的线性关联关系,在数据集上的表现不理想,误差较大。BP神经网络能够拟合非线性函数,但由于其每次输出的结果仅仅依赖于该次输入数据,不能挖掘非输入时序数据和输出的关联关系。RNN和GRU这两种模型虽然具备一定的记忆能力,普通RNN存在梯度消失的问题,不能挖掘时间序列中长跨度依赖关系;GRU是LSTM的简化版本,在很多问题上两者不相伯仲,实验结果表明,该模型稍逊于LSTM,这是由于GRU模型在训练过程中抖动比较严重,而LSTM表现稳定,损失保持相对稳定下降。
本文给出了基于LSTM循环神经网络的应用运行关键负载指标的预测模型,并设计了相关实验比较了其它预测模型的预测效果。实验结果表明,本论文提出的基于LSTM的神经网络模型的预测效果更优,精度更高。论文初步验证了应用运行负载指标日志并在线预测未来应用关键负载指标的可行性,可以为弹性计算根据预测负载调整集群容量提供参考。