Skip to content

Actor 基础:定义与启动

在 Monarch 中,Actor 是构建分布式应用的基本积木。它是一个运行在独立进程(甚至不同物理主机)中的 Python 对象。

1. 定义 Actor

定义 Actor 非常简单,只需继承 monarch.actor.Actor 类,并使用 @endpoint 装饰器标记那些允许远程调用的方法。

python
from monarch.actor import Actor, endpoint, this_host

class Worker(Actor):
    def __init__(self, worker_id: int):
        # 初始化方法在 Actor 进程启动时执行
        self.worker_id = worker_id
        print(f"Worker {worker_id} is ready.")

    @endpoint
    def compute(self, x: int) -> int:
        # 这个方法可以被控制器远程调用
        return x * x + self.worker_id

2. 启动 (Spawn) Actor

要运行 Actor,我们需要先申请计算资源(进程),然后将 Actor "孵化"(Spawn)到这些资源上。

在本地模拟

对于初学者,我们可以在单台机器上模拟分布式环境。

python
def main():
    # 1. 获取当前主机句柄
    host = this_host()
    
    # 2. 申请资源:启动 4 个进程(模拟 4 个设备)
    # 这里的 "gpus" 是一个逻辑维度名称,也可以是 "workers" 等
    procs = host.spawn_procs({"gpus": 4})
    
    # 3. 在这些进程上启动 Actor
    # "my_workers" 是这组 Actor 的名称
    workers = procs.spawn("my_workers", Worker, worker_id=0) 
    # 注意:为了简单演示,这里传给所有 Actor 的 worker_id 都是 0
    # 在实际场景中,通常会根据 rank 或枚举来分配不同的 ID
    
    print("Actors spawned successfully!")

if __name__ == "__main__":
    main()

关键点

  • Actor 是有状态的self.worker_id 会保存在远程进程的内存中。
  • @endpoint:只有被标记的方法才能远程调用,未标记的方法只能在 Actor 内部调用。

接下来,我们将学习如何调用这些 Actor 的方法并获取结果。

Monarch中文教程