首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从Ray.remote parallel Python 3函数返回值时出现问题

从Ray.remote parallel Python 3函数返回值时出现问题
EN

Stack Overflow用户
提问于 2019-07-04 08:08:36
回答 1查看 922关注 0票数 1

我一直在开发一个使用Ray的EC2并行云应用程序,用于设置集群和调度任务。然而,我有一个问题一直困扰着我。下面是一个非常简单的程序(在3个workers上运行),它说明了这一点:

代码语言:javascript
运行
复制
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()

此命令的输出为:-

代码语言:javascript
运行
复制
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中重新分配。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-07 11:55:05

每个Ray "worker“运行在一个单独的进程中(而不是线程),所以没有任何全局作用域的变量在所有worker之间共享。

在定义test_loop远程函数时,函数定义将被序列化并发送到每个工作进程(以及pop数组)。因此,每个工作进程(除了您的主脚本之外)都有自己的pop副本。当您在主脚本中修改pop时,这不会影响pop数组的其他副本。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56879252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档