阿里妹導(dǎo)讀:日前,阿里巴巴正式對(duì)外發(fā)布了分布式科學(xué)計(jì)算引擎 Mars 的開源代碼地址炫加,開發(fā)者們可以在Github上獲取源代碼并參與開發(fā)。
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)場景魄健。
下面赋铝,我們將詳細(xì)介紹Mars的設(shè)計(jì)初衷和技術(shù)架構(gòu),希望和大家共同交流探討沽瘦。
Github地址:
https://github.com/mars-project/mars
概述
科學(xué)計(jì)算即數(shù)值計(jì)算革骨,是指應(yīng)用計(jì)算機(jī)處理科學(xué)研究和工程技術(shù)中所遇到的數(shù)學(xué)計(jì)算問題。比如圖像處理析恋、機(jī)器學(xué)習(xí)良哲、深度學(xué)習(xí)等很多領(lǐng)域都會(huì)用到科學(xué)計(jì)算。有很多語言和庫都提供了科學(xué)計(jì)算工具助隧。這其中筑凫,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í)的熱潮席卷而來,張量的概念已逐漸為人所熟知洗显,對(duì)張量進(jìn)行通用計(jì)算的規(guī)模需求也與日俱增外潜。但現(xiàn)實(shí)是如Numpy這樣優(yōu)秀的科學(xué)計(jì)算庫仍舊停留在單機(jī)時(shí)代,無法突破規(guī)模瓶頸挠唆。當(dāng)下流行的分布式計(jì)算引擎也并非為科學(xué)計(jì)算而生处窥,上層接口不匹配導(dǎo)致科學(xué)計(jì)算任務(wù)很難用傳統(tǒng)的SQL/MapReduce編寫,執(zhí)行引擎本身沒有針對(duì)科學(xué)計(jì)算優(yōu)化更使得計(jì)算效率難以令人滿意玄组。
基于以上科學(xué)計(jì)算現(xiàn)狀滔驾,由阿里巴巴統(tǒng)一大數(shù)據(jù)計(jì)算平臺(tái)MaxCompute研發(fā)團(tuán)隊(duì)谒麦,歷經(jīng)一年多研發(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 通過 tensor 模塊提供兼容 Numpy 的接口波闹,用戶可以將已有的基于 Numpy 編寫的代碼,只需替換 import涛碑,就可將代碼邏輯移植到 Mars精堕,并直接獲得比原來大數(shù)萬倍規(guī)模,同時(shí)處理能力提高數(shù)十倍的能力蒲障。目前歹篓,Mars 實(shí)現(xiàn)了大約 70% 的常見Numpy 接口。
充分利用GPU加速
除此之外揉阎,Mars 還擴(kuò)展了 Numpy庄撮,充分利用了GPU在科學(xué)計(jì)算領(lǐng)域的已有成果。創(chuàng)建張量時(shí)毙籽,通過指定 gpu=True 就可以讓后續(xù)計(jì)算在GPU上執(zhí)行洞斯。比如:
稀疏矩陣
Mars 還支持二維稀疏矩陣,創(chuàng)建稀疏矩陣的時(shí)候坑赡,通過指定 sparse=True 即可烙如。以eye 接口為例么抗,它創(chuàng)建了一個(gè)單位對(duì)角矩陣,這個(gè)矩陣只有對(duì)角線上有值厅翔,其他位置上都是 0乖坠,所以,我們可以用稀疏的方式存儲(chǔ)刀闷。
系統(tǒng)設(shè)計(jì)
接下來介紹 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 來分別處理。對(duì)于Mars 實(shí)現(xiàn)的所有的算子施蜜,都支持自動(dòng)切分任務(wù)并行卒蘸。這個(gè)自動(dòng)切分的過程在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 過程如下圖所示翘单。
延遲執(zhí)行和 Fusion 優(yōu)化
目前 Mars 編寫的代碼需要顯式調(diào)用?execute?觸發(fā),這是基于 Mars 的延遲執(zhí)行機(jī)制蹦渣。用戶在寫中間代碼時(shí)哄芜,并不會(huì)需要任何的實(shí)際數(shù)據(jù)計(jì)算。這樣的好處是可以對(duì)中間過程做更多優(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)恕酸,一方面可以通過調(diào)用如 numexpr 庫來生成加速代碼堪滨,另一方面,減少實(shí)際運(yùn)行節(jié)點(diǎn)的數(shù)量也可以有效減少調(diào)度執(zhí)行圖的開銷蕊温。
多種調(diào)度方式
Mars 支持多種調(diào)度方式:
多線程模式:Mars 可以使用多線程來在本地調(diào)度執(zhí)行 Chunk 級(jí)別的圖袱箱。對(duì)于 Numpy 來說遏乔,大部分算子都是使用單線程執(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)程來加速任務(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肤无,然后用戶通過 execute 提交了一個(gè)張量的計(jì)算先蒋,會(huì)創(chuàng)建 GraphActor 來管理這個(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ù)自己的依賴是否完成皇忿、以及集群資源是否足夠來提交到各個(gè)worker 上執(zhí)行畴蹭。在所有 OperandActor 都完成后會(huì)通知 GraphActor 任務(wù)完成,然后客戶端就可以拉取數(shù)據(jù)來展示或者繪圖鳍烁。
向內(nèi)和向外伸縮
Mars 靈活的 tile 化執(zhí)行圖配合多種調(diào)度模式叨襟,可以使得相同的 Mars 編寫的代碼隨意向內(nèi)(scale in)和向外(scale out)伸縮。向內(nèi)伸縮到單機(jī)幔荒,可以利用多核來并行執(zhí)行科學(xué)計(jì)算任務(wù)糊闽;向外伸縮到分布式集群,可以支持到上千臺(tái) worker 規(guī)模來完成單機(jī)無論如何都難以完成的任務(wù)爹梁。
Benchmark
在一個(gè)真實(shí)的場景中右犹,我們遇到了巨型矩陣乘法的計(jì)算需求,需要完成兩個(gè)均為千億元素姚垃,大小約為2.25T的矩陣相乘念链。Mars通過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)無法完成運(yùn)算亮靴,Mars 依然可以完成運(yùn)算馍盟,且隨著機(jī)器的增多可以獲得還不錯(cuò)的加速比。
Mars 已經(jīng)在 Github 開源茧吊,點(diǎn)擊文末“閱讀原文”即可獲取贞岭。后續(xù)Mars?團(tuán)隊(duì)會(huì)全部在 Github 上使用標(biāo)準(zhǔn)開源軟件的方式來進(jìn)行開發(fā),歡迎大家使用 Mars搓侄,成為 Mars 的 contributor瞄桨。