Запустите openai-тренажерный зал параллельно - PullRequest
0 голосов
/ 10 января 2019

Следующий код взят из 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, поэтому приведенный выше код должен выполнять действия в последовательном порядке, то есть действия выполняются по одному. Если это так, то какой смысл делать что-то подобное вышеописанному?

1 Ответ

0 голосов
/ 21 января 2019

Вы правы, есть один 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 и указав время, необходимое для полного вычисления.

...