摘要: 由阿里巴巴統(tǒng)一大數(shù)據(jù)計算平臺MaxCompute研發(fā)團(tuán)隊,歷經(jīng)1年多研發(fā),打破大數(shù)據(jù)、科學(xué)計算領(lǐng)域邊界,完成第一個版本并開源。 Mars,一個基于張量的統(tǒng)一分布式計算框架。使用 Mars 進(jìn)行科學(xué)計算,不僅使得完成大規(guī)模科學(xué)計算任務(wù)從MapReduce實現(xiàn)上千行代碼降低到Mars數(shù)行代碼,更在性能上有大幅提升。
日前,阿里巴巴正式對外發(fā)布了分布式科學(xué)計算引擎 Mars 的開源代碼地址,開發(fā)者們可以在pypi上自主下載安裝,或在Github上獲取源代碼并參與開發(fā)。
此前,早在2018年9月的杭州云棲大會上,阿里巴巴就公布了這項開源計劃。Mars 突破了現(xiàn)有大數(shù)據(jù)計算引擎的關(guān)系代數(shù)為主的計算模型,將分布式技術(shù)引入科學(xué)計算/數(shù)值計算領(lǐng)域,極大地擴(kuò)展了科學(xué)計算的計算規(guī)模和效率。目前已應(yīng)用于阿里巴巴及其云上客戶的業(yè)務(wù)和生產(chǎn)場景。本文將為大家詳細(xì)介紹Mars的設(shè)計初衷和技術(shù)架構(gòu)。
概述
科學(xué)計算即數(shù)值計算,是指應(yīng)用計算機(jī)處理科學(xué)研究和工程技術(shù)中所遇到的數(shù)學(xué)計算問題。比如圖像處理、機(jī)器學(xué)習(xí)、深度學(xué)習(xí)等很多領(lǐng)域都會用到科學(xué)計算。有很多語言和庫都提供了科學(xué)計算工具。這其中,Numpy以其簡潔易用的語法和強(qiáng)大的性能成為佼佼者,并以此為基礎(chǔ)形成了龐大的技術(shù)棧。(下圖所示)
Numpy的核心概念多維數(shù)組是各種上層工具的基礎(chǔ)。多維數(shù)組也被稱為張量,相較于二維表/矩陣,張量具有更強(qiáng)大的表達(dá)能力。因此,現(xiàn)在流行的深度學(xué)習(xí)框架也都廣泛的基于張量的數(shù)據(jù)結(jié)構(gòu)。
隨著機(jī)器學(xué)習(xí)/深度學(xué)習(xí)的熱潮,張量的概念已逐漸為人所熟知,對張量進(jìn)行通用計算的規(guī)模需求也與日俱增。但現(xiàn)實是如Numpy這樣優(yōu)秀的科學(xué)計算庫仍舊停留在單機(jī)時代,無法突破規(guī)模瓶頸。當(dāng)下流行的分布式計算引擎也并非為科學(xué)計算而生,上層接口不匹配導(dǎo)致科學(xué)計算任務(wù)很難用傳統(tǒng)的SQL/MapReduce編寫,執(zhí)行引擎本身沒有針對科學(xué)計算優(yōu)化更使得計算效率難以令人滿意。
基于以上科學(xué)計算現(xiàn)狀,由阿里巴巴統(tǒng)一大數(shù)據(jù)計算平臺MaxCompute研發(fā)團(tuán)隊,歷經(jīng)1年多研發(fā),打破大數(shù)據(jù)、科學(xué)計算領(lǐng)域邊界,完成第一個版本并開源。 Mars,一個基于張量的統(tǒng)一分布式計算框架。使用 Mars 進(jìn)行科學(xué)計算,不僅使得完成大規(guī)??茖W(xué)計算任務(wù)從MapReduce實現(xiàn)上千行代碼降低到Mars數(shù)行代碼,更在性能上有大幅提升。目前,Mars 實現(xiàn)了 tensor 的部分,即numpy 分布式化, 實現(xiàn)了 70% 常見的 numpy 接口。后續(xù),在 Mars 0.2 的版本中, 正在將 pandas 分布式化,即將提供完全兼容 pandas 的接口,以構(gòu)建整個生態(tài)。
Mars作為新一代超大規(guī)??茖W(xué)計算引擎,不僅普惠科學(xué)計算進(jìn)入分布式時代,更讓大數(shù)據(jù)進(jìn)行高效的科學(xué)計算成為可能。
Mars的核心能力
- 符合使用習(xí)慣的接口
- Mars 通過 tensor 模塊提供兼容 Numpy 的接口,用戶可以將已有的基于 Numpy 編寫的代碼,只需替換 import,就可將代碼邏輯移植到 Mars,并直接獲得比原來大數(shù)萬倍規(guī)模,同時處理能力提高數(shù)十倍的能力。目前,Mars 實現(xiàn)了大約 70% 的常見 Numpy 接口。
- 充分利用gpu加速
- 除此之外,Mars 還擴(kuò)展了 Numpy,充分利用了GPU在科學(xué)計算領(lǐng)域的已有成果。創(chuàng)建張量時,通過指定 gpu=True 就可以讓后續(xù)計算在GPU上執(zhí)行。比如:
a = mt.random.rand(1000, 2000, gpu=True) # 指定在 GPU 上創(chuàng)建(a 1).sum(axis=1).execute()
- 稀疏矩陣
- Mars 還支持二維稀疏矩陣,創(chuàng)建稀疏矩陣的時候,通過指定 sparse=True 即可。以eye 接口為例,它創(chuàng)建了一個單位對角矩陣,這個矩陣只有對角線上有值,其他位置上都是 0,所以,我們可以用稀疏的方式存儲。
a = mt.eye(1000, sparse=True) # 指定創(chuàng)建稀疏矩陣(a 1).sum(axis=1).execute()
系統(tǒng)設(shè)計
接下來介紹 Mars 的系統(tǒng)設(shè)計,讓大家了解 Mars 是如何讓科學(xué)計算任務(wù)自動并行化并擁有強(qiáng)大的性能。
- 分而治之—tile
- Mars 通常對科學(xué)計算任務(wù)采用分而治之的方式。給定一個張量,Mars 會自動將其在各個維度上切分成小的 Chunk 來分別處理。對于 Mars 實現(xiàn)的所有的算子,都支持自動切分任務(wù)并行。這個自動切分的過程在Mars里被稱為 tile。
比如,給定一個 1000 2000 的張量,如果每個維度上的 chunk 大小為 500,那么這個張量就會被 tile 成 2 4 一共 8 個 chunk。對于后續(xù)的算子,比如加法(Add)和求和(SUM),也都會自動執(zhí)行 tile 操作。一個張量的運算的 tile 過程如下圖所示。
- 延遲執(zhí)行和 Fusion 優(yōu)化
- 目前 Mars 編寫的代碼需要顯式調(diào)用 execute 觸發(fā),這是基于 Mars 的延遲執(zhí)行機(jī)制。用戶在寫中間代碼時,并不會需要任何的實際數(shù)據(jù)計算。這樣的好處是可以對中間過程做更多優(yōu)化,讓整個任務(wù)的執(zhí)行更優(yōu)。目前 Mars 里主要用到了 fusion 優(yōu)化,即把多個操作合并成一個執(zhí)行。
對于前面一個圖的例子,在 tile 完成之后,Mars 會對細(xì)粒度的 Chunk 級別圖進(jìn)行 fusion 優(yōu)化,比如8個 RAND ADD SUM,每個可以被分別合并成一個節(jié)點,一方面可以通過調(diào)用如 numexpr 庫來生成加速代碼,另一方面,減少實際運行節(jié)點的數(shù)量也可以有效減少調(diào)度執(zhí)行圖的開銷。
- 多種調(diào)度方式
- Mars 支持多種調(diào)度方式:
| 多線程模式:Mars 可以使用多線程來在本地調(diào)度執(zhí)行 Chunk 級別的圖。對于 Numpy 來說,大部分算子都是使用單線程執(zhí)行,僅使用這種調(diào)度方式,也可以使得 Mars 在單機(jī)即可獲得 tile 化的執(zhí)行圖的能力,突破 Numpy 的單機(jī)內(nèi)存限制,同時充分利用單機(jī)所有 CPU/GPU 資源,獲得比 Numpy 快數(shù)倍的性能。
| 單機(jī)集群模式: Mars 可以在單機(jī)啟動整個分布式運行時,利用多進(jìn)程來加速任務(wù)的執(zhí)行;這種模式適合模擬面向分布式環(huán)境的開發(fā)調(diào)試。
| 分布式 : Mars 可以啟動一個或者多個 scheduler,以及多個 worker,scheduler 會調(diào)度 Chunk 級別的算子到各個 worker 去執(zhí)行。
下圖是 Mars 分布式的執(zhí)行架構(gòu):
Mars 分布式執(zhí)行時會啟動多個 scheduler 和 多個 worker,圖中是3個 scheduler 和5個 worker,這些 scheduler 組成一致性哈希環(huán)。用戶在客戶端顯式或隱式創(chuàng)建一個 session,會根據(jù)一致性哈希在其中一個 scheduler 上分配 SessionActor,然后用戶通過 execute 提交了一個張量的計算,會創(chuàng)建 GraphActor 來管理這個張量的執(zhí)行,這個張量會在 GraphActor 中被 tile 成 chunk 級別的圖。這里假設(shè)有3個 chunk,那么會在 scheduler 上創(chuàng)建3個 OperandActor 分別對應(yīng)。這些 OperandActor 會根據(jù)自己的依賴是否完成、以及集群資源是否足夠來提交到各個 worker 上執(zhí)行。在所有 OperandActor 都完成后會通知 GraphActor 任務(wù)完成,然后客戶端就可以拉取數(shù)據(jù)來展示或者繪圖。
- 向內(nèi)和向外伸縮
- Mars 靈活的 tile 化執(zhí)行圖配合多種調(diào)度模式,可以使得相同的 Mars 編寫的代碼隨意向內(nèi)(scale in)和向外(scale out)伸縮。向內(nèi)伸縮到單機(jī),可以利用多核來并行執(zhí)行科學(xué)計算任務(wù);向外伸縮到分布式集群,可以支持到上千臺 worker 規(guī)模來完成單機(jī)無論如何都難以完成的任務(wù)。
Benchmark
在一個真實的場景中,我們遇到了巨型矩陣乘法的計算需求,需要完成兩個均為千億元素,大小約為2.25T的矩陣相乘。Mars通過5行代碼,使用1600 CU(200個 worker,每 worker 為 8核 32G內(nèi)存),在2個半小時內(nèi)完成計算。在此之前,同類計算只能使用 MapReduce 編寫千余行代碼模擬進(jìn)行,完成同樣的任務(wù)需要動用 9000 CU 并耗時10個小時。
讓我們再看兩個對比。下圖是對36億數(shù)據(jù)矩陣的每個元素加一再乘以二,紅色的叉表示 Numpy 的計算時間,綠色的實線是 Mars 的計算時間,藍(lán)色虛線是理論計算時間??梢钥吹絾螜C(jī) Mars 就比 Numpy 快數(shù)倍,隨著 Worker 的增加,可以獲得幾乎線性的加速比。
下圖是進(jìn)一步擴(kuò)大計算規(guī)模,把數(shù)據(jù)擴(kuò)大到144億元素,對這些元素加一乘以二以后再求和。這時候輸入數(shù)據(jù)就有 115G,單機(jī)的 Numpy 已經(jīng)無法完成運算,Mars 依然可以完成運算,且隨著機(jī)器的增多可以獲得還不錯的加速比。
開源地址
Mars 已經(jīng)在 Github 開源:https://github.com/mars-project/mars ,且后續(xù)會全部在 Github 上使用標(biāo)準(zhǔn)開源軟件的方式來進(jìn)行開發(fā),歡迎大家使用 Mars,并成為 Mars 的 contributor。
Mars科學(xué)計算引擎產(chǎn)品發(fā)布會
發(fā)布直播回放>>https://yq.aliyun.com/live/800
發(fā)布活動頁>> https://promotion.aliyun.com/ntms/act/cloud/marsfbh.html
大數(shù)據(jù)計算服務(wù)MaxCompute官網(wǎng)>>https://www.aliyun.com/product/odps
MaxCompute試用申請頁面>>https://i.aliyun.com/inviteapplyagent_id=183
聚能聊>>https://yq.aliyun.com/roundtable/493400
作者:晉恒
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 舉報,一經(jīng)查實,本站將立刻刪除。