Skip to content
Deepcity's Blog
Go back

OSDI18-A Distributed Framework for Emerging AI Applications

在 GitHub 上编辑

Ray: A Distributed Framework for Emerging AI Applications

Read Motivate

ServerlessLLM: Low-Latency Serverless Inference for Large Language Models作为对比标准引入。[Ray的官方Github仓库](ray-project/ray: Ray is an AI compute engine. Ray consists of a core distributed runtime and a set of AI Libraries for accelerating ML workloads.)Star数已有38k(截至2025年9月)。由UC BerkeleyRISELab发布,国内主要是蚂蚁在用。

Introdaction

Ray是一个分布式计算框架系统,为现代AI应用而设计。在论文中Ray的设计的经典应用场景为强化学习(RL)的三个过程SimulationTrainServing而设计。时至今日,Ray适用于任何分布式计算的任务包括分布式训练,目前支持库包括超参数调优Ray tune,梯度下降Ray SGD,推理服务RaySERVE,分布式数据Dataset以及分布式增强学习RLlib,详情如下图。

Third party

在Ray论文的slide中,Overview这么介绍Ray面对的需求。

Overview

Motivation

文章首先从过去的两个十年(18年)讲起,谈到许多组织对大量数据的收集和利用,导致了大量批处理,流处理,图像处理的框架开发。对大量数据级的分析是这些框架的核心部分,引领了“大数据”时代的起始。

而监督学习作为当下最主流的ML范式之一,在监督学习中,每一条数据都对应着一个相对应的标签,监督学习的目的是构建一个能够将数据映射为标签的模型,其中最主流的模型之一是深度神经网络,而深度神经网络的复杂性(不可解释,复杂的大结构)导致为其服务的框架(TensorFlow,MXNet,pyTorch等)都专注于利用硬件(GPU\TPU\NPU)加速神经网络的运行。然而AI的前景要远比监督学习任务宽泛。

Ray的设计者认为,下一代的AI应用将与环境存在持续、连续的交互,并从交互的反馈中学习,这naturally framed into Reinforcement Lreanings——在一个不确定的环境中,根据有限的,非严格实时的信息调整policy,并达成目标。这要求达成三个目标:

  1. Simulation:通过给定(随机)的policy在环境中的模拟评估一个策略并给出相应的反馈,使智能体能够了解到选择(action)对任务的短长期影响
  2. Train:分布式训练。这一点与传统的监督学习相似。策略的改进通常是由分布式的GPU集群进行的深度神经网络的方法进行的。其中使用的数据就来自SImulation。
  3. Serving:通过将policy作为服务部署,应用于交互式的闭环或开环场景上。

Example of an RL system

为满足RL、超参数微调,分布式训练的需求,设计框架必须满足如下图所示的key features

backgroud

现有的框架,例如MapReduce、Apache Spark、Dryad批处理同步并行系统用于分布式训练并不支持细粒度的模拟或policy部署。CIEL、Dask任务并行框架缺少了部分对分布式训练和服务的支持。而流系统也是一样。而分布式的深度学习框架则不原生支持模拟和服务。最后模型服务例如TensorFLow Serving和Cliper不支持训练和模拟

Bulk-synchronous parallel systems such as MapReduce [20], Apache Spark [64], and Dryad [28] do not support fine-grained simulation or policy serving. Taskparallel systems such as CIEL [40] and Dask [48] provide little support for distributed training and serving. The same is true for streaming systems such as Naiad [39] and Storm [31]. Distributed deep-learning frameworks such as TensorFlow [7] and MXNet [18] do not naturally support simulation and serving. Finally, model-serving systems such as TensorFlow Serving [6] and Clipper [19] support neither training nor simulation.

Existing Solutions

虽然通过缝合现有的系统可以开发端到端的解决方案或者像AlphaGo一样开发单独的系统。但这样的方案带来了巨大的系统工程的负担。

Horovod [53] for distributed training, Clipper [19] for serving, and CIEL [40] for simulation

因此需要一个分布式计算框架,用于支持异构的计算资源,不同层级的执行任务,动态的计算图,并在毫秒级的延迟下分布式处理百万级别的任务数量。

Problem Statement

Architecture

Ray在如今的简易架构图如下,如今的Ray由 Ray Core 和 Ray AI Libraries 两部分组成,拥有丰富的生态系统。

Arch25

map-of-ray

RayCore

Ray的系统架构分为两个部分Application LayerSystem Layer

其中Application Layer包含三种不同进程 Driver, Worker , Actor。分别用于执行用户程序,接受源自driver或其他worker的任务的无状态进程,由Worker或Driveer现实实例化连续执行函数的有状态进程。其中worker是自动创建并且被系统层指派任务,并且当一个远端函数被声明时,该函数会将被自动发布给所有worker,worker顺序执行任务,并不维护本地状态。Actor执行时进调用其公开的函数,每个函数的执行都取决于前一个函数的返回状态。

  • Driver: A process executing the user program.
  • Worker: A stateless process that executes tasks (remote functions) invoked by a driver or another worker. Workers are started automatically and assigned tasks by the system layer. When a remote function is declared, the function is automatically published to all workers. A worker executes tasks serially, with no local state maintained across tasks.
  • Actor: A stateful process that executes, when invoked, only the methods it exposes. Unlike a worker, an actor is explicitly instantiated by a worker or a driver. Like workers, actors execute methods serially, except that each method depends on the state resulting from the previous method execution.

