重磅!螞蟻金服開源機器學習工具SQLFlow,技術架構獨家解讀

重磅!螞蟻金服開源機器學習工具SQLFlow,技術架構獨家解讀

SQLFlow 的目標是將 SQL 引擎和 AI 引擎連接起來,讓用戶僅需幾行 SQL 代碼就能描述整個應用或者產品背後的數據流和 AI 構造。其中所涉及的 SQL 引擎包括 MySQL、Oracle、Hive、SparkSQL、Flink 等支持用 SQL 或其某個變種語言描述數據,以及描述對數據的操作的系統。而這裡所指的 AI 引擎包括 TensorFlow、PyTorch 等深度學習系統,也包括 XGBoost、LibLinear、LibSVM 等傳統機器學習系統。

SQLFlow 開源項目鏈接:https://sqlflow.org/sqlflow

SQLFlow 的研發團隊認為,在 SQLFlow 和 AI 引擎之間存在一個很大的空隙——如何把數據變成 AI 模型需要的輸入。谷歌開源的 TensorFlow 項目開了一個好頭,TFX Data Transform 和 feature column API 都是意圖填補這個空缺的項目。但是這個空缺很大,是各種 SQL 引擎和各種 AI 引擎的笛卡爾積,遠不是 TensorFlow 的這兩個子項目就足以填補的,需要一個開源社區才行。要填補好這個空缺,需要先讓用戶意識到其重要性,這也是螞蟻金服開源 SQLFlow 的意圖之一。

SQLFlow 位於 AI 軟件系統生態的最頂端,最接近用戶,它也位於數據和數據流軟件生態之上。

其實,將 SQL 和 AI 連接起來這個想法並非 SQLFlow 原創。谷歌於 2018 年年中發佈的 BigQueryML 同樣旨在“讓數據科學家和分析師只用 SQL 語言就可以實現流行的機器學習功能並執行預測分析”。除了 Google 的 BigQueryML,微軟基於 SQL Server 的 AI 擴展,以及 Teradata 的 SQL for DL 同樣旨在連接 SQL 和 AI,讓人工智能的應用變得像 SQL 一樣簡單。而 SQLFlow 與上述各個系統最根本的差異在於:SQLFlow 是開源的,以上系統都不是。

開發 SQLFlow 的初衷

螞蟻金服和很多互聯網公司一樣,不同產品背後有很多功能都依賴於 AI,比如用戶信用的評估就是一套預測模型。到目前為止,每一個這樣的功能的實現,都依賴一個工程師團隊開發多個子系統——讀取數據庫或者在線日誌流、這兩類數據的 join、各種數據篩選、數據到模型輸入(常說的 features)的映射、訓練模型、用訓練好的模型來做預測。整個過程下來耗時往往以月計,如果加班加點放棄寫 unit test 代碼,可能縮短到以週記。

以上問題正是 SQLFlow 系統希望替工程師們解決的問題。螞蟻金服擁有數千數據分析師,他們日常工作用的就是 SQL 語言。雖然數據分析師在互聯網行業往往不像用 Python、Java、C++ 的工程師那樣醒目,但是在很多有面向商業夥伴的業務的公司裡,比如 LinkedIn,他們的貢獻和人數都能與工程師相匹敵。SQLFlow 最早的初衷,就是希望解決分析師既要操作數據又要使用 AI、往往需要在兩個甚至更多的系統之間切換、工作效率低的窘境。

SQLFlow 旨在大幅提升效率,讓上述功能實現所花費的時間進一步縮短到能以日計,甚至以小時計的程度。

要達到這樣的效率,必須有一種效率極高的描述工作意圖的方式。SQL 是一種典型的描述意圖,而不描述過程的編程語言。用戶可以說我要 join 兩個表,但是不需要寫循環和構造 hash map 來描述如何 join 兩個表。這個特性使得 SQL 能極大地提升開發效率,這正是 SQLFlow 選擇擴展 SQL 語法支持 AI 這條思路的原因。

