首屆AIOps挑戰賽——冠軍LogicMonitor-AI團隊方案分享

技術瑣話發表於2018-12-13

首屆AIOps挑戰賽——冠軍LogicMonitor-AI團隊方案分享

前言

為了解決網際網路運維難題(故障發現、故障止損、故障修復、故障規避等),我們籌辦了AIOps挑戰賽,旨在藉助社群的力量,運用人工智慧演算法解決各類運維難題。挑戰賽網站於2017年12月1日上線了它的第一個挑戰賽——KPI異常檢測挑戰賽,發力解決運維領域最大的痛點之一——異常檢測。挑戰賽所用資料來自於搜狗、騰訊遊戲、eBay、百度、阿里巴巴等國內外一流網際網路公司的真實運維環境。挑戰賽吸引了三百多名選手組成的125支隊伍參加比賽,且最終有40支隊伍提交了比賽結果。經過4個月的初賽、1個月的決賽後,2018年5月19日於北京,舉行了AIOps挑戰賽決賽暨首屆AIOps研討會,進行了KPI異常檢測挑戰賽的決賽答辯,角逐出了冠亞季軍,分享了近10萬元的獎金池。   

本文是冠軍團隊LogicMonitor-AI成員姚睿,應邀所作的關於其解決方案的總結。 

概覽

異常檢測是智慧運維(AIOps)系統中一項基礎且重要功能,其旨在透過演算法自動地發現KPI時間序列資料中的異常波動,為後續的告警、自動止損、根因分析等提供決策依據。在實際場景下,由於異常點資料稀少,異常型別多樣以及KPI型別多樣,給異常檢測帶來了很大的挑戰。

本文整理了LogicMonitor-AI團隊在AIOps決賽暨首屆AIOps研討會中的分享內容,主要介紹了我們在AIOps異常檢測競賽中的演算法設計思路和實現細節。

團隊簡介

首屆AIOps挑戰賽——冠軍LogicMonitor-AI團隊方案分享

我們來自於雲智易控科技(LogicMonitor),LogicMonitor是基於SaaS模式的企業級IT效能監控平臺,提供業界領先的監控解決方案,目前服務全球超過1000家客戶。LogicMonitor-AI團隊主要專注於AIOps產品的研發,致力於推動AIOps在監控領域的落地。

首屆AIOps挑戰賽——冠軍LogicMonitor-AI團隊方案分享

接下來主要分三部分來介紹:

• 首先介紹這次競賽的背景和需求,在此基礎上給出我們方案的設計原則

• 第二部分會詳細介紹這次競賽中使用的演算法方案

• 最後探討方案的不足與改進計劃

需求分析

首屆AIOps挑戰賽——冠軍LogicMonitor-AI團隊方案分享

有部分同學可能不是太瞭解競賽的規則,這裡先簡單介紹下。

問題描述

在競賽中,主辦方提供了兩份資料集,分別用作訓練和測試,資料集由若干KPI時間序列組成,這些資料都來源於真實的運維場景。訓練資料事先由運維人員手工標註出了異常段,要求根據訓練資料生成模型並對測試資料進行異常檢測(即對每個資料點標註是否為異常點)。

評估

透過對比測試集上模型的檢測結果與真實標註資料,計算F-Score作為演算法的評估標準,考察演算法的精準率和召回率。通常情況下,運維人員往往只關心異常檢測演算法能否檢測到某一連續異常區間,而非檢測到該異常區間的每一個異常點。因此,對於連續的異常段,規定了時效性視窗,只要在視窗內檢出異常點,那麼該異常段都算作成功檢出,否則都判為失敗。

考慮到演算法的實用性,競賽還補充了幾點規則:

• 禁用手工干預:在模型訓練階段,不允許手動地建立從“KPI曲線ID或KPI曲線計算得出的特徵”到“演算法和引數”的一一對映。即在模型訓練階段,不允許手動針對一條特定的KPI曲線進行演算法的選擇和引數的調優。

• 禁用未來資訊:不允許參賽演算法使用未來點的資訊對當前點的異常做出判斷

