伴随企业业务的不断扩大,业务IT支撑系统规模及平台组件架构数量对应激增,其中作为基础资源之一的主机数量也程指数级增加,与此同时业务对系统资源的需求和敏感度也伴随业务规模的增加而越发的苛刻。运维团队对系统可用性的保障也如履薄冰,每一个可能的异常情况都应该被及时发现,及时响应,及时处理,以保障系统和服务的稳定高效运行,给客户良好的使用体验。为了保障基础资源之一主机的稳定可靠,笔者对运行中的主机健康度做了基于LSTM循环神经网络的预测。
本次分享分为四个部分:
1、LSTM简介
2、基本数据准备
3、多元LSTM预测
4、模型优化
01LSTM简介随着深度学习技术发展,相关深度学习模型逐渐被应用到时序数据研究中。深度学习模型是拥有多个非线性映射层级的深度神经网络模型,对输入信号逐层抽象并提取特征,挖掘出更深层次的潜在规律,以达到提前预知预警的效果。
众多深 度 学 习 模 型 中,循 环 神 经 网 络 ( RecurrentNeural Network,RNN) 将时序的概念引入到网络结构设计中,使其在时序数据分析中表现出更强的适应性。
RNN 变体中,长短期记忆( Long Short-Term Memory,LSTM) 模型弥补了RNN 的梯度消失、梯度爆炸和长期记忆能力不足等问题,使循环神经网络能够真正有效地利用长距离的时序信息。
LSTM 模型在不同领域的时序数据研究中已有不少成功的应用案例,包括文字语言相关的语言建模、语音识别、机器翻译,多媒体相关的音频和视频数据分析、图片标题建模,道路运输相关的交通流速预测,以及医学相关的蛋白质二级结构序列预测等。
但在可靠性领域,LSTM 模型的应用非常有限,尤其是对故障时间序列预测的相关问题研究,目前还未发现更多的案例。本文针对系统级故障时间序列数据,提出了一种基于 LSTM 循环神经网络的预测方法,该方法包括3 层( 输入层、隐藏层和输出层) 网络结构的详细设计,以及网络训练和网络预测的具体实现算法等。在此基础上,以预测误差最小化为目标,进一步提出了基于多层网格搜索的 LSTM 预测模型参数优选算法。
LSTM模型网络拓扑
例用数据采用某场地实时数据999条作为样本数据进行训练和测试。样本中主要采集了四个现场的主机指标数据(1分钟系统负载、CPU使用率、等待CPU进程个数、内存利用率)。
对样本进行清洗后截取前6个样本数据如下图:
对数据进行归一化处理并对每个样本数据行生成一个模拟健康度,将新样本数保存到test_health.csv文件中。
新生成test_health.csv文件截取前6个样本数据如下图所示:
我们可以使用这些数据来构建预测问题,在此数据基准下,使用前几个小时的主机指标情况和健康度,依此预测下一个小时的主机指标及健康度情况。
我们已经以易于使用的形式获得了数据,创建了每个系列的快速绘图并查看所拥有的数据。
下面代码加载新的“test_health.csv”文件,并将每个系列绘制为单独的子图。
运行示例将创建一个包含5个子图的趋势图,显示每个变量999个小时的数据。如下图所示:
0 3多元LSTM预测 LSTM数据准备第一步是为LSTM准备主机数据集,将数据集构建为有监督的学习问题,并对输入变量进行归一化。
考虑到前面时间步骤的主机指标测量和主机健康度情况,我们将监督学习问题设计为预测当前小时(t)的主机健康度。
根据主机健康度情况和最近24小时的主机指标情况,预测下一个小时的主机健康度情况。
如上预测下一个小时的主机健康度,并根据下一个小时的“预期”主机健康度状况进行预测。我们可以使用开发的series_to_supervised()函数来转换数据集。接下来,将所有特征标准化,然后将数据集转换为监督学习问题。
转化监督学习问题代码:
我们在第一隐藏层中定义50个神经元,在输出层中定义1个神经元来定义LSTM,以预测主机健康度。输入形状为1个时间步长,具有5个特征。我们使用平均绝对误差(MAE)损失函数和随机梯度下降的有效Adam版本。该模型将适合于50个训练周期,每批次的数量为72。请记住,每批结束时都会重置Keras中LSTM的内部权重,因此,内部状态可能是几天的函数,尝试对此进行测试,有助于模型的成熟度完善。最后,我们通过在fit()函数中设置validate_data参数来跟踪训练过程中的训练和测试损失。在运行结束时,绘制训练损失和测试损失。
定义和拟合模型首先,我们必须将准备好的数据集分为训练集和测试集。为了加快对本演示模型的训练,我们将仅在360的数据上拟合模型,然后在剩余639的数据上对其进行评估。
下面的示例将数据集分为训练集和测试集,然后将训练集和测试集分为输入和输出变量。最后,将输入(X)整形为LSTM期望的3D格式,即[样本,时间步长,特征]。
运行此示例将打印训练数据以及测试输入和输出集,其中约有360个小时的数据用于训练,约有637小时的测试数据。
现在,我们可以定义和拟合我们的LSTM模型。
我们将在第一隐藏层中定义50个神经元,在输出层中定义1个神经元来定义LSTM,以预测主机健康度。输入形状将是1个时间步长,具有5个特征。我们将使用平均绝对误差(MAE)损失函数和随机梯度下降的有效Adam版本。该模型将适合于50个训练周期,每批次的数量为72。请记住,每批结束时都会重置Keras中LSTM的内部权重,因此,内部状态可能是几天的函数,尝试对此进行测试,有助于模型的成熟度。最后,我们通过在fit()函数中设置validate_data参数来跟踪训练过程中的训练和测试损失。在运行结束时,绘制训练损失和测试损失。
评估模型模型拟合后,我们可以预测整个测试数据集。我们将预测与测试数据集结合起来,然后换算比例。我们还使用预期的主机健康度对测试数据集进行换算。利用原始比例的预测和实际值,我们可以为模型计算一个误差分数。在这种情况下,我们计算均方根误差(RMSE),该均方根误差与变量本身的单位相同。
首先运行示例创建一个图,显示训练期间的训练和测试损失。
我们需要对此模型进行进一步优化。训练和测试损失在每个训练时期的末尾打印,以便于我们知道模型数据。运行结束时,将打印测试数据集上模型的最终RMSE。我们可以看到,该模型实现的RMSE 3.700
04模型优化 训练多个滞后时间步首先,在调用series_to_supervised()时必须适当地解决问题。我们将使用3个小时的数据作为输入。还要注意,我们不再将所有其他字段的列都明确地放在ob(t)处,我们在指定输入和输出列时需要更加小心。
我们的框架数据集中有3 * 5 + 5列。我们将使用3 * 5或15列作为前3个小时内所有功能的obs的输入。我们将预测下一个小时主机各个指标作为输出,如下所示:
接下来,我们可以正确地重塑输入数据以反映时间步长和功能。.
此外,我们可以通过增大神经元个数,及增大每个神经元计算次数。来最大量减小优化在神经网络传递时的加权值。如下图所示:
其他变化是如何评估模型那?具体来说,在我们如何重构具有5列的行的过程中,这些行适合于反转缩放操作以将y和yhat还原为原始比例,以便于我们计算RMSE。
更改的要点是我们将y或yhat列与测试数据集的后4个特征连接起来,以求反比例,如下所示:
运行优化后,显示训练期间的训练和测试损失,模型已不存在测试损失,损失降至训练损失以下,如下图所示:
最后,打印出测试RMSE:
模型优化完成!当然最终此次分享只是参考!具体模型调优还需要按照各位的各自业务进行调优操作!
思考题:主机负载数据可能会存在周期化数据,比如正常业务系统存在忙时和闲时两种状态,如果上午十点为主机业务量最大时期(即主机系统忙时),那输入数据是否要以前一天十点为输入数据?