Я хочу распараллелить функцию, запущенную с использованием ray на python. Как я понимаю, Рэй может «изящно справляться со сбоями машин».
Таким образом, чтобы проверить, могу ли я использовать ray в своем коде с использованием кластера, я попытался распараллелить функцию на нескольких узлах и остановить один из узлов во время работы. Это приводит к очень медленному бегу по сравнению с обычным случаем, когда в середине нет остановки носа.
То есть я хочу иметь возможность запускать функцию в пуле рабочих и отсоединять \ подключать узел, в то время как запуск в надежде, что это может обработать луч.
При тестировании с помощью простого цикла это приводит к тому, что цикл становится действительно очень медленным (но не происходит сбой).
Я начал с записи на главном узле:
$ ray start --head --redis-port=6379
Затем на трех других узлах я подключаюсь к кластеру:
$ ray start --redis-address=IP:PORT
пока все хорошо.
Теперь, если я вхожу в python с одним из узлов и запускаю следующий код, все работает как положено:
import ray
import time
import tqdm
ray.init(redis_address="IP:PORT")
@ray.remote
def f(i):
time.sleep(1.0)
return [ray.services.get_node_ip_address(), i]
res = []
workers = [f.remote(i) for i in range(1000)]
for w in tqdm(workers):
res.append(ray.get(w))
print set([r[0] for r in res])
Этот код будет запущен на моем кластере примерно через 10 секунд.
Теперь, если я бегу
$ ray stop
на одном из кластеров, пока цикл работает, цикл займет ~ 1 час.
Чего мне не хватает?