天天看點

走進工業級圖神經網絡架構GraphLearn

觀看精彩回放

歡迎了解 GraphLearn,如果覺得還不錯請它加一個小星星🌟! GraphLearn開源位址:

https://github.com/alibaba/graph-learn

一、GNN背景與趨勢

(一)深度學習的發展

深度學習的第一個爆發點來自于機器視覺。ImageNet競賽引發了深度學習的熱潮,CV算法的識别能力也一度超過了人類,自此之後,我們見到了成熟的CV産品的落地,比如人臉識别,而CV的發展也由研究逐漸轉向到應用。

深度學習的第二個爆發點來自于NLP自然語言處理,随着Transformer、BERT等模型的不斷疊代,機器翻譯、閱讀了解等問題的精度被屢屢重新整理。

相比于前兩者,圖與深度學習的結合是後起之秀,近幾年受到各大AI頂會的追捧。圖像和自然語言更偏客觀,因為圖像的組成原理不變,人類的語言構成不變,對于CV和NLP的研究,是有一個上限的。但是圖的構成更偏主觀,我們可以把任何有關聯的事物抽象成圖,比如購買關系、好友關系、基因的堿基關系等,這種抽象方法是沒有上限的,這賦予了我們關于圖研究在時間之外的想象空間,各種圖資料中蘊含着巨大的商業價值和科學價值。

走進工業級圖神經網絡架構GraphLearn

(二)圖與深度學習的一體化趨勢

我們對圖的認識是從學習圖本身開始的,比如在圖中找到某兩點間的最短連通路徑。而在商業中我們更傾向于把圖納入到一個具體場景,作為解決方案的一部分,比如在電商網站,把使用者的購物行為圖作為精準推薦算法的一部分,對于圖的使用由學圖變成了用圖。

用圖的難點在于圖是不規則的,我們很難在不規則的資料上開展高效計算,更難把它與以深度學習為基礎的面向場景的任務結合起來。Embedding技術是一個重大突破,使得我們能夠把離散的、不規則的資料稠密化和向量化,這也為圖與深度學習的結合提供了橋梁。

近年來,各類圖神經網絡算法(Graph Neural Network,GNN)的發展與應用是圖與深度學習結合價值的最好證明。當然,未來還會有很大的探索空間。

圖神經網絡算法的快速發展,讓當下主流的深度學習架構稍顯不足,尤其是面向工業界的複雜場景的時候,這也在某種程度上限制了圖神經網絡的推廣。我們相信圖的重要性以及圖與深度學習結合将帶來的巨大價值,把圖納入到深度學習範疇,是一個自然趨勢,是以,我們需要在架構上提供相應的支援。

現在我們經常提到大資料,大資料之是以稱為大,是因為資料内部有了錯綜複雜的聯系,這才是價值空間所在,不然單純的量大也隻能稱為多,是以大資料在本質上其實說的是圖資料。

GNN是一個圖與深度神經網絡結合和落地的産物,它的一個直覺解釋是利用深度神經網絡的挖掘能力去發現蘊含豐富資訊的圖資料中的價值,目前主流的做法是把不規則的圖資料映射到規則的向量空間,進而對接深度學習理論,如下圖所示。

走進工業級圖神經網絡架構GraphLearn

二、GraphLearn的理念與特性

每一個有價值的事物,必然要經過時間的檢驗,才能被證明它有價值和保持長久的生命力,圖神經網絡也不例外。是以, 我們在設計圖神經網絡架構的時候,至少需要考慮以下幾點:

  • 支援工業生産:首先考慮支援工業生産,因為工業是我們接觸實際場景最近的一個環節,工業場景所要求的效率穩定性非常嚴格,要處理的圖資料也更為複雜,這是架構的難度所在。
  • 相容開源生态:大資料和深度學習推動了工業的發展,也讓開源社群達到了前所未有的繁榮。開源是技術史上的文明,讓我們都從中受益,遍觀當下沒有哪個AI技術可以脫離開源生态而獨立存在,圖神經網絡架構也必然要擁抱開源。
  • 便于功能擴充:圖神經網絡處于一個快速發展階段,算法疊代非常快,落地的應用百花齊放,作為架構也必然要跟得上節奏,甚至要做出預判,在不斷變化的需求中便于擴充。

