Ray:一个分布式应用框架

下一代AI应用程序将持续与环境交互并从这些交互中学习。 这些应用程序在性能和灵活性方面都提出了新的和苛刻的系统要求。 在本文中,我们考虑这些要求并提出Ray ----- 一个分布式系统来解决它们。Ray实现了一个统一的接口,可以表示任务并行和基于actor的计算,由单个动态执行引擎支持。 为了满足性能要求,Ray采用分布式调度程序和分布式容错存储来管理系统的控制状态。 在我们的实验中,我们展示了超过每秒180万个任务的规模,并且比几个现有的具有挑战性的强化学习应用程序的性能好。

1.介绍

在过去的20年里,许多研究组织一直在收集和利用不断增长的数据。这导致开发了大量用于分布式数据分析的框架,包括批处理、流处理和图处理系统。这些框架的成功使得研究组织能够将分析大型数据集作为其业务或科学战略的核心部分,并引领了大数据时代。

最近,以数据为中心的应用范围已扩大到包括更复杂的人工智能(AI)或机器学习(ML)技术。典型的例子是监督学习,其中数据点伴随着标签,而将数据点映射到标签的主要技术是由深度神经网络提供的。这些深度神经网络的复杂性引发了另一波框架研究热潮,这些框架研究的重点是深度神经网络的训练及其在预测中的应用。这些框架通常利用专门的硬件(例如gpu和TPUs),目的是减少批处理设置中的训练时间。例如TensorFlow、MXNet和PyTorch。

然而,人工智能的前景远比经典的监督学习要广阔。新兴的人工智能应用程序必须越来越多地在动态环境中运行,对环境变化作出反应,并采取一系列行动来实现长期目标。他们不仅要利用收集到的数据,而且要探索可能的行动空间。这些更广泛的需求自然被构建在强化学习(RL)的范式中。RL处理基于延迟和有限反馈的学习在不确定环境中持续运行。基于RL的系统已经取得了显著的成果,如谷歌的AlphaGo击败了人类世界冠军,并开始进入对话系统、无人机和机器人操作。

RL应用程序的核心目标是学习策略----从环境状态映射到随着时间的推移产生有效性能的操作选择,例如,赢得游戏或驾驶无人机。在大型应用程序中寻找有效的策略需要三个主要功能。首先,RL方法通常依赖于模拟来评估策略。模拟可以探索许多不同的动作序列选择,并了解这些选择的长期后果。其次,与有监督学习算法一样,RL算法需要执行分布式训练,以基于模拟生成的数据或与物理环境的交互来改进策略。第三,策略是为控制问题提供解决方案,因此在交互式闭环和开环控制场景中为策略服务是必要的。

这些特性驱动了新的系统需求:RL必须支持细粒度计算的系统(例如,渲染行为与现实世界交互时以毫秒级为单位,并进行大量的模拟),必须支持异构性在时间(例如,模拟可能需要毫秒或小时)和资源使用(如训练gpu和cpu仿真),必须支持动态执行,模拟的结果或与环境的相互作用可以改变未来的计算。因此,我们需要一个动态计算框架,以毫秒级的延迟每秒处理数百万个异构任务。

