分佈式圖並行計算框架:PowerGraph

1. About Joseph E.Conzalez

這裏寫圖片描述

首先關於約瑟夫,他目前在伯克利AMP實驗室做博士後,這是他博客的一個截圖。在他博客中寫道,下個月即2016年1月份將要當任伯克利的助理教授。

在看了他的簡歷後,發現他居然也是Spark Graphx的第一作者,並且Graphx這篇論論文也是發表在OSDI上,非常牛逼!戳這裏,是他的博客地址。


2. About OSDI

第二個要介紹的是關於OSDI這個會議,PowerGraph這篇文章是發表在2012年OSDI會議上,OSDI,它的全稱是Operating Systems Design and Implementation。

它與另一個會議SOSP被公認爲是System方面最好的會議,每兩年開一次,輪流開,比如今年是SOSP,明年就是OSDI,一般是偶數年是OSDI。發表在上面的文章數,以前維持在每屆20篇左右,從2002年開始穩定在每屆27篇

下面這張表列出了目前有哪些科研機構和學校在OSDI上發表過文章,以及總共發表文章的數目是多少。可以看出這裏都是世界頂尖級別的理工學校,像MIT(麻省理工),Princeton,Standford,Berkeley,CMU。

機構 文章數目
MIT 14
Microsoft 13
Princeton 12
Washington 12
Stanford 11
Berkeley 10
CMU 10
Michigan 7
Arizona 6
Rice 6


OSDI已經是計算機學界最頂級會議之一,很多革命性成果都在這裏發表,比如MapReduce和BigTable等等。剛纔提到本文作者Joseph已經以第一作者的身份在OSDI上發表了兩篇文章。據統計目前國內只有2人中過該會,一個是清華牟帥在國外交流訪問期間中過一篇,百度少帥李沐在CMU期間中過一篇。

這裏在給大家科普一下usenix,USENIX成立於1975年,當時的名字叫做”Unix用戶羣”。它的主要目的是學習及開發Unix以及類似系統。1977年六月,美國電話電報公司的律師告訴用戶羣他們不能繼續使用UNIX這個名字,因爲UNIX是美國電話電報公司所擁有的一個商標。所以這個用戶羣更名成USENIX.從那以後,USENIX逐漸發展成一個倍受尊敬的由計算機操作系統用戶,開發者和研究者所組成的機構。USENIX每年贊助好幾個學術會議和工作室會議,其中最有名的是OSDI。


3. PowerGraph && GraphLab

第三個這裏要介紹下,PowerGraph和GraphLab 是什麼關係。

之前我在接觸圖計算時,只知道有GraphLab。其實平時我們狹義上說的GraphLab圖計算指的就是PowerGraph,而PowerGraph後來被集成到GraphLab後只是GraphLab一個主要的底層框架,GraphLab實際上是一個機器學習框架,裏面實現了非常多的機器學習算法,之前GraphLab是一個開源項目,但它在接受了兩輪投資之後已經由原來的免費項目變成了一個付費試用的項目。網址由原來的graphlab.org也變成了dato.com。

這裏寫圖片描述

上面這個是GraphLab的Logo,官網首頁中用這樣一句話來形容GraphLab,讓複雜的機器學習就和寫Hello World一樣簡單。GraphLab快得益於PowerGraph設計

業界對PowerGraph認可度是非常高的,稱它能輕鬆搞定TB級數據,計算能力突破人類圖計算“極限值”。

下面將正式論述該論文。


4. Graphs are ubiquitous

我們都知道,圖在我們生活中是無所不在的。


這裏寫圖片描述

社交媒體、科學中分子結構關係、電商平臺的廣告推薦、網頁信息

圖是能夠將人、產品、想法、事實、興趣愛好之間的關係進行編碼,轉成一種結構進行存儲。

圖的一個特點是:Big,數十億的點和邊以及豐富的元數據。

各種場景下的信息都能轉成圖來表示,同時我們可以利用圖來進行數據挖掘和機器學習,比如
識別出有影響力的人和信息、社區發現、尋找產品和廣告的投放用戶、給有依賴關係的複雜數據構建模型等等這些都可以使用圖來完成

下面要介紹論文中的第一個概念 :Natural Graphs
從不同平臺或實際應用中產生的圖我們稱爲:Natural Graphs

面對各種應用中如此海量的Natural Graphs,現有分佈式的圖處理平臺處理性能還是比較低效的。

作者選用Twitter數據集測試目前幾個主流分佈式平臺在處理這種Natural Graph的性能,這裏是利用PageRank算法每次迭代的時間作爲橫軸,縱座標是不同的分佈式平臺,可以看到Hadoop和原生態的GraphLab的處理時間還是很長的,性能最好的是Piccolo,它是Google的Pregel的C++實現 。