關於這兩點規則,放到實際應用場景下很好理解。在實際監控系統中,首先,KPI資料規模是非常大的,幾乎不可能針對每條KPI手工地去配置演算法、引數以及調優。那麼就要求演算法足夠的穩定和普適。其次,異常檢測往往需要實時地對資料點進行判定,自然也是無法利用未來資訊來幫助判定。

設計原則

基於以上需求分析,我們確立了以下幾條設計原則:

• 監督學習:因為資料本身是帶標註的,自然很適合用監督學習來進行訓練

• 自動化:為了避免手工干預,我們需要將整個機器學習流程設計為自動化的方式,同時在演算法模型選擇上儘量避免調參需求高的模型。實際上,在決賽中,我們全程是無法接觸到資料以及程式執行過程的,這一點也要求方案本身有較高的魯棒性。

• 流處理:按流處理的方式對測試資料進行特徵提取並實時進行異常檢測,避免使用到未來資料。在特徵方面,需要選擇能夠透過流式獲取到的特徵,避免使用批處理方式提取特徵。

在以上三點的基礎上,兼顧普適性:

 框架通用,適用於相同場景下的其他資料集

• 實現簡單,流程清晰,易維護

• 效能良好,滿足真實生產環境需求

• 演算法表現穩定

方案詳解

首屆AIOps挑戰賽——冠軍LogicMonitor-AI團隊方案分享

我們將異常檢測作為二分類問題來處理,按照機器學習流程分為四個階段:預處理,特徵提取,模型訓練和最後的異常檢測。

技術棧方面,整個方案透過Python來進行實現,用到的主要工具包括:Keras, Numpy,Pandas和Sklearn。

首屆AIOps挑戰賽——冠軍LogicMonitor-AI團隊方案分享

在預處理過程中,我們首先面對的一個挑戰是樣本極度不平衡,這也是異常檢測問題的主要特點。如圖所示,在本次競賽中,異常樣本比例只有2%,遠遠低於正常樣本。在實際應用中,這個比例可能會更低。如果直接將樣本進行訓練,模型會傾向於將所有樣本預測為正常樣本,那麼將無法達到異常檢測的目的。

為了解決這個問題,我們嘗試了幾種方案

1. 對正常樣本進行欠取樣以達到正負樣本1:1,實驗發現這種方案因為丟失了大量的樣本資訊,模型會出現比較嚴重的過擬合,泛化效能不佳

2. 欠取樣加整合學習。這種方式雖然效果有所提升,但由於每個基分類器的正確率很低,整合後的效果也不是很理想

3. 異常樣本過取樣以達到正負樣本1:1,最後透過閾值進行決策調整。實測下來,這種方式的結果比較理想,成為了我們的最終方案。

首屆AIOps挑戰賽——冠軍LogicMonitor-AI團隊方案分享

在需求分析中,我們提到了競賽評估標準中有時效性需求,即對於一段連續異常,我們需要在首個異常點出現的後的時效視窗內檢出異常點。這句話怎麼理解呢?我們來看上面這幅圖,圖中紅點表示發生了一段連續異常,藍色框表示時效視窗,基於規則,我們需要在藍框包含的樣本點檢出異常,否則後續異常點即使判斷正確也會視作失敗。

自然地,起始端的異常樣本點價值是遠遠大於後續樣本的,因此我們需要增強該類樣本的權重以提升其價值。結合前面提到的樣本均衡策略,樣本權重增強也是透過過取樣來實現的。

這是預處理階段的第二個關鍵點。

首屆AIOps挑戰賽——冠軍LogicMonitor-AI團隊方案分享

接下來我們來看特徵提取,時間序列的重要特點是在時間維度上的相關性,即上下文資訊。所以我們不宜直接將單個資料點作為樣本來訓練,而需要將上下文特徵提取出來。

異常往往意味著某個維度上的突變,可能是原始值的突變,也可能是均值、方差等統計量的突變,透過前後對比能夠很好的捕捉到這類變化。

考慮到這些特點,我們透過三種方式來獲取特徵

第一類,透過滑動視窗,提取該視窗類資料的統計特徵

第二類,透過序列前後值的對比,得到對位元徵

第三類,結合滑動視窗和對比,得到比統計特徵

上圖示意了,在T時刻,透過三種方式獲取T時刻對應的不同特徵。

