Mars——基于矩阵的统一分布式计算框架

背景

Python

Python 是一门相当古老的语言了,如今,在数据科学计算、机器学习、以及深度学习领域,Python 越来越受欢迎。

大数据领域,由于 hadoop 和 spark 等,Java 等还是占据着比较核心的位置,但是在 spark 上也可以看到,pyspark 的用户占据很大一部分。

深度学习领域,绝大部分的库(tensorflow、pytorch、mxnet、chainer)都支持 Python 语言,且 Python 语言也是这些库上使用最广泛的语言。

对 MaxCompute 来说,Python 用户也是一股重要力量。

PyData(numpy、scipy、pandas、scikit-learn、matplotlib)

Python 在数据科学领域,有非常丰富的包可以选择,下图展示了整个 Python 数据科学技术栈。

可以看到 numpy 作为基础,在其上,有 scipy 面向科学家,pandas 面向数据分析,scikit-learn 则是最著名的机器学习库,matplotlib 专注于可视化。

对 numpy 来说,其中最核心的概念就是 ndarray——多维数组,pandas、scikit-learn 等库都构建于这个数据结构基础之上。

问题

虽然 Python 在这些领域越来越流行,PyData 技术栈给数据科学家们提供了多维矩阵、DataFrame 上的分析和计算能力、基于二维矩阵的机器学习算法,但这些库都仅仅受限于单机运算,在大数据时代,数据量一大,这些库的处理能力都显得捉襟见肘。

虽然大数据时代,有各种各样基于 SQL 的计算引擎,但对科学计算领域,这些引擎都不太适合用来进行大规模的多维矩阵的运算操作。而且,相当一部分用户,尤其是数据科学家们,习惯于使用各种成熟的单机库,他们不希望改变自己的使用习惯,去学习一些新的库和语法。

此外,在深度学习领域,ndarray/tensor 也是最基本的数据结构,但它们仅仅限制在深度学习上,也不适合大规模的多维矩阵运算。

基于这些考量,我们开发了 Mars,一个基于 tensor 的统一分布式计算框架,前期我们关注怎么将 tensor 这层做到极致。

我们的工作

Mars 的核心用 python 实现,这样做的好处是能利用到现有的 Python 社区的工作,我们能充分利用 numpy、cupy、pandas 等来作为我们小的计算单元,我们能快速稳定构建我们整个系统;其次,Python 本身能轻松和 c/c++ 做继承,我们也不必担心 Python 语言本身的性能问题,我们可以对性能热点模块轻松用 c/cython 重写。

接下来,主要集中介绍 Mars tensor,即多维矩阵计算的部分。

Numpy API

Numpy 成功的一个原因,就是其简单易用的 API。Mars tensor 在这块可以直接利用其作为我们的接口。所以在 numpy API 的基础上,用户可以写出灵活的代码,进行数据处理,甚至是实现各种算法。

下面是两段代码,分别是用 numpy 和 Mars tensor 来实现一个功能。

import numpy as npa = np.random.rand(1000, 2000)
(a + 1).sum(axis=1)
import mars.tensor as mta = mt.random.rand(1000, 2000)
(a + 1).sum(axis=1).execute()

这里,创建了一个 1000x2000 的随机数矩阵,对其中每个元素加1,并在 axis=1(行)上求和。

目前,Mars 实现了大约 70% 的 Numpy 常用接口。

可以看到,除了 import 做了替换,用户只需要通过调用 execute 来显式触发计算。通过 execute 显式触发计算的好处是,我们能对中间过程做更多的优化,来更高效地执行计算。

不过,静态图的坏处是牺牲了灵活性,增加了 debug 的难度。下个版本,我们会提供 instant/eager mode,来对每一步操作触发计算,这样,用户能更有效地进行 debug,且能利用到 Python 语言来做循环,当然性能也会有所损失。

使用 GPU 计算

Mars tensor 也支持使用 GPU 计算。对于某些矩阵创建的接口,我们提供了 gpu=True 的选项,来指定分配到 GPU,后续这个矩阵上的计算将会在 GPU 上进行。