而PowerGraph的處理時間更短,達到了數量級的性能提升。


這裏寫圖片描述


5. Power-Law Degree Distribution

下面我們來看一下,Natural Graph這種圖到底有什麼特點,爲什麼大部分分佈式處理系統性能都比較低效,PowerGraph在Natural Graph有如此好的性能。Natural Graphs的屬性特點是滿足密率度分佈。

下面我們來看下什麼叫密率度分佈。


這裏寫圖片描述

簡單來說,冪律有兩個通俗的解釋,一個是“長尾”理論,只有少數明星是有很多人關注的,但是還有大部分人只有少部分人關注。長尾理論就是對冪律通俗化的解釋。

另外一個通俗解釋就是馬太效應,窮者越窮富者越富。

從這幅圖可以看出,只有一個鄰居的點的數目有超過10的8次方個,而僅有那1%的點卻佔了整個圖50%的邊。這些點被稱爲高緯度點。


這裏寫圖片描述

這裏舉一個明星效應的例子,比如這裏表示社交網絡中的一個子圖,中間紅色點表示某個用戶,旁邊黑點表示的是所有的粉絲,比如這裏我們一個黑點表示100w的用戶,那麼這個人可能就是obama,但像obama這樣擁有這麼多粉絲的人是非常少的,大部分人粉絲只有大黑點中的一個點,幾百或者多者上千。這就是我們說的密率度分佈圖的特點。

這裏寫圖片描述

PowerGraph中在計算時會切分高緯度點,被切分的點形成了一個新的抽象。

但是在節點切分策略下要解決的一個問題是如何運行節點程序?在之前的邊切分策略下節點是單一的、完整的,節點擁有所有鄰居的信息,可以獨立完成節點程序的運算。但是在節點切分策略下,每個節點看到的只是部分的鄰居,無法完成整個計算。

在節點切分策略下,分佈在不同的CPU或者機器上的節點如何對其進行編程?

下面將介紹兩種目前最具代表性的圖計算方法是如何對圖進行並行化抽象計算的。

圖並行化抽象目前流行的兩種方法是
——使用消息 Pregel
——共享狀態 GraphLab


這裏寫圖片描述

但對於我們前面提到的密率圖,Pregel和GraphLab都不能很好地處理這種節點。最大的挑戰就是如何來處理這些高維度的點。

最簡單也最低效的方法是序列化處理這些邊,說白了就是遍歷所有點。

第二種方法就是剛纔提到的Pregel,它處理高緯度點的缺陷是單個worker要發送大量消息給鄰居節點,

GraphLab的方法的缺點是會觸到圖的大部分(GraphLab)

並且對於單臺機器邊的元數據太大

GraphLab共享狀態是異步執行,需要大量鎖
Pregel同步執行但容易產生straggler,straggler可以理解爲執行比較慢的節點。木桶的短板效應

導致這些系統中存在這些問題主要原因是他們對圖的切分策略是採用邊分割的方式。


6. Edge-Cut and Vertex-Cut


這裏寫圖片描述

還有一種是點切分的方式,下面我們看下邊切分的方式和點切分方式有什麼不同,
我們現在要將一個有4個頂點的圖存儲到3臺機器上,這三臺機器分別叫1,2,3。那麼按照邊切分的方式,這且邊被切人後在3臺機器的分佈如右邊圖。
從圖中可以看出,切分的過程中,總共有AB,BC,CD三條邊被切開,保存到3臺機器後,邊的總數目由原來的3條,變成了6條,多了一倍,外加5個節點副本。

第二種方式是點切分方式,同樣是4個節點的圖,我們將B、C節點切分開來。存儲到3臺機器後,得到右邊這個圖,可以看出我們的邊的數目還是3臺,只多了兩個節點的副本。

所以當邊的數量比節點數量大很多的情況下,這種兩種切分方式差異會更加明顯。

圖的切分問題又叫着圖分區。圖並行抽象的性能要依賴於圖的分區方式,
而我們的目標是
——最小化通信
——權衡圖計算和存儲開銷


這裏寫圖片描述

而前面提到的兩種流行的圖處理框架GraphLab和Pregel採用的都是邊切分方式的隨機Hash分區策略這種策略只保證了節點均勻分佈在整個集羣中,邊被切分成雙份分散在整個集羣中。

對於一般圖來說,邊的數量是要遠大於點的數量,因此按邊分區會帶來存儲和計算上的不均衡。

論文中總結了這種邊切分方式帶來的影響,給出了一個公式用來求被切的邊除以總的邊的均值,p表示隨機被分的機器數目,當p等於10時有90%的邊被切分,當p等於100時,有99%的邊會被切。

