摘要:由阿里巴巴統(tǒng)一大數(shù)據(jù)計(jì)算平臺(tái)MaxCompute研發(fā)團(tuán)隊(duì)唯卖,歷經(jīng)1年多研發(fā),打破大數(shù)據(jù)躬柬、科學(xué)計(jì)算領(lǐng)域邊界拜轨,完成第一個(gè)版本并開源。 Mars允青,一個(gè)基于張量的統(tǒng)一分布式計(jì)算框架橄碾。使用 Mars 進(jìn)行科學(xué)計(jì)算,不僅使得完成大規(guī)模科學(xué)計(jì)算任務(wù)從MapReduce實(shí)現(xiàn)上千行代碼降低到Mars數(shù)行代碼法牲,更在性能上有大幅提升史汗。
日前,阿里巴巴正式對(duì)外發(fā)布了分布式科學(xué)計(jì)算引擎 Mars 的開源代碼地址拒垃,開發(fā)者們可以在pypi上自主下載安裝停撞,或在Github上獲取源代碼并參與開發(fā)。
此前悼瓮,早在2018年9月的杭州云棲大會(huì)上戈毒,阿里巴巴就公布了這項(xiàng)開源計(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編寫,執(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è)版本并開源。 Mars髓需,一個(gè)基于張量的統(tǒng)一分布式計(jì)算框架许师。使用 Mars 進(jìn)行科學(xué)計(jì)算,不僅使得完成大規(guī)牧糯遥科學(xué)計(jì)算任務(wù)從MapReduce實(shí)現(xiàn)上千行代碼降低到Mars數(shù)行代碼微渠,更在性能上有大幅提升。目前咧擂,Mars 實(shí)現(xiàn)了 tensor 的部分逞盆,即numpy 分布式化, 實(shí)現(xiàn)了 70% 常見的 numpy 接口松申。后續(xù)云芦,在 Mars 0.2 的版本中, 正在將 pandas 分布式化贸桶,即將提供完全兼容 pandas 的接口舅逸,以構(gòu)建整個(gè)生態(tài)。
Mars作為新一代超大規(guī)幕噬福科學(xué)計(jì)算引擎琉历,不僅普惠科學(xué)計(jì)算進(jìn)入分布式時(shí)代,更讓大數(shù)據(jù)進(jìn)行高效的科學(xué)計(jì)算成為可能水醋。
Mars的核心能力
符合使用習(xí)慣的接口
Mars 通過(guò) tensor 模塊提供兼容 Numpy 的接口旗笔,用戶可以將已有的基于 Numpy 編寫的代碼,只需替換 import拄踪,就可將代碼邏輯移植到 Mars蝇恶,并直接獲得比原來(lái)大數(shù)萬(wàn)倍規(guī)模,同時(shí)處理能力提高數(shù)十倍的能力惶桐。目前撮弧,Mars 實(shí)現(xiàn)了大約 70% 的常見 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 編寫的代碼需要顯式調(diào)用 execute 觸發(fā)蜗字,這是基于 Mars 的延遲執(zhí)行機(jī)制打肝。用戶在寫中間代碼時(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í)行圖的開銷发绢。
多種調(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)境的開發(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 編寫的代碼隨意向內(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 編寫千余行代碼模擬進(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ò)的加速比近上。
開源地址
Mars 已經(jīng)在 Github 開源:https://github.com/mars-project/mars剔宪,且后續(xù)會(huì)全部在 Github 上使用標(biāo)準(zhǔn)開源軟件的方式來(lái)進(jìn)行開發(fā),歡迎大家使用 Mars壹无,并成為 Mars 的 contributor葱绒。
Mars科學(xué)計(jì)算引擎產(chǎn)品發(fā)布會(huì)
大數(shù)據(jù)計(jì)算服務(wù)MaxCompute官網(wǎng)>>
本文作者:晉恒
作者:阿里云云棲社區(qū)
鏈接:http://www.reibang.com/p/ba1a2a454af6
來(lái)源:簡(jiǎn)書
簡(jiǎn)書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處斗锭。