GraphLab介紹
GraphLab 是由CMU(卡內基梅隆大學)的Select 實驗室在2010 年提出的一個基於圖像處理模型的開源圖計算框架。框架使用C++語言開發實現。
該框架是面向機器學習(ML)的流處理並行計算框架,可以運行在多處理機的單機系統、集群或是亞馬遜的EC2 等多種環境下。框架的設計目標是,像MapReduce一樣高度抽象。可以高效運行與機器學習相關的、具有稀疏的計算依賴特性的迭代性算法,並且保證計算過程中數據的高度一致性和高效的並行計算性能。該框架最初是為處理大規模機器學習任務而開發的,可是該框架也相同適用於很多數據挖掘方面的計算任務。在並行圖計算領域,該框架在性能上高出非常多其它並行計算框架(比如,MapReduce、Mahout)幾個數量級。GraphLab 自成立以來就是一個發展非常迅速的開源項目,其用戶涉及的范圍也相當廣泛,全球有2 000 多個企業、機構使用GraphLab。

GraphLab的長處
GraphLab 作為一個基於圖處理的並行計算框架,可以高效地運行機器學習相關的數據依賴性強,迭代型算法。其設計具有例如以下特點和長處。
- 統一的API 接口。
對於多核處理器和分布式環境,採用統一的API 接口,一次編敲代碼就可以高效地運行在共享內存環境或者分布式集群上。
- 高性能。優化C++運行引擎,在大量多線程操作和同步I/O 操作之間進行了非常好的平衡。
- 可伸縮性強。GraphLab 可以智能地選擇存儲和計算的節點,原因是GraphLab 對於數據的存儲與計算都使用了精心設計的優良算法。
- 集成HDFS。GraphLab 內置對HDFS 的支持。GraphLab 可以直接從HDFS中讀數據或者將計算結果數據直接寫入到HDFS 中。
- 功能強大的機器學習類工具集。GraphLab 在自身提供的API 接口之上實現了大量的開箱即用的工具集。
GraphLab在Windows下的安裝
GraphLab如今還不支持Windows,臨時僅僅能通過VMware Player運行linux的虛擬機,官方給出了已經配置好的GraphLab Create的VM文件。可以免去編譯等步驟。
下載GraphLab Create,並依照要求配置安裝
- 首先下載GraphLab Create VM文件
- 然后安裝VMware Player。導入GraphLab Create VM文件詳見文檔
- 最后通過ipython查看能否正常導入graphlab庫詳見文檔
GraphLab和MapReduce的對照
一般的機器學習類算法有下面兩個特性:
- 數據依賴性非常強。運算過程中參與計算的各個機器之間常常須要交換大量的數據。
- 流處理復雜。主要表如今整個處理過程須要重復地迭代計算,數據處理分支非常多。非常難實現真正的並行。
在GraphLab 出現之前。針對這些機器學習的算法,普遍的編程方法是採用MPI 和PThread 這些已有的底層開發庫來完畢這類計算問題。採用這樣的編程模型的開發應用,針對詳細的應用,須要開發人員實現相應的算法來完畢計算過程中集群計算節點之間主機通信和數據同步等底層操作。這樣的開發方法的優勢在於,可以針對詳細的應用對代碼進行深度的優化。以達到非常高的性能。
可是對於不同的應用,須要重寫代碼實現底層的數據分配、數據通信等細節,這就導致了代碼重用率非常低,可拓展性差。對編程人員要求高。這樣的編程模型顯然不適合當前敏捷的互聯網開發。而當前被廣泛使用的MapReduce 計算框架,在並行運行多任務的時候,要求各個任務之間相互獨立。任務運行期間不須要相互之間進行數據通信。所以MapReduce 不適合數據依賴性強的任務,並且MapReduce 並行計算模型也不能高效表達迭代型算法。
這樣的計算模型在處理如日志分析、數據統計等數據獨立性的任務時具有明顯的優勢,可是在機器學習領域。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三個階段。
- Gather階段
工作頂點的邊 (可能是全部邊。也有可能是入邊或者出邊)從領接頂點和自身收集數據,記為gather_data_i。各個邊的數據graphlab會求和,記為sum_data。這一階段對工作頂點、邊都是僅僅讀的。 - Apply階段
Mirror將gather計算的結果sum_data發送給master頂點,master進行匯總為total。Master利用total和上一步的頂點數據,依照業務需求進行進一步的計算,然后更新master的頂點數據,並同步mirror。
Apply階段中。工作頂點可改動,邊不可改動。
- 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進入我的博客主頁