System Layer 同样包含三种不同的设计。Global Control Store (GCS)Bottom-up distributed schedulerIn-memory distributed object store - Apache Arrow。GCS是一个key-value store的pubsub全局控制器,存储所有Object的元数据位置同时采用分片实现规模化,并用分片链复制提供故障容忍。Bottom-up distributed scheduler是一种调度设计,它通过设置多个Global Scheduler与Local Scheduler(单node单个)消除了调度器在高并发低延迟的分布式任务中的瓶颈。In-memory distributed object store - Apache Arrow是一种以Apache Arrow数据格式存储的零拷贝数据共享机制,用于在统一节点的任务之间进行数据交换。

The global control store (GCS) maintains the entire control state of the system, and it is a unique feature of our design. At its core, GCS is a key-value store with pubsub functionality. We use sharding to achieve scale, and per-shard chain replication [61] to provide fault tolerance. The primary reason for the GCS and its design is to maintain fault tolerance and low latency for a system that can dynamically spawn millions of tasks per second.

CoreArch

Application Layer

System Layer

Putting Everything Together

这里从进程的角度分析

Overview

图4描述了任务的定义、提交和执行的过程

  1. 【定义远程函数】位于N1N_1的用户程序中定义的远程函数add被装载到GCS的函数表中,位于N2N_2的工作器从GCS中读取并装载远程函数add
  2. 【提交任务】位于N1N_1的用户程序向本地调度器提交add(a, b)的任务
  3. 【提交任务到全局】本地调度器将任务提交至全局调度器
  4. 【检查对象表】全局调度器从GCS中找到add任务所需的实参a, b,发现a在N1N_1上,b在N2N_2上(a, b 已在用户程序中事先定义)
  5. 【执行全局调度】由上一步可知,任务的输入平均地分布在两个节点,因此全局调度器随机选择一个节点进行调度,此处选择了N2N_2
  6. 【检查任务输入】 的局部调度器检查任务所需的对象是否都在N2N_2的本地对象存储器中
  7. 【查询缺失输入】 的局部调度器发现任务所需的a不在N2N_2中,在GCS中查找后发现a在N1N_1
  8. 【对象复制】将a从N1N_1复制到N2N_2
  9. 【执行局部调度】在 的工作器上执行add(a, b)的任务
  10. 【访问对象存储器】add(a, b)访问局部对象存储器中相应的对象

图5描述了获取任务执行结果的的过程

  1. 【提交get请求】向本地调度器提交ray.get的请求,期望获取add任务执行的返回值
  2. 【注册回调函数】N1N_1本地没有存储返回值,所以根据返回值对象的引用id_c在GCS的对象表中查询该对象位于哪个节点,假设此时任务没有执行完成,那么对象表中找不到id_c,因此N1N_1的对象存储器会注册一个回调函数,当GCS对象表中出现id_c时触发该回调,将c从对应的节点复制到N1N_1
  3. 【任务执行完毕】N2N_2上的add任务执行完成,返回值c被存储到N2N_2的对象存储器中
  4. 【将对象同步到GCS】N2N_2将c及其引用id_c存入GCS的对象表中
  5. 【触发回调函数】2中注册的回调函数被触发
  6. 【执行回调函数】将c从N2N_2复制到N1N_1
  7. 【返回用户程序】将c返回给用户程序,任务结束

Ray Update Log

2016 年,UC Berkeley 的 RISELab 发布了一个新的分布式计算框架 Ray。

2017 年,发布 Ray 相关论文之后,受到业内的广泛关注,国内主要是蚂蚁集团采用并贡献了 Ray。

2020 年,Ray 发布了 1.0 版本,引入 Placement Group 特性,增加了用户自定义任务编排的灵活性,为后续的 Ray AI Libraries 和 vLLM 等项目提供了基础支持。

2021 年,Ray 发布了 1.5 版本,发布 Ray Data Alpha,弥补了 Ray 在 AI 数据处理和离线推理领域的空白,后续在 AI 数据处理方面得到广泛应用。

2022 年,Ray 发布了 2.0 版本,引入 Ray AIR(Ray AI Runtime)概念,聚焦 AI 生态,使用户能够基于此快速构建 AI 基建。

2023 年,Ray 发布了 2.9 版本,引入 Streaming Generator,原生支持流式推理能力,更好地适配大模型场景。大模型推理引擎 vLLM 基于 Ray Core 及 Ray Serve 构建分布式推理能力,进一步丰富了 Ray 的 AI 生态。

2024 年,Ray 发布了 Ray 2.32 版本,引入 Ray DAG,更好地支持 AI 场景下异构设备间的通信,持续推动 Ray 在分布式计算尤其是 AI 领域的应用和发展。

目前 Ray 最新的版本是 2.42.0。

REF

  1. Ray: A Distributed Framework for Emerging AI Applications | USENIX
  2. cl.cam.ac.uk/~ey204/teaching/ACS/R244_2018_2019/presentation/S2/RAY_Devin.pdf
  3. Ray分布式计算框架详解 - 知乎
  4. 分布式计算框架 Ray – 陈少文的网站
  5. Ray 分布式计算 | 从入门到实践 - 知乎
  6. 机器学习分布式框架Ray-阿里云开发者社区

在 GitHub 上编辑
Share this post on:

下一篇
OSDI24-ServerlessLLM: Low-Latency Serverless Inference for Large Language Models