Paddle Graph Learning (PGL)是一個基於PaddlePaddle的高效易用的圖學習框架git
在最新發布的PGL中引入了異構圖的支持,新增MetaPath採樣支持異構圖表示學習,新增異構圖Message Passing機制支持基於消息傳遞的異構圖算法,利用新增的異構圖接口,能輕鬆搭建前沿的異構圖學習算法。並且,在最新發布的PGL中,同時也增長了分佈式圖存儲以及一些分佈式圖學習訓練算法,例如,分佈式deep walk和分佈式graphsage。結合PaddlePaddle深度學習框架,咱們的框架基本可以覆蓋大部分的圖網絡應用,包括圖表示學習以及圖神經網絡。github
特點:高效性——支持Scatter-Gather及LodTensor消息傳遞
對比於通常的模型,圖神經網絡模型最大的優點在於它利用了節點與節點之間鏈接的信息。可是,如何經過代碼來實現建模這些節點鏈接十分的麻煩。PGL採用與DGL類似的消息傳遞範式用於做爲構建圖神經網絡的接口。用於只須要簡單的編寫send
還有recv
函數就可以輕鬆的實現一個簡單的GCN網絡。以下圖所示,首先,send函數被定義在節點之間的邊上,用戶自定義send函數會把消息從源點發送到目標節點。而後,recv函數負責將這些消息用匯聚函數 匯聚起來。算法
以下面左圖所示,爲了去適配用戶定義的匯聚函數,DGL使用了Degree Bucketing來將相同度的節點組合在一個塊,而後將匯聚函數做用在每一個塊之上。而對於PGL的用戶定義匯聚函數,咱們則將消息以PaddlePaddle的LodTensor的形式處理,將若干消息看做一組變長的序列,而後利用LodTensor在PaddlePaddle的特性進行快速平行的消息聚合。服務器
用戶只須要簡單的調用PaddlePaddle序列相關的函數sequence_ops
就能夠實現高效的消息聚合了。舉個例子,下面就是簡單的利用sequence_pool
來作鄰居消息求和。網絡
import paddle.fluid as fluid
def recv(msg):
return fluid.layers.sequence_pool(msg, "sum")
儘管DGL用了一些內核融合(kernel fusion)的方法來將經常使用的sum,max等聚合函數用scatter-gather進行優化。可是對於複雜的用戶定義函數,他們使用的Degree Bucketing算法,僅僅使用串行的方案來處理不一樣的分塊,並不會充分利用GPU進行加速。然而,在PGL中咱們使用基於LodTensor的消息傳遞可以充分地利用GPU的並行優化,在複雜的用戶定義函數下,PGL的速度在咱們的實驗中甚至可以達到DGL的13倍。即便不使用scatter-gather的優化,PGL仍然有高效的性能表現。固然,咱們也是提供了scatter優化的聚合函數。框架
性能測試
咱們用Tesla V100-SXM2-16G測試了下列全部的GNN算法,每個算法跑了200個Epoch來計算平均速度。準確率是在測試集上計算出來的,而且咱們沒有使用Early-stopping策略。分佈式
數據集 | 模型 | PGL準確率 | PGL速度 (epoch) | DGL 0.3.0 速度 (epoch) |
---|---|---|---|---|
Cora | GCN | 81.75% | 0.0047s | 0.0045s |
Cora | GAT | 83.5% | 0.0119s | 0.0141s |
Pubmed | GCN | 79.2% | 0.0049s | 0.0051s |
Pubmed | GAT | 77% | 0.0193s | 0.0144s |
Citeseer | GCN | 70.2% | 0.0045 | 0.0046s |
Citeseer | GAT | 68.8% | 0.0124s | 0.0139s |
若是咱們使用複雜的用戶定義聚合函數,例如像GraphSAGE-LSTM那樣忽略鄰居信息的獲取順序,利用LSTM來聚合節點的鄰居特徵。DGL所使用的消息傳遞函數將退化成Degree Bucketing模式,在這個狀況下DGL實現的模型會比PGL的慢的多。模型的性能會隨着圖規模而變化,在咱們的實驗中,PGL的速度甚至可以能達到DGL的13倍。ide
數據集 | PGL速度 (epoch) | DGL 0.3.0 速度 (epoch time) | 加速比 |
---|---|---|---|
Cora | 0.0186s | 0.1638s | 8.80x |
Pubmed | 0.0388s | 0.5275s | 13.59x |
Citeseer | 0.0150s | 0.1278s | 8.52x |
特點:易用性——原生支持異構圖
圖能夠很方便的表示真實世界中事物之間的聯繫,可是事物的類別以及事物之間的聯繫多種多樣,所以,在異構圖中,咱們須要對圖網絡中的節點類型以及邊類型進行區分。PGL針對異構圖包含多種節點類型和多種邊類型的特色進行建模,能夠描述不一樣類型之間的複雜聯繫。函數
支持異構圖MetaPath walk採樣
上圖左邊描述的是一個購物的社交網絡,上面的節點有用戶和商品兩大類,關係有用戶和用戶之間的關係,用戶和商品之間的關係以及商品和商品之間的關係。上圖的右邊是一個簡單的MetaPath採樣過程,輸入metapath爲UPU(user-product-user),採出結果爲 而後在此基礎上引入word2vec等方法,支持異構圖表示學習metapath2vec等算法。支持異構圖Message Passing機制
在異構圖上因爲節點類型不一樣,消息傳遞也方式也有所不一樣。如上圖左邊,它有五個鄰居節點,屬於兩種不一樣的節點類型。如上圖右邊,在消息傳遞的時候須要把屬於不一樣類型的節點分開聚合,而後在合併成最終的消息,從而更新目標節點。在此基礎上PGL支持基於消息傳遞的異構圖算法,如GATNE等算法。特點:規模性——支持分佈式圖存儲以及分佈式學習算法
在大規模的圖網絡學習中,一般須要多機圖存儲以及多機分佈式訓練。以下圖所示,PGL提供一套大規模訓練的解決方案,咱們利用PaddleFleet(支持大規模分佈式Embedding學習)做爲咱們參數服務器模塊以及一套簡易的分佈式存儲方案,能夠輕鬆在MPI集羣上搭建分佈式大規模圖學習方法。
豐富性——覆蓋業界大部分圖學習網絡
下列是框架中已經自帶實現的十三種圖網絡學習模型。詳情請參考這裏
模型 | 特色 |
---|---|
GCN | 圖卷積網絡 |
GAT | 基於Attention的圖卷積網絡 |
GraphSage | 基於鄰居採樣的大規模圖卷積網絡 |
unSup-GraphSage | 無監督學習的GraphSAGE |
LINE | 基於一階、二階鄰居的表示學習 |
DeepWalk | DFS隨機遊走的表示學習 |
MetaPath2Vec | 基於metapath的表示學習 |
Node2Vec | 結合DFS及BFS的表示學習 |
Struct2Vec | 基於結構類似的表示學習 |
SGC | 簡化的圖卷積網絡 |
GES | 加入節點特徵的圖表示學習方法 |
DGI | 基於圖卷積網絡的無監督表示學習 |
GATNE | 基於MessagePassing的異構圖表示學習 |
上述模型包含圖表示學習,圖神經網絡以及異構圖三部分,而異構圖裏面也分圖表示學習和圖神經網絡。
依賴
PGL依賴於:
- paddle >= 1.6
- cython
PGL支持Python 2和3。
安裝
你能夠簡單的用pip進行安裝。
pip install pgl
團隊
PGL由百度的NLP以及Paddle團隊共同開發以及維護。
聯繫方式 E-mail: nlp-gnn[at]baidu.com
License
PGL uses Apache License 2.0.