Проблема возврата значений из параллельной функции Python 3 Ray.remote - PullRequest
0 голосов
/ 04 июля 2019

Я работал над параллельным облачным приложением EC2, используя Ray для настройки кластера и планирования задач.Однако у меня есть проблема, которая ставит меня в тупик.Ниже приведена очень упрощенная программа (работает на 3 рабочих), которая иллюстрирует ее: -

import numpy as np
import subprocess as sp
import boto3
import ray

redadd=sp.check_output("hostname -I",shell=True).decode("utf-8").rstrip()
ray.init(redis_address=redadd+":6379")
pop=np.ones((3,3))

@ray.remote
def test_loop(n):                                           
    return n*pop[n,:]

for i in range(0,2): 
    print("iteration ",i)
    print(pop)
    if __name__=='__main__':
        ans=ray.get([test_loop.remote(n) for n in range(0,3)])
    print("ans ",ans)
    pop=2*pop

ray.shutdown()

Вывод этого: -

2019-07-03 23:35:06,078 WARNING worker.py:1337 -- WARNING: Not updating   worker name since `setproctitle` is not installed. Install this with `pip install setproctitle` (or ray[debug]) to enable monitoring of worker processes.
iteration  0
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]
ans  [array([0., 0., 0.]), array([1., 1., 1.]), array([2., 2., 2.])]
iteration  1
[[2. 2. 2.]
 [2. 2. 2.]
 [2. 2. 2.]]
ans  [array([0., 0., 0.]), array([1., 1., 1.]), array([2., 2., 2.])]

Игнорирование предупреждения, головоломкачто значение pop читается во время первой итерации test_loop, возвращая три вектора продукта параллельно.Однако на следующей итерации, где значение pop было удвоено, test_loop игнорирует его и сохраняет старое значение.Может кто-нибудь объяснить, что здесь происходит, и как заставить удаленный вызов функции работать так, как я ожидал?

NB Я не думаю, что это проблема контекста: pop определяется глобально и непереназначен в test_loop.

1 Ответ

1 голос
/ 07 июля 2019

Каждый "работник" Ray выполняется в отдельном процессе (в отличие от потока), поэтому нет никаких глобально переменных области действия, которые бы совместно использовались всеми работниками.

При определении удаленной функции test_loop определение функции сериализуется и отправляется каждому рабочему процессу (вместе с массивом pop). Таким образом, каждый рабочий процесс (в дополнение к вашему основному сценарию) имеет свою собственную копию pop. Когда вы изменяете pop в основном скрипте, это не влияет на другие копии массива pop.

Если вы хотите, чтобы ваши рабочие процессы имели состояние, которое изменяется при запуске методов, вы можете использовать Лучи актеров .

...