Как именно Рэй делится данными с работниками? - PullRequest
0 голосов
/ 24 сентября 2019

Существует множество простых руководств, а также ТАК вопросы и ответы, в которых утверждается, что Рэй каким-то образом обменивается данными с работниками, но ни один из них не дает точных сведений о том, что и как делится на какой ОС.

Например, в этом ответе SO: https://stackoverflow.com/a/56287012/1382437 массив np сериализуется в хранилище общих объектов, а затем используется несколькими работниками, обращающимися к одним и тем же данным (код скопирован из этого ответа):

import numpy as np
import ray

ray.init()

@ray.remote
def worker_func(data, i):
    # Do work. This function will have read-only access to
    # the data array.
    return 0

data = np.zeros(10**7)
# Store the large array in shared memory once so that it can be accessed
# by the worker tasks without creating copies.
data_id = ray.put(data)

# Run worker_func 10 times in parallel. This will not create any copies
# of the array. The tasks will run in separate processes.
result_ids = []
for i in range(10):
    result_ids.append(worker_func.remote(data_id, i))

# Get the results.
results = ray.get(result_ids)

Вызов ray.put (data) помещает сериализованное представление данных в хранилище общих объектов и возвращает дескриптор / идентификатор для него.

затем, когда вызывается worker_func.remote (data_id, i), worker_func получает десериализованные данные.

Но что именно происходит между ними?Ясно, что data_id используется, чтобы найти сериализованную версию данных и десериализовать ее.

Q1: когда данные подвергаются десериализации, всегда ли создается копия исходных данных?Я думаю, что да, но я не уверен.

Как только данные были десериализованы, они передаются работнику.Теперь, если те же данные необходимо передать другому работнику, есть две возможности:

Q2: когда объект, который уже был десериализован, передается работнику, будет ли он через другую копию или точнотот же объект?Если это точно такой же объект, то использует ли он стандартный подход к разделяемой памяти для обмена данными между процессами?В Linux это будет означать копирование при записи, поэтому означает ли это, что, как только объект записывается, создается еще одна его копия?

Q3: некоторые учебные пособия / ответы, кажется, указывают на то, что накладные расходыДесериализация и обмен данными между работниками очень различаются в зависимости от типа данных (numpy против non numpy), так каковы подробности там?Почему NumPy данные распределяются более эффективно, и это все еще эффективно, когда клиент пытается записать в этот NUMPY массив (который, я думаю, всегда будет создавать локальную копию для процесса?)?

...