引言
GraphLearn(GL)是阿裡巴巴開源的一個大規模圖神經網絡平台,本文将對GL的接口做基本介紹,幫助使用者快速上手。項目位址:
https://github.com/alibaba/graph-learn。
圖神經網絡(Graph Neural Networks, GNNs)将深度神經網絡技術應用于圖結構上,通過遞歸地聚合鄰域特征資訊來表征頂點,GNNs的算法架構通常為Sample-Aggregate-Combine,如下Algorithm 1所示。

GNNs應用在推薦系統、資料挖掘、自然語言處理、知識圖譜等領域中,比如在阿裡的一個典型的推薦場景中,利用“使用者-商品”,“商品-商品”的二部圖預測一個使用者是否會購買某個商品。
根據圖神經網絡的Sample-Aggregate-Combine架構,我們不難想象,一個完整的圖神經網絡的任務從端到端,可以粗略地分為圖資料準備、構圖、采樣、查詢、模型建構、訓練、預測幾個階段。
從一鍵運作到深度定制
GL基于大規模異構圖的場景,提供了一套簡潔靈活的API,加速圖神經網絡的開發。
圖神經網絡學習有兩種方式,一種是在全圖上通過鄰接矩陣計算,比如GCN/GAT等算法,這種方式受到記憶體的限制;另一種方式是對圖采樣,做mini-batch的計算,比如GraphSAGE等,這種方式更具有擴充性。GL支援這兩大類型的算法,提供了GraphEngine API、Data Model API以及Graph learning models。
Graph Engine構造了一個全局唯一的Graph對象,在這個對象上進行查詢、采樣等操作。基于Graph Engine的接口,你可以周遊圖、得到鄰居樣本、得到所需屬性,進而自己組織資料,構造模型。
Data Model是GL的基礎資料模型,由種子節點(seed nodes/edges)和鄰域(receptive fields /multi-hops neighbors)組成。通過上層的Encoders可以轉換為多種NN引擎對應的資料格式。基于Data Model,系統接手了樣本資料的準備,你可以專注于模型的開發。
Graph learning models将Data model的資料轉換為Embedding,并提供了多個built-in的GNNs models。Graph learning models可以直接調用,如果在自己的資料上運作,隻需要簡單适配即可。
從裸資料到GNN樣本,隻差一行python
Graph Engine包含圖對象子產品、采樣子產品和查詢子產品,這些 Graph 上的子產品接口通過一套Gremlin-like API表達。如何從裸資料構造單機或分布式的圖、如何在圖上遊走、如何周遊、如何采樣鄰域、查詢哪些field,以及如何用這些資料構造圖神經網絡模型所需的樣本,整個過程隻需要一句python表示,類似data-flow的查詢語句:
gl.Graph().node().edge().init().V().outV().sample().by().values()
我們将這一行代碼拆分到圖對象子產品、采樣子產品和查詢子產品的接口中進行解釋。
圖對象
圖對象子產品用于将結構化的圖資料轉換為邏輯圖對象。GL的入口非常簡單,載入graphlearn庫,建構一個 Graph 邏輯對象,後續所有的操作都在這個 Graph 對象上進行。
import graphlearn as gl
g = gl.Graph()
• 圖資料格式:靈活的schema,多變的資料類型
GL圖資料格式靈活,支援float,int,string類型的屬性,支援帶權重、标簽。在現實的場景中,資料格式多變,通過config檔案描述非常複雜,容易寫錯;有些GNN系統不支援多種類型的屬性。
下面的示例描述了資料中存在string和float類型的兩列屬性和權重、标簽列。
decoder = gl.Decoder(attr_types=["string", "float"], weighted=True, labeled=True)
• 資料源載入和拓撲描述:同構、異構、多資料源,通通支援
GL提供了 node 和 edge 兩個簡單的接口來支援頂點和邊的資料源載入,同時在這兩個接口中描述圖的拓撲結構,比如“buy”邊的源頂點類型是“user”,目的頂點類型是“item”。這個拓撲結構在異構圖中十分重要,是後續采樣路徑meta-path的依據,也是查詢的實體類型的基礎。
g.node(data_source, node_type, decoder) \
.node(data_source, node_type, decoder) \
.edge(data_source, (src_node_type, dst_node_type, edge_type), decoder)
• Graph Engine啟動:快速拉起大規模分布式圖引擎
GL提供單機的版本, 通過init 接口快速啟動Graph Engine,至此,圖對象已經構造完畢,查詢、采樣操作就可以在 Graph 上進行了。
g.init()
在大規模的場景下,圖頂點可達億級别,邊可達千億級别,不管是圖結構還是圖屬性,都無法完全載入單機記憶體。GL提供分布式的Graph Engine,速度非常快,使用上也非常簡單,隻需要在 init 中加幾個參數。
g.init({"server_count": N, "client_count": M}, task_name, job_index)
采樣
采樣在GL中通過遊走路徑和采樣政策進行描述。如下示例中,表達的是一個周遊和二跳鄰居采樣,即周遊圖獲得64個使用者,對每個使用者根據邊的權重采樣50個他們購買的商品的相似商品。
q = g.V("user").bath(64).outV("buy").sample(5).outV("similar-to").sample(10).by("edge_weight").values()
除了采樣鄰居,GL也提供了負采樣,隻需要将示例中的 outV 改為 outNeg 即可。GL提供了多種内置的采樣政策,也支援自定義采樣政策的實作,詳細内容可見我們的系列文檔中關于“采樣算法”的文章。
查詢
GL提供了
Nods
和
Edges
兩個基礎的資料類型,作為周遊、采樣的結果。為了擷取 Nodes 的int類型的屬性,可以調用如下接口進行查詢,得到的是numpy array資料結構。
nodes = g.run(q)
nodes[2].int_atrs # nodes is a list of Nodes, include Nodes of user,
# Nodes of item for 1 hop, Nodes of item of 2 hop.
g.run(q)
可以多次執行,周遊圖中的頂點和他們的邊,直到周遊完畢。是以,上述采樣和查詢的結果可以作為generator接入tf或pytorch等NN引擎作為資料源,進而深度定制GNN模型。
GL也提供了資料模型的封裝,接管資料采樣流程和樣本組織,下文将簡要描述資料模型。
那些Dirty work系統幫你做了
為了便于使用者能更專注于探索模型,而非資料采樣和樣本組織,在模型程式設計接口層面我們封裝了EgoGraph,用于産生接管樣本和鄰域産生的過程。
EgoGraph包含多種内置采樣器和負采樣器,覆寫有監督學習和無監督學習場景。EgoGraph 中的資料類型為numpy array,可以根據不同的NN引擎轉化為不同的格式的 EgoTensor 。EgoFlow 用于将 EgoGraoh 處理并轉換為 EgoTensor ,并構成資料産生的pipline。
GL提供Encoder的子產品,用于将頂點、邊或子圖根據他們的鄰域資訊轉換為Embedding。
基于Embedding進行模型建構,GL封裝了多個built-in的模型,包括:
• GraphSAGE
• GCN
• GAT
• DeepWalk
• TransE
• ...
在GL中運作以上模型,隻需要一鍵執行python腳本。比如我們要執行一個二部圖的GraphSAGE算法,樣例資料已經準備好了,在examples/data目錄下,運作腳本就可以得到資料,模型訓練可直接調用如下腳本。
cd examples/tf/bipartite_graphsage
python train_unsupervised.py
我們也将模型進行了抽象,包括Layers、Aggregators的複用,以賦予開發者和使用者快速開發更多GNNs模型的能力。GNNs是近年來圖資料分析與應用的熱點研究問題,學術屆和工業界都在不斷提出新的模型,我們也将繼續探索,不斷完善模型,并提升大規模下的性能。
總結
GL的接口設計緻力為不同需求的使用者提供dive into GNNs的入口,從圖語義的角度提供簡單、高效的算子,為使用者快速實作和調試GNNs算法提供端到端的解決方式,詳細的API手冊見:
https://github.com/alibaba/graph-learn/blob/master/docs/concept_api.mdGL上的GNNs模型正在快速發展疊代,我們也将把更多在阿裡的大規模業務上經過驗證的GNNs模型開源出來,歡迎大家加入到GL的共建中。
項目位址:
本文作者:沈雯婷