可以看出,當我們集羣規模越大,按照邊來切分方式進行分區是非常划不來的,圖中大部分邊會變切分開來。


7. PowerGraph

這裏總結一下目前對於專門的圖處理框架GraphLab和Pregel是不適合處理這種natural graphs
主要的兩大挑戰是高緯度的點和低質量的分區策略。

本文提出的PowerGraph即是爲了解決這2個問題而設計的,其中Power的意思就是密分佈的意思。

下面就來介紹PowerGraph的詳細設計細節:

PowerGraph的主要貢獻或者說創新點可歸結爲以下兩點:

第一,提出了GAS計算模型,將高維度的點進行並行化

第二是採用點切分策略,來保證整個集羣的均衡性,該策略對大量密率圖分區是非常高效的。


8. GAS Decomposition


這裏寫圖片描述

下面以PageRank爲例,頂點程序的通用模板大致如圖所示,第一步收集鄰居節點信息,第二步更新節點權值,如果還沒有收斂,觸發節點鄰居再次運行頂點程序。
這是一種通用的處理模板


這裏寫圖片描述

PowerGraph提出了自己的一套計算模型,叫GAS分解。G是Gather的意思,A是Apply的意思,S是Scatter的意思。

GAS分解過程如下,

Gather:收集鄰居信息
先收集同一臺機器的信息,然後對不同主機收集的信息進行彙總。得到最後的求和信息。

Apply:對中心點應用收集點的值,得到y一撇

Scatter(分散):更新鄰居點和邊,觸發鄰居點進行下一輪迭代。


這裏寫圖片描述

那麼就PowerGraph的GAP模型應用到RageRank算法中,是什麼樣的過程?

該公式中i表示目標節點,我們需要對這個節點求PageRank值,wij表示從j點到i點的權值,

Gather階段,先求i所有鄰居節點的權值,用戶自定義一個sum操作,統計所有鄰居節點的權值之和。

Apply階段更新i點的權值,利用上一階段的sum值加上一個偏置值,計算得到i的新的權值;

Scatter階段如果i值被修改,就觸發相應的鄰居節點j重新計算。

下面用一個動畫演示PowerGraph是如何執行頂點程序。

當頂點按點切分方式被分到4臺機器之後,在多個節點上指派一個爲Master,其餘的爲Mirror。

Mirror上可以運行Gather程序來收集所有鄰居的信息,並進行聚合計算(sum)後發送給Master。

Master上的Gather程序收集這些結果,最終將這個結果應用到Apply程序上,得到新的節點狀態。然後通過Scatter程序將新的節點狀態廣播給各個Mirror,Mirror進而廣播給各個鄰居。


9. Constructing Vertex-Cuts

PowerGraph提出了一種均衡圖劃分方案,在減少計算中通信量的同時保證負載均衡。

實際上通信開銷是和節點所跨的機器數目成線性關係,但點切分的方式可以最小化每個頂點所跨的機器數目。

PowerGraph使用的不是邊切分,邊切分前面已經提到會同步大量的邊的信息。

而是採用點切分,點切分只要同步一個點的節點信息。

論文中給出了一個新的理論(定理):對於任何邊切分我們都可以直接構造一個點切分,能夠嚴格減少通信和存儲開銷。下面將介紹該論文是如何來構造這個點分割。

論文提出了3種分配方式
隨機邊分配
貪婪協同邊分配
非貪婪邊分配(Oblivious遺忘)

第一種策略是隨機的邊放置策略,按照點切分的方式,隨機放置邊


這裏寫圖片描述

下面分析邊這種隨機邊放置策略的性能

這裏數據集選用的是Twitter數據集,有410w個頂點,14億條邊 。橫座標是實際集羣中機器的數目,縱座標表示1個頂點期望跨了機器數目,關於這兩者的數量關係公式,作者在論文中給出了一個定理。藍色的線表示表示理論推測期望值,紅線是實際隨機邊放置的曲線圖。可以看出期望值和理論值之間基本是能夠match上的。所以針對隨即邊放置策略,就可以做到精確的估計內存和通信開銷。


這裏寫圖片描述

下面給出了點切分策略相對於邊切分策略性能上的提升,橫座標還是機器數目,縱座標是點切分相對於邊切分在通信和存儲開銷上減少的幅度,當機器數目比較少時,減少了接近100倍,隨着機器數目增大,通信和存儲開銷減少了大概10倍左右,即點切分的性能相對於邊切分提升了將近10倍。

這裏寫圖片描述