GraphLearn是一個我們自研的面向開發者的圖神經網絡架構,架構根植于阿裡巴巴集團的業務,經過沉澱和孵化,充分考慮了資料、應用、生态等問題。目前GraphLearn已經作為雲産品的一部分,大家可以通過阿裡雲官網機器學習平台PAI來試用。當然,架構代碼也已經在開源社群公開,可以一鍵安裝我們釋出好的package,也可以根據自己的開發環境,從源碼編譯安裝或者二次開發。

GraphLearn目前主要有以下特性:

1.     工業級資料支援

實際中的圖資料非常複雜,尤其對網際網路公司而言,存在着各種形式的圖資料。概括來說,工業級圖資料的特點主要有:

  • 超大規模:工業級的資料往往可以達到千億級别,百億級别和TB級存儲。
  • 點邊異構:工業級的資料不規則,點邊異構化,往往有多種類型的點和多種類型的邊。
  • 屬性多樣:點和邊并非隻有一個單獨的ID,同時也存在着多樣化的屬性資訊,這些屬性不規則,類型也不一。

對于上述的圖資料,GraphLearn可以做到在幾分鐘内完成從檔案系統的原始資料到記憶體索引的建構,并通過提供簡單易用的API簡化複雜資料的操作。

2.     統一的程式設計範式

資料的複雜性也影響了上層算法的程式設計範式。面對如此規模的資料,采樣是一個必要過程,采樣就是把大圖變成小圖,并做必要的資料對齊,以滿足深度學習疊代訓練的需要。不同的采樣算法直接影響了上層計算的資料輸入。

GraphLearn内置了多種采樣算子并支援擴充,此外,GraphLearn也内置了複采樣子產品,作為對無監督訓練的支援。采樣之後是向量化,這也是和學術界的一些圖神經網絡架構差別比較大的地方,因為我們要處理的資料的原始資料是ID和屬性,是離散的資料,而并不是已經向量化好的資料。這些離散的資料需要經過向量化的過程,把離散的特征稠密化。然後在向量化好的基礎上,做鄰域的聚合和自身資訊的整合,這是目前最流行的圖神經網絡的程式設計架構。 上述的每一個階段在GraphLearn中都有對應的接口支援,以簡化開發的過程。

走進工業級圖神經網絡架構GraphLearn

3.     可擴充的計算模式

為了可擴充,GraphLearn抽象了每個算子的計算模式,包括MAP,PROESS,REDUCE三個階段,該範式可以覆寫關于圖的大多數計算的需求。

以采樣為例,當Server收到API的采樣請求時,MAP階段根據圖劃分政策,把ID分發到資料所對應的Server上面去。因為圖是分布式存儲的,每一個server隻存儲圖的一個分片,PROESS階段則在每個Server上執行采樣計算,盡可能避免資料遷移帶來的開銷,REDUCE階段則把每個Server的結果彙聚起來。

如果我們要擴充一種新的采樣算法,那麼隻需實作這三個函數即可,是以擴充起來比較容易。

走進工業級圖神經網絡架構GraphLearn

4.     支援面向業務定制化

為了便于應用,GraphLearn支援面向業務的定制化,在實際的每個場景中都有具體的深度學習模型來支撐,且模型與業務緊密結合。 我們可以從最底層的資料接入出發,在經過必要的算子和Graph Embedding算法産出圖的向量化表示,然後把向量化表示接入到業務模型中,就構成了一個端到端的大模型,且訓練過程中的資訊也可以反向傳播到大模型中的每一層。現在也已經有一些公開成果顯示,這種端到端的訓練在模型效果上會有更好的收益,而且在效率上也免去了中間結果落地的開銷。

走進工業級圖神經網絡架構GraphLearn

5.     可與PAI雲産品內建

目前,GraphLearn已經在阿裡雲機器學習平台PAI上釋出,且相容PAI雲産品,比如DLC、DSW等,打通了與MaxCompute、OSS等産品的連接配接。我們可以在PAI平台上利用GraphLearn和TensorFlow來開發一個圖神經網絡算法,也可以直接調用我們釋出的算法元件。PAI背景的資源排程和安全隔離,包括深度優化的軟體在内,為開發和生産提供了比較好的保障。

