重磅開源!阿里首款自研科學計算引擎Mars來了

jopen 6年前發布 | 11K 次閱讀 阿里巴巴 Mars 阿里技術

重磅開源!阿里首款自研科學計算引擎Mars來了

日前,阿里巴巴正式對外發布了分布式科學計算引擎 Mars 的開源代碼地址,開發者們可以在 Github 上獲取源代碼并參與開發。

Mars 突破了現有大數據計算引擎的關系代數為主的計算模型,將分布式技術引入科學計算/數值計算領域,極大地擴展了科學計算的計算規模和效率。目前已應用于阿里巴巴及其云上客戶的業務和生產場景。

下面,我們將詳細介紹 Mars 的設計初衷和技術架構,希望和大家共同交流探討。

Github 地址:https://github.com/mars-project/mars

概述

科學計算即數值計算,是指應用計算機處理科學研究和工程技術中所遇到的數學計算問題。比如圖像處理、機器學習、深度學習等很多領域都會用到科學計算。有很多語言和庫都提供了科學計算工具。這其中,Numpy 以其簡潔易用的語法和強大的性能成為佼佼者,并以此為基礎形成了龐大的技術棧(下圖所示)。

重磅開源!阿里首款自研科學計算引擎Mars來了

Numpy 的核心概念多維數組是各種上層工具的基礎。多維數組也被稱為張量,相較于二維表/矩陣,張量具有更強大的表達能力。因此,現在流行的深度學習框架也都廣泛的基于張量的數據結構。

重磅開源!阿里首款自研科學計算引擎Mars來了

機器學習/深度學習的熱潮席卷而來,張量的概念已逐漸為人所熟知,對張量進行通用計算的規模需求也與日俱增。但現實是如 Numpy 這樣優秀的科學計算庫仍舊停留在單機時代,無法突破規模瓶頸。當下流行的分布式計算引擎也并非為科學計算而生,上層接口不匹配導致科學計算任務很難用傳統的 SQL/MapReduce 編寫,執行引擎本身沒有針對科學計算優化更使得計算效率難以令人滿意。

基于以上科學計算現狀,由阿里巴巴統一大數據計算平臺 MaxCompute 研發團隊,歷經一年多研發,打破大數據、科學計算領域邊界,完成第一個版本并開源。 

Mars,一個基于張量的統一分布式計算框架。使用 Mars 進行科學計算,不僅使得完成大規模科學計算任務從 MapReduce 實現上千行代碼降低到 Mars 數行代碼,更在性能上有大幅提升。目前,Mars 實現了 tensor 的部分,即 numpy 分布式化, 實現了 70% 常見的 numpy 接口。后續,在 Mars 0.2 的版本中, 正在將 pandas 分布式化,即將提供完全兼容 pandas 的接口,以構建整個生態。

Mars 作為新一代超大規模科學計算引擎,不僅普惠科學計算進入分布式時代,更讓大數據進行高效的科學計算成為可能。

Mars 的核心能力

符合使用習慣的接口

Mars 通過 tensor 模塊提供兼容 Numpy 的接口,用戶可以將已有的基于 Numpy 編寫的代碼,只需替換 import,就可將代碼邏輯移植到 Mars,并直接獲得比原來大數萬倍規模,同時處理能力提高數十倍的能力。目前,Mars 實現了大約 70% 的常見 Numpy 接口。

重磅開源!阿里首款自研科學計算引擎Mars來了

充分利用 GPU 加速

除此之外,Mars 還擴展了 Numpy,充分利用了 GPU 在科學計算領域的已有成果。創建張量時,通過指定 gpu=True 就可以讓后續計算在 GPU 上執行。比如:

重磅開源!阿里首款自研科學計算引擎Mars來了

稀疏矩陣

Mars 還支持二維稀疏矩陣,創建稀疏矩陣的時候,通過指定 sparse=True 即可。以 eye 接口為例,它創建了一個單位對角矩陣,這個矩陣只有對角線上有值,其他位置上都是 0,所以,我們可以用稀疏的方式存儲。

重磅開源!阿里首款自研科學計算引擎Mars來了

 

系統設計

接下來介紹 Mars 的系統設計,讓大家了解 Mars 是如何讓科學計算任務自動并行化并擁有強大的性能。

分而治之:tile

Mars 通常對科學計算任務采用分而治之的方式。給定一個張量,Mars 會自動將其在各個維度上切分成小的 Chunk 來分別處理。對于 Mars 實現的所有的算子,都支持自動切分任務并行。這個自動切分的過程在 Mars 里被稱為 tile。

比如,給定一個 1000 * 2000 的張量,如果每個維度上的 chunk 大小為 500,那么這個張量就會被 tile 成 2 * 4 一共 8 個 chunk。對于后續的算子,比如加法(Add)和求和(SUM),也都會自動執行 tile 操作。一個張量的運算的 tile 過程如下圖所示。

重磅開源!阿里首款自研科學計算引擎Mars來了

延遲執行和 Fusion 優化

目前 Mars 編寫的代碼需要顯式調用 execute 觸發,這是基于 Mars 的延遲執行機制。用戶在寫中間代碼時,并不會需要任何的實際數據計算。這樣的好處是可以對中間過程做更多優化,讓整個任務的執行更優。目前 Mars 里主要用到了 fusion 優化,即把多個操作合并成一個執行。

對于前面一個圖的例子,在 tile 完成之后,Mars 會對細粒度的 Chunk 級別圖進行 fusion 優化,比如 8 個 RAND+ADD+SUM,每個可以被分別合并成一個節點,一方面可以通過調用如 numexpr 庫來生成加速代碼,另一方面,減少實際運行節點的數量也可以有效減少調度執行圖的開銷。

多種調度方式

Mars 支持多種調度方式:

  • 多線程模式:Mars 可以使用多線程來在本地調度執行 Chunk 級別的圖。對于 Numpy 來說,大部分算子都是使用單線程執行,僅使用這種調度方式,也可以使得 Mars 在單機即可獲得 tile 化的執行圖的能力,突破 Numpy 的單機內存限制,同時充分利用單機所有 CPU/GPU 資源,獲得比 Numpy 快數倍的性能。

  • 單機集群模式: Mars 可以在單機啟動整個分布式運行時,利用多進程來加速任務的執行;這種模式適合模擬面向分布式環境的開發調試。

  • 分布式 : Mars 可以啟動一個或者多個 scheduler,以及多個 worker,scheduler 會調度 Chunk 級別的算子到各個 worker 去執行。

下圖是 Mars 分布式的執行架構:

重磅開源!阿里首款自研科學計算引擎Mars來了

Mars 分布式執行時會啟動多個 scheduler 和多個 worker,圖中是 3 個 scheduler 和 5 個 worker,這些 scheduler 組成一致性哈希環。用戶在客戶端顯式或隱式創建一個 session,會根據一致性哈希在其中一個 scheduler 上分配 SessionActor,然后用戶通過 execute 提交了一個張量的計算,會創建 GraphActor 來管理這個張量的執行,這個張量會在 GraphActor 中被 tile 成 chunk 級別的圖。這里假設有 3 個 chunk,那么會在 scheduler 上創建 3 個 OperandActor 分別對應。這些 OperandActor 會根據自己的依賴是否完成、以及集群資源是否足夠來提交到各個 worker 上執行。在所有 OperandActor 都完成后會通知 GraphActor 任務完成,然后客戶端就可以拉取數據來展示或者繪圖。

向內和向外伸縮

Mars 靈活的 tile 化執行圖配合多種調度模式,可以使得相同的 Mars 編寫的代碼隨意向內(scale in)和向外(scale out)伸縮。向內伸縮到單機,可以利用多核來并行執行科學計算任務;向外伸縮到分布式集群,可以支持到上千臺 worker 規模來完成單機無論如何都難以完成的任務。

Benchmark

在一個真實的場景中,我們遇到了巨型矩陣乘法的計算需求,需要完成兩個均為千億元素,大小約為 2.25T 的矩陣相乘。Mars 通過 5 行代碼,使用 1600 CU(200 個 worker,每 worker 為 8 核 32G 內存),在 2 個半小時內完成計算。在此之前,同類計算只能使用 MapReduce 編寫千余行代碼模擬進行,完成同樣的任務需要動用 9000 CU 并耗時 10 個小時。

讓我們再看兩個對比。下圖是對 36 億數據矩陣的每個元素加一再乘以二,紅色的叉表示 Numpy 的計算時間,綠色的實線是 Mars 的計算時間,藍色虛線是理論計算時間。可以看到單機 Mars 就比 Numpy 快數倍,隨著 Worker 的增加,可以獲得幾乎線性的加速比。

重磅開源!阿里首款自研科學計算引擎Mars來了

下圖是進一步擴大計算規模,把數據擴大到 144 億元素,對這些元素加一乘以二以后再求和。這時候輸入數據就有 115G,單機的 Numpy 已經無法完成運算,Mars 依然可以完成運算,且隨著機器的增多可以獲得還不錯的加速比。

重磅開源!阿里首款自研科學計算引擎Mars來了

Mars 已經在 Github 開源,點擊文末“閱讀原文”即可獲取。后續 Mars 團隊會全部在 Github 上使用標準開源軟件的方式來進行開發,歡迎大家使用 Mars,成為 Mars 的 contributor。

來自: mp.weixin.qq.com

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!