首屆AIOps挑戰賽——冠軍LogicMonitor-AI團隊方案分享

統計特徵方面,我們主要使用了均值、方差和分位數等

對位元徵方面,使用了差分和變化比例這兩種對比方式,差分代表了絕對變化,變化比例則是相對值。需要注意的是,變化比例在原始資料接近0時很容易出現畸變,所以某些場景下不是太好用。

另外我們選擇了不同的視窗寬度來進行特徵提取,所以總的特徵集是視窗寬度、統計特徵、對位元徵的交叉組合。

上圖右側是特徵提取的一個例子,將原始資料轉換到方差差分特徵空間後,異常樣本的辨識度明顯提升,這也利於後續模型訓練和識別。

首屆AIOps挑戰賽——冠軍LogicMonitor-AI團隊方案分享

關於模型,我們主要考量有兩點,第一能夠適應較大的樣本量,第二是能夠自適應地控制過擬合,因為樣本不均衡容易帶來嚴重的過擬合,還有一點是希望模型超引數夠少,儘量避免人工調參。

我們測試過三種模型:

第一個是IsolationForest,這是一種常用的異常檢測模型,但由於它對區域性異常不敏感,在這個問題上表現欠佳

第二個是隨機森林,作為一種整合模型,總體表現很穩定,泛化能力也不錯,實測結果略低於DNN

最終的選擇方案是深度學習模型,主要考慮到模型有足夠的表達能力,能適應大資料,泛化能力強。實測下來,表現也是非常的好。

首屆AIOps挑戰賽——冠軍LogicMonitor-AI團隊方案分享

這是我們最終使用的深度模型,有兩個全連線隱層和一個Sigmoid輸出層,兩個隱藏神經元數量都是128。透過Dropout和L1正則化控制模型的過擬合,以增強泛化能力。

DNN輸出資料點的異常機率,再透過閾值進行二分類。閾值如何確定呢?以F-Score作為評估標準,透過網格搜尋的方式確定最優閾值。這裡使用閾值的目的主要是為了修正樣本不均帶來的偏斜。

首屆AIOps挑戰賽——冠軍LogicMonitor-AI團隊方案分享

普適性上,我們做到了以下幾點:

• 通用:在競賽中,所有KPI的異常檢測都能透過一套框架來解決,這套方案也可以很容易地推廣到類似的場景和問題,且容易實現和維護。

• 自動:整套流程無需人工介入,演算法模型有較高的自適應能力

• 效能:對於普通監控資料(分鐘級取樣),單個KPI的模型訓練時間在3分鐘以內(單機,單GPU),流處理情況下單資料點檢測時間在毫秒級,基本滿足生產環境需求。

• 穩定:在不同資料集上,演算法的評估分數非常一致和穩定

首屆AIOps挑戰賽——冠軍LogicMonitor-AI團隊方案分享

最後來看一下這套演算法方案的評估結果,上圖列出了演算法在預賽訓練集、預賽測試集以及決賽測試集上的F-Score得分,在三個不同資料集上,得分穩定在0.8左右,表現非常穩定,有不錯的泛化能力。

首屆AIOps挑戰賽——冠軍LogicMonitor-AI團隊方案分享

在測試集標註公開以後,我們對演算法的誤報、漏報情況做過分析,發現目前還存在這樣一些不足:

• 有些異常模式只存在於測試集中,模型無法從訓練集中學習出該模式,這類異常容易出現漏報

• 部分異常在區域性不明顯,只能透過週期同比的方式發現,這類也容易出現漏報

針對這些問題,我們後續計劃從以下幾點對方案做進一步的最佳化

• 引入週期或時間相關的特徵,比如週期同比、星期、小時等維度,用於發現這類維度上異常

• 整合無監督模型,以適應異常樣本極度稀少或分佈不均的情況

• 提供整合業務規則的能力,以支援業務規則下的異常檢測

總結

本文以AIOps挑戰賽為背景,介紹了LogicMonitor-AI團隊對異常檢測的理解和思考,分享了詳細的演算法方案。該方案通用性強,高效且演算法表現穩定,適用於有標註的KPI異常檢測問題。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31562044/viewspace-2285169/,如需轉載,請註明出處,否則將追究法律責任。

相關文章