最近半年时间(2019年1月到今天),我和几个小伙伴参加了清华大学举办的【多维监测指标的异常定位】AI OPS比赛。总共327个队伍参加比赛,经过我们的努力,我们进入决赛,并且通过代码审核,成为最终进入决赛阶段的14个队伍中的一员。今天就是决赛的尾声,程序已经调通,正在调参等待结果,所以想借这个时间写点什么,对这段工作做一个总结。
多维度指标的异常定位是AI Ops领域的一个典型且有挑战的问题。在互联网服务运维中,当某个总指标(如总流量)发生异常时,需要快速准确地定位到是哪个交叉维度的细粒度指标(如“省份=北京 & 运营商=联通”的流量)的异常导致的,以便尽快做进一步的修复止损操作。由于运维中的指标维度多、每个维度取值范围大,导致异常定位时的搜索空间非常大(可能的搜索空间$2^{10000}$)。
本质上这是一个搜索问题,而不是传统机器学习比赛中的回归或者分类问题。所以,我们平时积累的机器学习技术能力只有很少的一部分能够使用。不过,从另一个角度来看,说明我们平时积累的技术有短板,正好通过这个机会补足。
接到这个比赛的任务的时间是今年1月初,当时官方给了参考资料如下,
经过一个多月的学习,我们大概对上面三个算法有所了解,三篇文章解决的思路为,
具体的论文导读,可以参考本文最后的附录。
预赛第一个阶段3月底结束,我们当时实现了Aditributor算法,最后的得分为0.18,而排行榜第一名的得分可以达到0.97(1为满分)。令人窒息,感觉这次果然是跨界打酱油了。我们决定果断放弃实现iDice,而是直接开始实现HotPot,希望可以得到比较理想的成绩。
预赛第二阶段,Hotspot那篇论文花了两到三周的时间琢磨整个算法,然后花了2周的时间实现,最后在5.1劳动节假期实现了完整版本,在预赛第二阶段的比赛中得到了0.49的得分,排名为18名。不过,在代码中有个bug(在预赛第三阶段才发现,所以导致得分不是特别理想)。
预赛第三阶段,找到了之前提到了那个bug,并修复,得分有大幅度提升,但是没有排到理想位置。后来,我们发现一个规律可以筛选出潜在候选集,然后使用MCTS在这个候选集中找到根因,可以极大的提升得分。并且,我们发现即使不需要MCTS,只需要在这个候选集合中直接计算PS,都可以得到比较好的结果。所以,我们认为MCTS的作用不是特别大。最终,在5月26日,我们用完了最后的提交机会,获得了0.64的分数,较稳的排在了前16的位置,进入了决赛。
决赛阶段只有一周时间,主要是将算法改为增量执行模式。在这个过程中,无法使用异常时刻之后的数据,这样会很大的影响KPI预测质量。现在,整个结果已调通并且提交可执行程序,等待组委会的最终排名。
经过这次比赛,本人还收获了不少,
着重阅读第3章,算法介绍。第4章将算法扩展到衍生指标,与本次比赛无关,有兴趣的同学可以看下。其他章节是背景介绍,问题定义,实验等。算法核心规则如下,
第四章介绍iDice核心算法。核心算法主要分为三部分,
Impact based Prunning
Change Dection based Pruning
Isolation Power based Pruning
此论文核心思想有三个