第二種是貪婪的點切分方式,由於隨機切分下,儘管各個子圖基本均衡,但是子圖內部聯通性很差。因此PowerGraph提出的啓發式的貪婪算法,基本原理如下:
如果新加進來的邊,它的某個節點已經存在於某臺機器上,就將該邊分到對應的機器上,比如在1號機器上已經存在AB這條邊,2號機器上已經存在BC這條邊,那門當一條新的邊AD在要加進來時,發現A節點已經在1號機器上,所以就將該邊放置到1號機器上。如果再來一條邊BE,發向兩臺機器上都存有B節點,這時候貪婪策略會選擇機器中分配的邊最少的機器進行分配。所以會將BE分配到2號機器,這裏只是簡單的舉了個例子,論文中是用集合的表示方式將這種貪婪策略歸納了4種case,這裏不詳細介紹,具體可以參考論文第8頁相關內容。

上面提到的貪婪策略,作者論文中稱之爲De-randomiztion。de的含義這裏因該是去除,與隨機化剛好是反義詞。De-randomization就是Greedy的含義,貪婪點切分能夠最小化機器所跨的機器數目。實際的貪婪的放置策略性能要比隨即放置策略要好。關於貪婪邊切分策略,作者給出了兩種實現方式:

第一種是協同邊放置策略,這需要維護一張全局u頂點放置的歷史紀錄表,在執行貪心切分之前都要去查詢這張表,在執行的過程中需要更新這張表。協同點切分的策略,它的特點是慢但點切分的質量高 ,

第二種方式是Oblivious的貪婪策略,它是一種近似的貪婪策略,不需要做全局的協同。貪婪算法的運行不依賴每一臺機器,不需要維護全局的記錄表,而是每臺機器自己維護這張表,不需要做機器間的通信。這種策略速度快,但切分質量比較低。關於這種方式,論文只用了一段話來描述,具體如何操作明白。

具體同學們可以參考論文第8頁最後一段文字描述。

下面是對比這三種分區策略的性能,對比的是平均的機器跨度和構建時間。
協同的貪婪分區算法平局機器跨度最小,但構建時間最長。而隨機策略構建時間短,但平局的機器跨度最大。而Oblivious的貪婪分區策略能夠在平局機器跨度和構建時間上獲得一個折中的性能。


這裏寫圖片描述

這裏測試貪婪分區策略相對於隨機分區策略的性能提升,縱座標是相對於隨機分區策略的時間,這裏假設隨機的時間開銷爲1,橫座標是PageRank、協同過濾算法、最短路徑3種算法對應的時間開銷。可以看出協同的貪婪分區策略的性能最佳,整體上貪婪分區能夠提升計算性能。

這裏寫圖片描述

這裏PowerGraph還有一些其它的特性,包括3種執行模式。(全局同步,全局異步,可串行化異步)。還有一個增量Cacha的特性,具體這些特點可以參加論文第7節。


10. System Design

整個PowerGraph的架構是這樣一個結構,最上層是PowerGraph 系統,它和GraphLab集成到一起,實現的接口是C++,利用HDFS進行數據的輸入和輸出,利用檢查點來實現容錯。


這裏寫圖片描述

在這個系統上實現了許多經典算法,比如:
Alternating Least Squares 交替最小二乘法
Stochastic Gradient Descent隨機梯度下降
SVD(Singular Value Decomposition)奇異值分解
Statistical Inference統計推斷
Loopy Belief Propagation(LBP)循環信度傳播算法
Gibbs Sampling吉布斯採樣
Image stitching圖像拼接
LDA(Latent Dirichlet Allocation)隱含狄利克雷分佈文檔主題生成模型

這裏寫圖片描述

下面對比了Pregel、GraphLab和PowerGraph在運行PageRank算法上通信開銷和執行的時間,可以看出PowerGraph不僅通信開銷小而且運行時間短,對高緯度點有很強的健壯性。這時在人工合成的數據集上的一個性能。

這裏寫圖片描述

下面選用了真實的Twitter數據集進行時間。通信開銷和運行時間相比GraphLab和Pregel都非常低。

這裏寫圖片描述

作者還測試了PowerGraph可擴展性,利用目前可獲取的最大公開數據集,Yahoo網頁數據,14億個網頁,66億條邊,利用64個amazon的高性能節點,總共是1024個計算核。只需要30行用戶端的代碼,就可以達到7秒鐘一次迭代,每秒能夠處理1B條邊。由此可見PowerGraph有非常好的擴展性。


這裏寫圖片描述

下面是我從2014年Grphax截過來的一頁性能對比的PPT,可以看出Graphx的性能要比PowerGraph慢2倍左右,作者在這後面也給出了原應,因爲PowerGraph是利用C++實現的,而GraphX是利用Scala語言實現,Java可能有很多開銷。


11. Summary


這裏寫圖片描述


【完】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章