模式:使用Supervisor Actor管理Actor树#
Actor监督是一种模式,其中一个Supervisor Actor管理一组Worker Actor。Supervisor将任务委托给下属,并处理它们的失败。这种模式简化了Driver,因为它只管理少数Supervisor,并且不直接处理Worker Actor的失败。此外,多个Supervisor可以并行工作,以并行化更多的工作。
Actor树#
注意
如果Supervisor(或Driver)死亡,Worker Actor将因Actor的引用计数而自动终止。
Actor可以嵌套到多个级别,形成一个树状结构。
用例#
您想要进行数据并行训练,并同时用不同的超参数并行训练相同的模型。对于每个超参数,您可以启动一个Supervisor Actor来执行编排,它将创建Worker Actor来为每个数据分片执行实际的训练。
注意
对于数据并行训练和超参数调优,推荐使用Ray Train(DataParallelTrainer和Ray 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]