架构#

主要架构如图所示。

../_images/dev-intro.png

本开发指引重心在图中红色点线包含的部分。

Mars 实现了一个轻量 actor 框架,叫 oscar,在其之上,分布式的执行层被分解成了几个服务:

  1. Session 服务。管理 session。每个 session 是独立的,一个 session 看不到另一个 session 中的数据。

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

  3. Meta 服务。存储 Mars 对象的 meta 信息,比如 tensor 的形状等等。

  4. Storage 服务。数据能够从 storage 服务中放入和取出,类似数据 spill 以及 worker 间数据传输的功能也包含在这个服务中。

  5. Task 服务。当用户调用 .execute(),一个 task 会被提交到这个服务。Task 服务会尝试把一个高级别粗粒度的计算图 tile 成低级别细粒度的计算图,这个图上的每个节点就是一个 subtask。Subtask 图会被交给 scheduling服务调度。

  6. Scheduling 服务。接受一个 subtask 图,使用很多优化的调度策略来调度 subtask 到 worker 上来执行。

  7. Subtask 服务。接受一个 subtask,执行,把数据放入存储记录元数据信息,向 task 服务汇报结果。

  8. Lifecycle 服务。每个 Mars 对象以及 chunk 在 lifecycle 服务中更有一个引用计数,当引用计数为0的时候,通知 storage 服务删除数据,且通知 meta 服务删除元数据。

代码结构#

  • core:包含内部数据结构,包括 tileable、chunk、operand 以及计算图。

  • lib:库,比如 filesystem、sparse。

  • oscar:actor 框架。

  • deploy/oscar:本地部署。

  • deploy/kubernetes:Kubernetes 上部署

  • deploy/yarn:Yarn 上部署。

  • services:所有的服务。

  • optimization:高级别和低级别优化,比如 fusion。

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

  • storage:本地存储,比如 plasma、shared_memory、ray。

Task 之旅#

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

一个 task 的执行包含几个步骤:

  1. When .execute() called on client side, a task that has a tileable graph will be submitted to task service.

  2. Task 服务会首先优化 tileable 图,一系列的规则会被引用,比如列剪裁。Tileable 图会被 tile 成 chunk 图,chunk 图也会被优化,比如 fusion。融合的图上的一个节点会变成一个 subtask,subtask 会交给 schduling 服务运行。

  3. Scheduling 服务根据一系列优化过的策略来调度,比如深度优先、

  4. 一个 task 会等到所有 subtask 执行完成结束。