SubprocVecEnv не работает с Custom Env (Stable Baselines - Gym)

Я создал собственный env, используя в качестве родительского класса gym.Env, и все работает хорошо на одном ядре. Я запустил код следующим образом:

class MyEnv(gym.Env):
....

Но если я попытаюсь использовать SubprocVecEnv для ускорения процесса обучения с использованием всех моих 24 ядер ЦП, я получаю сообщение: ValueError: не удалось передать массив ввода из формы (24,24) в форму (24,1)

Я тестировал DummyVecEnv, и он работает хорошо, но поскольку эта функция не поддерживает многопроцессорность, я хотел бы использовать SubprocVecEnv, как я обычно это делаю с окружениями Atari / Gym.

PS: мой пользовательский env очень прост, в основном я использую набор данных с 567 строками и 4 столбцами, агент посещает одну строку за раз и прогнозирует два значения из этого наблюдения. Наблюдение_пространство и действие_пространство следующие:

self.observation_space = spaces.Box(low=1, high=1, shape=(1,4), dtype=np.float64)

self.action_space = spaces.Box(low=np.array([0., -1.]), high=np.array([2., 1.]), dtype=np.float64)

Я тренирую агента, используя PPO2, исходя из стабильных исходных значений, как я обычно делаю.

Я упустил что-то важное?


person Guitar AI    schedule 14.01.2021    source источник


Ответы (1)


Проверьте этот пример кода:

import numpy as np
import gym
from baselines.common.vec_env.subproc_vec_env import SubprocVecEnv

env_name = 'your-env-name'
nproc = 8
T=10

def make_env(env_id, seed):
    def _f():
        env = gym.make(env_id)
        env.seed(seed)
        return env
    return _f

envs= [make_env(env_name, seed) for seed in range(nproc)]

envs = SubprocVecEnv(envs)

Xt = envs.reset()

for t in range(T):
    ut = np.stack([envs.action_space.sample() for _ in range(nproc)])
    xtpl, rt, done, info = envs.step(ut)
person BAKYAC    schedule 17.02.2021
comment
может быть, сначала нужно зарегистрироваться - person YIMIN TANG; 20.04.2021
comment
Сказал, что все хорошо работает на одном ядре! - person BAKYAC; 20.04.2021