架构#

主要架构如下所示。

../_images/dev-intro.png

本开发指南将主要关注缩进点线部分。

Mars 实现了一个轻量级的演员框架,称为 oscar,在此基础上,分布式执行层被解耦为几个服务,包括:

  1. 会话服务。管理会话。每个会话都是独立的,一个会话中的数据不能被另一个会话看到。

  2. 集群服务. 监控整个集群。

  3. 元服务。存储Mars对象的元数据,如张量的形状等。

  4. 存储服务。数据可以放入和从存储服务中获取,数据溢出和工作者之间的数据传输等功能也集成在存储服务中。

  5. 任务服务。当用户调用 .execute() 方法时,任务将被提交到此服务。任务服务将尝试将高层次的粗粒度计算图细分为低层次的细粒度图,其中图中的每个节点都是一个子任务。这个子任务图将被交给调度服务。

  6. 调度服务。接受一个子任务图,并根据多种高度优化的调度策略,将子任务调度到工作者执行。

  7. 子任务服务. 接受一个子任务,执行它们,然后将数据存入存储,记录元数据在元数据服务中,向任务服务报告结果。

  8. 生命周期服务。每个Mars对象以及块在生命周期服务中都有一个引用计数,当引用计数达到0时,通知存储服务移除数据,并告诉元数据服务移除元数据。

代码结构#

  • 核心: 内部数据结构,如可铺处理单元、块、操作数、图。

  • lib: 库,例如文件系统,稀疏。

  • 奥斯卡:演员框架。

  • 部署/oscar: 本地部署。

  • 部署/熊猫:在 Kubernetes 上部署。

  • deploy/yarn: 在yarn上部署。

  • 服务:所有服务。

  • 优化:高级和低级优化,例如融合。

  • 序列化:基于pickle5协议的序列化。

  • 存储:本地存储后端,例如 plasma、shared_memory、ray。

任务巡览#

../_images/tour-of-task.gif

一个任务由以下步骤组成:

  1. .execute()在客户端被调用时,一个具有可平铺图的任务将被提交到任务服务。

  2. 任务服务将首先优化可切片图,将应用一些规则,例如列裁剪。然后,可切片图将被切割成块图,块图也将被优化,例如融合。融合块图上的每个节点将被组织为一个子任务,子任务图将交给调度服务。

  3. 调度服务根据一些高度优化的调度策略(例如深度优先、局部感知)安排子任务。子任务将被提交给工作节点上的子任务服务以进行执行。

  4. 一个任务将在所有子任务完成后才会结束。