当前位置: 首页 > 科技观察

另一种监控姿势:基于深度学习+流处理的时序报警系统

时间:2023-03-13 17:58:55 科技观察

后台报警系统是运维人员的“眼睛”,是维护生产安全的第一层保障。传统的基于规则的报警系统采用同比、环比、差值、设置阈值等方法判断当前指标是否存在异常,但往往效果不理想,存在问题例如维护成本高和准确性低。随着人工智能的兴起,大数据运维也迎来了新的机遇,同时对自身报警系统的实时性提出了更高的要求。因此,我们结合Tensorflow深度学习算法,基于大数据平台天然的分布式流处理框架Spark,打造高覆盖、实时性强的报警系统,有效减少人工规则的参与,减少维护。成本。本文主要从“基于深度学习的时序预测算法”和“基于算法结合Spark流处理的实时报警”两个方面来介绍这个报警系统。框架图如下图所示:1.基于深度学习的时间序列预测算法使用该算法监控时间序列数据的常规思路是通过对比实时数据来比较此时的预测值将此时的值与之前几个时间点的时间序列数据进行对比。因此,告警的第一步是做好时序预测,即时序分析。引用百度文库对时间序列分析原理的介绍:“承认事物发展的连续性,事物的现实是历史发展的结果,事物的未来是现实的延伸。过去和未来时间序列分析预测方法的哲学基础是唯物辩证法的基本观点,即认为一切事物都在发展变化,事物的发展变化在时间上具有连续性”时间序列分析的过程分为以下三个步骤:Step1:数据预处理;Step2:核心指标分类;Step3:算法训练模型选择。善用数据就是数据好用,所以所有数据分析工作的第一步都必须先经过数据预处理,主要包括数据清洗和特征提取,时间序列预测是根据历史数据预测未来。历史数据中的“空值”和“异常值”会极大地影响预测的质量,因此在训练预测模型之前,需要对训练集的时间序列数据进行清洗,可以先将数据作图,直观查看是否有周期性,然后填入空值,具体的填充方法可以根据原序列周期性明显的情况,可以取多个h的平均值这个时间点的历史周期。如果没有明显的周期性,可以用前后两点的平均值代替,异常值同理。对于时间序列分析的特征提取,业界常采用滑动窗口时间序列特征分析的方法,即比较多个时间窗口之间的数据的统计均值、方差、协方差等,分解其组成成分时间序列。时间序列的成分分为三种:长期趋势(T):一段时间后序列的整体上升或下降趋势;季节性(S):周期性固定变化;余数(一):时间序列去除趋势和季节性后的偶然波动称为随机性,也称为不规则波动,属于正常现象。长期趋势(T)、季节性波动(S)和余数(I)与分类场景提取的特征不同,用于模型训练。这里特征提取的季节性波动和余数将服务于下一步的指标分类。2.核心指标分类对于核心指标的时间序列预测,需要对时间序列数据的成分进行分解,并预先进行预分类。参考业界对时间序列预测指标的分类方法,以是否周期性、是否稳定这两个标准分为以下四类,并以集群环境的真实指标来说明:(1)周期稳定(2)周期不稳定(3))非周期稳定(4)非周期不稳定从算法的角度,我们提出了一种基于时间序列分解、观察周期成分的指标类型判断方法对剩余项进行方差分析:步骤1:时间序列分解算法将时间序列数据分解为“趋势成分”、“周期成分”和“剩余项”。通过观察周期成分,上面的第三张图(Seasonality)只有有明显的规律性波动才算是周期性的。第二步:对时间序列分解法分解后的“剩余项”进行方差分析。首先对“残差项”进行预处理,使用“归一化”处理方法将“残差项”归一化到[0,1]区间。然后计算“归一化余数”的方差,方差在一定的阈值内才能认为是稳定的。具体阈值的大小没有统一的标准。经过以上近百个指标的分析,最终的阈值是0.2。至此,黄金指标的类型分类已经完成。对于非周期性指标的监测,目前业界还没有很好的解决方案,主要采用同比、差值、阈值设置等经典规则方法。同一种方法不能解决所有类型指标的监控。使用新的算法并不意味着完全放弃一些旧的方法,所以我们在这里不再进一步讨论。对于周期性非平稳序列,可以使用粗粒度时间窗。例如,可以将原1分钟的点每5分钟求和或平均,处理成周期平稳序列。因此,本文主要针对经过上述分类处理得到的周期性平稳数据。3、基于LSTM算法的时间序列预测时间序列预测算法整体上分为两类:传统的基于统计的机器学习算法(注:简称机器学习算法,下同);基于神经网络的深度学习算法。常用的机器学习算法,如指数平滑法(holt-winters)、移动平均自回归模型(ARIMA)和加入周期分量的季节性移动平均自回归模型(SARIMAX);常用的深度学习算法,如深度神经网络(DNN)、递归神经网络(RNN)和解决RNN长期依赖问题的长短期记忆网络(LSTM)。考虑平台部署、稳定性等实际因素,将ARIMA和SARIMAX两种统计模型算法的实时性与深度学习模型LSTM算法进行比较,在真实环境下,多次比较取平均值,得到如下结果结论:可以看出,LSTM模型的训练和预测耗时远低于其他两个模型,另外两个模型的实时性无法满足要求;同时,它还需要对资源消耗和缺失值敏感。比别人好。因此,最终选择的是深度学习算法——LSTM。1)LSTM简介近年来,随着计算能力的飞速提升,在上个世纪末研究半壁江山的深度学习(DL)今天“重新升温”,在各个领域大放异彩。深度学习模仿大脑神经元之间的传递和处理信息的方式。其算法思想的理解需要一定的机器学习基础。以下仅作简要介绍。深度学习属于机器学习。与传统机器学习根据人工规则定义特征相比,深度学习阐明了特征学习的重要性。简单的深度学习算法包括深度神经网络DNN,通过逐层特征变换,将样本在原始空间中的特征表示变换到一个新的特征空间,通过结合低层次的特征,形成更抽象的高层表示属性类别或特征级特征。随着深度学习的深入研究,除了DNN之外,还有更多用于图像识别的卷积神经网络(CNN)和自然语言处理(NLP)中常用的循环神经网络(RNN)。因为它的输入是同一事物的多个时间点的数据,RNN不断循环信息以保证信息持久化,从而可以利用之前事件信息的特征来应用于时序分析。本文中的LSTM是一种特殊的循环神经网络RNN。它既具有RNN保存历史信息的功能,又解决了普通RNN存在的梯度消失和梯度爆炸的问题。LSTM的变种也很多,这里只给出简单LSTM的网络结构图。2)LSTM模型训练运行过程LSTM算法的时间序列预测方法是先根据指标的历史数据训练模型,然后根据当前数据预测指标的未来。以下具体操作使用Tensorflow框架。TensorFlow是一种以数据流图的形式进行数值计算的Tensor(张量:类似于多维数组)。第一步:将预处理后的数据转化为Tensorflow可接受的张量形式A:数据归一化(便于模型训练快速收敛);B:训练数据转换格式(X:x(1),...,x(n);Y:x(n+1));C:Reshape成指定形状的tensor。上面的过程用一个例子来说明,假设有时间序列数据(1,2,3,4,5,6,7,8,9),n设置为3,然后处理这个序列得到(1,2,3;4),(2,3,4;5),...,(7,8,9;10)共7个训练样本。然后转换为张量格式如下图:两个6维三阶张量X两个1维二阶张量YStep2:定义网络结构A:选择网络:这里使用LSTM网络;B:设置参数:输入层(层数,隐藏层神经元个数),输出层,timestep;C:初始化每个神经元之间的连接(权重)和偏差。Step3:网络训练A:设置优化器、损失函数、学习率、激活函数……;B:设置训练方法(epoch,batch_size)。Step4:生产预测A:保存模型;B:复用模型做预测,注意需要反规范化。经过以上过程,LSTM模型的训练就完成了。此时得到的网络结构格式如下(这里以一个简单的单隐层LSTM网络为例,非集群使用真实模型):2.算法结合Spark流处理实时报警中上一章,利用深度学习算法对指标进行了有效的预测。本章结合Spark流处理框架,将其应用于报警系统的生产部署。限于Spark现有的机器学习库MLlib缺乏深度学习算法,以及大数据组件和深度学习算法之间的语言兼容性。于是尝试在Spark中调用训练好的Tensorflow模型,即“Tensorflow离线训练,Spark实时预测”AI生产部署模式。具体分为以下几个步骤:将模型上传到HDFS;Yarn调度SparkStreaming加载PB模型;实时数据消耗和告警。涉及到以下引擎层和Hadoop底层:1.将模型上传到HDFS。将章节中的深度学习算法模型输出为可上传HDFS文件系统格式的文件,上传到集群HDFS。首先对深度学习模型的存储方式进行简单的对比分析:通过以上对比分析,根据场景适用性、接口丰富性、开发语言兼容性等优点,最终选择了PB格式的存储方式.PB模型本质上是PB文件,是深度学习算法最终生成的二进制文件。需要通过Tensorflow框架进行读取和编译,最终在程序中形成预测模型。上传可以通过crontab定时上传,上传周期可调。2、Spark加载PB模型时,先将PB文件存储在HDFS上,然后通过SparkStreaming程序直接读取HDFS上的PB文件,然后使用Tensorflow框架将读取到的PB文件全部恢复到之前训练好的神经网络中网络。用于深度学习预测的网络模型。因为在生产环境中,程序处于OnYarn模式,以保证程序的高可用和高性能,所以所有的PB模型都是通过Spark程序的Driver组件统一生成,然后向下分发到各个Executor。该过程将在每个作业中执行。另外,由于使用了SparkStreaming框架,所以支持动态加载PB模型,即如果要更新PB模型,可以直接替换HDFS上的PB文件,程序可以识别新的PB文件,生成一个新的PB模型供后面的数据进行预测。动态更新PB模型调整预测规则。根据指标数据的实时变化,更有效地改变调整算法策略,使预测结果更加准确。整个程序基于SparkStreaming框架开发,可以保证实时性。在搭建好数据平台的基础上,所有的实时数据指标信息都会存储在Kafka消息队列中。程序实时消费Kafka获取当前指标数据,每次预测都会根据当前指标数据进行计算,得到的预测结果更符合真实值。上图展示了SparkStreaming的基本内部原理。SparkStreaming从实时数据流中访问数据,然后将它们分成小批次供后续的Spark引擎处理。因此,Spark以小批量的方式处理数据流。这正好符合我们的实际应用场景。数据实时接收,批量处理,结合深度学习算法,实现智能AI实时预测功能。3.数据的实时消费和告警为了防止瞬时异常导致模型失真,需要替换逻辑来保证模型的稳定性。我们使用外部应用Redis,因为Redis是一个内存数据库,具有速度快、存储类型多等丰富的特性,可以充分支持我们的存储需求。针对每一个需要预测的指标数据,设计了三个不同的数据集,分别是预测队列、真实队列和pb队列:预测队列是预测值队列,存放根据生成的预测值到深度学习算法;真实队列是真实值队列,存放的是从Kafka消息队列消费过来的真实数据;pb队列是模型输入队列,用于给PB模型注入数据。三个队列相互配合,保证模型的稳定性。首先,程序第一次启动时,需要积累足够的原始数据,填充到real队列和pb队列中。将数据填充到PB模型中,预测t+1分钟的数据,将t+1分钟的预测值填充到预测队列中。在t+1分钟,获取t+1分钟的真实值,根据特定的比较规则,将t+1分钟的真实值与t分钟预测的t+1分钟的预测值进行比较。如果真实值和预测值满足比较要求,则将t+1分钟的实际值填入pb队列,否则将t+1分钟的预测值填入pb队列,并保持需要的长度通过pb模型,去掉pb队列中最早的数据,用替换和改变的pb队列填充到PB模型中,预测t+2分钟的预测值。当上面的步骤执行够了,那么真实队列和预测队列已经积累了足够多的数据,时间会相互匹配,即真实队列的数据是t分钟到t+n分钟的真实值,而预测队列的数据是t+1分钟到t+n+1分钟的预测值,那么在t+n+1分钟,如果拿到t+n+1分钟的真实数据,就可以按照将每次的实际值和预测值相互比较,判断指标数据是否异常。如果比对结果中的异常时间点超过预定个数,则判断该指标异常,并立即发出告警,提醒运维人员检查维修。每个队列的长度和应用都做成配置项,可以随时更改。有详细的要求和规则来指定和约束每个不同预测模型的数据队列,以方便模型定制和调整,真正实现特定的预测。、特别预报和准确预报。3.总结整个报警系统平台,采用深度学习算法提高预测的准确性,结合SparkStreaming流处理框架,保证实时报警,减少人为规则的参与,减少维护运维人员的时间投入。自2019年底正式上线以来,现已稳定支持运营商核心指标业务实时监控,包括Kafka、HBase等大数据技术栈。平台正式运营以来,总召回率可达98%以上。由于核心业务更注重召回率,准确率略低,准确率维持在90%左右。同时,集群环境提供的容错性、可靠性以及SparkStreaming流处理提供的实时消费能力,大大降低了告警的时延,理论上可以从指标采集频率上实现毫秒级的延迟。