不過,高效率的背後是更大的工程技術挑戰。SQLFlow 需要做到能根據用戶的意圖,自動生成達到意圖的 Python、C++、Go 語言的程序。

重磅!螞蟻金服開源機器學習工具SQLFlow,技術架構獨家解讀

SQLFlow 的架構設計

設計目標

在連接 SQL 和 AI 應用這一方向上,業內已有相關工作。開發者可以使用像 DOT_PRODUCT 這樣的運算符在 SQL 中編寫簡單的機器學習預測(或評分)算法。但是,從訓練程序到 SQL 語句需要進行大量的模型參數複製粘貼的工作。目前在一些商業軟件中,已經有部分專有 SQL 引擎提供了支持機器學習功能的擴展。

  • Microsoft SQL Server:Microsoft SQL Server 支持機器學習服務,可以將 R 或 Python 編寫的機器學習程序作為外部腳本運行。
  • Teradata SQL for DL:Teradata 也提供了 RESTful 服務,可以通過擴展的 SQL SELECT 語法調用。
  • Google BigQuery:Google BigQuery 通過引入 CREATE MODEL 語句讓用 SQL 實現機器學習成為可能。

但上述已有的解決方案都無法解決螞蟻金服團隊的痛點,他們的目標是打造一個完全可擴展的解決方案。

  • 這一解決方案應與許多 SQL 引擎都兼容,而不是隻能兼容特定版本或類型的 SQL 引擎。
  • 它應該支持複雜的機器學習模型,包括用於深度學習的 TensorFlow 和用於樹模型的 XGBoost。
  • 能夠靈活地配置和運行前沿機器學習算法,包括指定特徵交叉,無需在 SQL 語句中嵌入 Python 或 R 代碼,以及完全集成超參數估計等。

應對上述挑戰的關鍵在於打造一套 SQL 擴展語法。研發團隊首先從僅支持 MySQL 和 TensorFlow 的原型開發開始,後續計劃支持更多 SQL 引擎和機器學習工具包。

從 SQL 到機器學習

SQLFlow 可以看作一個翻譯器,它把擴展語法的 SQL 程序翻譯成一個被稱為 submitter 的程序,然後執行。 SQLFlow 提供一個抽象層,把各種 SQL 引擎抽象成一樣的。SQLFlow 還提供一個可擴展的機制,使得大家可以插入各種翻譯機制,得到基於不同 AI 引擎的 submitter 程序。

SQLFlow 對 SQL 語法的擴展意圖很簡單:在 SELECT 語句後面,加上一個擴展語法的 TRAIN 從句,即可實現 AI 模型的訓練。或者加上一個 PREDICT 從句即可實現用現有模型做預測。這樣的設計大大簡化了數據分析師的學習路徑。

此外,SQLFlow 也提供一些基本功能,可以供各種 submitter 翻譯插件使用,用來根據數據的特點,推導如何自動地把數據轉換成 features。這樣用戶就不需要在 TRAIN 從句裡描述這個轉換。

重磅!螞蟻金服開源機器學習工具SQLFlow,技術架構獨家解讀

以上這些設計意圖在 SQLFlow 的開源代碼中都有體現。當然,SQLFlow 開發時間還比較短,仍然存在很多做的不夠細緻的地方。螞蟻金服將其開源的另一個目的,就是希望能夠和各個 SQL 引擎團隊和各個 AI 團隊一起打造這座橫跨數據和 AI 的橋樑。

基於 Go 語言開發

據介紹,SQLFlow 基於 Go 語言開發,Go 語言的眾多優點使其成為了 SQLFlow 研發團隊的首選。除了 Go 社區討論較多的優勢以外,以下兩點被重點提及:

首先 Go 容易學習卻擁有極高的開發效率。它的 keyword 數量比 C 語言還要少,但是描述能力(平均每一行代碼能表示的意圖)接近 Python。

