什么是智能运维?
智能运维,AIOps起源是“Algorithmic IT Operations”,算法IT运维。而在AI发展最热的几年里,又赋予了它新的意义“Artificial Intelligence for IT Operation”,也就是人工智能IT运维。Gartner对AIOps的定义是:
“AIOps平台利用大数据,现代机器学习和其他高级分析技术,以主动,个性化和动态的见解直接或间接地增强IT操作(监视,自动化和服务台)的功能。AIOps平台允许并发使用多个数据源,数据收集方法,分析(实时和深度)技术以及表示技术。”
本篇文章带来的是在智能运维场景的常见任务“告警聚类”的一种基于度量学习的应用方案。这是一种基于距离的有监督聚类算法,在较小的训练数据集上训练出距离计算模型,并依此进行告警聚类。这种方案在一定程度上巧妙地解决了一些在网络运维场景的特征处理挑战,只用了少量的标注数据训练但取得了较好的聚类效果。
业务背景
光传送(OTN)网络现网每天都会产生大量告警,其中大部分告警都是衍生告警导致定位到故障根因告警的难度大幅增加。现网运维成本高,人工运维效率低,不能及时有效解决每天发生的故障并消除相关告警。为了降低现网运维成本,需要使用AI算法快速、准确地将属于一组的告警归类,并找出其中的根因告警进行上报。
现网中采集的告警信息有告警名、告警拓扑信息、发生和清除时间等。我们标注了一段连续时间内的几百条告警,作为参考和训练数据。在告警聚类中,人工判断两组告警是否属于一组主要参考告警的拓扑信息和时间。拓扑信息是网络结构信息,包括了告警元信息和告警路径信息。网络结构可以抽象为一个图,网元是图的点,路径是图的边。路径比较特殊的一点是它们是分层的,一个层级较高的路径可能对应由一个或多个低层路径承载。对于两组告警,如果它们在拓扑图上具有相同的点、具有相关的边,并且具有接近的时间,则它们是一组告警的可能性较大。
图1、告警聚类举例
在这个问题中,有几个难以处理的挑战,给解决问题带来了很大 麻烦。
挑战1:数据如何处理?
拓扑信息和告警名为字符串,不像数字可以进行比较大小,计算差值。
字符串的取值在真实网络环境中无法被穷举。
看到这里,很多人的想法是使用One-hot编码。但第二点限制了它,这是不太可取的。如果我们取了100条字符串取值做One-hot,未出现的值用一个新位表示,特征向量就是。假设真实网络环境有10,000种取值,那9,900种取值的表示都是。用One-hot表示都是相同的,而它们彼此之间应该是不同的,因此用One-hot是不合理的。
挑战2:模型效果和泛用性?
可参考和用于训练的标注集仅有数百条数据,数据量远小于真实网络中的情况。
数百条标注数据的数据集在网络运维场景下能覆盖的场景实在是冰山一角,巧妇难为无米之炊,难以保障模型的效果和泛用性。
对于数据处理的挑战,我们认为可以引入一种“相对特征”的想法。处理单条告警数据,我们可能对这种字符串特征束手无策,但研究两个告警它们之间的关系时,就有更合理的方法了。判断两告警对应字段的字符串是否相等只有两种可能,求字符串相似度可以进行量化表示。如果它们的告警名(或告警元等)一样,则可能关系密切,不一样的话可能相关度较低。这样我们并不需要知道字符串所有的取值,对未出现过的字符串取值也可以处理,避开了难点。如果说相等的条件比较苛刻,会损失信息,则可以使用多种方式,提取多位特征。例如提取字符串前缀和后缀,判断是否相等,并作为“相对特征”向量的新维度。这种“相对特征”在聚类中是可以很好地使用的,聚类的核心是数据之间的相似度数据,“相对特征”刚好可以作为计算它们相似度的特征。
接下来说我们的聚类应用。聚类的三个重要点是:相似度计算、聚类算法、特征处理。对于相似度计算,由于上文特征处理提到的“相对特征”的原因,需要我们自行进行计算。这就引出了我们在摘要中提到的度量学习。度量学习是根据不同的任务来自主学习出针对某个特定任务的度量距离函数。这就就是对相似度计算任务进行建模,两告警之间的相似度就是“距离”,“距离”越大则两告警差别越大,相似度越小,是一组告警的可能性较小。我们建立了回归模型,模型输入两告警之间比较的相对特征,输出两告警的距离。
对于训练数据,标记为一组的两个告警,我们期望得到的距离结果是0,非一组的两个告警,距离期望值则是1。为了让距离建模体现出时间特征的连续性,我们还进行了一些改进:对出现的告警组按时间顺序编号,编号差乘以较小的权重与距离期望值相加作为最终距离。
在距离计算模型中,特征之间是非线性相关的。因此我们最终选用了回归树模型类的XGBoost算法。它具有优秀的性能,训练速度很快,并且易用性也非常高,曾经在各大机器学习比赛中大放异彩,并且在原理上,与问题具有一定的相似度。
而在最终的聚类算法这里,我们应当注意一个问题。我们拿到一组告警时,是不可能预知聚类的簇数的。理所当然地,我们应当使用变化的簇数或是使用不需要指定聚类数量的算法。得益于距离计算模型给出较准确的距离,我们最终使用了不需要指定聚类数量的算法——基于距离阈值的层次聚类。它运行时,每次将最近的两个(或组)项聚为一组,直到它们的距离超过这个阈值就停止。在思考方式上,它是这样的流程:每次将两个(或组)最相似的告警划为一起,直到它们之间的相似度比较低,我们认为它们不是一组,则聚类停止。
这个聚类算法有两个比较重要的参数,是连接方式和阈值:
linkage(连接方式):用集合中点的距离,计算集合的距离。在使用距离矩阵的时候有三种方式complete, average, single。complete是取两集合中距离最远的点的距离,average是取距离的平均数,single是取距离最近的点的距离。在本问题中,很可能会出现两告警的距离很远(单独看不属于一组告警),但同时与另一个告警距离非常近(与第三个告警比较属于一组告警)。此时应当划为一组,single连接方式取集合中最近的点距离更合适,实际效果也更好。
Threshold(距离阈值):当聚类过程中所有的点和集合的距离都超过这个阈值,则聚类结束。值越小,簇的数量越多,值越大,簇的数量越少。由于我们距离计算模型期望告警是一组的时候距离为0,否则距离为1。因此此阈值应当在0-1中取值,理论上应当是0.5,可以依据情况进行调整。
这张图展示了我们这个基于度量学习的聚类方案:
最终我们在测试集上取得了ARI=0.9556的成绩,具有较好的效果和泛用性。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/301825.html