1

リストを定義する

g = [1, 2, 3, 4]

バージョン 1

@ray.remote
def f(*g):     
    return np.mean(g, axis=0)
f_ids = [f.remote(*g) for _ in range(10)]
print(ray.get(f.remote(*f_ids)))

バージョン 2

@ray.remote
def f(g):    # g is object ID list
    return np.mean(g, axis=0)
f_ids = [f.remote(g) for _ in range(10)]
print(ray.get(f.remote(f_ids)))

最初のコードは問題なく動作しますが、バージョン 2 は動作しません。エラーメッセージは

ray.get(f.remote(f_ids)) + のサポートされていないオペランド タイプ: 'common.ObjectID' および 'common.ObjectID'

バージョン 2 のようなことをしたい理由は、実際には次のようなことをしたいからです。

@remote
def f(g1, g2):    # g1 and g2 are object ID lists
    ...           # do something here

g1and g2as*g1の作り方がわからないので、*g2バージョン 2 を思いつきました。バージョン 2 が機能しないのはなぜですか? どうすれば修正できますか?

参照コードはこちら https://ray.readthedocs.io/en/latest/example-parameter-server.html#synchronous-parameter-server

4

1 に答える 1

2

引数が Ray リモート関数に渡されると、タイプの引数はすべてray.ObjectID、アンパックされた値に自動的に置き換えられます (意味ray.getは内部で呼び出されます)。他のすべての引数は変更されません。

そのため、次のようなリモート関数を定義すると

# Assuming you already called "import ray" and "ray.init()".

@ray.remote
def g(x):
    print(x)

あなたはそれを見るでしょう

g.remote(1)  # This prints '1'
g.remote(ray.put(1))  # This also prints '1'
g.remote([ray.put(1)])  # This prints '[ObjectID(feffffffe3f2116088b37cb305fbb2537b9783ee)]'

3行目は引数がリストなので、ObjectIDリスト内は対応する値に置き換えられません。

あなたの例では、

@ray.remote
def f(*xs):
    print(xs)

バージョン 1バージョン 2の違いは、バージョン1では複数のObjectID引数を渡すことです。バージョン 2では、複数の を含むリストである単一の引数を渡しますObjectID

xs = [ray.put(1), ray.put(2)]
f.remote(*xs)  # This prints '(1, 2)'
f.remote(xs)  # This prints '([ObjectID(fcffffffe3f2116088b37cb305fbb2537b9783ee), ObjectID(fbffffffe3f2116088b37cb305fbb2537b9783ee)],)'

必要なことを行うには、次のようなことを行う必要がある場合があります (基本的に 2 つのリストを 1 つに結合します)。それは最もきれいではありませんが、うまくいくはずです。

@ray.remote
def h(num_xs, *xs_and_ys):
    xs = xs_and_ys[:num_xs]
    ys = xs_and_ys[num_xs:]
    print(xs, ys)

x_ids = [ray.put(1), ray.put(2)]
y_ids = [ray.put(3), ray.put(4), ray.put(5)]

h.remote(len(x_ids), *(x_ids + y_ids))  # This prints '(1, 2) (3, 4, 5)'
于 2019-01-21T08:36:04.427 に答える