京東零售開源圖深度學習框架Galileo設計理念及異構圖推薦模型詳解

語言: CN / TW / HK

Galileo開源地址:

https://github.com/JDGalileo/galileo,歡迎star和試用,也歡迎貢獻程式碼。

資料、演算法、算力並列稱為AI時代的三駕馬車。從資料角度,隨著資訊科技的快速發展,各領域資料量均呈現爆發式增長,資料形式呈現多樣化、複雜化的趨勢,圖資料便是其中一個典型代表。從演算法角度,為了挖掘大資料中的價值,機器學習技術被廣泛使用,近幾年隨著硬體算力的突破性提升,深度學習作為機器學習的一個分支受到顯著關注。圖深度學習,用深度學習技術挖掘圖資料中的價值是一個新興前沿的方向,深度學習模型可有效捕捉圖中的隱含關係,提供更好的資料表徵,目前在網際網路領域搜尋、推薦、廣告、風控等業務中已經有許多探索和實踐,也取得了可觀的業務效果。

圖資料將各種實體物件表示為頂點,將它們之間的關係表示為邊,例如在電商領域中,使用者和商品均可以作為圖的頂點,使用者和商品的互動行為即是圖的邊,在京東內部,使用者和商品均是億級規模,構建的圖具有超大規模、異構、多重屬性等特點。在實際應用時,處理這種體量的超大規模異構圖,通常面臨消耗資源大、訓練評估效能低、現有的深度學習框架Tensorflow和PyTorch等難以訓練圖模型,缺乏統一圖模型程式設計正規化等困難和挑戰。

針對上述圖技術在超大規模場景中落地存在的問題,我們京東零售自研並開源了一個易用可擴充套件的圖深度學習框架Galileo(伽利略),核心功能包括支援超大規模異構圖、支援多後端分散式訓練、支援圖嵌入演算法和圖神經網路。Galileo開源地址https://github.com/JDGalileo/galileo,歡迎star和試用,也歡迎貢獻程式碼。此外,我們也將於今年底與清華大學出版社發行出版Galileo 配套圖書:《圖深度學習從理論到實踐》,敬請期待。

這裡特別緻謝京東零售資料演算法通道委員會對專案的支援,在京東零售資料演算法通道委員會的協調領導下,營造了良好的技術氛圍,注重技術沉澱及行業影響,積極參與學術交流,鼓勵前瞻性專案探索,挑戰業界難題,推動Galileo在京東多個應用場景中成功落地。

本文首先介紹Galileo框架的設計理念、使用方法和工作原理,然後介紹一個基於異構圖的推薦模型,最後介紹Galileo未來的發展規劃。

Galileo框架設計理念

Galileo是一個支援超大規模異構圖、高效能、雙後端,並且易使用和擴充套件的圖深度學習框架,旨在解決超大規模圖演算法在工業級場景的落地難題,提供圖神經網路和圖嵌入等模型的訓練評估及預測能力。

圖1 Galileo整體架構

Galileo圖深度學習框架的整體架構如圖1所示,我們採用了分層的設計理念,從下至上主要分為分散式圖引擎、多後端分散式框架、圖模型三層:

1.分散式圖引擎:採用緊湊高效的記憶體結構表達圖資料,能夠以極低記憶體支援超大規模異構圖;採用ZeroCopy機制實現全鏈路呼叫,支援高效能圖查詢和圖取樣;

2.多後端分散式框架:支援Tensorflow和PyTorch雙後端,配置化單機分散式訓練,支援Keras和Estimator訓練,提供統一的圖查詢和圖取樣介面,易擴充套件;

3.圖模型:遵循資料與模型解耦,提升程式碼複用性;基於元件化設計,降低模型實現難度,支援Message Passing正規化編寫圖模型,也支援Python直接訪問訓練後端介面,易使用且靈活性高。

更多關於Galileo的詳細介紹請參考我們之前發表的文章 《京東零售圖計算平臺Galileo即將開源 瞄準大規模圖演算法在工業級場景落地》。

快速上手Galileo

