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