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_id2. 启动 (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 的方法并获取结果。
