对于多处理,我想使用建议的 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 上找到类似的问题,但没有找到任何东西。而且这也不是解决办法。 文字
有谁知道什么会导致这样的错误?我一般不熟悉弱引用,以及我的环境中的内容可以被标记为这样。
最好的。
对我来说,问题是 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)