Galileo提供了簡單通用的SDK,使用者能夠輕鬆開始圖建模,完整的文件見Galileo docs( https://github.com/JDGalileo/galileo/tree/main/docs ),這裡我們只給出一個精簡的步驟來說明如何快速上手Galileo。我們提供了三種方式供使用者安裝使用Galileo,前兩種分別是以手動安裝Galileo的pip源或conda源安裝包(https://github.com/JDGalileo/galileo/blob/main/docs/pip.md)和從原始碼(https://github.com/JDGalileo/galileo/blob/main/docs/install.md)編譯安裝的形式,第三種是我們更推薦的,在Docker容器中使用Galileo,我們提供的Docker映象(https://hub.docker.com/r/jdgalileo/galileo)中預置Galileo最新版本和必須的依賴庫,使用者可以按照如下方式啟動容器並執行第一個示例:

第一步,啟動Docker容器。

docker run -it –-rm jdgalileo/galileo:latest bash

第二步,在預置示例Galileo examples(https://github.com/JDGalileo/galileo/tree/main/examples)中挑選一個圖神經網路的例子來執行,以Node2vec模型為例。

bash examples/start_zk.sh
python3 examples/tf/node2vec/simple.py

例子中使用Galileo提供的Keras Trainer訓練一個Node2vec模型,模型使用公開的CORA資料集,完整程式碼見Node2vec模型 (https://github.com/JDGalileo/galileo/blob/main/examples/tf/node2vec/simple.py)。如果使用者想要實現一個自定義模型參考定製化圖模型(https://github.com/JDGalileo/galileo/blob/main/docs/custom.md)。

Galileo工作原理

相信現在大家基本瞭解了Galileo框架和初步使用方法,但大部分對圖技術感興趣的使用者應該會有這樣的疑問:Galileo到底是如何載入圖資料並餵給模型的?接下來將詳細介紹Galileo的工作原理,探究其具體的執行機制。

圖2 Galileo工作原理

1、下載公開的圖資料集或者準備自己的圖資料,見詳細的圖資料準備教程(https://github.com/JDGalileo/galileo/blob/main/docs/data_prepare.md)。

2、使用galileo_convertor將圖資料來源格式轉換為圖二進位制格式。

3、圖引擎載入圖二進位制格式資料,並初始化取樣器。

4、啟動RPC圖引擎服務。

5、向zookeeper註冊圖服務。

6、訓練節點worker的圖引擎客戶端發現圖服務。

7、Tensorflow或PyTorch的Dataset呼叫圖引擎客戶端的查詢和取樣介面。

8、不同的模型inputs從圖引擎服務中獲取圖資料,包括頂點、邊、特徵等資料。

9、Dataset將圖樣本拼接為MiniBatch資料餵給圖模型,支援多執行緒並行預拉取。

10、模型訓練後,輸出圖模型的checkpoints或 Embeddings。

圖2中不同顏色的框代表Galileo框架包含三種程序:圖引擎程序(圖中綠色框),訓練節點worker程序(圖中紅色框)和Zookeeper程序(圖中粉色框)。

推薦場景的異構圖模型

在電商推薦場景中,實體通常指使用者和商品,實體間的關係包含商品與商品、使用者與使用者、使用者與商品三種互動關係,實體和關係還攜帶有豐富的屬性,例如使用者有性別、年齡、地區等,商品有類目、品牌、規格、包裝、產地等,使用者行為有瀏覽、加購、分享、點贊、收藏等。總結而言,推薦圖資料具有超大規模、複雜異構、關係稀疏、特徵高維等特點。

目前基於圖的推薦演算法主要專注於使用者商品二部圖,只能處理一種互動關係,不使用屬性特徵或僅使用非常單一的屬性特徵,不能有效挖掘使用者和商品的深層關係。因此我們使用Galileo框架設計了一個針對異構圖的模型HeteSAGE,以提升推薦系統的準確性。HeteSAGE模型使用多組元路徑編碼異構特徵資訊,支援編碼多種型別的特徵資訊,可以刻畫異構頂點之間的複雜關係。HeteSAGE模型的虛擬碼見圖3。

圖3 HeteSAGE模型虛擬碼

在一輪訓練過程中,HeteSAGE首先根據輸入目標頂點取樣鄰居以及特徵資訊,使用編碼器編碼多種型別的特徵資訊,再經過多層圖卷積操作,使用注意力機制融合特徵資訊,最後輸出目標頂點的向量表示。

HeteSAGE模型處理的異構圖用G=(V,E,T,A)表示,其中V表示頂點集合,E表示邊集合,T表示異構圖中頂點和邊的型別,頂點型別集合用T_v表示,邊型別集合用T_e表示,A表示異構圖中頂點的特徵資訊,包括稀疏特徵A_s和稠密特徵A_d。多組元路徑用M表示。模型輸出頂點的向量表示。

HeteSAGE模型詳細步驟如下:

1、首先通過頂點型別對映函式獲取目標頂點集合V的型別集合O(虛擬碼的第1行),遍歷所有頂點型別集合(虛擬碼的第2行),根據當前頂點型別t和目標頂點集合的型別集合O計算出目標頂點集合V的屬於當前頂點型別t的頂點集合Vt(虛擬碼的第3行)。

2、然後對當前頂點型別t的頂點集合Vt的特徵及其鄰居的特徵進行編碼和卷積操作(虛擬碼的第4行到第7行)。

a)第一步對多組元路徑M進行遍歷(虛擬碼的第4行),元路徑指的是多階鄰居取樣時從初始頂點到最大階頂點路徑上的邊的型別列表.

b)第二步對頂點集合Vt使用元路徑m取樣多階鄰居(虛擬碼的第5行),得到多階鄰居集合N(t,m),具體取樣方法借鑑了GraphSAGE演算法中的方式.

c)第三步編碼多種型別的特徵資訊(虛擬碼的第6行),目前支援稀疏特徵和稠密特徵。在電商場景下,異構圖資料中頂點存在多種型別的特徵,稀疏特徵例如有使用者的性別、年齡等,商品的類目,品牌等,稠密特徵例如有使用者的收入等,商品的名稱,價格等,而且多種型別的特徵的維度也不同,維度也比較高。因此需要編碼多種型別的特徵為統一低維度的特徵。稀疏特徵A_s使用查Embedding表的方式編碼,稠密特徵Ad使用轉移矩陣編碼,可以拼接或相加得到最終編碼後的特徵F(t,m)。

d)第四步是多層鄰居的圖卷積操作(虛擬碼的第7行),得到目標頂點的卷積特徵 F'(t,m) ,具體方法也借鑑了GraphSAGE演算法中的卷積方式,聚合函式也支援Mean聚合、pool聚合、LSTM聚合等; 最終將多組元路徑M下的頂點特徵表示 F'(t,m) 拼接在一起得到 F'(M)

