為什麼說 Flink + AI 值得期待?

去年11月的 Flink Forward Asia 2019 上Flink 社區提出了未來發展的幾個主要方向,其中之一就是擁抱AI [1]。實際上,近年來AI 持續火熱,各種計算框架、模型和算法層出不窮,從某種角度上來說,這個賽道已經有些擁擠了。在這種情況下, Flink將怎樣擁抱AI,又會為用戶帶來什麼新的價值?Flink AI 的優劣勢分別在哪裡?本文將通過對這些問題的討論來分析Flink AI 的發展方向。

Lambda架構,流批統一和AI實時化

Flink 在AI 中的價值其實和大數據中Lambda架構 [2]和流批統一這兩個概念有關係,Flink為大數據實時化帶來的價值也將同樣使AI受益。

不妨讓我們簡單回顧一下大數據的發展過程。從Google奠基性的“三架馬車” [3][4][5] 論文發表後的很長一段時間內,大數據的發展主線上都只有批計算的身影。後來隨著大家認識到數據時效性的重要作用,Twitter 開源的流計算引擎Storm [6] 紅極一時,各種流計算引擎也紛紛登場,其中也包括了Flink。由於成本、計算準確性和容錯性等方面的考慮,各家企業紛紛使用起了被稱為Lambda架構的解決方案,在同一個架構下融合批計算和流計算,以便在成本,容錯和數據時效性之間達到一個平衡。

Lambda架構在解決數據時效性的同時也存在一些問題,其中最受詬病的就是其系統複雜度和可維護性。用戶需要為Batch Layer 和 Speed Layer 各維護一套引擎和代碼,還需要保證二者之間的計算邏輯完全一致(圖1)。

圖1

為了解決這個問題,各個計算引擎不約而同的開始了流批統一的嘗試,試圖使用同一套引擎來執行流和批的任務(圖2)。經過若干年的大浪淘沙,Spark [7] 和Flink成為了目前處於第一梯隊的兩款主流計算引擎。Flink 是從流計算逐漸進入到批計算,一個非常典型的成功案例就是使用同一套標準的SQL語句對流和批進行查詢,並保證最終結果一致性[8]。而Spark 則是採用微批 (Micro Batch) 的方式從批計算進入到流計算提出了Spark Streaming,但是在時延的表現上始終遜色一些。

圖2

可以看到,在大數據的發展過程中,Lambda架構和流批一體背後的原始驅動力是數據實時化。同樣是向數據要價值,AI對數據時效性的要求同大數據是一致的。

因此AI實時化也將會是一個重要的發展方向。在觀察目前主流的AI場景和技術架構時,我們也會發現它們與大數據平臺有很多聯繫和相似之處。

目前的 AI大致可以分為數據預處理(也稱數據準備/特徵工程等)模型訓練推理預測三個主要階段。下面我們逐一來看一看在每個階段中AI實時化需求有哪些,又有什麼樣的問題待解決。為了便於與大數據的架構做類比,我們姑且認為流計算和批計算作為一種計算類型的劃分維度已經將所有基於數據的計算一分為二,沒有遺漏了。AI的各個階段根據場景不同,也可以歸為二者之一。

數據預處理(數據準備/特徵工程)

數據預處理階段是模型訓練和推理預測的前置環節,很多時候它更多的是一個大數據問題。根據數據預處理後的下游不同,數據預處理可能是批計算也可能是流計算,計算類型和下游一致。在一個典型的離線訓練(批計算)和在線預測(流計算)場景下,訓練和預測時要求產生輸入數據的預處理邏輯是一致的(比如相同的樣本拼接邏輯),這裡的需求和Lambda架構中的需求一樣,因此一個流批統一的引擎會格外有優勢。這樣可以避免批作業和流作業使用兩個不同的引擎,省去了維護邏輯一致的兩套代碼的麻煩。

模型訓練

目前而言AI訓練階段基本上是批計算(離線訓練)產生靜態模型(Static Model)的過程。這是因為目前絕大多數的模型是基於獨立同分布(IID)的統計規律實現的,也就是從大量的訓練樣本中找到特徵和標籤之間的統計相關性(Correlation),這些統計相關性通常不會突然變化,因此在一批樣本上訓練出的數據在另一批具有相同的特徵分佈的樣本上依然適用。然而這樣的離線模型訓練產生的靜態模型依然可能存在一些問題。

首先樣本數據可能隨著時間推移會發生分佈變化,這種情況下,在線預測的樣本分佈和訓練樣本的分佈會產生偏移,從而使模型預測的效果變差。因此靜態模型通常需要重新訓練,這可以是一個定期過程或者通過對樣本和模型的預測效果進行監控來實現(注意這裡的監控本身其實是一個典型的流計算需求)。

另外,在有些場景下,預測階段的樣本分佈可能無法在訓練階段就知曉。舉例來說,在阿里雙十一,微博熱搜,高頻交易等這類樣本分佈可能發生無法預測的分佈改變的場景下,如何迅速更新模型來得到更好的預測結果是十分有價值的。

因此一個理想的AI計算架構中,應該把如何及時更新模型納入考慮。在這方面流計算也有著一些獨特的優勢。事實上,阿里巴巴在搜索推薦系統中已經在使用在線機器學習,並且在雙十一這樣的場景下取得了良好的效果。

推理預測

