机器学习框架Ray——Actor模型

本文详细介绍了Ray机器学习框架中的Actor模型,包括Actor的定义、创建与使用,以及如何在Actor中封装状态并利用GPU资源。此外,还讨论了Actor句柄的传递和当前存在的限制,如Actor生命周期管理和返回句柄的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Actors

Ray中的远程函数被认为是功能性强和副作用低的框架。 仅限于远程函数的情况下,可以为我们提供分布式函数编程,这对于许多使用情况非常有用,但在实践中会受到一些限制。

Ray通过actor扩展了数据流模型。 一个actor本质上是一个有状态的worker(或service)。 当一个新的actor被实例化时,一个新的worker被创建,并且该actor的方法被安排在该特定的worker上,并且可以访问和改变该worker的状态。

假设我们已经开始了Ray。

import ray
ray.init()

 

2. 定义和创建一个actor

考虑下面的简单例子。装饰器 ray.remote表明类Counter实例化后为actor。

@ray.remote
class Counter(object):
    def __init__(self):
        self.value = 0

    def increment(self):
        self.value += 1
        return self.value

为了真正创建一个actor,我们通过调用Counter.remote()来实例化该类。

a1 = Counter.remote()
a2 = Counter.remote()

当一个actor被实例化,下面的情况发生

  1. 选择集群中的一个节点,并在该节点上(由该节点上的本地调度程序)创建一个worker,以便运行在该actor上调用的方法。
  2. 在该worker上创建一个Counter对象,并运行Counter构造函数。

 

 

3. 使用actor

我们可以通过调用actor的方法来调度它的任务。

a1.increment.remote()  # ray.get returns 1
a2.increment.remote()  # ray.get returns 1

当a1.increment.remote()被调用,下面的情况发生。

 

  1. 任务被创建。
  2. 该任务被直接分配给负责该actor的本地调度程序(由驱动程序的本地调度器控制)。 因此,此调度过程绕过全局调度程序。
  3. 一个对象ID被返回。

然后,我们可以调用ray.get根据对象ID来获取实际值。

同样,对a2.increment.remote()的调用将产生一个任务,该任务被调度到第二个Counter actor上。 由于这两个任务在不同的actor上运行,它们可以并行执行(请注意,只有该actor上的方法才被调度分配到actor worker上,常规的远程函数不会)。
 

另一方面,在同一个Counter actor上调用的方法按照它们被调用的顺序依次执行。 因此它们可以相互共享状态,如下所示。


                
### Ray 分布式计算框架的架构详解 #### 架构核心组件 Ray 的架构设计旨在简化分布式系统的开发与部署,其核心组件包括任务调度器、对象存储和全局控制状态服务。通过这些组件之间的紧密协作,实现了高效的资源管理和任务分发。 - **任务调度器**:负责分配工作负载到集群中的各个节点上执行。它会根据当前可用资源情况动态调整任务优先级,并确保不同类型的作业能够公平竞争CPU/GPU等硬件资源[^1]。 - **对象存储**:用于缓存中间结果和其他共享数据片段。这不仅减少了网络传输开销,还允许跨进程间高效传递大型数据集或模型参数副本[^2]。 - **全局控制器(Global Control State Service)**:维护整个集群的状态信息,如注册表记录所有活动的工作节点及其属性描述符;同时提供API接口供外部应用查询最新的拓扑变化事件流[^3]。 #### 编程抽象层 为了降低开发者的学习曲线和技术门槛,Ray 提出了两种主要编程抽象——远程函数(Remote Functions) 和Actor模式: - **Remote Function**:使得普通的Python函数可以通过简单的装饰器转变为可以在任意位置异步调用的任务单元。这种方式极大地提高了代码重用性和灵活性,同时也保留了原有同步风格不变[^4]。 ```python import ray @ray.remote def f(x): return x * x futures = [f.remote(i) for i in range(4)] print(ray.get(futures)) # 输出: [0, 1, 4, 9] ``` - **Actors**:支持创建持久性的远程实体实例,在多个请求之间保持内部状态一致性。这对于实现长时间运行的服务端逻辑非常有用,比如在线预测服务器或是持续监控的数据源适配器。 ```python @ray.remote class Counter(object): def __init__(self): self.value = 0 def increment(self): self.value += 1 return self.value counter = Counter.remote() future_increments = [counter.increment.remote() for _ in range(5)] print(ray.get(future_increments)) ``` #### 应用场景扩展性 得益于灵活的设计理念以及丰富的生态系统集成能力,Ray 已经被广泛应用于多种领域内解决实际问题,特别是在大规模机器学习训练方面表现突出。例如,在处理海量图像识别任务时,可以利用该平台天然具备的良好并行特性来加速收敛速度,进而显著减少整体耗时成本。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值