import mars.tensor as mta = mt.random.rand(1000, 2000, gpu=True)
(a + 1).sum(axis=1).execute()

这里 a 是分配在 GPU 上,因此后续的计算在 GPU 上进行。

稀疏矩阵

Mars tensor 支持创建稀疏矩阵,不过目前 Mars tensor 还只支持二维稀疏矩阵。比如,我们可以创建一个稀疏的单位矩阵,通过指定 sparse=True 即可。

import mars.tensor as mta = mt.eye(1000, sparse=True, gpu=True)
b = (a + 1).sum(axis=1)

这里看到,gpu 和 sparse 选项可以同时指定。

基于 Mars tensor 的上层建筑

这部分在 Mars 里尚未实现,这里提下我们希望在 Mars 上构建的各个组件。

DataFrame

相信有部分同学也知道 PyODPS DataFrame,这个库是我们之前的一个项目,它能让用户写出类似 pandas 类似的语法,让运算在 ODPS 上进行。但 PyODPS DataFrame 由于 ODPS 本身的限制,并不能完全实现 pandas 的全部功能(如 index 等),而且语法也有不同。

基于 Mars tensor,我们提供 100% 兼容 pandas 语法的 DataFrame。使用 mars DataFrame,不会受限于单个机器的内存。这个是我们下个版本的最主要工作之一。

机器学习

scikit-learn 的一些算法的输入就是二维的 numpy ndarray。我们也会在 Mars 上提供分布式的机器学习算法。我们大致有以下三条路:

  1. scikit-learn 有些算法支持 partial_fit,因此,我们直接在每个 worker 上调用 sklearn 的算法。
  2. 提供基于 Mars 的 joblib 后端。由于 sklearn 使用 joblib 来做并行,因此,我们可以通过实现 joblib 的 backend,来让 scikit-learn 直接跑在 Mars 的分布式环境。但是,这个方法的输入仍然是 numpy ndarray,因此,总的输入数据还是受限于内存。
  3. 在 Mars tensor 的基础上实现机器学习算法,这个方法需要的工作量是最高的,但是,好处是,这些算法就能利用 Mars tensor 的能力,比如 GPU 计算。以后,我们需要更多的同学来帮我们贡献代码,共建 Mars 生态。

细粒度的函数和类

Mars 的核心,其实是一个基于 Actor 的细粒度的调度引擎。因此,实际上,用户可以写一些并行的 Python 函数和类,来进行细粒度的控制。我们可能会提供以下几种接口。

函数

用户能写普通的 Python 函数,通过 mars.remote.spawn 来将函数调度到 Mars 上来分布式运行

import mars.remote as mrdef add(x, y):return x + ydata = [(1, 2),(3, 4)
]for item in data:mr.spawn(add, item[0], item[1])

利用 mr.spawn,用户能轻松构建分布式程序。在函数里,用户也可以使用 mr.spawn,这样,用户可以写出非常精细的分布式执行程序。

有时候,用户需要一些有状态的类,来进行更新状态等操作,这些类在 Mars 上被称为 RemoteClass。

import mars.remote as mrclass Counter(mr.RemoteClass):def __init__(self):self.value = 0def inc(self, n=1):self.value += ncounter = mr.spawn(Counter)
counter.inc()

目前,这些函数和类的部分尚未实现,只是在构想中,所以届时接口可能会做调整。

内部实现

这里,我简单介绍下 Mars tensor 的内部原理。

客户端

在客户端,我们不会做任何真正的运算操作,用户写下代码,我们只会在内存里用图记录用户的操作。

对于 Mars tensor 来说,我们有两个重要的概念,operand 和 tensor,分别如下图的蓝色圆和粉色方块所示。Operand 表示算子,tensor 表示生成的多维数组。

比如,下图,用户写下这些代码,我们会依次在图上生成对应的 operand 和 tensor。

2018-07-23 11_30_18.gif

当用户显式调用 execute 的时候,我们会将这个图提交到 Mars 的分布式执行环境。

