在 SB3 中使用 SubprocVecEnv 会导致“无法pickle 'weakref'对象”错误,即使相同的矢量化环境适用于 DummyVecEnv。为什么?

问题描述 投票:0回答:1

对于多处理,我想使用建议的 vec_env_cls、SubprocVecEnv。像下面给定代码中的 env-line 一样使用它,或者也像 make_vec_env 中的 vec_enc_cls=SubprocVecEnv 一样使用它,都会导致不可挑选对象的错误。

    def create_envs(self, n_envs, eval_env: bool = False):
        """
        Creates environment vector.
        """        
        # Initialize parameters for a Custom Environment
        self.env_kwargs = {**config.ENV_PARAMS(self.env_id.lower()), "save_folder": self.save_path}

        env = SubprocVecEnv([self.make_env(i) for i in range(n_envs)])
#        env = make_vec_env(lambda: config.ENV_ID[self.env_id.lower()](**self.env_kwargs), n_envs=n_envs)
        if self.normalize and n_envs > 0:
            env = self._normalize_envs(env, eval_env)
        return env

错误:

    return Pickler.dump(self, obj)

TypeError: cannot pickle 'weakref' object


Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Users\Calculations\anaconda3\envs\laue\lib\multiprocessing\spawn.py", line 116, in spawn_main
    exitcode = _main(fd, parent_sentinel)
  File "C:\Users\Calculations\anaconda3\envs\laue\lib\multiprocessing\spawn.py", line 126, in _main
    self = reduction.pickle.load(from_parent)
EOFError: Ran out of input

我试图在 SB3 github Repo 上找到类似的问题,但没有找到任何东西。而且这也不是解决办法。 文字

有谁知道什么会导致这样的错误?我一般不熟悉弱引用,以及我的环境中的内容可以被标记为这样。

最好的。

error-handling stable-baselines
1个回答
0
投票

对我来说,问题是 action_masks() 方法位于 numba jitted 类中。 sb3 lib 使用的默认方法似乎无法从这样的类中按名称提取方法。我所做的是更改

sb3contrib/common/maskable/utils.py

中的一些行
def is_masking_supported(env: GymEnv) -> bool:
    """
    Checks whether gym env exposes a method returning invalid action masks

    :param env: the Gym environment to check
    :return: True if the method is found, False otherwise
    """

    if isinstance(env, VecEnv):
        try:
            # TODO: add VecEnv.has_attr()
            # env.get_attr(EXPECTED_METHOD_NAME) # This doesen't work with jitclass
            env.env_method(EXPECTED_METHOD_NAME) # Taken from Line 17
            return True
        except AttributeError:
            return False
    else:
        return hasattr(env, EXPECTED_METHOD_NAME)
© www.soinside.com 2019 - 2024. All rights reserved.