如何在 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/PULLnanomsg 或 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)