模式:使用 supervisor actor 管理 actor 树#

Actor 监督是一种模式,其中一个监督 actor 管理一组工作 actor。监督者将任务委托给下属并处理它们的故障。这种模式简化了驱动程序,因为它只管理少量监督者,而无需直接处理工作 actor 的故障。此外,多个监督者可以并行工作以实现更多工作并行化。

../../_images/tree-of-actors.svg

Actor 树#

注意

  • 如果监督者(或驱动程序)死亡,工作 actor 会由于 actor 引用计数而自动终止。

  • Actor 可以嵌套到多层以形成树形结构。

示例用例#

您想进行数据并行训练,并并行地使用不同的超参数训练同一个模型。对于每个超参数,您可以启动一个监督 actor 来进行编排,它将创建工作 actor 来执行每个数据分片的实际训练。

注意

对于数据并行训练和超参数调优,建议使用 Ray TrainDataParallelTrainerRay Tune 的 Tuner),它在底层应用了此模式。

代码示例#

import ray


@ray.remote(num_cpus=1)
class Trainer:
    def __init__(self, hyperparameter, data):
        self.hyperparameter = hyperparameter
        self.data = data

    # Train the model on the given training data shard.
    def fit(self):
        return self.data * self.hyperparameter


@ray.remote(num_cpus=1)
class Supervisor:
    def __init__(self, hyperparameter, data):
        self.trainers = [Trainer.remote(hyperparameter, d) for d in data]

    def fit(self):
        # Train with different data shard in parallel.
        return ray.get([trainer.fit.remote() for trainer in self.trainers])


data = [1, 2, 3]
supervisor1 = Supervisor.remote(1, data)
supervisor2 = Supervisor.remote(2, data)
# Train with different hyperparameters in parallel.
model1 = supervisor1.fit.remote()
model2 = supervisor2.fit.remote()
assert ray.get(model1) == [1, 2, 3]
assert ray.get(model2) == [2, 4, 6]