另一個原因是 Go 的代碼庫易於長期維護。一項工作用 Python 或者 C++ 來寫,會有很多種寫法,都能跑。用 Go 來寫,往往只有一種寫法。這就使得 Go 程序員社區裡不會有很多風格共存,也就不需要 Google C++ style 這樣的代碼規範來限制不許用 C++ 的哪些特性,也不會像 Python 代碼開發時那樣,各種代碼風格之間形成鄙視鏈,在 code review 過程裡帶來不必要的爭執。

與阿里 PAI 的關係

SQLFlow 研發團隊認為,AI 和機器學習的生態可以分為很多層。其中 TensorFlow、PyTorch、XGBoost、LibLinear 這些系統位於最底層,距離終端用戶最遠,只有很硬核的用戶才能熟練掌握和使用,而這部分用戶在互聯網從業者裡佔的比例較小。

SQLFlow 和阿里推出的機器學習平臺 PAI 均位於生態的最頂層,需要調用下層的技術棧,二者均直接面對最終用戶,而這些用戶中可能有大量並不具備 AI 背景知識。

PAI 系統通過先進的圖形用戶界面來解決 AI 難理解、難應用的挑戰——比如託拽基礎 AI 組件來構造複雜的模型和數據流。

SQLFlow 則通過寫 SQL 程序的方式來實現這一目標。有能寫下來的程序,就容易存檔,容易 Code Review,容易分享知識,容易集思廣益,容易高效率迭代。此外,敲鍵盤寫程序比動鼠標拖拽快。

SQLFlow 項目負責人表示,SQLFlow 和 PAI 都是有意思且有意義的嘗試,二者的發展都值得持續觀察。

SQLFlow 優化工作

SQLFlow 目前依賴 TensorFlow 等底層引擎來實現訓練和預測。為了提升 SQLFlow 在機器學習模型的訓練和預測性能,螞蟻金服有一個團隊專門做硬件加速 AI 計算的工作,最近已經有了一些令人驚喜的成績,希望在不久的將來可以和大家分享細節。另外還有一個兄弟項目專門維護螞蟻金服對 TensorFlow 的功能擴展,也和性能相關。

SQLFlow 項目負責人表示,訓練和預測只是整個 AI 產品功能長長的鏈條中的兩個環節。SQLFlow 這個項目是為解決整個鏈條構建而打造的,其中有很多環節的耗時比 AI 的訓練和預測多得多,因此還有極大的性能提升的空間。比如很多 SQL 引擎並不支持讓一個分佈式 AI 程序併發讀取其中的數據,如果 SQLFlow 能夠解決類似的吞吐量限制,AI 的總體效率能提高數倍甚至數十倍。

在對機器學習算法的支持方面,SQLFlow 設計的初衷就是要複用各個 AI 引擎各自的模型庫。目前 SQLFlow 支持 TensorFlow Estimator 規範的模型。比如 SQLFlow 擴展語法中 SELECT ... TRAIN DNNClassifier ... 這個寫法,DNNClassifier 就是一個 Python class 的名,在這個例子中是一個派生自 tf.Estimator 的 class。SQLFlow 研發團隊也正在做支持 Keras 模型的相關工作,團隊也在考慮規範 XGBoost 模型的程序寫作,使其可以被 SQLFlow 用戶方便地調用。

這些工作背後的思路是希望互聯網行業常見的三類技術角色:分析師、研究員、工程師的分工更清晰,從而能更專注發揮各自特長:分析師因為了解數據所以寫 SQL,調用 DNNClassifier 這樣由研究員用 Python 寫的模型;研究員不用操心分佈式計算和模型到底是如何被分佈式訓練(或預測)的,這部分工作留給工程師。與此同時,SQLFlow 作為一種粘合劑,把這三類角色的產出有機結合,以便更加高效地構造產品。

SQLFlow 未來規劃

SQLFlow 當前已經能夠帶來研發效率的提升,但尚不完美,目前 SQLFlow 還存在以下問題有待解決:

第一個問題是 parsing。SQLFlow 目前已經對接 MySQL,正在對接 Hive 和 阿里雲上的 MaxCompute,將來還希望能對接更多公司正在使用的 SQL 引擎。這些引擎的 SQL 語法大都符合 SQL 標準,但是總有一些自己獨特的擴展,而用戶往往不知不覺地用到了這些特點。SQLFlow 希望用戶能在已有的 SELECT 語句之後,通過簡單地添加一個 TRAIN 或者 PREDICT 從句,即可實現數據和 AI 的互聯,這就要求 SQLFlow 支持各個 SQL 引擎獨到的語法特點。

第二個問題是數據到 feature 的映射的自動化。目前 SQLFlow 是根據 SQL 字段的類型(INT、FLOAT、TEXT、BLOB)來自動化映射到 feature column API,比如 numeric_column 或者 categorical_column_with_vocabulary 或者 bucketized_column。其實很多 TEXT 字段裡存儲的信息很複雜,可能是一個 yaml 或者 json,所以需要掃描(至少一部分)數據,才能精準地判斷這個映射。類似的,一個 BLOB 字段裡可能是 protobuf message 的 encoding,encode 的是一個 TensorFlow 的 tensor。

第三個問題是 AI 引擎。 TensorFlow、PyTorch、XGBoost、LibLinear 這些 AI 引擎的分佈式計算能力都有一些問題。TensorFlow 原生支持分佈式訓練,但不支持容錯,一個進程掛了,整個作業就掛了。雖然這還可以通過 checkpointing 解決,但是不容錯就不能彈性調度,不能彈性調度就意味著集群利用率可能極差。比如一個有 N 個 GPU 的集群上在運行一個作業,使用了一個 GPU;此時一個新提交的作業要求使用 N 個 GPU,因為空閒 GPU 個數是 N-1,所以這個新的作業不能開始執行,而是得一直等數小時甚至數天,直到前一個作業結束、釋放那個被佔用的 GPU。這麼長時間裡,集群利用率< 1/N。關於這個問題的解決方案,百度 PaddleEDL(https://kubernetes.io/blog/2017/12/paddle-paddle-fluid-elastic-learning/)和阿里集團的 XDL(https://github.com/alibaba/x-deeplearning/)做了一些很有益的探索。希望業界把過分集中於 AI 運行時間優化的眼光,分一部分到減少等待時間上。

接下來螞蟻金服將致力於推動 SQLFlow 在螞蟻金服業務和螞蟻金服以外的公司的使用,讓 SQLFlow 項目成為整個社區的共同工作,從中收穫更多的反饋,引導項目的發展方向,也幫助明確各項工作的優先級。

令 SQLFlow 團隊感到欣喜的是,雖然 SQLFlow 剛開源,但目前已經有來自美國和中國幾大互聯網公司的貢獻者參與到社區工作中來。由於每個公司使用的 SQL 引擎不同,如果 SQLFlow 核心團隊能提供比較好的數據層抽象,那麼來自不同公司的貢獻者就能比較容易地把 SQLFlow 適配到自己公司的引擎上。類似的,支持多種 AI 引擎的方式也是如此。

此外,SQLFlow 團隊希望各個公司的研究員們能夠參與到開源項目中來,分享各自的模型,未來 SQLFlow 會支持各種形式的模型,以便分析師使用。

過去這幾年,螞蟻金服一直積極參與開源社區共建,自 2011 年宣佈第一波開源項目以來,開源項目數量每年皆有增長。目前螞蟻金服已有 30 多個開源項目,其中,Ant Design項目已獲三萬多 Star,有 600 多人參與項目建設,EggJS 和 SOFA 系列也成為了社區熱門。

在 SQLFlow 的 GitHub 項目中,螞蟻金服提供了 SQLFlow 的安裝指引以及快速入門的示例,對此項目感興趣的開發者不妨一試。也歡迎留言反饋你對 SQLFlow 項目的建議和使用感受。

再次附上 SQLFlow 開源項目鏈接:https://sqlflow.org/sqlflow


分享到:


相關文章: