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

2021-09-10 10:08:57 字數 4054 閱讀 3654

mars 突破了現有大資料計算引擎的關係代數為主的計算模型,將分布式技術引入科學計算/數值計算領域,極大地擴充套件了科學計算的計算規模和效率。目前已應用於阿里巴巴及其雲上客戶的業務和生產場景。

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

概述

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

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

機器學習/深度學習的熱潮席捲而來,張量的概念已逐漸為人所熟知,對張量進行通用計算的規模需求也與日俱增。但現實是如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 介面。

充分利用gpu加速

除此之外,mars 還擴充套件了 numpy,充分利用了gpu在科學計算領域的已有成果。建立張量時,通過指定 gpu=true 就可以讓後續計算在gpu上執行。比如:

稀疏矩陣

mars 還支援二維稀疏矩陣,建立稀疏矩陣的時候,通過指定 sparse=true 即可。以eye 介面為例,它建立了乙個單位對角矩陣,這個矩陣只有對角線上有值,其他位置上都是 0,所以,我們可以用稀疏的方式儲存。

系統設計

接下來介紹 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 分布式的執行架構:

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 依然可以完成運算,且隨著機器的增多可以獲得還不錯的加速比。

重磅 阿里雲文件開源

文件開源的前世今生 開源專案一直是很多開發者的寵兒。通過開源,開發者集思廣益,共同管理 分享 學習某個產品及其 通過精英式的管理方式,誕生了很多款優秀的開源軟體,長期以來在軟體市場佔據這獨特的地位。但是對於it行業,產品文件開源還是新鮮事物。不管是在傳統的通訊行業,還是在飛速發展的網際網路行業,文件...

重磅!阿里自研容器技術Pouch宣布即將開源

摘要 今天,阿里巴巴決定以開源的方式回饋社群,希望與開發者共同推動容器技術的發展,共建容器技術標準。在2017杭州雲棲大會上,阿里巴巴正式宣布自主研發的容器技術pouch即將開源。經過七年的沉澱和錘煉,阿里希望通過開源的形式回饋社群,與開發者共同推動容器技術發展,共建容器技術標準。擁抱生態,阿里容器...

73款阿里巴巴開源軟體詳解

這是開發者和開源愛好者正在共同書寫的崢嶸歲月。擁抱開源 回饋開源 融合開源和回報開源 是阿里的開源歷程,通過 眾創 帶來技術上的創新和推動是阿里開源最核心的意義,而阿里的每一項重要開源技術都離不開業內廣大開發者的參與和貢獻。受益開源,就當回饋。面對阿里頭頂上 貢獻開源軟體數目第一 的光環,我們清醒地...