開(kāi)源!一文了解阿里一站式圖計(jì)算平臺(tái)GraphScope
隨著大數(shù)據(jù)的爆發(fā),圖數(shù)據(jù)的應(yīng)用規(guī)模不斷增長(zhǎng),現(xiàn)有的圖計(jì)算系統(tǒng)仍然存在一定的局限。阿里巴巴擁有全球超大的商品知識(shí)圖譜,在豐富的圖場(chǎng)景和真實(shí)應(yīng)用的驅(qū)動(dòng)下,阿里巴巴達(dá)摩院智能計(jì)算實(shí)驗(yàn)室研發(fā)并開(kāi)源了全球首個(gè)一站式超大規(guī)模分布式圖計(jì)算平臺(tái)GraphScope,并入選中國(guó)科學(xué)技術(shù)協(xié)會(huì)“科創(chuàng)中國(guó)”平臺(tái)。本文詳解圖計(jì)算的原理和應(yīng)用及GraphScope的架構(gòu)設(shè)計(jì)。
一 什么是圖計(jì)算
圖數(shù)據(jù)對(duì)一組對(duì)象(頂點(diǎn))及其關(guān)系(邊)進(jìn)行建模,可以直觀、自然地表示現(xiàn)實(shí)世界中各種實(shí)體對(duì)象以及它們之間的關(guān)系。在大數(shù)據(jù)場(chǎng)景下,社交網(wǎng)絡(luò)、交易數(shù)據(jù)、知識(shí)圖譜、交通和通信網(wǎng)絡(luò)、供應(yīng)鏈和物流規(guī)劃等都是典型的以圖建模的例子。圖 1 顯示了阿里巴巴在電商場(chǎng)景下的圖數(shù)據(jù),其中有各種類(lèi)型的頂點(diǎn)(消費(fèi)者、賣(mài)家、物品和設(shè)備)和邊(表示了購(gòu)買(mǎi)、查看、評(píng)論等關(guān)系)。此外,每個(gè)頂點(diǎn)還有豐富的屬性信息相關(guān)聯(lián)。
圖 1:阿里巴巴電商場(chǎng)景圖數(shù)據(jù)示例
實(shí)際場(chǎng)景中的這種圖數(shù)據(jù)通常包含數(shù)十億個(gè)頂點(diǎn)和數(shù)萬(wàn)億條邊。除了規(guī)模大之外,這個(gè)圖的持續(xù)更新速度也非???,每秒可能有近百萬(wàn)的更新。隨著近年來(lái)圖數(shù)據(jù)應(yīng)用規(guī)模的不斷增長(zhǎng),探索圖數(shù)據(jù)內(nèi)部關(guān)系以及在圖數(shù)據(jù)上的計(jì)算受到了越來(lái)越多的關(guān)注。根據(jù)圖計(jì)算的不同目標(biāo),大致可以分為交互查詢、圖分析和基于圖的機(jī)器學(xué)習(xí)三類(lèi)任務(wù)。
1 圖的交互查詢
圖 2:左,金融反欺詐示例;右,圖學(xué)習(xí)示例。
在圖計(jì)算的應(yīng)用中,業(yè)務(wù)通常需要以探索的方式來(lái)查看圖數(shù)據(jù),以進(jìn)行一些問(wèn)題的及時(shí)定位和分析某個(gè)深入的信息,如 圖 2 (左)中的(簡(jiǎn)化)圖模型可被用于金融反欺詐(信用卡非法套現(xiàn))檢測(cè)。 通過(guò)使用偽造的標(biāo)識(shí)符,“犯罪分子”可以從銀行獲得短期信用(頂點(diǎn) 4)。 他嘗試通過(guò)商家(頂點(diǎn)3)的幫助,以虛假購(gòu)買(mǎi)( 邊 2->3)來(lái)兌現(xiàn)貨幣。 一旦從銀行(頂點(diǎn)4)收到付款(邊 4->3),商家再通過(guò)其名下的多個(gè)帳戶將錢(qián)(通過(guò)邊 3->1 和 1->2)退還給“犯罪分子”。 這種模式最終形成一個(gè)圖上的閉環(huán)(2->3->1...->2)。 真實(shí)場(chǎng)景中,圖數(shù)據(jù)在線上的規(guī)??赡馨瑪?shù)十億個(gè)頂點(diǎn)(例如,用戶)和數(shù)千億至萬(wàn)億條邊(例如,支付交易),并且整個(gè)欺詐過(guò)程可能涉及到許多實(shí)體之間包含各種約束的動(dòng)態(tài)交易鏈,因此需要復(fù)雜的實(shí)時(shí)交互分析才能很好的識(shí)別。
2 圖分析
關(guān)于圖分析計(jì)算的研究已經(jīng)持續(xù)了數(shù)十年,產(chǎn)生了很多圖分析的算法。典型的圖分析算法包括經(jīng)典圖算法(例如,PageRank、最短路徑和最大流),社區(qū)檢測(cè)算法(例如,最大團(tuán)/clique、聯(lián)通量計(jì)算、Louvain 和標(biāo)簽傳播),圖挖掘算法(例如,頻繁集挖掘和圖的模式匹配)。由于圖分析算法的多樣性和分布式計(jì)算的復(fù)雜性,分布式圖分析算法往往需要遵循一定的編程模型。當(dāng)前的編程模型有點(diǎn)中心模型“Think-like-vertex”,基于矩陣的模型和基于子圖的模型等。在這些模型下,涌現(xiàn)出各種圖分析系統(tǒng),如 Apache Giraph、Pregel、PowerGraph、Spark GraphX、GRAPE 等。
3 基于圖的機(jī)器學(xué)習(xí)
經(jīng)典的 Graph Embedding 技術(shù),例如 Node2Vec 和 LINE,已在各種機(jī)器學(xué)習(xí)場(chǎng)景中廣泛使用。近年來(lái)提出的圖神經(jīng)網(wǎng)絡(luò)(GNN),更是將圖中的結(jié)構(gòu)和屬性信息與深度學(xué)習(xí)中的特征相結(jié)合。GNN 可以為圖中的任何圖結(jié)構(gòu)(例如,頂點(diǎn),邊或整個(gè)圖)學(xué)習(xí)低維表征,并且生成的表征可以被許多下游圖相關(guān)的機(jī)器學(xué)習(xí)任務(wù)進(jìn)行分類(lèi)、鏈路預(yù)測(cè)、聚類(lèi)等。圖學(xué)習(xí)技術(shù)已被證明在許多與圖相關(guān)的任務(wù)上具有令人信服的性能。與傳統(tǒng)的機(jī)器學(xué)習(xí)任務(wù)不同,圖學(xué)習(xí)任務(wù)涉及圖和神經(jīng)網(wǎng)絡(luò)的相關(guān)操作(見(jiàn)圖 2 右),圖中的每個(gè)頂點(diǎn)都使用與圖相關(guān)的操作來(lái)選擇其鄰居,并將其鄰居的特征與神經(jīng)網(wǎng)絡(luò)操作進(jìn)行聚合。
二 圖計(jì)算:下一代人工智能的基石
不僅僅是阿里巴巴,近年來(lái)圖數(shù)據(jù)和計(jì)算技術(shù)一直是學(xué)術(shù)界和工業(yè)界的熱點(diǎn)。特別是,在過(guò)去的十年中,圖計(jì)算系統(tǒng)的性能已提高了 10~100 倍,并且系統(tǒng)仍在變得越來(lái)越高效,這使得通過(guò)圖計(jì)算來(lái)加速AI和大數(shù)據(jù)任務(wù)成為了可能。實(shí)際上,由于圖能十分自然地表達(dá)各種復(fù)雜類(lèi)型的數(shù)據(jù),并且可以為常見(jiàn)的機(jī)器學(xué)習(xí)模型提供抽象。與密集張量相比,圖能提供更豐富的語(yǔ)義和更全面的優(yōu)化功能。此外,圖是稀疏高維數(shù)據(jù)的自然表達(dá),并且圖卷積網(wǎng)絡(luò)(GCN)和圖神經(jīng)網(wǎng)絡(luò)(GNN)中越來(lái)越多的研究證明,圖計(jì)算是對(duì)機(jī)器學(xué)習(xí)的有效補(bǔ)充,在結(jié)果的可解釋性、深層次推理因果等方面將扮演越來(lái)越重要的作用。
圖 3:圖計(jì)算在AI各個(gè)領(lǐng)域具有廣闊的應(yīng)用前景
可以預(yù)見(jiàn),圖計(jì)算將在下一代人工智能的各種應(yīng)用中發(fā)揮重要作用,包括反欺詐,智能物流,城市大腦,生物信息學(xué),公共安全,公共衛(wèi)生,城市規(guī)劃,反洗錢(qián),基礎(chǔ)設(shè)施,推薦系統(tǒng),金融技術(shù)和供應(yīng)鏈等領(lǐng)域。
三 圖計(jì)算現(xiàn)狀
經(jīng)過(guò)這些年的發(fā)展,已有針對(duì)各種圖計(jì)算需求的多種系統(tǒng)和工具。例如在交互查詢方面,有圖數(shù)據(jù)庫(kù)Neo4j、ArangoDB和OrientDB等、也有分布式系統(tǒng)和服務(wù)JanusGraph、Amazon Neptune和Azure Cosmos DB等;在圖分析方面,有 Pregel、Apache Giraph、Spark GraphX、PowerGraph 等系統(tǒng);在圖學(xué)習(xí)上有 DGL、pytorch geometric 等。盡管如此,面對(duì)豐富的圖數(shù)據(jù)和多樣化的圖場(chǎng)景,有效利用圖計(jì)算增強(qiáng)業(yè)務(wù)效果依然面臨著巨大的挑戰(zhàn):
-
現(xiàn)實(shí)生活中的圖計(jì)算場(chǎng)景多樣,且通常非常復(fù)雜,涉及到多種類(lèi)型的圖計(jì)算。現(xiàn)有的系統(tǒng)主要是為特定類(lèi)型的圖計(jì)算任務(wù)設(shè)計(jì)的。因此,用戶必須將復(fù)雜的任務(wù)分解為涉及許多系統(tǒng)的多個(gè)作業(yè)。在系統(tǒng)之間可能會(huì)產(chǎn)生大量例如集成、IO、格式轉(zhuǎn)換、網(wǎng)絡(luò)和存儲(chǔ)方面的額外開(kāi)銷(xiāo)。
-
難以開(kāi)發(fā)大型圖計(jì)算的應(yīng)用。為了開(kāi)發(fā)圖計(jì)算的應(yīng)用,用戶通常使用簡(jiǎn)單易用的工具(例如 Python 中的 NetworkX 和 TinkerPop)在一臺(tái)機(jī)器上從小規(guī)模圖數(shù)據(jù)開(kāi)始。但是,對(duì)于普通用戶而言,擴(kuò)展其單機(jī)解決方案到并行環(huán)境處理大規(guī)模圖是極其困難的?,F(xiàn)有的用于大規(guī)模圖的分布式系統(tǒng)通常遵循不同的編程模型,并且缺乏單機(jī)庫(kù)(例如 NetworkX)中豐富的即用算法/插件庫(kù)。這使得分布式圖計(jì)算的門(mén)檻過(guò)高。
-
處理大圖的規(guī)模和效率仍然有限。例如,由于游歷模式的高度復(fù)雜性,現(xiàn)有的交互式圖查詢系統(tǒng)無(wú)法并行執(zhí)行 Gremlin 查詢。對(duì)于圖分析系統(tǒng),傳統(tǒng)的點(diǎn)中心編程模型使圖級(jí)別的現(xiàn)有優(yōu)化技術(shù)不再可用。此外,許多現(xiàn)有系統(tǒng)也基本未在編譯器級(jí)別上做過(guò)優(yōu)化。
下面我們通過(guò)一個(gè)具體的示例看看現(xiàn)有系統(tǒng)的局限性。
1 示例:論文分類(lèi)預(yù)測(cè)
數(shù)據(jù)集 ogbn-mag 是一個(gè)來(lái)自于微軟學(xué)術(shù)的數(shù)據(jù)集。數(shù)據(jù)中包含四種類(lèi)型的點(diǎn),分別表示論文、作者、機(jī)構(gòu)、研究領(lǐng)域;在這些點(diǎn)之間有表示關(guān)系的四種邊:分別是作者 “ 撰寫(xiě) ” 了論文,論文 “ 引用 ” 了另一篇論文,作者 “ 隸屬于 ” 某個(gè)機(jī)構(gòu),和論文 “ 屬于 ” 某個(gè)研究領(lǐng)域。這個(gè)數(shù)據(jù)很自然的可以用圖來(lái)建模。
一個(gè)用戶期望在這個(gè)圖上對(duì) 2014-2020 年間發(fā)表的 “ 論文 ” 做一個(gè)分類(lèi)任務(wù),期望能根據(jù)論文在數(shù)據(jù)圖中的結(jié)構(gòu)屬性、自身的主題特征、以及 kcore、三角計(jì)數(shù) triangle-counting 等團(tuán)聚度的衡量參數(shù),將其歸類(lèi)并預(yù)測(cè)文章的主題類(lèi)別。實(shí)際上,這是一個(gè)十分常見(jiàn)和有意義的任務(wù),這個(gè)預(yù)測(cè)由于考慮了論文的引用關(guān)系和論文的主題,可以幫助研究人員更好的發(fā)現(xiàn)領(lǐng)域內(nèi)的潛在合作和研究熱點(diǎn)。
讓我們分解一下這個(gè)計(jì)算任務(wù):首先我們需要對(duì)論文及其相關(guān)的點(diǎn)邊做一個(gè)根據(jù)年份的篩選,再需要在這個(gè)圖上計(jì)算 kcore、triangle-counting 等全圖計(jì)算,最后將這兩個(gè)參數(shù)和圖上的原始特征一起,放入一個(gè)機(jī)器學(xué)習(xí)框架進(jìn)行分類(lèi)訓(xùn)練和預(yù)測(cè)。我們發(fā)現(xiàn)當(dāng)前已有的系統(tǒng)并不能很好的端到端解決這個(gè)問(wèn)題,我們只能通過(guò)將多個(gè)系統(tǒng)組織成一個(gè) pipeline 的形式運(yùn)行:
圖 4:論文分類(lèi)預(yù)測(cè)多系統(tǒng)組成的工作流
這個(gè)任務(wù)看起來(lái)是解決了,實(shí)際上這樣流水線的方案背后隱藏著許多問(wèn)題。例如多個(gè)系統(tǒng)之間互相獨(dú)立和割裂,中間數(shù)據(jù)頻繁落盤(pán)進(jìn)行系統(tǒng)間的數(shù)據(jù)傳遞;圖分析的程序不是聲明性語(yǔ)言,沒(méi)有固定范式;圖的規(guī)模影響機(jī)器學(xué)習(xí)框架的效率等等。這些都是我們?cè)诂F(xiàn)實(shí)圖計(jì)算場(chǎng)景中常遇到的問(wèn)題,總結(jié)一下可以概括為以下三點(diǎn):
-
圖計(jì)算問(wèn)題十分復(fù)雜,計(jì)算模式多樣,解決方案碎片化。
-
圖計(jì)算學(xué)習(xí)難度強(qiáng),成本大,門(mén)檻高。
-
圖的規(guī)模和數(shù)據(jù)量大,計(jì)算復(fù)雜,效率低。
為了解決以上的問(wèn)題,我們?cè)O(shè)計(jì)并研發(fā)了一站式開(kāi)源圖計(jì)算系統(tǒng):GraphScope。
四 GraphScope 是什么
GraphScope 是阿里巴巴達(dá)摩院智能計(jì)算實(shí)驗(yàn)室研發(fā)并開(kāi)源的一站式圖計(jì)算平臺(tái)。依托于阿里海量數(shù)據(jù)和豐富場(chǎng)景,與達(dá)摩院的高水平研究,GraphScope 致力于針對(duì)實(shí)際生產(chǎn)中圖計(jì)算的上述挑戰(zhàn),提供一站式高效的解決方案。
GraphScope 提供 Python 客戶端,能十分方便的對(duì)接上下游工作流,具有一站式、開(kāi)發(fā)便捷、性能極致等特點(diǎn)。它具有高效的跨引擎內(nèi)存管理,在業(yè)界首次支持 Gremlin 分布式編譯優(yōu)化,同時(shí)支持算法的自動(dòng)并行化和支持自動(dòng)增量化處理動(dòng)態(tài)圖更新,提供了企業(yè)級(jí)場(chǎng)景的極致性能。在阿里巴巴內(nèi)部和外部的應(yīng)用中,GraphScope 已經(jīng)證明在多個(gè)關(guān)鍵互聯(lián)網(wǎng)領(lǐng)域(如風(fēng)控,電商推薦,廣告,網(wǎng)絡(luò)安全,知識(shí)圖譜等)實(shí)現(xiàn)重要的業(yè)務(wù)新價(jià)值。
GraphScope 集合了達(dá)摩院的多項(xiàng)學(xué)術(shù)研究成果,其中的核心技術(shù)曾獲得數(shù)據(jù)庫(kù)領(lǐng)域頂級(jí)學(xué)術(shù)會(huì)議 SIGMOD2017 最佳論文獎(jiǎng)、VLDB2017 最佳演示獎(jiǎng)、VLDB2020 最佳論文提名獎(jiǎng)、世界人工智能創(chuàng)新大賽SAIL獎(jiǎng)。GraphScope 的交互查詢引擎的論文也已被 NSDI 2021 錄用,即將發(fā)表。還有其它圍繞 GraphScope 的十多項(xiàng)研究成果發(fā)表在領(lǐng)域頂級(jí)的學(xué)術(shù)會(huì)議或期刊上,如 TODS、SIGMOD、VLDB、KDD 等。
1 架構(gòu)介紹
圖 5:GraphScope 系統(tǒng)架構(gòu)圖
GraphScope 的底層是一個(gè)分布式內(nèi)存數(shù)據(jù)管理系統(tǒng) vineyard[1]。vineyard 也是我們開(kāi)源的一個(gè)項(xiàng)目,它提供了高效和豐富的 IO 接口負(fù)責(zé)與更底層的文件系統(tǒng)交互,它提供了高效和高層次的數(shù)據(jù)抽象(包括但不限于圖,tensor,vector 等),支持管理數(shù)據(jù)的分區(qū)、元數(shù)據(jù)等,可以為上層應(yīng)用提供本機(jī)零拷貝的數(shù)據(jù)讀取。正是這一點(diǎn)支持了 GraphScope 的一站式能力:在跨引擎之間,圖數(shù)據(jù)按分區(qū)的形式存在于 vineyard,由 vineyard 統(tǒng)一管理。
中間是引擎層,分別由交互式查詢引擎 GIE,圖分析引擎 GAE,和圖學(xué)習(xí)引擎 GLE 組成,我們將在后續(xù)的章節(jié)中詳細(xì)介紹。
最上層是開(kāi)發(fā)工具和算法庫(kù)。GraphScope 提供了各類(lèi)常用的分析算法,包括連通性計(jì)算類(lèi)、社區(qū)發(fā)現(xiàn)類(lèi)和 PageRank、中心度等數(shù)值計(jì)算類(lèi)的算法,后續(xù)會(huì)不斷擴(kuò)展算法包,在超大規(guī)模圖上提供與 NetworkX 算法庫(kù)兼容的分析能力。此外也提供了豐富的圖學(xué)習(xí)算法包,內(nèi)置支持 GraphSage、DeepWalk、LINE、Node2Vec 等算法。
2 重解問(wèn)題:論文分類(lèi)預(yù)測(cè)
有了一站式計(jì)算平臺(tái) GraphScope,我們可以用一種更簡(jiǎn)單的方式解決前面示例中的問(wèn)題。
GraphScope 提供 Python客戶端, 讓數(shù)據(jù)科學(xué)家可以在自己熟悉的環(huán)境中完成所有圖計(jì)算相關(guān)的工作。打開(kāi) Python 后,我們首先需要建立一個(gè) GraphScope 會(huì)話。
- import graphscope
- from graphscope.dataset.ogbn_mag import load_ogbn_mag
- sess = graphscope.sesson()
- g = load_ogbn_mag(sess, "/testingdata/ogbn_mag/")
在上面的代碼中,我們建立了一個(gè) GraphScope 的 session,并載入了圖數(shù)據(jù)。
GraphScope 面向云原生設(shè)計(jì),一個(gè) session 的背后對(duì)應(yīng)了一組 k8s 的資源,該session 負(fù)責(zé)這個(gè)會(huì)話中所有資源的申請(qǐng)和管理。具體來(lái)說(shuō),在用戶這行代碼的背后,session首先會(huì)請(qǐng)求一個(gè)后端總?cè)肟?Coordinator 的 pod。Coordinator 負(fù)責(zé)跟 Python 客戶端的所有通信,在完成自身的初始化后,它會(huì)拉起一組引擎 pod。這組 pod 中每一個(gè) pod 都有一個(gè) vineyard 實(shí)例,共同組成一個(gè)分布式內(nèi)存管理層;同時(shí),每一個(gè) pod 中都有 GIE、GAE、GLE 三個(gè)引擎,它們的啟停狀態(tài)由 Coordinator 在后續(xù)按需管理。當(dāng)這組 pod 拉起并與 Coordinator 建立穩(wěn)定連接、完成健康檢查后,Coordinator 會(huì)返回狀態(tài)到客戶端,告訴用戶,session 已拉起成功,資源就緒可以開(kāi)始載圖或計(jì)算了。
- interactive = sess.gremlin(g)
- # count the number of papers two authors (with id 2 and 4307) have co-authored
- papers = interactive.execute("g.V().has('author', 'id', 2).out('writes').where(__.in('writes').has('id', 4307)).count()").one()
首先我們?cè)趫D g 上建立了一個(gè)交互式查詢對(duì)象 interactive 。這個(gè)對(duì)象在引擎 pod 中拉起了一組交互式查詢引擎 GIE。接著下面是一個(gè)標(biāo)準(zhǔn)的 Gremlin 查詢語(yǔ)句,用戶想在這個(gè)數(shù)據(jù)中查看兩個(gè)具體作者的合作論文。這個(gè) Gremlin 語(yǔ)句會(huì)發(fā)送給 GIE 引擎進(jìn)行拆解和執(zhí)行。
GIE 引擎由并行化 Compiler、內(nèi)存和調(diào)度管理、Operator 運(yùn)行時(shí)、自適應(yīng)的游歷策略和分布式 Dataflow 引擎等核心組件組成。在收到交互式查詢的語(yǔ)句后,該語(yǔ)句首先會(huì)被 Compiler 拆分,編譯成多個(gè)運(yùn)行算子。這些算子再以分布式數(shù)據(jù)流的模型被驅(qū)動(dòng)和執(zhí)行,在這個(gè)過(guò)程中,每一個(gè)持有分區(qū)數(shù)據(jù)的計(jì)算節(jié)點(diǎn)都跑一份該數(shù)據(jù)流的拷貝,并行處理本分區(qū)的數(shù)據(jù),并在過(guò)程中按需進(jìn)行數(shù)據(jù)交換,從而并行化的執(zhí)行 Gremlin 查詢。
Gremlin 復(fù)雜的語(yǔ)法下,游歷策略至關(guān)重要并影響著查詢的并行度,它的選擇直接影響著資源的占用和查詢的性能。只靠簡(jiǎn)單的 BFS 或是 DFS 在現(xiàn)實(shí)中并不能滿足需求。最優(yōu)的游歷策略往往需要根據(jù)具體的數(shù)據(jù)和查詢動(dòng)態(tài)調(diào)整和選擇。GIE 引擎提供了自適應(yīng)的游歷策略配置,根據(jù)查詢數(shù)據(jù)、拆解的 Op 和 Cost 模型選擇游歷策略,以達(dá)到算子執(zhí)行的高效性。
- # extract a subgraph of publication within a time range
- sub_graph = interactive.subgraph("g.V().has('year', inside(2014, 2020)).outE('cites')")
- # project the projected graph to simple graph.
- simple_g = sub_graph.project_to_simple(v_label="paper", e_label="cites")
- ret1 = graphscope.k_core(simple_g, k=5)
- ret2 = graphscope.triangles(simple_g)
- # add the results as new columns to the citation graph
- sub_graph = sub_graph.add_column(ret1, {"kcore": "r"})
- sub_graph = sub_graph.add_column(ret2, {"tc": "r"})
在通過(guò)一系列單點(diǎn)查看的交互式查詢后,用戶通過(guò)以上語(yǔ)句開(kāi)始做圖分析任務(wù)。
首先它通過(guò)一個(gè) subgraph 的操作子從原圖中根據(jù)篩選條件抽取了一個(gè)子圖。這個(gè)操作子的背后,是交互式引擎 GIE 執(zhí)行了一個(gè)查詢,再將結(jié)果圖寫(xiě)入了 vineyard。
然后用戶在這個(gè)新圖上抽取了 label 為論文的點(diǎn)和他們之間關(guān)系為引用(cites)的邊,產(chǎn)出了一張同構(gòu)圖,并在上面調(diào)用了 GAE 的內(nèi)置算法 k-core 和三角計(jì)數(shù) triangles 在全圖做了分析型計(jì)算。產(chǎn)出結(jié)果后,這兩個(gè)結(jié)果被作為點(diǎn)上的屬性加回了原圖。這里,借助于 vineyard 元數(shù)據(jù)管理和高層數(shù)據(jù)抽象,新的 sub_graph 是通過(guò)原圖上新增一列的變換來(lái)生成的,不需要重建整張圖的全部數(shù)據(jù)。
GAE 引擎核心繼承了曾獲得 SIGMOD2017 最佳論文獎(jiǎng)的 GRAPE 系統(tǒng)[2]。它由高性能運(yùn)行時(shí)、自動(dòng)并行化組件、多語(yǔ)言支持的 SDK 等組件組成。上面的例子用到了 GAE 自帶的算法,此外,GAE 也支持用戶十分簡(jiǎn)單的編寫(xiě)自己的算法并在其上即插即用。用戶以基于子圖編程的 PIE 模型編寫(xiě)算法,或者重用已有圖算法,而不用考慮分布式細(xì)節(jié),由 GAE 來(lái)做自動(dòng)并行化,大幅降低了分布式圖計(jì)算對(duì)用戶的高門(mén)檻。目前,GAE 支持用戶通過(guò)C++、Python(后續(xù)將支持 Java)等多語(yǔ)言編寫(xiě)自己的算法邏輯,即插即用在分布式環(huán)境。GAE 的高性能運(yùn)行時(shí)基于 MPI,對(duì)通訊、數(shù)據(jù)排布,硬件特征做了十分細(xì)致的優(yōu)化,以達(dá)到極致性能。
- # define the features for learning
- paper_features = []
- for i in range(128):
- paper_features.append("feat_" + str(i))
- paper_features.append("kcore")
- paper_features.append("tc")
- # launch a learning engine.
- lg = sess.learning(sub_graph, nodes=[("paper", paper_features)],
- edges=[("paper", "cites", "paper")],
- gen_labels=[
- ("train", "paper", 100, (1, 75)),
- ("val", "paper", 100, (75, 85)),
- ("test", "paper", 100, (85, 100))
- ])
接下來(lái)我們開(kāi)始用圖學(xué)習(xí)引擎為論文分類(lèi)。首先我們配置將數(shù)據(jù)中論文類(lèi)節(jié)點(diǎn)的 128 維特征以及我們?cè)谏弦徊街杏?jì)算出的 kcore 和 triangles 兩個(gè)屬性共同作為訓(xùn)練特征。然后我們從 session 中拉起圖學(xué)習(xí)引擎 GIE。在拉起 GIE中 圖 lg 時(shí),我們配置了圖數(shù)據(jù),特征屬性,指定了哪一類(lèi)的邊,以及將點(diǎn)集劃分為了訓(xùn)練集、驗(yàn)證集和測(cè)試集。
- from graphscope.learning.examples import GCN
- from graphscope.learning.graphlearn.python.model.tf.trainer import LocalTFTrainer
- from graphscope.learning.graphlearn.python.model.tf.optimizer import get_tf_optimizer
- # supervised GCN.
- def train_and_test(config, graph):
- def model_fn():
- return GCN(graph, config["class_num"], ...)
- trainer = LocalTFTrainer(model_fn,
- epoch=config["epoch"]...)
- trainer.train_and_evaluate()
- config = {...}
- train_and_test(config, lg)
然后我們通過(guò)上面的代碼選用模型以及做一些訓(xùn)練相關(guān)的參數(shù)配置就可以十分便捷的用 GLE 開(kāi)始做圖分類(lèi)任務(wù)。
GLE 引擎包含 Graph 與 Tensor 兩部分,分別由各種 Operator 構(gòu)成。Graph 部分涉及圖數(shù)據(jù)與深度學(xué)習(xí)的對(duì)接,如按 Batch 迭代、采樣和負(fù)采樣等,支持同構(gòu)圖和異構(gòu)圖。Tensor 部分則由各類(lèi)深度學(xué)習(xí)算子構(gòu)成。在計(jì)算模塊中,圖學(xué)習(xí)任務(wù)被拆解成一個(gè)個(gè)算子,算子再被運(yùn)行時(shí)分布式的執(zhí)行。為了進(jìn)一步優(yōu)化采樣性能,GLE 將緩存遠(yuǎn)程鄰居、經(jīng)常訪問(wèn)的點(diǎn)、屬性索引等,以加快每個(gè)分區(qū)中頂點(diǎn)及其屬性的查找。GLE 采用支持異構(gòu)硬件的異步執(zhí)行引擎,這使 GLE 可以有效地重疊大量并發(fā)操作,例如 I/O、采樣和張量計(jì)算。GLE 將異構(gòu)計(jì)算硬件抽象為資源池(例如 CPU 線程池和 GPU 流池),并協(xié)作調(diào)度細(xì)粒度的并發(fā)任務(wù)。
五 性能
GraphScope 不僅在易用性上一站式的解決了圖計(jì)算問(wèn)題,在性能上也達(dá)到極致,滿足了企業(yè)級(jí)需求。我們使用 LDBC Benchmark 對(duì) GraphScope 的性能進(jìn)行了評(píng)估和對(duì)比測(cè)試。
如圖 6 所示,在交互式查詢測(cè)試 LDBC SNB Benchmark上,單節(jié)點(diǎn)部署的 GraphScope 與開(kāi)源系統(tǒng) JanusGraph 相比,多數(shù)查詢快一個(gè)數(shù)量級(jí)以上;在分布式部署下,GraphScope 的交互式查詢基本能達(dá)到線性加速的擴(kuò)展性。
圖 6:GraphScope 交互式查詢性能
在圖分析測(cè)試 LDBC GraphAnalytics Benchmark 上,GraphScope 與 PowerGraph 以及其他最新系統(tǒng)比較,幾乎在所有算法和數(shù)據(jù)集的組合中居于領(lǐng)先水平。在某些算法和數(shù)據(jù)集上,跟其他平臺(tái)比較最低也有五倍的性能優(yōu)勢(shì)。局部數(shù)據(jù)見(jiàn)下圖。
圖 7:GraphScope 圖分析性能
關(guān)于實(shí)驗(yàn)的設(shè)定、重現(xiàn)和完整的性能比較可以參見(jiàn)交互式查詢性能[3]和圖分析性能[4]。
六 擁抱開(kāi)源
GraphScope 的白皮書(shū)、代碼已經(jīng)在 github.com/alibaba/graphscope 開(kāi)源[5],項(xiàng)目遵守 Apache License 2.0。 歡迎大家 star、試用,參與到圖計(jì)算 中來(lái)。 也歡迎大家貢獻(xiàn)代碼,一起打造業(yè)界最好的圖計(jì)算系統(tǒng)。 我們的目標(biāo)是持續(xù)更新該項(xiàng)目,不斷提升功能的完整性和系統(tǒng)的穩(wěn)定性。 也歡迎大家關(guān)注網(wǎng)站 graphscope.io 來(lái)跟進(jìn)項(xiàng)目的最新?tīng)顟B(tài)。