3、最後使用自注意力機制融合多組元路徑的特徵 F'(M) 得到當前頂點型別的特徵F_t(虛擬碼的第8行),最終輸出目標頂點的向量表示H(虛擬碼的第9行)。

Galileo未來規劃

1、打造Galileo平臺,支援建、存、查、算、用一體的自動化構建系統。

2、支援實時圖計算和動態圖計算。

3、持續整合前沿圖模型,探索適合GNN的新型硬體。

Galileo開源地址:

https://github.com/JDGalileo/galileo,歡迎star和試用,也歡迎貢獻程式碼。

團隊介紹

Galileo專案組屬於京東零售資料演算法通道下的資料智慧研發部。

這是一個有技術和夢想的團隊,團隊成員均來自國內一線網際網路公司和雙一流大學,既有經驗豐富的資深架構師和技術紮實的中堅力量,也有朝氣蓬勃的後起之秀。團隊在訓練框架及高效能運算領域積累了豐富的實戰經驗。

團隊致力於工業級資料演算法模型在京東零售真實業務場景中的落地,大規模機器學習及商業分析平臺九數,推動了京東無人投放廣告的高速增長,成為京東廣告的核心收入來源。

Galileo團隊也非常歡迎志同道合的優秀人才加入,有意者請與 <[email protected]> 聯絡。