为大数据工作负载或有监督的学习工作负载开发的现有框架无法满足这些新的RL需求。批量同步并行系统(如mapreduce、apache spark和dryad不支持细粒度模拟或策略服务。任务并行系统,如ciel和dask几乎不支持分布式培训和服务。同样适用于流媒体系统,如Naiad和Storm。像TensorFlow和MXnet这样的分布式深度学习框架自然不支持模拟和服务。最后,诸如TensorFlowServing和Clipper等模型服务系统既不支持训练也不支持模拟。

虽然原则上可以通过将几个现有的系统(例如用于分布式培训的Horovod、用于服务的Clipper和用于模拟的CIEL)拼接在一起来开发端到端解决方案,但实际上由于应用程序中这些组件的紧密耦合,这种方法是站不住脚的。因此,今天的研究人员和实践者为专门的RL应用程序构建一次性的系统。这种方法通过将调度、容错和数据移动等标准系统挑战推到每个应用程序上,给分布式应用程序的开发带来了巨大的系统工程负担。

为了满足性能需求,Ray分布了两个通常集中在现有框架中的组件:(1)任务调度程序和(2)元数据存储,元数据存储维护计算沿袭(lineage)和数据对象目录。这允许Ray以毫秒级的延迟每秒调度数百万个任务。此外,Ray还为任务和参与者提供了基于沿袭(lineage)的容错,并为元数据存储提供了基于复制的容错。

在这里插入图片描述
虽然Ray支持在RL应用程序环境中提供服务、训练和模拟,但这并不意味着它应该被看作是在其他环境中为这些工作负载提供解决方案的系统的替代品。特别是,Ray的目标不是替代Clipper和TensorFlow这样的服务系统,因为这些系统解决了部署模型时面临的更广泛的挑战,包括模型管理、测试和模型组合。同样,尽管Ray具有灵活性,但它并不能替代一般的数据并行框架(如Spark),因为它目前缺乏这些框架提供的丰富功能和api(例如,straggler mitigation、query optimization)。

我们做出以下贡献:

  • 我们设计并构建了一个分布式框架,将训练、模拟和服务于新兴RL应用程序的必要组件结合起来。

  • 为了支持这些工作负载,我们在动态任务执行引擎之上统一了参与者(actor)和任务(task)并行抽象。

  • 为了实现可扩展性和容错性,我们提出了一种系统设计原则,其中控制状态存储在分片元数据存储中,而所有其他系统组件都是无状态的。

  • 为了实现可扩展性,我们提出了自下而上的分布式调度策略。

2.动机和要求

我们首先考虑RL系统的基本组件,并充实Ray的关键需求。如图1所示,在RL设置中,代理与环境反复交互。代理的目标是学习一种使奖励最大化的策略。策略是从环境状态到操作选择的映射。环境、代理、状态、操作和奖励的精确定义是特定于应用程序的。

在这里插入图片描述
图二 典型的强化学习的学习策略伪代码

为了学习策略,代理(agent)通常采用两个步骤:(1)策略评估和(2)策略改进。为了评估策略,代理与环境交互(例如,与环境的模拟)来生成轨迹,其中一个轨迹由当前策略生成的一系列(状态、奖励)元组组成。然后,代理利用这些轨迹来改进策略;即,以使奖励最大化的梯度方向更新策略。图2显示了代理用于学习策略的伪代码示例。这个伪代码通过调用rollout (environment, policy)来生成轨迹来评估策略。train policy()之后使用这些轨迹通过 policy. update (trajectories)改新当前的策略。这个过程重复进行,直到策略收敛为止。

因此,RL应用程序的框架必须为训练、服务和模拟提供有效的支持(图1)。接下来,我们简要描述这些工作负载。

训练–通常在分布式设置中运行随机梯度下降(SGD),以更新策略。分布式SGD通常依赖于allreduce聚合步骤或参数服务器

服务使用经过训练的策略根据环境的当前状态呈现操作。服务系统旨在最小化延迟,并最大化每秒的决策数量。为了进行扩展,负载通常在为策略提供服务的多个节点之间进行平衡。

最后,大多数现有的RL应用程序使用模拟来评估策略,当前的RL算法的采样效率不足以完全依赖于与物理世界交互获得的数据。这些模拟在复杂性上差别很大,他们可能需要几毫秒(例如,模拟象棋游戏中的移动)到几分钟(例如,模拟自动驾驶汽车的真实环境)。

与监督学习不同,在监督学习中,训练和服务可以由不同的系统单独处理,在RL中,所有三个工作负载都紧密耦合在一个应用程序中,它们之间有严格的延迟要求。目前,没有框架支持工作负载的这种耦合。理论上,可以将多个专门的框架组合在一起以提供总体功能,但在实践中,在RL环境中,所产生的系统间数据移动和延迟是禁止的。因此,研究人员和实践者一直在构建自己的一次性系统。

这种情况需要为RL开发新的分布式框架,以有效地支持训练、服务和模拟。特别是,这种框架应满足以下要求:

细粒度、异构计算。计算的持续时间可以从毫秒(例如,采样行动)到小时(例如,训练一个复杂的策略)。此外,训练通常需要异构硬件(如CPU、GPU或TPU)。

灵活的计算模型。RL应用程序需要无状态和有状态计算。无状态计算可以在系统中的任何节点上执行,这使得在需要时很容易实现负载平衡和计算到数据的移动。因此,无状态计算非常适合于细粒度模拟和数据处理,例如从图像或视频中提取特征。相反,状态计算非常适合于实现参数服务器、对支持GPU的数据执行重复计算或运行不公开其状态的第三方模拟器。

动态执行。RL应用程序的几个组件需要动态执行,因为计算完成的顺序并不总是预先知道(例如,模拟完成的顺序),计算结果可以决定未来的计算(例如,模拟结果将决定我们是否需要执行更多的模拟)。

通过上边的分析得出两个结论。首先,为了在大型集群中实现高利用率,这种框架必须每秒处理数百万个任务;其次,这种框架不必从头开始实现深层神经网络或复杂模拟器。相反,它应该能够与现有模拟器和深度学习框架无缝集成。

名称 描述
futures = f.remote(args) 远程执行函数f.remote()可以接受对象或期货作为输入,并返回一个或多个期货。这是非阻塞的
objects = ray.get(futures) 返回与一个或多个期货关联的值。这是阻塞。
ready futures = ray.wait(futures,k,timeout) 一旦k完成或超时,返回相应任务已完成的期货。
actor = Class.remote(args)或futures = actor.method.remote(args) 将class类实例化为远程参与者,并返回它的句柄。调用远程参与者上的方法并返回一个或多个期货。两者都是阻塞。

表1: Ray API
注:个人更愿意把futures翻译为对象id。

3.规划计算模型

Ray实现了一个动态任务图计算模型,也就是说,它将应用程序建模为在执行过程中演化的依赖任务图。在这个模型的基础上,Ray提供了一个参与者和一个任务并行编程抽象。这种统一将ray与相关系统(如ciel,它只提供任务并行抽象)以及Orleans或Akka区分开来,后者主要提供参与者抽象。

3.1 编程模型

任务。任务表示在无状态工作机上执行远程函数。当调用远程函数时,将立即返回表示任务结果的期货(ID)。可以使用 ray.get() 检索,并将其作为参数传递到其他远程函数,而无需等待其结果。这允许用户在捕获数据依赖项时表示并行性。表1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值