Ray ObjectRef автоматически собирается и десериализуется?Python

Программы на Python
Ответить
Anonymous
 Ray ObjectRef автоматически собирается и десериализуется?

Сообщение Anonymous »

У меня есть актеры Ray, которые взаимодействуют друг с другом, один из них генерирует массив numpy. Когда я собираю ссылку на объект и отправляю ее другому актеру, кажется, что он автоматически десериализуется.
Для контекста см. следующее:

Код: Выделить всё

sp_refs = [sp.self_play.remote() for _ in range(GAMES_TOTAL)]
buffer_refs = []
start_time = time.time()
# ? Preload the ReplayBuffer

print(f"Number of Jobs Running: {len(sp_refs)=}")
while sp_refs:
complete, sp_refs = ray.wait(sp_refs)
print(f"{complete=}")
buffer.add.remote(complete)
for r in complete:
buffer_refs.append(buffer.add.remote(r))
Код добавления буферов:

Код: Выделить всё

    def add(self, experience: ray.ObjectRef):
print(f"{experience} - add function")
print(f"{type(experience)=}")
print(f"{type(experience[0])}")
data = ray.get(experience)
print(data)
print(type(data))
assert False
что дает следующий результат:

Код: Выделить всё

ValueError: Invalid type of object refs, , is given. 'object_refs' must either be an ObjectRef or a list of ObjectRefs.
(ReplayBuffer pid=527599) [ObjectRef(f91b78d7db9a659302e1adadcf69844dfe0a8bc60100000001000000)] - add function
(ReplayBuffer pid=527599) type(experience)=
(ReplayBuffer pid=527599) 
(ReplayBuffer pid=527599) [array([[1.000e+00, 1.000e+00, 1.000e+00, ..., 0.000e+00, 1.829e+03,
(ReplayBuffer pid=527599)         0.000e+00],
(ReplayBuffer pid=527599)        [1.000e+00, 1.000e+00, 1.000e+00, ..., 0.000e+00, 1.837e+03,
(ReplayBuffer pid=527599)         0.000e+00],
(ReplayBuffer pid=527599)        [1.000e+00, 1.000e+00, 1.000e+00, ..., 0.000e+00, 2.997e+03,
(ReplayBuffer pid=527599)         0.000e+00],
(ReplayBuffer pid=527599)        ...,
(ReplayBuffer pid=527599)        [0.000e+00, 0.000e+00, 0.000e+00, ..., 0.000e+00, 4.105e+03,
(ReplayBuffer pid=527599)         0.000e+00],
(ReplayBuffer pid=527599)        [0.000e+00, 0.000e+00, 0.000e+00, ..., 0.000e+00, 3.510e+03,
(ReplayBuffer pid=527599)         0.000e+00],
(ReplayBuffer pid=527599)        [0.000e+00, 0.000e+00, 0.000e+00, ..., 0.000e+00, 2.358e+03,
(ReplayBuffer pid=527599)         0.000e+00]])]
(ReplayBuffer pid=527599) 
(ReplayBuffer pid=527599) [[1.000e+00 1.000e+00 1.000e+00 ... 0.000e+00 1.829e+03 0.000e+00]
(ReplayBuffer pid=527599)  [1.000e+00 1.000e+00 1.000e+00 ... 0.000e+00 1.837e+03 0.000e+00]
(ReplayBuffer pid=527599)  [1.000e+00 1.000e+00 1.000e+00 ... 0.000e+00 2.997e+03 0.000e+00]
(ReplayBuffer pid=527599)  ...
(ReplayBuffer pid=527599)  [0.000e+00 0.000e+00 0.000e+00 ... 0.000e+00 4.105e+03 0.000e+00]
(ReplayBuffer pid=527599)  [0.000e+00 0.000e+00 0.000e+00 ... 0.000e+00 3.510e+03 0.000e+00]
(ReplayBuffer pid=527599)  [0.000e+00 0.000e+00 0.000e+00 ... 0.000e+00 2.358e+03 0.000e+00]] - add function
(ReplayBuffer pid=527599) type(experience)=
(ReplayBuffer pid=527599) 
Обратите внимание, это только один объект. Мы также можем видеть, что функция, по сути, была вызвана дважды: один раз для ссылки на объект, а затем еще раз для фактического списка (содержащего массив), который затем завершается с ошибкой.

Код: Выделить всё

        data = ray.get(experience)
Кто-нибудь знает почему?


Подробнее здесь: https://stackoverflow.com/questions/793 ... serialised
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»