如何在 Ray 中使用全局变量
How to use global variables with Ray
我有一个看起来更复杂的脚本:
import ray
var1 = 0
var2 = 0
@ray.remote
def create(n):
global var1
global var2
for i in range(10):
var1 += 1
var2 += 1
def create2():
tasks = [create.remote(i) for i in range(20)]
ray.get(tasks)
create2()
这个错误是因为 Ray 不允许以传统方式使用全局变量。我该如何解决这个问题?
一个解决方案是为准global
-s中的任何一个创建一个方法.add1()
,其实现将向main
.
加 1
这种方式 main
能够维持一个最便宜的(不过分昂贵)原子性递增任何准 global
,由于强制 [SERIAL]
-信号处理,否则主要[CONCURRENT]
-信号到达。
这样做的可能工具是 ZeroMQ PUSH/PULL
和 nanomsg
或 pynng push/pull
可扩展的正式通信模式原型。
每个 @ray.remote
-decorated 执行都可以设置其自己的 { PUSH | push }
-side 信号路径,而 main
-side 或其 { thread |基于流程}的衍生产品只是填充了一个中央{ PULL | pull }
端,位于一个恒定的.bind( <Transport_Class>:<Port#orOtherAdressSpecifier> )
“收集服务”位置。每个 PUSH
-ers .connect()
到先验已知的 TransportClass 目标地址,其余的都是微不足道的。
根据您的需要,也可以使用更强大、更容错的方法。因此,不需要 global
-s 来执行此操作或更复杂的 any:M+N
-弹性投票-、收集器-或通用多代理分布式信令。
您可以创建一个保存变量的 actor 并更新它。
@ray.remote
class GlobalState:
def __init__(self):
self.state = {
"var1": 0,
"var2": 0
}
def increment(key):
self.state[key] += 1
@ray.remote
def create(global_state):
for i in range(10):
global_state.increment.remote("var1")
global_state.increment.remote("var2")
def create2(global_state):
tasks = [create.remote(global_state) for i in range(20)]
ray.get(tasks)
global_state = GlobalState.remote()
create2(global_state)
我有一个看起来更复杂的脚本:
import ray
var1 = 0
var2 = 0
@ray.remote
def create(n):
global var1
global var2
for i in range(10):
var1 += 1
var2 += 1
def create2():
tasks = [create.remote(i) for i in range(20)]
ray.get(tasks)
create2()
这个错误是因为 Ray 不允许以传统方式使用全局变量。我该如何解决这个问题?
一个解决方案是为准global
-s中的任何一个创建一个方法.add1()
,其实现将向main
.
这种方式 main
能够维持一个最便宜的(不过分昂贵)原子性递增任何准 global
,由于强制 [SERIAL]
-信号处理,否则主要[CONCURRENT]
-信号到达。
这样做的可能工具是 ZeroMQ PUSH/PULL
和 nanomsg
或 pynng push/pull
可扩展的正式通信模式原型。
每个 @ray.remote
-decorated 执行都可以设置其自己的 { PUSH | push }
-side 信号路径,而 main
-side 或其 { thread |基于流程}的衍生产品只是填充了一个中央{ PULL | pull }
端,位于一个恒定的.bind( <Transport_Class>:<Port#orOtherAdressSpecifier> )
“收集服务”位置。每个 PUSH
-ers .connect()
到先验已知的 TransportClass 目标地址,其余的都是微不足道的。
根据您的需要,也可以使用更强大、更容错的方法。因此,不需要 global
-s 来执行此操作或更复杂的 any:M+N
-弹性投票-、收集器-或通用多代理分布式信令。
您可以创建一个保存变量的 actor 并更新它。
@ray.remote
class GlobalState:
def __init__(self):
self.state = {
"var1": 0,
"var2": 0
}
def increment(key):
self.state[key] += 1
@ray.remote
def create(global_state):
for i in range(10):
global_state.increment.remote("var1")
global_state.increment.remote("var2")
def create2(global_state):
tasks = [create.remote(global_state) for i in range(20)]
ray.get(tasks)
global_state = GlobalState.remote()
create2(global_state)