Если у меня есть функция, Ray может автоматически балансировать нагрузку, поэтому все мои работники заняты.
@ray.remote
def f(task):
context = very_long_init_fun()
return work(task,context=context) # this runs sometimes fast, sometimes slow
results = ray.get([f.remote(task) for task in tasks])
Если я использую актеры, я могу сохранить длительное время инициализации или кэшировать значениямежду задачами, но я теряю способность автоматически балансировать нагрузку между моими работниками. Если некоторые работники заканчивают работу раньше времени, они просто сидят и ничего не делают, хотя еще остается много работы.
@ray.remote
class StatefulWorker(object):
def __init__(self):
self.context = very_long_init_fun()
def work(self,task):
return work(task,context = self.context) # this runs sometimes fast, sometimes slow
actors = [StatefulWorker.remote() for _ in range(num_workers)]
results = []
# naive load balancing: evenly distribute the tasks between the workers
for task_i,task in enumerate(tasks):
results.append(actors[task_i % num_workers].work.remote(task))
results = ray.get(results)
Вопрос : Есть ли хороший способ получитьрабочие состояния и балансировка нагрузки одновременно?