6.     相容開源生态

在開源方面,GraphLearn與社群内主流的深度學習生态相容,且比較輕量級,友善安裝部署,支援單機和分布式,不同模式隻需要簡單的配置即可。我們可以基于GraphLearn結合TensorFlow或者Pytorch開發自己的圖神經網絡算法和應用,也可以在探索階段結合Python和Numpy進行高效率的調試。

目前,在阿裡内部GraphLearn已經有多個場景落地,比如搜尋推薦、網絡安全和知識圖譜等,在各個場景中都對業務效率有了非常大的提升。

三、GraphLearn的概念與用法

上面從宏觀上介紹了GraphLearn的特點,那麼它具體能做什麼呢?其基本概念和用法都有哪些呢?

比如下面這張圖,我們把場景分到了4個象限,橫軸為圖和神經網絡,縱軸為離線和線上,兩兩結合。左上角側重圖的離線場景,比如像圖采樣、複采樣等,可以在任意一個圖上進行,可以作為特征工程的一部分産出訓練需要的樣本,也可以對産出的圖做一個召回的hitrate計算,評估效果,對于圖的其他操作也可以友善的在該象限進行擴充。左下角可以看成是把左上角對應的離線操作轉成了線上,比如hatrate這種計算,我們變成了向量召回,線上支援是由GraphLearn本身的Service化部署能力來提供的。

右上角是離線的模型開發與訓練,GraphLearn提供了必要的圖資料處理能力和簡化模型開發的接口以及與PyTorch結合的能力,熟悉TF和PyTorch的同學可以更快的上手,學習成本更小。右下角是模型的線上推理和Graph Embedding召回,其中一些模型的實時推理與實時的圖資料相關,這方面也是我們目前正在做的方向。

走進工業級圖神經網絡架構GraphLearn

(一)安裝部署

GraphLearn的主體代碼由C++開發,提供Python層的封裝,可以wheel包的形式進行安裝;我們還提供了Ubuntu 16.04下基于g++ 5.4.0編譯的安裝包,可以直接下載下傳并通過pip install的方式進行安裝。對于與上述環境不相容的其他環境,可以從源碼編譯、安裝,整個過程也隻需要簡單的幾行代碼即可完成。安裝完成後進入Python指令行,輸入import graphlearn來檢驗安裝是否正确。

GraphLearn的部署支援單機和分布式,其中分布式場景又支援Worker Mode和Server Mode。單機場景适用于資料比較小、或原型開發階段,部署時隻需要g.init()即可,不需要任何額外參數。Worker Mode的分布式部署表示圖資料是分布式存儲的,每個Worker存儲圖的一個分片,Worker之間可以兩兩通信。在訓練時,Worker可以通路本地的圖資料,對于涉及到遠端資料的通路的操作,在邏輯上圖是一個整體,無論從哪個Worker查詢都會保證資料的正确性。在Worker Mode初始化的時候,我們需要傳入目前Worker的ID以及分布式的總量count。

在使用Server Mode分布式部署時,訓練的Worker和圖資料的server是分開的,一般用于圖資料規模和訓練規模不對稱的情況下。比如目前資料量我們用20個Server就可以容下,但想用100個Worker來加速模型的訓練,這時候就需要用到Server Mode的部署方式。此時如果用Worker Mode來部署,那就意味着圖資料會存在100個Worker上,而100個Worker之間的兩兩通信的代價要比20個Server兩兩通信的代價大得多。

在Server Mode模式下,每個Worker都與一個Server相連,作為資料連接配接的入口,也比較容易做到Worker的動态伸縮,在Server mode部署的時候,我們需要給g.init()傳入cluster spec。

走進工業級圖神經網絡架構GraphLearn

(二)資料源&資料格式

在資料方面,從檔案系統加載資料到記憶體組織成圖的結構,原始資料在檔案系統是離散的,而非圖形式的存在,比如一條頂點資料或者是一條邊資料。檔案系統的類型可以按需擴充,目前支援的有本地檔案系統,阿裡雲的MaxCompute表,還有NFS等。如果想要擴充一種資料源,隻需實作必要的讀寫接口即可。 

