从 Ray.remote parallel Python 3 函数返回值时出现问题
Problem returning values from a Ray.remote parallel Python 3 function
我一直在使用 Ray 开发一个 EC2 并行云应用程序来设置集群和安排任务。然而,有个问题一直困扰着我。以下是一个非常简化的程序(运行 在 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.])]
忽略警告,不解的是在test_loop的第一次迭代中读取pop的值,并行返回三个乘积向量。然而,在下一次迭代中,pop 的值已经翻倍,test_loop 忽略它并保留旧值。谁能解释这里发生了什么,以及如何让远程函数调用像我期望的那样工作?
N.B。我不认为这是一个范围问题:pop 是全局定义的并且没有在 test_loop.
中重新分配
每个 Ray "worker" 运行 在一个单独的进程中(而不是一个线程),因此没有任何全局范围的变量在所有工作人员之间共享。
当您定义 test_loop
远程函数时,函数定义被序列化并传送到每个工作进程(连同 pop
数组)。所以每个工作进程(除了你的主脚本)都有自己的 pop
副本。当您在主脚本中修改 pop
时,不会影响 pop
数组的其他副本。
如果您希望工作进程的状态在方法 运行 时发生变化,您可能需要使用 Ray actors.
我一直在使用 Ray 开发一个 EC2 并行云应用程序来设置集群和安排任务。然而,有个问题一直困扰着我。以下是一个非常简化的程序(运行 在 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.])]
忽略警告,不解的是在test_loop的第一次迭代中读取pop的值,并行返回三个乘积向量。然而,在下一次迭代中,pop 的值已经翻倍,test_loop 忽略它并保留旧值。谁能解释这里发生了什么,以及如何让远程函数调用像我期望的那样工作?
N.B。我不认为这是一个范围问题:pop 是全局定义的并且没有在 test_loop.
中重新分配每个 Ray "worker" 运行 在一个单独的进程中(而不是一个线程),因此没有任何全局范围的变量在所有工作人员之间共享。
当您定义 test_loop
远程函数时,函数定义被序列化并传送到每个工作进程(连同 pop
数组)。所以每个工作进程(除了你的主脚本)都有自己的 pop
副本。当您在主脚本中修改 pop
时,不会影响 pop
数组的其他副本。
如果您希望工作进程的状态在方法 运行 时发生变化,您可能需要使用 Ray actors.