Как создать нового работника (запустив новый скрипт Python) и подключить его к существующему ученику

Я создал учащегося (удаленный объект, украшенный @ray.remote) в одном процессе Python, и теперь я хочу создать рабочего в новом процессе (запущенном python new_file.py либо на той же машине, либо на другой машине) и подключить его к тот ученик. Как я могу добиться этого, используя ray? Предполагая, что новый работник находится на той же машине, что и обучающийся, но ответы на то, что они находятся на разных машинах, также приветствуются.


person Maybe    schedule 22.11.2019    source источник
comment
Я бы предложил посмотреть на актеров и использовать тот факт, что вы можете передавать дескрипторы актеров. См. ray.readthedocs.io/en/latest/actors.html и ray.readthedocs.io/en/latest/   -  person Robert Nishihara    schedule 27.11.2019
comment
@RobertNishihara Спасибо за ответ и извините за то, что я не прояснил ситуацию. Новый рабочий процесс создается путем запуска python new_file.py либо на том же компьютере, либо на другом компьютере. В таком случае я не знаю, как связать его с процессом, который запускает учащегося, и как получить обработчик учащегося.   -  person Maybe    schedule 28.11.2019
comment
Я понимаю. Вы можете совместно использовать акторов между несколькими приложениями Ray, работающими в одном и том же кластере Ray. Подключите оба драйвера к одному и тому же кластеру Ray, используя ray.init(...), например, ray.init(address='auto'), а затем вы можете использовать API именованного актора в github.com/ray-project/ray/blob/master/python/ray/experimental/. Обратите внимание, что этот API может немного измениться в будущем (хотя функциональность останется).   -  person Robert Nishihara    schedule 30.11.2019
comment
Привет, @RobertNishihara, я написал пример в ответе. Как вы думаете, это подходящее решение?   -  person Maybe    schedule 02.12.2019


Ответы (1)


Спасибо за помощь, @RobertNishihara.

Вот пример, который я написал в соответствии с https://ray.readthedocs.io/en/latest/advanced.html#detached-actors, https://github.com/ray-project/ray/blob/72755563652ea153c0dc60c95e233f31a4c3082a/python/ray/experimental/named_actors.py#L22. и ray.init(address='auto') от @RobertNishihara.

""" main.py that starts the server """
import time

import ray

@ray.remote
class Counter:
    def __init__(self):
        self.count = 0

    def set_self_handler(self, handler):
        self.handler = handler

    def wait(self):
        if self.count == 0:
            time.sleep(1)
            self.handler.wait.remote()

    def increase(self, n):
        self.count += n

    def get_count(self):
        return self.count

if __name__ == '__main__':
    ray.init()

    counter = Counter.options(name='CounterActor').remote()

    counter.set_self_handler.remote(counter)

    counter.wait.remote()
    while ray.get(counter.get_count.remote()) == 0:
        time.sleep(1)
    print(ray.get(counter.get_count.remote()))
    ray.shutdown()
"""increase.py, started by another python command"""
import ray
from test import Counter

if __name__ == '__main__':
    ray.init(address='auto')   # connect to the server that has been started by main.py

    counter = ray.experimental.get_actor('CounterActor')
    ray.get(counter.increase.remote(1))

При запуске increase.py появится сообщение об ошибке, поскольку сервер был выключен main.py.

2019-12-02 18:20:43,708 ОШИБКА worker.py:939 -- print_logs: соединение закрыто сервером. 2019-12-02 18:20:43,708 ОШИБКА worker.py:1039 -- listen_error_messages_raylet: соединение закрыто сервером. 2019-12-02 18:20:43,709 ОШИБКА import_thread.py:89 -- ImportThread: соединение закрыто сервером.

person Maybe    schedule 02.12.2019