Запустите openai-тренажерный зал параллельно

1

Следующий код взят из https://bair.berkeley.edu/blog/2018/01/09/ray/.

import gym

@ray.remote
class Simulator(object):
    def __init__(self):
        self.env = gym.make("Pong-v0")
        self.env.reset()

    def step(self, action):
        return self.env.step(action)

# Create a simulator, this will start a remote process that will run
# all methods for this actor.
simulator = Simulator.remote()

observations = []
for _ in range(4):
    # Take action 0 in the simulator. This call does not block and
    # it returns a future.
    observations.append(simulator.step.remote(0))

Я чувствую себя очень смущенным, когда я читаю этот код. Этот код действительно работает параллельно? Исходя из моего понимания, существует только один env, поэтому приведенный выше код должен выполнять действия в последовательном порядке, т.е. действия выполняются одно за другим. Если это так, то какой смысл делать что-то подобное вышеописанному?

Теги:
parallel-processing
openai-gym

1 ответ

0

Вы правы, есть один актер Simulator. Метод step вызывается у актера четыре раза. Это создает четыре задачи, которые актер будет выполнять последовательно.

Если это все, что делает приложение, то нет смысла создавать обычный объект Python и вызывать метод четыре раза. Тем не менее, этот подход дает вам возможность создать двух акторов Simulator и вызывать методы для них параллельно. Например, вы можете написать следующее.

# This assumes you've already called "import ray", "import gym",
# "ray.init()", and defined the Simulator class from the original
# post.

# Create two simulators.
simulator1 = Simulator.remote()
simulator2 = Simulator.remote()

# Step each of them four times.
observation_ids1 = []
observation_ids2 = []
for _ in range(4):
    observation_ids1.append(simulator1.step.remote(0))
    observation_ids2.append(simulator2.step.remote(0))

# Get the results.
observations1 = ray.get(observation_ids1)
observations2 = ray.get(observation_ids2)

В этом примере каждый симулятор выполняет четыре задачи последовательно, но два симулятора работают параллельно. Вы можете проиллюстрировать это, поместив оператор time.sleep(1) в метод step и time.sleep(1) время, необходимое для выполнения общего вычисления.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню