開源圖計算框架GraphLab介紹

GraphLab介紹

GraphLab 是由CMU(卡內基梅隆大學)的Select 實驗室在2010 年提出的一個基於圖像處理模型的開源圖計算框架。框架使用C++語言開發實現。python

該框架是面向機器學習(ML)的流處理並行計算框架,能夠運行在多處理機的單機系統、集羣或是亞馬遜的EC2 等多種環境下。框架的設計目標是,像MapReduce同樣高度抽象。能夠高效運行與機器學習相關的、具備稀疏的計算依賴特性的迭代性算法,而且保證計算過程當中數據的高度一致性和高效的並行計算性能。該框架最初是爲處理大規模機器學習任務而開發的,但是該框架也相同適用於不少數據挖掘方面的計算任務。在並行圖計算領域,該框架在性能上高出很是多其它並行計算框架(好比,MapReduce、Mahout)幾個數量級。GraphLab 自成立以來就是一個發展很是迅速的開源項目,其用戶涉及的範圍也至關普遍,全球有2 000 多個企業、機構使用GraphLab。linux

GraphLab的整體架構

GraphLab的長處

GraphLab 做爲一個基於圖處理的並行計算框架,能夠高效地運行機器學習相關的數據依賴性強,迭代型算法。其設計具備例如如下特色和長處。android

  • 統一的API 接口。

    對於多核處理器和分佈式環境,採用統一的API 接口,一次編敲代碼就能夠高效地運行在共享內存環境或者分佈式集羣上。git

  • 高性能。優化C++運行引擎,在大量多線程操做和同步I/O 操做之間進行了很是好的平衡。
  • 可伸縮性強。GraphLab 能夠智能地選擇存儲和計算的節點,緣由是GraphLab 對於數據的存儲與計算都使用了精心設計的優良算法。

  • 集成HDFS。GraphLab 內置對HDFS 的支持。GraphLab 能夠直接從HDFS中讀數據或者將計算結果數據直接寫入到HDFS 中。

  • 功能強大的機器學習類工具集。GraphLab 在自身提供的API 接口之上實現了大量的開箱即用的工具集。

GraphLab在Windows下的安裝

GraphLab現在還不支持Windows,臨時僅僅能經過VMware Player運行linux的虛擬機,官方給出了已經配置好的GraphLab Create的VM文件。能夠免去編譯等步驟。github

下載GraphLab Create,並依照要求配置安裝
- 首先下載GraphLab Create VM文件
- 而後安裝VMware Player。導入GraphLab Create VM文件詳見文檔
- 最後經過ipython查看可否正常導入graphlab庫詳見文檔算法

GraphLab和MapReduce的對照

通常的機器學習類算法有下面兩個特性:編程

  • 數據依賴性很是強。運算過程當中參與計算的各個機器之間經常需要交換大量的數據。
  • 流處理複雜。主要表現在整個處理過程需要重複地迭代計算,數據處理分支很是多。很是難實現真正的並行。

在GraphLab 出現以前。針對這些機器學習的算法,廣泛的編程方法是採用MPI 和PThread 這些已有的底層開發庫來完畢這類計算問題。採用這樣的編程模型的開發應用,針對詳細的應用,需要開發人員實現相應的算法來完畢計算過程當中集羣計算節點之間主機通訊和數據同步等底層操做。這樣的開發方法的優點在於,能夠針對詳細的應用對代碼進行深度的優化。以達到很是高的性能。windows

但是對於不一樣的應用,需要重寫代碼實現底層的數據分配、數據通訊等細節,這就致使了代碼重用率很是低,可拓展性差。對編程人員要求高。這樣的編程模型顯然不適合當前敏捷的互聯網開發。而當前被普遍使用的MapReduce 計算框架,在並行運行多任務的時候,要求各個任務之間相互獨立。任務運行期間不需要相互之間進行數據通訊。因此MapReduce 不適合數據依賴性強的任務,而且MapReduce 並行計算模型也不能高效表達迭代型算法。markdown

這樣的計算模型在處理如日誌分析、數據統計等數據獨立性的任務時具備明顯的優點,但是在機器學習領域。MapReduce框架並不能很是好地知足機器學習計算任務。多線程

GraphLab 的出現不是對MapReduce 算法的替代,相反,GraphLab 借鑑了MapReduce 的思想,將MapReduce 並行計算模型推廣到了對數據重疊性、數據依賴性和迭代型算法適用的領域。本質上,GraphLab 填補了高度抽象的MapReduce 並行計算模型和底層消息傳遞、多線程模型(如MPI 和PThread)之間的空隙。

當前流行的並行計算框架MapReduce 將並行計算過程抽象爲兩個基本操做。即map 操做和reduce 操做。在map 階段將做業分爲相互獨立的任務在集羣上進行並行處理。在reduce階段將map的輸出結果進行合併獲得終於的輸出結果。GraphLab 模擬了MapReduce 中的抽象過程。對MapReduce的map操做,經過稱爲更新函數(Update Function)的過程進行模擬,更新函數能夠讀取和改動用戶定義的圖結構數據集。用戶提供的數據圖表明瞭程序在內存中和圖的頂點、邊相關聯的內存狀態,更新函數能夠遞歸地觸發更新操做。從而使更新操做做用在其它圖節點上進行動態的迭代式計算。GraphLab 提供了強大的控制原語,以保證更新函數的運行順序。GraphLab對MapReduce的reduce操做也經過稱爲同步操做(Sync Operation)的過程進行模擬。同步操做能夠在後臺計算任務進行的過程當中運行合併(Reductions),和GraphLab 提供的更新函數同樣,同步操做能夠同一時候並行處理多條記錄,這也保證了同步操做能夠在大規模獨立環境下運行。

GraphLab並行框架

GraphLab將數據抽象成Graph結構,將算法的運行過程抽象成Gather、Apply、Scatter三個步驟。其並行的核心思想是對頂點的切分。

上圖演示樣例中,需要完畢對V0鄰接頂點的求和計算,串行實現中。V0對其所有的鄰接點進行遍歷。累加求和。而GraphLab中,將頂點V0進行切分,將V0的邊關係以及相應的鄰接點部署在兩臺處理器上。各臺機器上並行進行部分求和運算。而後經過master頂點和mirror頂點的通訊完畢終於的計算。

Graph的構造


頂點是其最小並行粒度和通訊粒度。邊是機器學習算法中數據依賴性的表現方式。
對於某個頂點,其被部署到多臺機器,一臺機器做爲master頂點,其他機器上做爲mirror。Master做爲所有mirror的管理者,負責給mirror安排詳細計算任務;mirror做爲該頂點在各臺機器上的代理運行者,與master數據的保持同步。
對於某條邊。GraphLab將其惟一部署在某一臺機器上,而對邊關聯的頂點進行多份存儲,解了邊數據量大的問題。


同一臺機器上的所有edge和vertex構成local graph,在每臺機器上,存在本地id到全局id的映射表。

vertex是一個進程上所有線程共享的,在並行計算過程當中,各個線程分攤進程中所有頂點的gather->apply->scatter操做。

GraphLab的運行模型


每個頂點每一輪迭代通過gather->apple->scatter三個階段。

  1. Gather階段
    工做頂點的邊 (多是所有邊。也有多是入邊或者出邊)從領接頂點和自身收集數據,記爲gather_data_i。各個邊的數據graphlab會求和,記爲sum_data。這一階段對工做頂點、邊都是僅僅讀的。

  2. Apply階段
    Mirror將gather計算的結果sum_data發送給master頂點,master進行彙總爲total。

    Master利用total和上一步的頂點數據,依照業務需求進行進一步的計算,而後更新master的頂點數據,並同步mirror。

    Apply階段中。工做頂點可改動,邊不可改動。

  3. Scatter階段
    工做頂點更新完畢以後,更新邊上的數據,並通知對其有依賴的鄰結頂點更新狀態。

    這scatter過程當中,工做頂點僅僅讀,邊上數據可寫。

在運行模型中,graphlab經過控制三個階段的讀寫權限來達到相互排斥的目的。在gather階段僅僅讀,apply對頂點僅僅寫。scatter對邊僅僅寫。並行計算的同步經過master和mirror來實現,mirror至關於每個頂點對外的一個接口人。將複雜的數據通訊抽象成頂點的行爲。

參考資料

GraphLab:新的面向機器學習的並行框架
GraphLab百度百科
輕鬆搞定TB級數據。開源GraphLab突破人類圖計算「極限值」
GraphLab:將大數據分析從理念運用到生產

轉載請註明做者Jason Ding及其出處
GitCafe博客主頁(http://jasonding1354.gitcafe.io/)
Github博客主頁(http://jasonding1354.github.io/)
CSDN博客(http://blog.csdn.net/jasonding1354)
簡書主頁(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)
百度搜索jasonding1354進入個人博客主頁

相關文章
相關標籤/搜索