我们客户端部分,并不会对语言有任何依赖,只需要有相同的 tensor graph 序列化,因此可以用任何语言实现。下个版本我们要不要提供 Java 版本的 Mars tensor,我们还要看是不是有用户需要。

分布式执行环境

Mars 本质上是一个对细粒度图的执行调度系统。

对于 Mars tensor 来说,我们接收到了客户端的 tensor 级别的图(粗粒度),我们要尝试将其转化成 chunk 级别的图(细粒度)。每个 chunk 以及其输入,在执行时,都应当能被内存放下。我们称这个过程叫做 tile。

mars_tiles.gif

在拿到细粒度的 chunk 级别的图后,我们会将这个图上的 Operand 分配到各个 worker 上去执行。

总结

Mars 在九月份的云栖大会发布,目前我们已经在 Github 开源:https://github.com/mars-project/mars 。我们项目完全以开源的方式运作,而不是简单把代码放出来。

期待有更多的同学能参与 Mars,共建 Mars。

努力了很久,我们不会甘于做一个平庸的项目,我们期待对世界做出一点微小的贡献——我们的征途是星辰大海!

 


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云计算管理工具:根植热土

戳蓝字“CSDN云计算”关注我们哦!作者 | 老姜出品 | CSDN云计算(ID:CSDNcloud)有机构曾预计2020年全球云计算市场空间,会增至1435亿美元,年复合增长率超过20%。相关资料显示:2018年,…

linux modbus工具,基于ARM-Linux的Modbus串口服务器设计

随着互联网的迅猛发展,在使用计算机进行网络互联的同时,各种家电设备、仪器仪表以及工业生产中的数据采集和控制设备也在逐步地走向网络化,以便共享网络资源。所以,在电子设备日趋网络化的今天,利用串口服务器来实现网…

win10右键没有新建选项,无法新建文件夹

按下winr打开运行窗口,输入 regedit回车,如下图所示: 定位到HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers,如下图所示 鼠标右键ContextMenuHandlers,新建-》项(K)-》…

Service Mesh 是新瓶装旧酒吗?

戳蓝字“CSDN云计算”关注我们哦!文章来源:阿里巴巴云原生,点击查看原文。Service Mesh 是新瓶装旧酒吗?新技术出现时所主张的价值一定会引发相应的探讨,Service Mesh 也不例外。以往,怀疑 Service Mesh 价…

Mars 算法实践——人脸识别

Mars 是一个基于矩阵的统一分布式计算框架,在之前的文章中已经介绍了 Mars 是什么, 以及 Mars 分布式执行 ,而且 Mars 已经在 GitHub 中开源。当你看完 Mars 的介绍可能会问它能做什么,这几乎取决于你想做什么,因为 Ma…

2018年自然语言处理最值得关注的研究、论文和代码

2018年对于自然语言处理(NPL)是很有意义的一年,见证了许多新的研究方向和尖端成果。Elvis Saravia 是计算语言学专家,也是2019 计算语言学会年度大会北美分部的项目委员之一。他总结了2018年 NLP 的重要进展,包括增强学…

【惊天】京东任命周伯文担任京东云与AI事业部负责人 全面负责AI、云计算、IoT三大技术领域!

昨日,京东集团爆出大消息,宣布设立京东云与AI事业部,整合原京东云、人工智能、IoT三大事业部的架构与职责,由京东集团副总裁周伯文博士担任负责人,直接向京东集团董事局主席兼CEO刘强东先生汇报。 对此周伯文博士表示…

如何基于OceanBase构建应用和数据库的异地多活

如何基于OceanBase构建应用和数据库的异地多活 前言 OceanBase是一个通用的分布式的关系型数据库,有很多独特的特点。比如数据库的多租户、高可用、极致弹性伸缩能力。如果把OceanBase当作单库使用,就没有把OceanBase的分布式优势发挥到极致。 本文主要…

Perhaps you are running on a JRE rather than a JDK?

解决方案 https://gblfy.blog.csdn.net/article/details/102893885