推理預測環節的環境和計算類型比較豐富,既有批處理(離線預測)又有流處理。流式預測又大致可以分為在線 (Online) 預測和近線 (Nearline) 預測。在線預測通常處於用戶訪問的關鍵鏈路(Critical Path中),因此對latency的要求極高,比如毫秒級。而近線預測要求略低一些,通常在亞秒級到秒級。目前大多數純流式分佈式計算(Native Stream Processing)引擎可以滿足近線數據預處理和預測的需求,而在線數據預處理和預測則通常需要將預測代碼寫進應用程序內部來滿足極致的低延遲要求。因此在線預測的場景也比較少看到大數據引擎的身影。在這方面Flink的Stateful Function [9] 是一個獨特的創新,Stateful Function的設計初衷是在Flink上通過若干有狀態的函數來構建一個在線應用,通過它可以做到超低延遲的在線預測服務,這樣用戶可以在離線,近線和在線三種場景下使用同一套代碼同一個引擎來進行數據預處理和預測。

綜上所述,可以看到在機器學習的每個主要階段中對AI實時化都有重要的需求,那什麼樣的系統架構能夠有效滿足這樣的需求呢?

Flink和AI實時化的架構

目前最典型的AI架構示例是離線訓練配合在線推理預測(圖3)。


圖3

正如之前提到的,這個架構存在兩個問題:

模型更新的週期通常比較長。離線和在線的預處理可能需要維護兩套代碼。


為了解決第一個問題,我們需要引入一個實時訓練的鏈路(圖4)。

圖4

在這個鏈路中,線上的數據在用於推理預測之外還會實時生成樣本並用於在線模型訓練。在這個過程中,模型是動態更新的,因此可以更好的契合樣本發生的變化。

不論是純在線還是純離線的鏈路,都並非適合所有的AI場景。和Lambda的思想類似,我們可以把兩者結合(圖5)。

圖5

同樣的,為了解決系統複雜度和可運維性的問題(也就是上面提到的第二個問題),我們希望在數據預處理的部分用一個流批統一的引擎來避免維護兩套代碼(圖6)。不僅如此,我們還需要數據預處理和推理預測能夠支持離線,近線和在線的各種Latency要求,所以使用Flink是一個非常合適的選擇。尤其是對於數據預處理環節而言,Flink 在流和批上全面完整的 SQL支持可以大大提高的開發效率。

圖 6

除此之外,為了進一步降低系統的複雜度,Flink也在模型訓練環節進行了一系列努力(圖7)。

流批一體算法庫Alink


在去年的 FFA 2019上,阿里巴巴宣佈開源了基於Flink的機器學習算法庫Alink [10],並計劃將其逐步貢獻回Apache Flink,作為Flink ML Lib隨Apache Flink發佈。除了離線學習的算法外,Alink的一大特色就是為用戶提供了在線學習算法,助推Flink在AI實時化上發揮更大的作用。


Deep Learning on Flink (flink-ai-extended [11])


幫助用戶把目前流行的深度學習框架(TensorFlow、PyTorch)整合到Flink中。使除了深度學習算法開發者之外的用戶可以基於Flink實現整套AI架構。


流批統一的迭代語義和高性能實現


AI訓練中迭代收斂是一個最核心的計算過程。Flink從一開始就使用了原生迭代的方式來保證迭代計算的效率。為了幫助用戶更好的開發算法,簡化代碼,進一步提高運行效率。Flink社區也正在統一流和批上迭代的語義,同時對迭代性能進行更進一步的優化,新的優化將盡可能避免迭代輪次之間的同步開銷,允許不同批次的數據、不同輪次的迭代同時進行。

圖7

當然,在一個完整的AI架構中,除了以上提到的三個主要階段,還有很多其他工作需要完成,包括對各種數據源的對接,已有AI生態的對接,在線的模型和樣本監控和各類周邊配套支持系統等。阿里巴巴實時計算負責人王峰(花名莫問)在2019年FFA的主題演講中的一張圖(圖8)很好的總結了其中許多工作。

圖8

Flink社區也正在為此做出努力。大致上來說,這些AI相關的工作可以分成補足,提高和創新三類。下面羅列了其中一部分進行中的工作,有些工作也許與AI不直接相關,但是卻會對Flink更好的服務於AI實時化產生影響。

補足:人有我無


Flink ML Pipeline [12]:幫助用戶方便的存儲和複用一個機器學習的完整計算邏輯。Flink Python API(PyFlink [13]):Python 是AI 的母語,PyFlink為用戶提供AI中最重要的編程接口。Notebook Integration [14](Zeppelin):為用戶的AI實驗提供友好的API。原生Kubernetes支持 [15]:和Kubernetes集成來支持基於雲原生的的開發、部署和運維。


提高:人有我強


Connector 的重新設計和優化 [16]:簡化Connector實現,擴大Connector生態。

創新:人無我有


AI Flow:兼顧流計算的大數據 + AI 頂層工作流抽象和配套服務(即將開源)。Stateful Function[9]:提供堪比在線應用的超低延遲數據預處理和推理預測。


其中有些是Flink作為流行的大數據引擎的自有功能,比如豐富Connector生態來對接各種外部數據源。另一些則要依靠Flink之外的生態項目來完成,其中比較重要的是AI Flow。它雖然起源於支持AI實時化架構,但是在引擎層並不綁定Flink,而聚焦於頂層的流批統一工作流抽象,旨在為不同平臺,不同引擎和不同系統共同服務於AI實時化的架構提供環境支持。由於篇幅關係在此不多贅述,將另文向大家介紹。

寫在最後

Apache Flink 從一個簡單的流計算想法開始,直到今天成長為一個業界流行的實時計算開源項目,使所有人受益,這個過程中離不開Flink社區中數以百計的代碼貢獻者和數以萬計的用戶。我們相信Flink在AI上也能夠有所作為,也歡迎更多的人能夠加入到Flink社區,同我們一起共創並共享AI實時化的價值。


Flink AI,未來可期。


<code>