首頁(yè)>博客>應(yīng)用場(chǎng)景技術(shù)干貨>亞馬遜 AWS:開(kāi)源圖深度學(xué)習(xí)框架 DGL 的機(jī)遇與挑戰(zhàn)
亞馬遜 AWS:開(kāi)源圖深度學(xué)習(xí)框架 DGL 的機(jī)遇與挑戰(zhàn)
本文整理自亞馬遜云AWS-資深應(yīng)用科學(xué)家-王敏捷在 NUC 2022 年度用戶(hù)大會(huì)上的分享,。
非常高興 悅數(shù)圖數(shù)據(jù)庫(kù) 邀請(qǐng)我給大家講做一個(gè)分享。
先簡(jiǎn)單介紹一下,,我叫王敏捷,現(xiàn)在是亞馬遜云科技上海人工智能研究院的資深應(yīng)用科學(xué)家,,我們研究院成立不久,,主要研究的內(nèi)容其實(shí)就是圖。我們知道圖(Graph)其實(shí)是一個(gè)非常廣闊的東西,,它包含的不僅僅是數(shù)據(jù)結(jié)構(gòu)本身,,它包含的是一種關(guān)系,甚至于是知識(shí)這樣的一種范式,。
今天我想分享的主題叫做《開(kāi)源圖深度學(xué)習(xí)框架的機(jī)遇與挑戰(zhàn)》,,我會(huì)談到我們研究院所主導(dǎo)并開(kāi)發(fā)的一個(gè)開(kāi)源圖深度學(xué)習(xí)框架叫做 Deep Graph Library(DGL) 以及我們?cè)陂_(kāi)源這個(gè)領(lǐng)域的一些前端的研究工作。
什么是圖機(jī)器學(xué)習(xí)
相信聽(tīng)過(guò)上半場(chǎng)很多這些 talk 的同學(xué)們或者老師們,,肯定對(duì)這一點(diǎn)是毋庸置疑了——就是我們的圖數(shù)據(jù)其實(shí)在整個(gè)生產(chǎn)生活當(dāng)中是無(wú)處不在的,,在一些比如說(shuō)非常微觀的層面上,我們的藥物和分子結(jié)構(gòu)其實(shí)可以認(rèn)為是一種圖的結(jié)構(gòu),,然后在我們的電商等等場(chǎng)景當(dāng)中,,像社交網(wǎng)絡(luò)產(chǎn)品的交互網(wǎng)絡(luò)知識(shí)圖譜等等,其實(shí)都是圖的數(shù)據(jù)結(jié)構(gòu),。
圖機(jī)器學(xué)習(xí)任務(wù)
那既然圖的數(shù)據(jù)結(jié)構(gòu)有那么多樣,,而且無(wú)處不在,在圖上的機(jī)器學(xué)習(xí)也會(huì)有各種各樣的種類(lèi),,這邊我簡(jiǎn)單地抽象地概括一下,,比如說(shuō)我們現(xiàn)在有這張圖,我們?cè)谶@個(gè)圖上其實(shí)有很多種不同的機(jī)器學(xué)習(xí)任務(wù),,比如說(shuō)我可以對(duì)這個(gè)節(jié)點(diǎn)去做一個(gè)預(yù)測(cè),,我可以試圖去分析,比如說(shuō)一個(gè)用戶(hù)他的興趣愛(ài)好是什么,其實(shí)這就是在圖上做節(jié)點(diǎn)分類(lèi)的這樣一個(gè)任務(wù),。
對(duì)應(yīng)的我們既然有節(jié)點(diǎn)分類(lèi)任務(wù),,也可以有鏈接預(yù)測(cè)的任務(wù),比如說(shuō)我現(xiàn)在這張圖上有一條邊,,我去判斷邊的屬性,,其實(shí)這就是一個(gè)邊預(yù)測(cè)的任務(wù)。我可以對(duì)一個(gè)已有的邊進(jìn)行分類(lèi),,也可以去判斷兩個(gè)節(jié)點(diǎn)之間它是不是存在一條邊,,其實(shí)都是鏈接預(yù)測(cè)的這樣的任務(wù)。相對(duì)應(yīng)的例子,,比如說(shuō)像推薦系統(tǒng),,知識(shí)圖譜股權(quán)等等,其實(shí)都是鏈接預(yù)測(cè)對(duì)應(yīng)的實(shí)際應(yīng)用,。
節(jié)點(diǎn)和鏈接預(yù)測(cè)這兩類(lèi)任務(wù)以外,,我們會(huì)有圖的這樣的一個(gè)預(yù)測(cè)。其中一個(gè)例子就叫做社區(qū)的子圖檢測(cè),,比如說(shuō)我想判斷一個(gè)比較大的圖當(dāng)中,,是不是存在一類(lèi)模式,就比如說(shuō)節(jié)點(diǎn)之間它是某一種互相關(guān)聯(lián)的關(guān)系,,這類(lèi)任務(wù)叫做社區(qū)子圖的檢測(cè),。常見(jiàn)的一個(gè)應(yīng)用,比如說(shuō)我們?cè)诮鹑陲L(fēng)控中會(huì)經(jīng)常發(fā)現(xiàn),,比如說(shuō)一種欺詐行為,,它其實(shí)有一種很強(qiáng)的這樣一個(gè)圖的 pattern,我能不能在一個(gè)復(fù)雜的金融交易網(wǎng)絡(luò)當(dāng)中檢測(cè)到這種 pattern,,其實(shí)就是一個(gè)子圖檢測(cè)的任務(wù),。
最后也會(huì)有整圖檢測(cè)這樣的一個(gè)任務(wù)。整圖檢測(cè)往往是一個(gè)比對(duì)于比較小的這些圖,,比如說(shuō)我們可以把藥物的分子或者說(shuō)一些化合物把它給認(rèn)為是主圖的結(jié)構(gòu),,然后我去判斷說(shuō)給定一個(gè)藥分子的這樣一個(gè)圖的結(jié)構(gòu),我能不能去預(yù)測(cè)出分子是否具有我們想要的某種化學(xué)性質(zhì),,這類(lèi)的任務(wù)就是整圖的性質(zhì)預(yù)測(cè),。
圖應(yīng)用案例
社交平臺(tái)上的水軍檢測(cè)
剛剛講的可能是一些比較抽象的分類(lèi),接下來(lái)我講幾個(gè)實(shí)際的例子,。
第一個(gè)例子,我們實(shí)際做的一個(gè)客戶(hù)案例,。這個(gè)客戶(hù)是一個(gè)社交平臺(tái),,它的一個(gè)任務(wù)是水軍檢測(cè),它的數(shù)據(jù)其實(shí)大家在 PPT 上可以看到——有一個(gè)異構(gòu)圖,這個(gè)圖上有兩類(lèi)節(jié)點(diǎn),,一類(lèi)是這個(gè)帖子的節(jié)點(diǎn),,一類(lèi)是用戶(hù)的節(jié)點(diǎn),我分別用圓圈方塊來(lái)表示,,這些邊代表的是用戶(hù)和帖子的交互關(guān)系,,比如說(shuō)用戶(hù)點(diǎn)贊轉(zhuǎn)發(fā)帖子等等這些。水軍檢測(cè)這個(gè)任務(wù)對(duì)應(yīng)的是,,如果出現(xiàn)一類(lèi)新的交互關(guān)系,,我要去判斷說(shuō)這個(gè)關(guān)系究竟是一個(gè)好的關(guān)系,還是一個(gè)惡意的關(guān)系,,其實(shí)這對(duì)應(yīng)的就是我們剛剛提到的邊的分類(lèi)任務(wù),。
所以其實(shí)可以看到,對(duì)于水軍檢測(cè)這樣一個(gè)任務(wù)本身,,我們可以把它給抽象成一個(gè)圖上的機(jī)器學(xué)習(xí)任務(wù),。
藥物重定位知識(shí)圖譜
第二個(gè)例子我想講的是我們研究院做的另外一個(gè)工作,這個(gè)工作其實(shí)是2020 年時(shí)做的,,因?yàn)槟莻€(gè)時(shí)候正好是新冠病毒肆虐的這樣的一個(gè)時(shí)間,,想看我們能不能通過(guò)我們研究院所做的圖的主題,來(lái)給抗疫攻堅(jiān)戰(zhàn)貢獻(xiàn)一份力量,。
當(dāng)時(shí)我們想做的一個(gè)任務(wù)叫做藥物重定位,,什么叫藥物重定位?我們知道一個(gè)新的病毒產(chǎn)生,,我們希望能夠立馬找到它的靶向藥,,但是一個(gè)藥物的審批流程是非常長(zhǎng)的,所以我們想要做的事情就是在已經(jīng)審批過(guò)的藥物當(dāng)中,,能不能把這個(gè)藥物重定向?yàn)樾碌牟《镜陌邢蛩?。?dāng)然這個(gè)過(guò)程是非常復(fù)雜的,我們做了這么一個(gè)知識(shí)圖譜,,叫做 藥物重定位知識(shí)圖譜(DRKG),。
可以看到左邊這個(gè)知識(shí)圖譜的 Schema 是非常復(fù)雜的,在這個(gè)圖當(dāng)中,,比如說(shuō)有 Compound 的化合物基因,,包括 Disease 等等不同類(lèi)型的節(jié)點(diǎn),我們?cè)趺慈ソ鉀Q藥物重定位的問(wèn)題,?其實(shí)也是同樣的思路,,我們把藥物重定位的問(wèn)題給映射成這個(gè)圖上的一個(gè)機(jī)器學(xué)習(xí)問(wèn)題。
如果把藥物重定位映射成圖上機(jī)器學(xué)習(xí)問(wèn)題,,它其實(shí)對(duì)應(yīng)的就是一個(gè)鏈接預(yù)測(cè),,我希望能夠去判斷,,比如一個(gè)疾病節(jié)點(diǎn),它是不是潛在地和某一個(gè)藥物節(jié)點(diǎn)之間有一個(gè)潛在的靶向連接關(guān)系,,如果說(shuō)通過(guò)數(shù)據(jù)分析能夠判斷出來(lái)有這樣潛在的連接關(guān)系,,就有理由相信說(shuō)這類(lèi)藥物是治療這類(lèi)病毒的一個(gè)潛在的藥物。
通過(guò)這個(gè)方式我們也做了一些建模,,包括一些數(shù)據(jù)分析,,最終的結(jié)果我們發(fā)現(xiàn)通過(guò)這個(gè)圖數(shù)據(jù)分析的方式,所推薦的 41 種藥物當(dāng)中,,有 11 種還確實(shí)是被用于 Covid-19 的臨床實(shí)踐的,。所以可以看到其實(shí)在這個(gè)圖數(shù)據(jù)當(dāng)中,我們可以學(xué)習(xí)出很多有重要價(jià)值的信息和(取得)一些結(jié)果,。
圖神經(jīng)網(wǎng)絡(luò) (GNN) 的介紹
什么是圖神經(jīng)網(wǎng)絡(luò)(GNN)
實(shí)際過(guò)程中使用圖數(shù)據(jù)去解決問(wèn)題,,大家可能會(huì)想到說(shuō)我有這樣的任務(wù),我有這樣的一個(gè)需求,,我應(yīng)該用怎樣的模型去解決它呢,?
現(xiàn)在主流的或者說(shuō)一個(gè)非常火熱的方向,,(就是)把我們知道已經(jīng)非常成功的深度學(xué)習(xí)技巧引入到圖數(shù)據(jù)的學(xué)習(xí)當(dāng)中,,因此也就誕生了一類(lèi)新的圖數(shù)據(jù)庫(kù),叫做圖神經(jīng)網(wǎng)絡(luò) Graph Neural Network,,GNN,。
什么是 GNN?我這邊做一個(gè)簡(jiǎn)單的介紹,,如果做個(gè)類(lèi)比的話(huà),,我們可以想象說(shuō)非常常見(jiàn)的傳統(tǒng)的比如說(shuō)卷積神經(jīng)網(wǎng)絡(luò),它是用于比如說(shuō)圖像識(shí)別這些任務(wù),,其實(shí)這些神經(jīng)網(wǎng)絡(luò)它的一個(gè)目的就是說(shuō)我獲得一份輸入的數(shù)據(jù),,然后把這些輸入數(shù)據(jù)變成一種高維空間中的向量表征。其實(shí)圖神經(jīng)網(wǎng)絡(luò)也是對(duì)應(yīng)的類(lèi)似的這樣一個(gè)技巧,,它的輸入數(shù)據(jù)是個(gè)圖,,所以自然地我就可以把這個(gè)圖上的點(diǎn)邊,甚至于整張圖這個(gè)數(shù)據(jù)通過(guò)圖神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)映射成一個(gè)高維的向量——其實(shí)這就是圖神經(jīng)網(wǎng)絡(luò),。
這邊有個(gè)簡(jiǎn)單的例子,,比如說(shuō)我們可以看到左邊的輸入數(shù)據(jù)是一個(gè)簡(jiǎn)單的社交網(wǎng)絡(luò),每個(gè)節(jié)點(diǎn)是個(gè)用戶(hù),,用戶(hù)和用戶(hù)之間是朋友的關(guān)系,,我可以通過(guò)神經(jīng)網(wǎng)絡(luò)給不同的用戶(hù)生成一個(gè)高維空間的向量,它不僅僅包含比如說(shuō)用戶(hù)本身的畫(huà)像信息,,同時(shí)也會(huì)包含它周?chē)従拥慕Y(jié)構(gòu)信息,。通過(guò)這樣一個(gè)畫(huà)像,,這樣的一個(gè)高維向量,,我可以把它輸入到分類(lèi)器中去判斷說(shuō)他的一個(gè)興趣愛(ài)好,。
圖數(shù)據(jù)網(wǎng)絡(luò)為什么強(qiáng)大?一個(gè)原因就在于它在計(jì)算的過(guò)程當(dāng)中,,其實(shí)不僅僅考慮了一個(gè)節(jié)點(diǎn)自己的畫(huà)像信息,,也考慮了一個(gè)節(jié)點(diǎn)它周?chē)泥従拥慕Y(jié)果。
做一個(gè)很簡(jiǎn)單的類(lèi)比,,比如說(shuō)如果要判斷我到底喜歡哪一支 NBA 球隊(duì),,最簡(jiǎn)單的方式就是看我的社交網(wǎng)絡(luò)上我的朋友到底喜歡哪支 NBA 球隊(duì),如果發(fā)現(xiàn)我 99% 的朋友都喜歡,,比如紐約尼克斯,,我有可能也是這樣一個(gè)球隊(duì)的粉絲。
同樣的,,圖神經(jīng)網(wǎng)絡(luò)也利用這樣的一個(gè)很樸素的思想,,也就是說(shuō)當(dāng)我在計(jì)算某一個(gè)節(jié)點(diǎn)的向量的時(shí)候,我會(huì)去收集它周?chē)従拥南蛄刻卣?,然后做個(gè)聚合,,通過(guò)這樣的不斷的迭代的方式,我可以獲得圖神經(jīng)網(wǎng)絡(luò)的最終輸出的結(jié)果,。
這邊簡(jiǎn)單看一個(gè)公式,,總體來(lái)說(shuō)就是剛剛我們所說(shuō)的這樣一個(gè)過(guò)程,就是通過(guò)收集鄰居信息,,然后再做聚合的過(guò)程,。
這個(gè)過(guò)程叫做消息傳遞,可以用一個(gè)數(shù)兩個(gè)數(shù)學(xué)公式去表達(dá),。大家要記住這個(gè)詞,,消息傳遞是非常重要的,是我們圖神經(jīng)網(wǎng)絡(luò)一個(gè)核心的概念,。這當(dāng)中其實(shí)包含了兩類(lèi)的計(jì)算,,一類(lèi)是在邊上計(jì)算,去計(jì)算一個(gè)節(jié)點(diǎn),,到底要給鄰居發(fā)怎樣的消息,,對(duì)應(yīng)的當(dāng)中也會(huì)有一個(gè)函數(shù)叫做消息函數(shù)。
然后另外一個(gè)是在節(jié)點(diǎn)上發(fā)生的計(jì)算,,就是說(shuō)(節(jié)點(diǎn))現(xiàn)在收到了很多鄰居的消息,,我怎么把它給聚合起來(lái),所以這對(duì)應(yīng)的也會(huì)有一個(gè)累和函數(shù),。然后我通過(guò)了這些累和的消息以及我自身的消息,,去重新更新自己的向量特征,,所以這邊會(huì)有一個(gè)更新函數(shù)。
圖神經(jīng)網(wǎng)絡(luò)的靈活性以及強(qiáng)大在于,,我剛剛所提到的這些消息函數(shù),、累和函數(shù)、更新函數(shù),,可以通過(guò)你自己的場(chǎng)景和任務(wù)本身去定制,,也就是說(shuō)圖神經(jīng)網(wǎng)絡(luò)它不是一個(gè)模型,它是一類(lèi)模型,,而我完全可以根據(jù)你到底是做的怎樣一個(gè)下游任務(wù),,去定制化這樣的一個(gè)函數(shù)來(lái)獲得更好的效果。
圖神經(jīng)網(wǎng)絡(luò)的現(xiàn)狀
我們可以看看基于這樣的一個(gè)思想,,這類(lèi)我們叫做圖神經(jīng)網(wǎng)絡(luò)(的思想),,它到底有多火——這邊做了一些簡(jiǎn)單的統(tǒng)計(jì),這是我自己做的在學(xué)術(shù)圈的一些統(tǒng)計(jì),,也并沒(méi)有計(jì)算最近的一些文章,。但是總體來(lái)說(shuō)可以看到,關(guān)于圖神經(jīng)網(wǎng)絡(luò)的論文數(shù)目每年的增長(zhǎng)數(shù)目幾乎是呈指數(shù)級(jí)的,,然后在學(xué)術(shù)會(huì)議方面,,圖神經(jīng)網(wǎng)絡(luò)也是非常火熱,,(可以說(shuō))是最火熱的關(guān)鍵詞之一,。
在學(xué)術(shù)圈,在今年年中剛剛結(jié)束的亞馬遜云科技的發(fā)布會(huì)上,,我們的資深副總斯瓦米(Swami)也是專(zhuān)門(mén)提到了 Graph Neural Networks,,他專(zhuān)門(mén)提到說(shuō) Graph Neural Networks are the next big thing。也就是說(shuō)其實(shí)不論是學(xué)界還是工業(yè)界,,都是認(rèn)為圖神經(jīng)網(wǎng)絡(luò)是非常重要的,、里程碑式的一個(gè)發(fā)展。
DGL 的創(chuàng)立與發(fā)展
正是因?yàn)榭吹搅诉@樣一類(lèi)新的神經(jīng)網(wǎng)絡(luò)的誕生,,所以我們其實(shí)整個(gè)團(tuán)隊(duì)也是很快就跟上了,。
我們是在 2018 年 12 月的時(shí)候開(kāi)源了我們的圖神經(jīng)網(wǎng)絡(luò)框架叫做 Deep Graph Library(DGL),我們這個(gè)框架是專(zhuān)門(mén)面向圖數(shù)據(jù)結(jié)構(gòu)專(zhuān)用的一個(gè)深度學(xué)習(xí)框架,,我們開(kāi)發(fā)團(tuán)隊(duì)包括我本人也是來(lái)自于 NYU 和 NYU Shanghai,,由張崢教授發(fā)起,現(xiàn)在也是由我們整個(gè)亞馬遜云科技上海人工智能研究院所負(fù)責(zé)開(kāi)發(fā),,我們整個(gè)項(xiàng)目在上線之初就獲得了廣泛的好評(píng)和關(guān)注,。
這邊可以看到右邊是一些不同的推特,就說(shuō)當(dāng)時(shí)我們剛剛上線的時(shí)候,,有很多的知名學(xué)者,,包括像圖靈獎(jiǎng)獲得者 Yann LeCun 也是專(zhuān)門(mén)給我們點(diǎn)贊,,我們現(xiàn)在的 GitHub Star 數(shù)已經(jīng)超過(guò) 1萬(wàn)了,總體來(lái)說(shuō)在一個(gè)良好的這樣的一個(gè)增長(zhǎng)的趨勢(shì)當(dāng)中,??梢赃@么說(shuō),DGL 在學(xué)界可以說(shuō)是全球領(lǐng)先的深度學(xué)習(xí)框架之一,,在業(yè)界 DGL 的使用率上也是全面領(lǐng)先,。
所以為什么 DGL 這么受人歡迎,,我總結(jié)下來(lái)有4個(gè)原因——
第一個(gè)是我們有一個(gè)靈活應(yīng)用的編程接口,。圖神經(jīng)網(wǎng)絡(luò)其實(shí)是作用在圖上的這樣的一類(lèi)神經(jīng)網(wǎng)絡(luò),所以其實(shí)包括我們剛剛看到這些消息傳遞對(duì)吧,?我收集連接的信息,,然后再累和其實(shí)都是圖上的一個(gè)概念,所以我們采用了一個(gè)以圖為核心的這樣一個(gè)編程接口,,使用戶(hù)在編寫(xiě)圖神經(jīng)網(wǎng)絡(luò)過(guò)程當(dāng)中覺(jué)得非常的簡(jiǎn)單易懂,。
第二點(diǎn)是我們有非常高效的底層系統(tǒng)設(shè)計(jì),原因也是因?yàn)閳D和比如說(shuō)我們常見(jiàn)的深度學(xué)習(xí)所遇到的數(shù)據(jù),,比如說(shuō)張量等等是不一樣的,,圖它是稀疏的,并且它是不規(guī)則的,,所以他其實(shí)對(duì)于底層比如說(shuō)用 GPU 加速是有挑戰(zhàn)的,,在這一點(diǎn)上就是專(zhuān)門(mén)實(shí)現(xiàn)了很高效的底層設(shè)計(jì),使得比如說(shuō)大家寫(xiě)了一個(gè)圖神經(jīng)網(wǎng)絡(luò),,它能夠很方便的在GPU上進(jìn)行加速,。
第三點(diǎn)就是我們有優(yōu)秀的巨圖訓(xùn)練性能。在實(shí)際場(chǎng)景當(dāng)中一個(gè)圖可能非常大,,可能有百億級(jí)的點(diǎn)和邊,,怎么去訓(xùn)練這樣的大圖是一個(gè)非常難的挑戰(zhàn)。DGL 在這當(dāng)中做了很多的探索,,也做了很多的實(shí)踐,。
最后是作為一個(gè)開(kāi)源項(xiàng)目,我們也非常關(guān)注開(kāi)源生態(tài)的完善,,現(xiàn)在也看到很多的 Package 在 DGL 上進(jìn)行構(gòu)建,。
這邊著重談?wù)勎覀冮_(kāi)源社區(qū)建設(shè)的情況,首先是我們有廣泛的開(kāi)源合作的伙伴,,包括比較大的芯片廠商,,也有比如說(shuō)知名的高校,國(guó)內(nèi)的公司等等,;我們也每月會(huì)定期組織用戶(hù)群的分享會(huì),,會(huì)邀請(qǐng)學(xué)界和業(yè)界的研究者一起來(lái)分享這個(gè)圖神經(jīng)網(wǎng)絡(luò)最新的成果,。因?yàn)槲覀円仓肋@是一個(gè)非常新的領(lǐng)域,所以也希望通過(guò)大家的交流來(lái)迸發(fā)出一些新的這些研究的 idea,。
最后就是說(shuō) DGL 其實(shí)在很多的學(xué)術(shù)頂會(huì)上都做過(guò)手把手的教程,,包括像 KDD、WWW 等等,,而且我們作為開(kāi)源項(xiàng)目也會(huì)把所有的材料全部公開(kāi)在網(wǎng)上,,所以如果大家想要學(xué)習(xí) DGL 想要去上手的話(huà),可以在這些網(wǎng)站上找到我們的這些學(xué)習(xí)材料,。
然后我們也知道就是說(shuō)作為一個(gè)開(kāi)源項(xiàng)目,,一個(gè)很重要的就是建立一個(gè)開(kāi)源生態(tài),所以我這邊也簡(jiǎn)單羅列了一下基于 DGL 所開(kāi)發(fā)的很多項(xiàng)目,,或者比較有 interaction 的一些項(xiàng)目,。
首先是可視化,因?yàn)槲覀冎肋@個(gè)圖是個(gè)非常復(fù)雜的數(shù)據(jù),,比如說(shuō)我看張圖片或者說(shuō)看一段文本,,我能夠很清晰地了解它到底是什么意思,但是我看到這張圖我可能就懵了,,我不知道這個(gè)圖連接在一起到底是什么意思,,對(duì)吧?所以可視化就是個(gè)非常重要的一個(gè)手段去給我們的客戶(hù)解釋說(shuō)圖數(shù)據(jù)到底意味著什么,。這邊我們也看到有像學(xué)界的 GNNLens,,包括業(yè)界的 HGNN 等等這些,他們都基于 DGL 開(kāi)發(fā)了可視化的工具,。
第二點(diǎn)是復(fù)雜圖,,因?yàn)槲覄偺岬降囊恍﹫D,比如社交網(wǎng)絡(luò)它可能更多的是比較簡(jiǎn)單的圖,,因?yàn)槠鋵?shí)只有一類(lèi)節(jié)點(diǎn),,就是用戶(hù),用戶(hù)之間比如說(shuō)有個(gè)朋友的關(guān)系——但實(shí)際,,我們看到很多的圖它是異構(gòu)的,,它有不同類(lèi)型的節(jié)點(diǎn)和不同類(lèi)型的邊,在復(fù)雜圖上怎么去建模,,這是一個(gè)比較難的問(wèn)題,,我們這邊也有專(zhuān)門(mén)是北京郵電大學(xué)的石川老師組,可以說(shuō)是國(guó)內(nèi)做異構(gòu)圖最有名的組,,他們所開(kāi)發(fā)的叫做 OpenHGNN 這樣一個(gè)項(xiàng)目,,專(zhuān)門(mén)給大家提供了異構(gòu)圖的很多模型庫(kù),所以如果大家感興趣的話(huà),也可以去看一下 OpenHGNN,。
接下來(lái)就是 GNN 的評(píng)測(cè)標(biāo)準(zhǔn),,作為一個(gè)新興領(lǐng)域,我們肯定需要有很好的評(píng)測(cè)標(biāo)準(zhǔn)來(lái)衡量哪個(gè)圖層網(wǎng)絡(luò)模型更好,,所以這邊有 Open Graph Benchmark,, OGB 也是現(xiàn)在目前最火熱的 benchmark 之一,基于他也是開(kāi)放了 DGL 的接口,。
數(shù)據(jù)庫(kù)的話(huà),,就是說(shuō)我們知道有很多數(shù)據(jù)它其實(shí)不在內(nèi)存里面,它可能一開(kāi)始是來(lái)自于比如用戶(hù)自己的這些數(shù)據(jù)的 warehouse 這邊,,也像有就 Amazon Neptune ML,、Neo4j、ArangoDB,,他們都提供了關(guān)于 DGL 的這樣的一個(gè)開(kāi)放的接口,,我后面會(huì)提到悅數(shù)圖數(shù)據(jù)庫(kù), 悅數(shù)圖數(shù)據(jù)庫(kù)其實(shí)和 DGL 也有一個(gè)良好的數(shù)據(jù)接口,,然后我們專(zhuān)門(mén)還有一個(gè)和 悅數(shù)圖數(shù)據(jù)庫(kù) 的這樣的一個(gè)實(shí)踐案例,后面我會(huì)提到,。
接下來(lái)是自然語(yǔ)言處理,。這一點(diǎn)可能大家會(huì)覺(jué)得有點(diǎn) surprise,為什么自然語(yǔ)言處理和 Graph 有關(guān)系,?事實(shí)上我們?nèi)タ匆粋€(gè)文本的時(shí)候,,我們?nèi)ダ斫庖欢挝谋荆鋵?shí)一個(gè)很自然的想法是去理解它的結(jié)構(gòu),,比如說(shuō)我去理解這個(gè)段和段之間的上下的因果關(guān)系,,所以其實(shí)在我們研究院看來(lái),我們研究圖本身不僅僅是應(yīng)該局限在圖數(shù)據(jù),,也應(yīng)該去看說(shuō)比如說(shuō)一些非結(jié)構(gòu)化數(shù)據(jù)當(dāng)中有沒(méi)有圖這樣的一個(gè)關(guān)系,,其實(shí)學(xué)界當(dāng)中和我們的想法有很多地方是不謀而合的,所以這邊也有像 Graph NLP 這些專(zhuān)門(mén)基于 NGL build的給這些 NLP 的庫(kù),。
生命科學(xué)也是非常重要,,我剛提到像分子生物醫(yī)藥等等,還有這些微觀的數(shù)據(jù),,其實(shí)可以認(rèn)為是圖,,所以 DGL 也有專(zhuān)門(mén)的面向分子生物的包叫做 DGL-LifenSci,像在這個(gè)領(lǐng)域做研究,,做了很多的同學(xué)可能會(huì)了解 deepchem 這么一個(gè) package,,這個(gè) package 是有提供 DGL 所實(shí)現(xiàn)的模型,
最后就是知識(shí)圖譜,,知識(shí)圖譜我不用多說(shuō)了,,作為一個(gè)非常重要的圖數(shù)據(jù)的來(lái)源,,在知識(shí)圖譜上進(jìn)行訓(xùn)練是非常重要的, DGL 也是有專(zhuān)門(mén)的 DGL-KE 這樣一個(gè)知識(shí)圖譜的支付搜索框架,。
簡(jiǎn)單看一下 DGL 這三年的開(kāi)發(fā)歷程,,其實(shí)我們從 2018 年年底發(fā)布第一個(gè)版本之后,一直在不斷的開(kāi)發(fā)新的功能,,然后也是幾乎每三個(gè)月大概是開(kāi)發(fā)一個(gè)新的版本,,然后每個(gè)版本就會(huì)添加很多不同的這樣的一個(gè)支持,比如說(shuō)大圖的一些采用的算法的支持,,包括分布式的訓(xùn)練等等,。
開(kāi)源圖機(jī)器學(xué)習(xí)面臨的挑戰(zhàn)
介紹完 DGL 的事情,我想講一下我們作為一個(gè)開(kāi)源圖機(jī)器學(xué)習(xí)框架面臨的一些核心的挑戰(zhàn),。
事實(shí)上如果我們?nèi)タ词忻嫔系膱D神經(jīng)網(wǎng)絡(luò)框架其實(shí)有很多對(duì)吧,?不僅有 DGL ,還有像 Paddle Graph Learning,、Jraffe,、PyG 等等,有很多這樣的一個(gè)package,。
你可以想象就為什么有那么多 package,,原因也很簡(jiǎn)單,就是我們還做得不夠好,,否則的話(huà)也不會(huì)有那么多 package 對(duì)吧,?那就說(shuō)明它其實(shí)有很多的挑戰(zhàn)是我們沒(méi)有辦法很好解決的,也是我們?cè)诳吹闹饕姆较?。這些方向我總結(jié)下來(lái)一共有三點(diǎn),,第一點(diǎn)是易用性,我怎么讓用戶(hù)使用開(kāi)發(fā)這個(gè)圖神經(jīng)網(wǎng)絡(luò)變得非常方便,。第二點(diǎn)是高性能,,怎么讓他們訓(xùn)練的過(guò)程變得非常快,。最后就是大規(guī)模圖我怎么去解決,,在一個(gè)圖上就是一個(gè)巨圖的這樣的問(wèn)題。
大家可以看到這個(gè)圖當(dāng)中其實(shí)有很多的交集,,也就是說(shuō)其實(shí)我們?cè)谧龅倪^(guò)程中,,我們會(huì)發(fā)現(xiàn),其實(shí)很多情況下它是有 trade-off 的,,比如說(shuō)如果我在易用性上我要達(dá)到一個(gè)完美的易用性,,很有可能我在性能上就會(huì)有做一些損失,這個(gè)當(dāng)中就會(huì)有帶來(lái)了很多的研究的問(wèn)題和挑戰(zhàn)。
所以接下來(lái)我可能會(huì)講一些我們研究院在這幾個(gè)不同的交集當(dāng)中,,我們做的一些實(shí)踐,,以及我們做的一些研究的課題。
易用性和高性能的挑戰(zhàn)
首先的一個(gè)問(wèn)題我想說(shuō)的是易用性加上高性能,,因?yàn)槲覀冏鱿聛?lái)發(fā)現(xiàn)一個(gè)很大的點(diǎn)是說(shuō)神經(jīng)網(wǎng)絡(luò)已經(jīng)很難了,,然后圖又是一個(gè)很復(fù)雜的數(shù)據(jù),所以當(dāng)我們把這個(gè)圖和神經(jīng)網(wǎng)絡(luò)結(jié)合在一塊以后,,就會(huì)發(fā)現(xiàn)這個(gè)事情特別難做,,所以它的整個(gè)入門(mén)門(mén)檻是非常高的。
然后我在編寫(xiě)代碼的時(shí)候,,我很容易寫(xiě)出來(lái)非常低效的代碼,,原因也是跟我們剛剛所提到的說(shuō)圖它是一個(gè)稀疏的和不規(guī)則數(shù)據(jù)結(jié)構(gòu)是有關(guān)的,而我們的底層的硬件芯片像 GPU 等等,,它其實(shí)都更加關(guān)注的是這種規(guī)整的數(shù)據(jù)結(jié)構(gòu),。所以如果我們?nèi)ゾ帉?xiě)一個(gè)圖神經(jīng)網(wǎng)絡(luò)的時(shí)候,很有可能最終的結(jié)果不會(huì)特別好,。
我這邊做一個(gè)簡(jiǎn)單的舉個(gè)例子就說(shuō)這邊有一個(gè)網(wǎng)絡(luò)叫做 Graph,,其實(shí)大家不用特別擔(dān)心說(shuō)這個(gè)數(shù)這個(gè)公式怎么看上去那么復(fù)雜對(duì)吧?但是我可以給大家講稍微講一下,,比如說(shuō)大家如果回想一下圖神經(jīng)網(wǎng)絡(luò),,我剛剛提到其實(shí)就是兩類(lèi)計(jì)算對(duì)吧?一個(gè)在邊上的計(jì)算,,一個(gè)是在點(diǎn)上計(jì)算。
我在邊上要做的事情是把一個(gè)節(jié)點(diǎn)的消息發(fā)給鄰居,,在點(diǎn)上要做的事情是說(shuō)我收到很多鄰居的消息把它聚合,,對(duì)吧?所以說(shuō)如果我去看 GAT 這個(gè)模型公式,,其實(shí)它也就是這兩個(gè)計(jì)算,,比如說(shuō)公式 1 和公式 2 和公式 6,你可以看到他其實(shí)做的都是說(shuō)在這個(gè)節(jié)點(diǎn)的邊上,,我計(jì)算某個(gè)東西,,對(duì)吧?
我們不用管它算的是什么東西,,你可以直接認(rèn)為公式 1,、2、6 它其實(shí)就是在邊上進(jìn)行計(jì)算,,然后 7 這個(gè)公式是在點(diǎn)上算的,,它的做法就是把這個(gè)點(diǎn)上就我剛剛算出來(lái)這些邊上的消息做一個(gè)有機(jī)的結(jié)合,然后再把它聚合起來(lái)。
Ok,,所以這就是 Graph Attention Network,, GAT 這樣一個(gè)模型。
如果我們?nèi)ゾ帉?xiě)一個(gè) code 在當(dāng)中,,其實(shí)邊我們提供了兩套方式去編寫(xiě),,第一套方式我們叫它 User-defined Function,UDF,。這個(gè)一看到就是說(shuō)如果用戶(hù)去寫(xiě) UDF 的話(huà),,它寫(xiě)出來(lái)是這樣的一個(gè)兩個(gè)函數(shù),第一個(gè)叫做 message,,第二個(gè)叫做 aggregate 對(duì)吧,?雖然說(shuō)寫(xiě)程序?qū)懙牟欢嗟耐瑢W(xué)可能不太了解,但是大概還是能夠看出來(lái),,比如說(shuō)每一行代碼它對(duì)應(yīng)的哪一行公式,,對(duì)吧?
所以其實(shí)整體的代碼邏輯是非常簡(jiǎn)單的,,而且能夠自然而然看出來(lái)它的對(duì)應(yīng)關(guān)系,,這樣的一類(lèi)編程接口就是非常直觀,但是一個(gè)問(wèn)題是在于說(shuō)它非常低效,,原因是在于我們要為了支持這樣一種非常直觀的編程方式,,需要把圖這種不規(guī)整的數(shù)據(jù)結(jié)構(gòu)整理成規(guī)整的數(shù)據(jù)結(jié)構(gòu)。
我可以舉個(gè)例子,,比如在圖上很常見(jiàn)的情況是一個(gè)節(jié)點(diǎn),,它可能有不同數(shù)目的鄰居,可能有的節(jié)點(diǎn)它是一個(gè)名人節(jié)點(diǎn)對(duì)吧,?我可能有 100 萬(wàn)個(gè)鄰居,,但有些節(jié)點(diǎn)可能就像我們這樣的,可能也就是比如說(shuō) 100,、200個(gè)朋友對(duì)不對(duì),?你在計(jì)算這個(gè)消息累和的過(guò)程當(dāng)中,它的計(jì)算的代價(jià)是很不一樣的,,我為了要支持這樣的一個(gè)方式,,我需要把它進(jìn)行分類(lèi)。
比如說(shuō)節(jié)點(diǎn)度數(shù)比較高的,,我把它給聚在一塊,,節(jié)點(diǎn)度數(shù)低的我把它給分成另外一塊,然后通過(guò)不同的批次的計(jì)算完成整個(gè)計(jì)算,,可以想象這個(gè)計(jì)算本身是非常耗時(shí)的,,原因也是因?yàn)槲野岩粋€(gè)大的規(guī)整,,我把大的計(jì)算把它切成了很多小計(jì)算,切成小計(jì)算的代價(jià),,就是會(huì)增加很多系統(tǒng)上的一些 overhead,。
所以在 DGL 當(dāng)中我們提供了另外一種編程方式,就說(shuō)對(duì)于一些高級(jí)的用戶(hù),,我們推薦大家是怎么去寫(xiě) GAT 這個(gè)模型,?是讓他們直接調(diào)用我們已經(jīng)包裝好的底層的算子。比如說(shuō)下面這個(gè)例子,,如果我要用 DGL 包裝好的底層的算子去實(shí)現(xiàn)階梯模型是怎么做的,?
可以看到就是說(shuō)首先雖然我有大概的還有個(gè)對(duì)應(yīng),比如說(shuō)我這邊用注釋寫(xiě)了,,說(shuō)每一行公式對(duì)應(yīng)的是哪一些代碼,,但是這個(gè)代碼本身其實(shí)的可讀性已經(jīng)比上面要低很多了,我并不能很快的去了解說(shuō)到底每一個(gè) operation 到底在干什么,。
這邊可以看到有很多 DGL 的調(diào)用,,比如說(shuō)如我們看下面的這些調(diào)用,其實(shí)就是我剛剛提到的說(shuō)提交已經(jīng)封裝好的底層的這些算子交給用戶(hù)去做,,但是理解這些算子的本身是有代價(jià)的,,所以可以看到說(shuō)這個(gè)當(dāng)中也就是另外一類(lèi)編程模型的這樣一個(gè)問(wèn)題,它雖然非常高效,,因?yàn)槊恳粋€(gè)就是很高效的算子去幫你高效 GPU 的加速,,但是它是直白的,然后這當(dāng)中的性能差距能有多大呢,?
當(dāng)然得判斷這個(gè)圖的分布是怎樣,,但是最終的結(jié)果我們測(cè)下來(lái)大概平均會(huì)有 10 倍到 100 倍的差距,所以這個(gè)差距是非常大的,。
Ok,,所以這其實(shí)就有一個(gè) trade-off 在里面,就我剛剛提到的在易用性和高性能之間,,它是有一個(gè)要做權(quán)衡的。
對(duì)于我們研究人員來(lái)說(shuō),,我們想做的事情就是想了解說(shuō)我們有沒(méi)有辦法達(dá)到又好用又高效,。我們的解決方案去做一個(gè)編譯器,因?yàn)槲覀兤鋵?shí)可以看到就是說(shuō)用戶(hù)寫(xiě)的一些非常直白的代碼,,我完全可以通過(guò)一個(gè)編譯的手段給翻譯成我們剛剛所看到的非常高效的代碼,,用戶(hù)不用去可見(jiàn)說(shuō)當(dāng)中的翻譯過(guò)程,通過(guò)這種方式用戶(hù)只需要寫(xiě)直觀的代碼,,但是它能達(dá)到同樣的,,很高效的性能,,這篇文章我們也是在今年發(fā)的一篇文章叫做《Graphiler: Optimizing GNN with Message Passing Data Flow Graph》,如果大家有興趣也可以去看一下我們具體是怎么實(shí)現(xiàn)的,。
大規(guī)模圖的挑戰(zhàn)
Ok,,接下來(lái)的我想提的就是大規(guī)模圖,是我剛剛所說(shuō)的三中的第三個(gè)挑戰(zhàn),,學(xué)術(shù)圈也是越來(lái)越關(guān)注這個(gè)問(wèn)題,。
比如說(shuō)右邊可以看到我剛剛提到的 Open Graph Benchmark,OGB 這樣的一個(gè)評(píng)測(cè)集當(dāng)中的數(shù)據(jù)集的大小,,可以看到其實(shí)現(xiàn)在最大的圖也是比之前要大很多了,,像 MAG-LSC 有大概 240 million這樣的一個(gè)規(guī)模,但是這個(gè)規(guī)模和我們工業(yè)界遇到的圖的規(guī)模還是差很多的,,我們公益就遇到了規(guī)??隙ㄊ且诎賰|千億級(jí)量,就相相當(dāng)于是這個(gè)圖的大概 10 倍到 100 倍以上,。
所以可以看到就說(shuō)學(xué)界還沒(méi)有感受到工業(yè)界的這樣的一個(gè)規(guī)模,,但是在這樣的規(guī)模上其實(shí)已經(jīng)有很多的問(wèn)題了。
因?yàn)檫@個(gè)圖很大,,我沒(méi)有辦法把整個(gè)圖放到內(nèi)存當(dāng)中,,該怎么辦?其實(shí)是需要做一個(gè)采樣的方式去做訓(xùn)練的,。這個(gè)在 GNN 當(dāng)中我們也稱(chēng)之為叫做小批次訓(xùn)練,,mini-batch training。
Mini-batch training 包含好幾個(gè)步驟,,首先是第一個(gè)步驟是,,因?yàn)檎麄€(gè)圖沒(méi)有辦法放到內(nèi)存里面,所以只能先選取目標(biāo)節(jié)點(diǎn),,然后去看這個(gè)目標(biāo)節(jié)點(diǎn)的鄰居子圖,,把這個(gè)子圖拿出來(lái),這個(gè)圖就小了,。抽取出子圖之后,,再去根據(jù)子圖的關(guān)系去把它對(duì)應(yīng)的特征給拿出來(lái),拿出來(lái)之后就獲得了一些比較小的圖,。
然后在這個(gè)子圖上訓(xùn)練網(wǎng)絡(luò),,比如說(shuō)可以把這個(gè)圖放到 GPU上,因?yàn)?GPU 內(nèi)存有限,,但這個(gè)子圖變得很小,,我就把它放到 GPU 上進(jìn)行訓(xùn)練,然后我在不斷重復(fù)這個(gè)步驟,,直到它的收斂,。
可以看到其實(shí)整個(gè)過(guò)程是比普通的深度神經(jīng)網(wǎng)絡(luò)的小批次訓(xùn)練要復(fù)雜的,,而這個(gè)過(guò)程由于它包含了很多的步驟,所以我們?cè)谠O(shè)計(jì) DGL 的子圖訓(xùn)練框架的過(guò)程當(dāng)中,,也把它給分割成了不同的模塊,。
比如說(shuō)對(duì)于第一個(gè),我們把我們給定一個(gè)節(jié)點(diǎn),,我們?nèi)コ槿∷泥従拥淖訄D,,這個(gè)模塊我們稱(chēng)之為采樣模塊,這個(gè)模塊就在右邊這個(gè)圖上對(duì)應(yīng)的叫做 sampling component,,這個(gè)模塊它負(fù)責(zé)的作用,,就是說(shuō)我把這個(gè)子圖抽出來(lái),把它給喂到下面的步驟當(dāng)中去做計(jì)算,。
然后第二個(gè)是子圖的特征的存儲(chǔ),,我們知道子圖特征其實(shí)本質(zhì)上是很多高維向量特征,高維向量特征我其實(shí)可以用一個(gè)傳統(tǒng)的 key value store 的方式把它給存儲(chǔ)起來(lái),,其實(shí)我們專(zhuān)門(mén)為圖神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)了一個(gè) Key value store 的這樣一個(gè)component,,然后當(dāng)把這個(gè)圖采樣和子特征都已經(jīng)抽取出來(lái)之后,就可以把它給放到接下來(lái)的輸入到接下來(lái)訓(xùn)練模塊里邊,,而訓(xùn)練模塊就很有可能在 GPU 上,,而且可能會(huì)有多個(gè)這樣的訓(xùn)練模塊進(jìn)行之間進(jìn)行一個(gè)協(xié)作,可以獲得一個(gè)更高效的并行訓(xùn)練的效果,。
然后這樣的訓(xùn)練分割其實(shí)可以部署到不同的硬件環(huán)境上面,,包括我剛剛說(shuō)的采樣模塊,特征模塊,、訓(xùn)練模塊,,根據(jù)不同的硬件環(huán)境,我可以采取不同的部署,。
舉個(gè)例子,,如果現(xiàn)在是個(gè)單 GPU 訓(xùn)練這樣的一個(gè)流程,現(xiàn)在有個(gè) Graff structure 和一個(gè) Node feature ,,這些圖都很大,、整個(gè)特征包括圖結(jié)構(gòu)都很大,我沒(méi)有辦法放到 GPU 上,。那該怎么做呢,?OK,我(可以)放到 CPU 上,。
通過(guò)剛剛說(shuō)的先做一個(gè)子圖的抽取,抽取完之后對(duì)這個(gè)子圖做一些變換,,然后把它對(duì)應(yīng)的 feature 把它給抽出來(lái),,最終把它給交到 GNN 上做一個(gè)訓(xùn)練,,其實(shí)這就是在單 GPU 上的整個(gè)訓(xùn)練的流程。
在傳統(tǒng)的訓(xùn)練硬件的部署方面,,其實(shí)是因?yàn)檫@個(gè)圖很大,,所以只能把前面的這些采樣包括特征抽取的流程放在 CPU 上,然后把后面訓(xùn)練的流程放在 GPU 上,。那這個(gè)過(guò)程就顯而易見(jiàn)會(huì)帶來(lái)一個(gè)問(wèn)題,,就是我們?cè)趶?CPU 到 GPU 的數(shù)據(jù)拷貝,它會(huì)成為整個(gè)訓(xùn)練的瓶頸,。
所以在 DGL 其實(shí)是上一個(gè)版本 0.8 這個(gè)過(guò)程當(dāng)中,,我們其實(shí)就對(duì)剛剛我說(shuō)的流程進(jìn)行了一個(gè)更新,我們的總體原則是說(shuō)我們希望把更多的計(jì)算放在GPU上,,這樣才能更高效,。但是因?yàn)?GPU 內(nèi)存不夠,所以我們需要使用新的技術(shù)來(lái)解決內(nèi)存限制的問(wèn)題,。
我們使用新的技術(shù)就叫做 CUDA UVA 這樣一個(gè)技術(shù),,如果我用一句話(huà)來(lái)概括它就是說(shuō)我可以在 CPU上開(kāi)辟一塊空間,這個(gè)空間的大小可以和你的 CPU 的用量一樣大,,但是這塊空間是可以被 GPU 訪問(wèn)的,。這其實(shí)就解決了剛剛說(shuō)的你的 CPU 用量不夠,但是又想用 GPU 進(jìn)行加速的這樣一個(gè)問(wèn)題,。
通過(guò)使用 GPU UVA 的技術(shù),,我可以把所有的圖的結(jié)構(gòu)包括 feature 的結(jié)構(gòu)把它放到 UVA memory 當(dāng)中,這部分 memory 雖然在 CPU 上,,但是 GPU 可見(jiàn)的,,然后我把后面的所有的流程全部通過(guò) GPU 進(jìn)行加速,整個(gè)過(guò)程就會(huì)達(dá)到一個(gè)非常高效的這樣性能,。
如何借助圖數(shù)據(jù)庫(kù)解決這些問(wèn)題
好,,這個(gè)是在單 GPU 上的訓(xùn)練流程,如果說(shuō)我們圖更大對(duì)吧,?我可能一個(gè)機(jī)器的內(nèi)存都存不下,,我該怎么辦對(duì)吧?其實(shí)一個(gè)很自然的想法,,就是說(shuō)我們能不能通過(guò)一些已有的 infrastructure 來(lái)解決這個(gè)問(wèn)題,,這個(gè)當(dāng)中最重要的一個(gè) infrastructure 之一就是這個(gè)圖數(shù)據(jù)庫(kù)了,那圖數(shù)據(jù)庫(kù)有哪些特性呢,?
首先我們可以看圖數(shù)據(jù)庫(kù)它是天然支持海量巨圖的,,對(duì)吧?圖不論多大,,我可以分布式存儲(chǔ),。同時(shí)圖數(shù)據(jù)庫(kù)另外幾個(gè)好處,,比如說(shuō)可以支持?jǐn)?shù)據(jù)持久化,可以支持實(shí)時(shí)的事務(wù)性操作,,包括靈活的圖查詢(xún)語(yǔ)言,,為什么靈活的圖查詢(xún)語(yǔ)言非常重要?因?yàn)槠鋵?shí)大家可以想我采樣的過(guò)程,,我給定一個(gè)節(jié)點(diǎn),,我去拿到這個(gè)節(jié)點(diǎn)的這樣的一個(gè)周?chē)泥従舆^(guò)程,其實(shí)是完全就等價(jià)于說(shuō)我在圖做了一個(gè)查詢(xún)操作,。
Ok,,其實(shí)可以看到圖數(shù)據(jù)庫(kù)包含這些很好的一些性質(zhì)。我們剛剛也提到 DGL 有豐富的 GNN 的模型庫(kù),,然后我們有高效的 GPU 的實(shí)現(xiàn),,我們也可以實(shí)現(xiàn)多機(jī)多卡的這樣一個(gè)訓(xùn)練。
自然而然我們可以思考說(shuō)能不能把它們結(jié)合起來(lái),,結(jié)合起來(lái)的一個(gè)想法也非常簡(jiǎn)單,,就是我剛剛提到的我把圖數(shù)據(jù)庫(kù)作為我們這個(gè)圖采樣系統(tǒng),因?yàn)樗С謭D查詢(xún)語(yǔ)言它可以作為采樣的一個(gè)部分,,對(duì)吧,?而且它可以支持海量的巨圖,然后我把圖樣本從圖數(shù)據(jù)庫(kù)當(dāng)中抽取出來(lái)之后,,交給 DGL 只要作為 GNN 訓(xùn)練系統(tǒng)進(jìn)行操作——所以這個(gè)就是一套整套的一個(gè)新的這樣的一個(gè) design,。
這邊其實(shí)我們也是給我們客戶(hù)做的一個(gè)案例,這個(gè)案例也是非常有幸地使用到了 悅數(shù)圖數(shù)據(jù)庫(kù) 的技術(shù),。這是在我們的 AWS 云上所做的這樣的一個(gè) architecture,,可以看到整個(gè)過(guò)程當(dāng)中,核心就是說(shuō)你可以看到 NebulaGraph 所做的事情,,就是一旦這個(gè)節(jié)點(diǎn)它是一個(gè)實(shí)時(shí)系統(tǒng),,就說(shuō)我這個(gè)圖就算在整個(gè)運(yùn)行過(guò)程當(dāng)中有新的節(jié)點(diǎn),新的邊加進(jìn)來(lái),,它也是可以滿(mǎn)足需求的,。
因?yàn)?悅數(shù)圖數(shù)據(jù)庫(kù) 是有實(shí)時(shí)的事務(wù)性操作的功能,在這邊其實(shí) 悅數(shù)圖數(shù)據(jù)庫(kù) 所起的作用就是一個(gè)圖采樣系統(tǒng),。我們通過(guò) graph database 拿到 sub-graph,,也就是我們說(shuō)的子圖,獲得子圖之后,,我們?cè)俳唤o DGL,,我們 DGL 是部署在 Amazon 的 SageMaker 這樣的一個(gè) end point上,然后通過(guò) DGL 的計(jì)算,我們可以獲得這樣的一個(gè)更高效的這樣一個(gè)訓(xùn)練效果,。
DGL 在編譯和分布式的最新研究成果
接下來(lái)我也想說(shuō)一下訓(xùn)練成本的這樣一個(gè)問(wèn)題,,因?yàn)槠鋵?shí)剛剛我記得之前嘉賓也提到說(shuō)訓(xùn)練非常慢,其實(shí)不僅僅慢也很貴,。
我現(xiàn)在這邊做一個(gè)簡(jiǎn)單的例子,我使用的一個(gè)數(shù)據(jù)叫做是 OGB 里邊的一個(gè)數(shù)據(jù)叫做 MAG240M,,然后它這個(gè)數(shù)據(jù)規(guī)模有多大,?我剛剛提過(guò)了,它其實(shí)有 240 million 這樣的一個(gè)節(jié)點(diǎn),,所以它的圖結(jié)構(gòu)數(shù)據(jù)大概是 30GB,,節(jié)點(diǎn)特征大概是 200GB 左右這樣一個(gè)量級(jí)。
如果使用 CPU 加 GPU 的混合訓(xùn)練,,我需要把這些數(shù)據(jù)全部放在 CPU 上,,所以需要一臺(tái)這樣的機(jī)器——這個(gè)機(jī)器在 AWS 上大家可以查到它的價(jià)格大概是 8 美元一小時(shí),ok,,有人說(shuō)我可能還是比較有錢(qián)的對(duì)吧,,所以我可以用得起這樣的一個(gè)這樣的一個(gè)數(shù)據(jù)這樣的機(jī)器。如果說(shuō)我想要用全 GPU 訓(xùn)練,,我們把它的速度再 push 到一個(gè)limit,,對(duì)吧?我想要更快怎么辦,?我需要很多的 GPU 它的總的容量,,GPU 內(nèi)存總?cè)萘磕軌蚍畔滤械木褪菆D結(jié)構(gòu)包括特征結(jié)構(gòu),這個(gè)時(shí)候我就需要 4 臺(tái)這樣的機(jī)器,,你的價(jià)格就已經(jīng)上升很多了,,對(duì)吧?
同時(shí)我們要考慮就是說(shuō)這個(gè)圖本身還不是最大的,,事實(shí)上如果我們?nèi)タ紤] Internet,,我們整個(gè)互聯(lián)網(wǎng)對(duì)吧?互聯(lián)網(wǎng)我們認(rèn)為它是個(gè)圖,,它的整個(gè)鏈接關(guān)系都可以認(rèn)為是連接關(guān)系,,這個(gè)圖的大小是 MAG240 的 10 倍以上,我們可以想象我們的訓(xùn)練成本有多貴,,對(duì)吧,?
所以訓(xùn)練成本其實(shí)是圖神經(jīng)網(wǎng)絡(luò)現(xiàn)在大規(guī)模圖神經(jīng)網(wǎng)絡(luò)訓(xùn)練上的一個(gè)很?chē)?yán)重的問(wèn)題。
然后這邊訓(xùn)練成本不僅僅包含的是我們說(shuō)的訓(xùn)練,,其實(shí)還有一點(diǎn)是可能大家沒(méi)有太大關(guān)注的,,就是它的推理性能也是代價(jià)很高的。這邊我們做了一個(gè) benchmark,就說(shuō)是推理,,就說(shuō)我在訓(xùn)練過(guò)程當(dāng)中我還要做推理來(lái)驗(yàn)證說(shuō)我這個(gè)模型到底有沒(méi)有訓(xùn)練對(duì),,對(duì)吧?
我們可以發(fā)現(xiàn)就是說(shuō)這邊我們測(cè)試像GCN,、GAT,、GraphSAGE、GraphSAINT 不同的這些模型,,這邊紅色的代表是它的推理占比時(shí)間,,而 training 代表訓(xùn)練占比的時(shí)間,然后不同的柱代表的是不同的數(shù)目的層數(shù),。
可以看到就是說(shuō)當(dāng)比如說(shuō)這個(gè)模型達(dá)到三層,,三層其實(shí)也不是很深對(duì)吧?三層的時(shí)候它的整個(gè)推理要占比的要占到 90% 以上的時(shí)間,。所以可以看到整個(gè)訓(xùn)練過(guò)程,,整個(gè)耗時(shí)當(dāng)中推理都是一個(gè)非常嚴(yán)重的問(wèn)題。
當(dāng)然解決問(wèn)題肯定要一步步做,,所以我們看到這個(gè)問(wèn)題,,我們先對(duì)推理的問(wèn)題做了一定的優(yōu)化。我們所采取的一個(gè)思路叫做叫 Layer-wise influnce,,按層的這樣一個(gè)推理的范式,。什么意思?就是我們發(fā)現(xiàn)為什么剛剛我們看到這個(gè)推理性能那么的慢,,原因是因?yàn)閭鹘y(tǒng)的推理性能都是基于 b這樣的一種做法,,就是 Node-wise inference。
Node-wise influence 的做法比如我要 influence A 這個(gè)節(jié)點(diǎn)的結(jié)果,,我怎么做,?根據(jù)圖神經(jīng)網(wǎng)絡(luò)的做法,我要去看他所有的鄰居以及鄰居的鄰居的消息,,對(duì)吧,?所以對(duì) A 來(lái)說(shuō)我要計(jì)算它周?chē)械墓?jié)點(diǎn) 。接下來(lái)我走到下一個(gè) batch,,我要去算 B 的時(shí)候,,很不幸它正好 share 所有 A 的neighbor,這個(gè)時(shí)候其實(shí)我就全部重新算了一遍,,這個(gè)當(dāng)中就有很多的計(jì)算冗余,,這就是為什么之前我們看到計(jì)算那么慢的一個(gè)主要的原因。
因此我們的解決方案就是把這樣的計(jì)算方式換成了 Layer-wise 的計(jì)算方式,,也就是說(shuō)我并不是先計(jì)算 A 和 B ,,而是先計(jì)算它的二度鄰居的 inbeding,比如說(shuō) C 和 D。通過(guò)這樣的方式,,每個(gè)節(jié)點(diǎn)都只需要計(jì)算一次,,這就是為什么 Layer-wisa 要比它快很多。
當(dāng)然 Layer-wise 也有它的問(wèn)題,,比如說(shuō)我寫(xiě)了一個(gè) Graph SAGE ,,它是有三層的模型,每一層是一個(gè) sage com 的一個(gè) layer,,當(dāng)我把它變成一個(gè) Layer-wise 的計(jì)算的時(shí)候,,它的整個(gè)代碼就看不懂了。因?yàn)長(zhǎng)ayer-wise 它其實(shí)是 break了我們的整個(gè)在計(jì)算的過(guò)程當(dāng)中一個(gè)計(jì)算的邏輯,,然后用戶(hù)必須對(duì)所有的模型都要重寫(xiě)一份代碼。
通過(guò)這個(gè)方式,,其實(shí)我們做了一個(gè)研究工作,,就叫做全自動(dòng)的 GNN 推理。利用了剛剛我們提到的逐層 Layer-wise 推理的方式,,同時(shí)為了解決我剛剛提到的用戶(hù)編寫(xiě)代碼困難,,所以我們又設(shè)計(jì)了一個(gè)編譯的框架,通過(guò)分析編譯用戶(hù)的代碼,,然后把它給自動(dòng)地變成我們剛剛看到的 Layer-wise 這樣的一個(gè)推理的一個(gè)代碼,,然后達(dá)到一個(gè)比較高效的推理速度。
最后做一些總結(jié),,今天我的分享主要介紹了一下 DGL 的一些關(guān)鍵的技術(shù)特點(diǎn)和開(kāi)源社區(qū)的一些介紹,。之后其實(shí)我也講了,包括像易用性,、高性能,、大規(guī)模圖方面,其實(shí)它是有很多挑戰(zhàn)的,,因?yàn)閳D神經(jīng)網(wǎng)絡(luò)它作為一個(gè)比較新的這樣的一個(gè)領(lǐng)域,,還是有很多比較熱的研究問(wèn)題,也是我們研究院攻堅(jiān)的方向,,同時(shí)我也介紹了一些我們?cè)诰幾g和分布式領(lǐng)域的一些最新的研究成果,。所以如果同學(xué)們有興趣,可以一起來(lái)投入到這樣的領(lǐng)域當(dāng)中,。
最后簡(jiǎn)單打個(gè)廣告,,希望大家使用并貢獻(xiàn) DGL 大家可以訪問(wèn)我們的網(wǎng)站,訪問(wèn)我們 GitHub 的頁(yè)面,,也可以關(guān)注我們的知乎的專(zhuān)欄,,我們會(huì)定期做很多的關(guān)于圖神經(jīng)網(wǎng)絡(luò)的一些分享。
Ok,謝謝大家,。