阿里重磅開源首款自研科學計算引擎Mars,揭祕超大規模科學計算

日前,阿里巴巴正式對外發布了分佈式科學計算引擎 Mars 的開源代碼地址,開發者們能夠在pypi上自主下載安裝,或在Github上獲取源代碼並參與開發。git

此前,早在2018年9月的杭州雲棲大會上,阿里巴巴就公佈了這項開源計劃。Mars 突破了現有大數據計算引擎的關係代數爲主的計算模型,將分佈式技術引入科學計算/數值計算領域,極大地擴展了科學計算的計算規模和效率。目前已應用於阿里巴巴及其雲上客戶的業務和生產場景。本文將爲你們詳細介紹Mars的設計初衷和技術架構。github

概述數組

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

圖片描述

Numpy的核心概念多維數組是各類上層工具的基礎。多維數組也被稱爲張量,相較於二維表/矩陣,張量具備更強大的表達能力。所以,如今流行的深度學習框架也都普遍的基於張量的數據結構。
圖片描述數據結構

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

基於以上科學計算現狀,由阿里巴巴統一大數據計算平臺MaxCompute研發團隊,歷經1年多研發,打破大數據、科學計算領域邊界,完成第一個版本並開源。 Mars,一個基於張量的統一分佈式計算框架。使用 Mars 進行科學計算,不只使得完成大規模科學計算任務從MapReduce實現上千行代碼下降到Mars數行代碼,更在性能上有大幅提高。目前,Mars 實現了 tensor 的部分,即numpy 分佈式化, 實現了 70% 常見的 numpy 接口。後續,在 Mars 0.2 的版本中, 正在將 pandas 分佈式化,即將提供徹底兼容 pandas 的接口,以構建整個生態。 架構

Mars做爲新一代超大規模科學計算引擎,不只普惠科學計算進入分佈式時代,更讓大數據進行高效的科學計算成爲可能。框架

Mars的核心能力dom

符合使用習慣的接口
Mars 經過 tensor 模塊提供兼容 Numpy 的接口,用戶能夠將已有的基於 Numpy 編寫的代碼,只需替換 import,就可將代碼邏輯移植到 Mars,並直接得到比原來大數萬倍規模,同時處理能力提升數十倍的能力。目前,Mars 實現了大約 70% 的常見 Numpy 接口。
圖片描述機器學習

充分利用GPU加速
除此以外,Mars 還擴展了 Numpy,充分利用了GPU在科學計算領域的已有成果。建立張量時,經過指定 gpu=True 就可讓後續計算在GPU上執行。好比:
a = mt.random.rand(1000, 2000, gpu=True) # 指定在 GPU 上建立
(a + 1).sum(axis=1).execute()

稀疏矩陣
Mars 還支持二維稀疏矩陣,建立稀疏矩陣的時候,經過指定 sparse=True 便可。以eye 接口爲例,它建立了一個單位對角矩陣,這個矩陣只有對角線上有值,其餘位置上都是 0,因此,咱們能夠用稀疏的方式存儲。
a = mt.eye(1000, sparse=True) # 指定建立稀疏矩陣
(a + 1).sum(axis=1).execute()

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

分而治之—tile
Mars 一般對科學計算任務採用分而治之的方式。給定一個張量,Mars 會自動將其在各個維度上切分紅小的 Chunk 來分別處理。對於 Mars 實現的全部的算子,都支持自動切分任務並行。這個自動切分的過程在Mars裏被稱爲 tile。
好比,給定一個 1000 2000 的張量,若是每一個維度上的 chunk 大小爲 500,那麼這個張量就會被 tile 成 2 4 一共 8 個 chunk。對於後續的算子,好比加法(Add)和求和(SUM),也都會自動執行 tile 操做。一個張量的運算的 tile 過程以下圖所示。

延遲執行和 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 分佈式執行時會啓動多個 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 的增長,能夠得到幾乎線性的加速比。

圖片描述

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

圖片描述

開源地址

Mars 已經在 Github 開源:https://github.com/mars-proje... ,且後續會所有在 Github 上使用標準開源軟件的方式來進行開發,歡迎你們使用 Mars,併成爲 Mars 的 contributor。

相關文章
相關標籤/搜索