1

我一直在使用 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 将忽略它并保留旧值。谁能解释这里发生了什么,以及如何让远程函数调用按我的预期工作?

注意我不认为这是一个范围问题:pop 是全局定义的,并且没有在 test_loop 中重新分配。

4

1 回答 1

1

每个 Ray “worker”都在单独的进程中运行(与线程相反),因此没有任何全局范围的变量在所有 worker 之间共享。

当您定义test_loop远程函数时,函数定义被序列化并传送到每个工作进程(连同pop数组)。所以每个工作进程(除了你的主脚本)都有自己的pop. 当您pop在主脚本中进行修改时,这不会影响pop数组的其他副本。

如果您希望您的工作进程具有在方法运行时发生突变的状态,您可能需要使用Ray actor

于 2019-07-07T03:55:05.213 回答