12亿行代码,阿里巴巴这一年的技术报告和梦想报告

78年前,图灵用代码编译出的情报破解系统,让二战至少提前2年结束,挽救了2000万人的生命;50年前,登月科学家敲下的一行关键代码,启动了阿波罗号的着陆,成就了人类的一大步;30年前&…

为什么鲜有炫富的程序员?看看中国各阶级收入统计表

网上那些口口声声随随便便就能年入百万的,听听就行。作为开发者,可以不参加双11,但是花钱最多的地方就是买电子产品和“买课”。他们的炫富就是:你根本不知道有多贵的机械键盘,为了赚钱和幸福,又买了多少大…

路径规划之 A* 算法

算法介绍 A*(念做:A Star)算法是一种很常用的路径查找和图形遍历算法。它有较好的性能和准确度。本文在讲解算法的同时也会提供Python语言的代码实现,并会借助matplotlib库动态的展示算法的运算过程。 A*算法最初发表于1968年&a…

王思聪究竟上了多少次热搜?

戳蓝字“CSDN云计算”关注我们哦!作者 | 朱小五责编 | 阿秃王思聪又又又上了微博热搜——然而这次却不是关于娱乐圈。最近几天,王思聪与他的“限消令”接连登上热搜榜,引发吃瓜群众们广泛热议。知乎的段子手们也纷纷发挥自己的想象力。小五本…

2018年,自然语言处理很全的应用与合作

2018年见证了 NLP 许多新的应用发展。Elvis Saravia 是计算语言学专家,也是2019 计算语言学会年度大会北美分部的项目委员之一。他在一份报告中总结出,NLP 不仅在聊天机器人和机器学习中有所突破,也在医疗健康、金融、法律和广告等行业中有崭…

如何把springboot项目部署到tomcat上

文章目录一、 企业发布场景1. 首次发布2. 非首次发布3. 全量发布和增量发布概念和区别二、springboot部署tomcat2.1. 创建Web初始化类2.2. 修改打包方式2.3. 项目发布目录2.4. 启动tomcat2.5. 浏览器验证一、 企业发布场景 1. 首次发布 项目上线第一次会采用全量发布 【编译】…

OceanBase迁移服务:向分布式架构升级的直接路径

2019年1月4日,OceanBase迁移服务解决方案在ATEC城市峰会中正式发布。蚂蚁金服资深技术专家师文汇和技术专家韩谷悦共同分享了OceanBase迁移服务的重要特性和业务实践。 蚂蚁数据库架构的三代升级史 在过去的十多年时间里,蚂蚁在整个基础数据库架构上一…

被嫌弃的互联网的 “一生”(上)

戳蓝字“CSDN云计算”关注我们哦!作者 | 小灰责编 | 阿秃在人类的历史长河中,我们这一代人是最幸运的一代,因为我们生活在一个智慧飞扬的时代。这个时代最伟大的发明是什么?或许每个人心中都有不同的答案。在小灰看来,…

Mars 是什么、能做什么、如何做的——记 Mars 在 PyCon China 2018 上的分享

最近,在 PyCon China 2018 的北京主会场、成都和杭州分会场都分享了我们最新的工作 Mars,基于矩阵的统一计算框架。本文会以文字的形式对 PyCon 中国上的分享再进行一次阐述。 听到 Mars,很多第一次听说的同学都会灵魂三问:Mars …

Failed to bind properties under mybatis-plus.configuration.result-maps[0]

Failed to bind properties under mybatis-plus.configuration.incomplete-result-maps[0].assistant.configuration.mapped-statements[0].parameter-map.parameter-mappings[0] to org.apache.ibatis.mapping.ParameterMapping解决方案: 鉴于Spring Boot 2.2.0 和…

为什么要学Python 编程?(附Python学习路线)

为何程序员多数会选择 Python 作为入门级语言?在此,估计不少开发者都会予以反驳,自己明明就没有选择 Python,不能一概而论。下面,我们就用数据一窥如今最流行的编程语言。今年的 3 月份,国外招聘网站 Hacke…