為了支援典型場景下資料的需求,GraphLearn抽象了weight、label和attributes三種格式,對于頂點資料和邊資料三種格式都作為可選項。例如下圖中間圖的左部分頂點資料源,除了必要的頂點ID以外,若有權重列,表示這個頂點是有權重的,若有label清單示頂點是有标簽的,若有attributes則表示頂點是有屬性的,對于邊資料也是一樣。資料格式是通過Decoder對象來描述,weighted和labeled隻需要設定True或False就可以了。 對于attributes需要設定每個attributes的類型,如下圖所示頂點有三個屬性,其中第一個為string類型,第二個和第三個是int類型,屬性之間是以冒号分割。

走進工業級圖神經網絡架構GraphLearn

(三)圖對象:資料與計算的載體

前面的介紹裡都通過g作為出口,g作為全局圖對象,在GraphLearn中所有關于圖資料的操作都通過該對象進行。圖對象的聲明比較簡單,隻需要gl.Graph()即可傳回一個圖對象。有了圖對象之後可以為其增加資料,比如下面代碼中為圖對象增加了user和movie兩種類型的頂點資料,然後又增加了點選關系和相似關系,僅需幾行代碼就完成了拓撲關系的建構。最後,我們隻需要g.init()就可以把資料從原始的檔案系統載入成記憶體圖結構并開始對外服務。圖建構完成之後,就可以進行相關的計算,比如圖周遊、圖采樣、負采樣等。

import graphlearn as gl

g = gl.Graph()

g.node(source="path_1", node_type="user", decoder=Decoder(attr_types=["int", "float", "int"]))
 .node(source="path_2", node_type="movie", decoder=Decoder(labeled=True)
 .edge(source="table_4", edge_type=("user", "movie", "click"), decoder= Decoder(weighted=True) )
 .edge(source="table_5", edge_type=("movie", "movie", "similar"), decoder=Decoder(weighted=True) )
 .init()
 
s1 = g.node_sampler("user", batch_size=512, strategy="random")
s2 = g.edge_sampler("click", batch_size=512, strategy="random")
s3 = g.neighbor_sampler(meta_path, expand_factor, strategy="random")
s4 = g.negative_sampler(meta_path, expand_factor, strategy="random")      

(四)Graph Sampling Language(GSL)

在實際場景中,模型依賴的圖操作可能會很複雜。比如之前提到的使用者和電影之間的推薦算法,我們為了預測使用者和電影的連接配接關系,大緻需要以下步驟:

1.     從圖上按Batch擷取邊;

2.     對邊的目的頂點采樣二階鄰居,對邊的原頂點采樣一階鄰居,這是對邊的編碼過程,采樣其頂點感受域;同時還要對邊的原頂點,也就是所謂的user頂點采樣它的負鄰居,也就是沒有直接關系的那些item;

3.    對負采樣的結果,也需要采樣它的二跳鄰居作為編碼。上面對圖操作的過程作為模型的輸入,這個過程表達起來是非常困難。 為了進一步簡化這樣的操作,提高運作效率,我們提出了Graph Sampling Language(GSL)作為圖采樣語言。GSL形式與經典的圖查詢語言有相近之處,本質上是将關于圖的操作描述成一個DAG,由背景引擎高效的執行。關于GSL的詳細用法,可以參考開源文檔上的介紹。

走進工業級圖神經網絡架構GraphLearn

四、GraphLearn的未來規劃

接下來GraphLearn會從幾個方面推進GNN及其生态的建設:

1.     首先是算法與業務。GNN的價值一定是由應用、算法、架構共同去證明,業務和算法是風向标,GNN的生命力要通過落地到場景才能保持,而實踐會帶來算法上的創新。

2.     另一方面是圖資料和程式設計架構。業務和算法的變化,無論是在規模上還是圖的組織方式上,必然帶來不一樣的資料以及連接配接算法與資料的程式設計架構,軟體層的優化也主要展現在這一部分。

3.     最後是新型硬體。架構是合理的利用算力,但并不能創造算力。極緻的性能最終來源于硬體的支援。深度學習已經引發了好幾代GPU的變革,但GPU純粹用于這種不規則的計算,并不經濟,我們也在探索适合GNN的新型硬體。 

歡迎了解 GraphLearn,如果覺得還不錯請它加一個小星星🌟! 

GraphLearn開源位址: