Taboola是世界上最大的内容推荐公司之一。我们在世界各地的多个数据中心维护了数百个服务器,同时有义务严格的SLA。因此,您可能会理解为什么当系统过载时,我们的工程师会欣赏一点点抬头。与当今大多数公司一样,我们使用指标来可视化我们的服务健康,我们的挑战是创建一个自动系统,它会尽快检测多个指标的问题,而不会发生任何性能影响。
一个真实的例子
如果我们能够预测对我们的响应时间指标的影响,那么当主要事件即将发生时不会好?例如,“黑色星期五”,“网络星期一”甚至是“科比布莱恩特的悲剧”,在26/1/2020?- 如下所示:
图1:Kobe Bryant的停机时间26/1/20
是的 - 在26/1周围没有指标的差距是我们的停机时间......
我们目前的异常检测引擎通过使用添加剂回归模型来预测关键的指标行为,结合每日,每周和每月季节性季节性定义的非线性趋势FBProcet.。今天,我们将单个指标作为输入,并预测其接下来的24小时的行为。最近,我们基于作为异常检测引擎的输入的多个指标来预测我们整个数据中心的健康感兴趣。动机是解决在一个度量标准中检测到异常的常用情况 - 但没有真正的问题,其中几个不同度量的多个异常可能表明有些错误的信心。
我们可以做得更好吗?
在此博客中,我们将在一次以上的度量标准时描述时间序列异常检测的方法。我们的演示使用了无人监督的学习方法,特别是LSTM神经网络与AutoEncoder架构,它在Python中实现凯拉斯。
我们的目标是to改善当前的异常检测引擎,我们计划通过建模来实现这一点数据的结构/分发,以了解更多信息。在我们的情况下,我们将使用系统健康指标,我们将尝试使用我们模型的重建错误(更详细)来模拟系统的正常行为。如果重建误差高于常规,我们将其定义为异常。
异常检测可以建模为分类和回归问题。在分类中,我们通常需要标记数据(至少对于一些样本),然后我们训练模型以区分标记为正常与标记为异常的样本。在我们的情况下,我们没有标记数据。因此,我们选择将问题建模为回归问题,我们尝试量化模型的重建错误。我们的假设是重复事件易于重建,因为系统大多是健康的,健康的事件丰富,而不健康的事件很少见。因此,误差越高,我们可以更自信地是当前样本是异常的。
一些预处理早餐
让我们首先检查我们的数据集,如下表#1所示,有6个不同的重要系统健康指标。这些指标以较大的规模彼此不同。
约会时间 | 要求率 | 请求速度在5分钟窗口中 | 失败的请求 速度 |
成功的要求 速度 |
请求响应时间p95(ms) | 请求响应时间P99(MS) |
04.11.2020 0:00 | 8,783 | 8,842 | 142,618 | 7,983 | 310.40 | 398.37 |
04.11.2020 0:05 | 9,971 | 10,307 | 170,124 | 7,319 | 306.07 | 399.30. |
04.11.2020 0:10 | 9,798 | 9,836. | 152,490 | 7,331 | 304.69 | 395.92 |
04.11.2020 0:15 | 9,879. | 9,939 | 153661 | 7,617 | 308.57 | 404.71 |
04.11.2020 0:20 | 10,086 | 10,158 | 153,972 | 7,188 | 306.93 | 400.64 |
表格1:我们数据集的示例。用作具有AutoEncoder模型的LSTM的输入的指标,并在整个数据中心计算,每个数据中心都有> = 100个服务器。
我们选择通过使用来规范数据集最大max scaler.:
#python#确保所有数据都是float值= value.astype('float32')#归一化特征scaler = minmaxscaler(feature_range =(0,1))scaled = scaler.fit_transform(值)
这是归一化之后的数据集:
约会时间 | 要求率 | 请求速度在5分钟窗口中 | 失败的请求 速度 |
成功的要求 速度 |
请求响应时间p95(ms) | 请求响应时间P99(MS) |
04.11.2020 0:00 | 0.37637 | 0.38709 | 0.34508 | 0.27990 | 0.26912 | 0.0533 |
04.11.2020 0:05 | 0.42730. | 0.45124 | 0.41163 | 0.25659. | 0.26165 | 0.05412 |
04.11.2020 0:10 | 0.41988 | 0.43063 | 0.36896. | 0.25701. | 0.25927 | 0.05127 |
04.11.2020 0:15 | 0.42334 | 0.43511 | 0.37179 | 0.26704 | 0.26598 | 0.05867 |
04.11.2020 0:20 | 0.43223 | 0.44470. | 0.37255 | 0.2520。 | 0.26314 | 0.05525. |
表2.:使用MIN MAX Scaler后的归一化数据集的示例。
选择模型或者乐趣开始的地方......
我们决定使用LSTM.(即,长期内记忆模型),人工复发性神经网络(RNN)。该网络基于RNN的基本结构,其被设计为处理顺序数据,其中从上一步的输出被馈送为电流步骤。LSTM是一个改进的Vanilla RNN版本,有三个不同的“记忆”门:忘记门那输入门和输出门。忘记门控制单元格状态中的哪些信息忘记,给定从输入门输入的新信息。我们的数据是一个时间序列,LSTM适合它,因此,选择作为我们问题的基本解决方案。
由于我们的目标不仅预测了一个单一的指标,而且为了在所有指标中找到一个全球异常,因此LSTM独自无法为我们提供我们需要的全球视角,因此我们决定添加AutoEncoder。
图2:autoencoder架构
一个autoencoder.是一种人工神经网络,用于以无监督的方式学习高效的数据编码。AutoEncoder的目标是使用编码和解码来学习一组数据的潜在表示。通过这样做,神经网络了解数据中最重要的功能。解码后,我们可以将输入与输出进行比较并检查差异。如果存在很大差异(重建损失高)然后我们可以假设模型在重建数据中努力,因此,该数据点被怀疑为异常。
这LSTM AutoEncoder.是使用编码器解码器LSTM架构的顺序数据的AutoEncoder的实现。通过使用此模型,我们可以具有两种模型的好处。
午餐时间
LSTM模型
#python self.model.add(lstm(单位= 64,input_shape =(self.train_x.shape [1],self.train_x.shape [2]))self.model.add(丢弃(速率= 0.2))selfim.model.add(repectVector(n = self.train_x.shape [1])self.model.add(lstm(单位= 64,return_sequences = true)self.model.add(丢弃(速率= 0.2))自我.model.add(timedistRibuted(dimedistRibuted(self.train_x.shape [2]))self.model.compile(优化程序='adam',lock ='mae')
合身
self.history = self.fit(self.train_x,self.train_y,epochs = 50,bath_size = 72,validation_split = 0.1,shuffle = false)
对于培训,我们使用的是上述健康指标的功能,我们的目标是预测不久的将来的数据中心健康。
让我们专注于第9行:
- 训练_X.是一个在某个时间点包含服务器健康指标的矢量。
- Train_y.是一个在稍后的时间点包含相同度量的矢量。
笔记:我们正在使用洗牌=错误的在第9行中,因为在时间序列数据中,订单很重要。
预测
#python x_test_pred = self.model.predict(self.test_x)test_mae_loss = np.mean(np.abs(x_test_pred - self.test_x),axace = 1)test_mae_loss_avg_vector = np.mean(test_mae_loss,axis = 1)
对于我们的“重建错误”,我们使用了平均值错误(MAE),因为它给了我们最佳结果与均值平方误差(MSE)和均方根平方误差(RMSE)相比。在两个MSE和RMSE中,在平均误差之前,错误被平方,这导致更高的重量给出更大的错误。这导致模型对噪声更敏感可能导致误报。自从我们的数据是嘈杂的自然界,我们定义了(商业决定)“异常”是飙升或持续至少10分钟的趋势。因此,在该模型中,我们需要一个损失函数,这些损失函数更像是一个特征或两个的小尖峰。
考虑到这一点,让我们开始绘制!
静态阈值
最重要的是决定异常的方式可能是:“任何大于固定阈值的东西被认为是异常的,否则正常“。
数字3.呈现重建误差,该误差是由平均绝对误差(MAE)测量的。另外,我们绘制了一个静态阈值这是计算的总体平均值+ 2个STD步骤在整个训练有素的数据上的MAE。在图4.我们可以看到根据定义的静态阈值检测为异常的点,绘制在总成功请求率实际数据上。
图3.:静态阈值随着时间的推移平均损失
图4:总成功请求率异常,使用静态阈值
我们区分了两种类型的异常:a局部异常(绿色当单个度量丢失交叉阈值时,触发点)全球异常(黄色的点)当均衡的损失时被触发所有指标跨越阈值(低于局部异常阈值)。当触发本地和全球异常时,我们将其彩色彩色粉色的。
动态阈值
图4是嘈杂的,并且在我们知道的同时是一个吵闹的,充满异常。“噪音”是季节性,这使我们意识到我们应该使用对数据行为敏感的动态阈值。
我们可以通过使用滚动均值来改变静态阈值指数意味着,如下图所示。
图5:随着时间的推移损失,静态和动态阈值
图5显示了具有静态阈值的度量值的平均损失绿色,滚动平均阈值橘子,并指数均值阈值红色的。
我们决定使用EMA.(即,指数移动平均值)检测异常的阈值。
alpha是平滑参数。较高的alpha值将为上次数据点提供更大的权重,这将使模型更敏感。
以下是使用EMA的结果总成功请求率指标。
图6:总成功请求率异常
成功!指数均值阈值较小,在这里我们预测了一个专业
在灾难真的发生之前,在成功的动作转换公制下降!
比对更好的聪明
在实施LSTM模型时,我们尝试了两种不同的策略批量模型和钩模型。
- 批量模型
此模型立即获取所有数据,将其分成列车和测试集。
批处理越大 - 模型越准确,而且在资源中更昂贵,并修剪漂移和数据的变化。 - 块模型
此模型获取小块中的数据(例如,5分钟块)并在线更新。该模型有时比批量模型不太准确,但它更为动态。
总共,
我们建议使用批量模型进行POC,以估计模型的良好。在生产中,数据大多来自流,因此块模型更好。
沙漠的金色模型还
我们选择以下参数来使用上述架构创建最佳模型。
- train_size = 0.7
- epochs = 50.
- batch_size = 72.
- n_nodes = 64.
- time_steps(我们想要预测有多少时间步骤,每次步骤都是5分钟,所以6时间步骤=预测30分钟)= 6
- prediction_size(我们希望在我们的预测图中呈现多少天)= 1
我们在github上!
致谢
这个blogpost是由米奇塔尔和Matan Anavi.,本科生来自本吉尔大学的软件和信息系统工程,谁被思考了四个月星舰Taboola Mentors的实习计划盖伊盖恩和加里卡兹。