首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tf-Agents ParallelPyEnvironment以静默方式失败

Tf-Agents ParallelPyEnvironment以静默方式失败
EN

Stack Overflow用户
提问于 2019-08-20 20:20:19
回答 1查看 541关注 0票数 2

我已经编写了一个自定义环境,这样我就可以使用强化学习(PPO)和tf-agent。如果我将我的env (继承自py_environment.PyEnvironment)包装在一个TfPyEnvironment中,这可以很好地工作,但是如果我试图将它包装到一个ParallelPyEnvironment中,就会失败。我尝试过使用ParallelPyEnvironment的所有关键字参数,但是代码一直运行到行,然后什么也没有发生--没有例外,程序不会终止等等。

下面是初始化环境并展示eval_env的工作变体的代码

代码语言:javascript
复制
train_env = tf_py_environment.TFPyEnvironment(
    ParallelPyEnvironment(
        [CardGameEnv()] * hparams['parallel_environments']
    )
)
# this works perfectly:
eval_env = tf_py_environment.TFPyEnvironment(CardGameEnv(debug=True))

如果我通过CTRL+C终止脚本,则会输出以下内容:

代码语言:javascript
复制
Traceback (most recent call last):
Traceback (most recent call last):
  File "E:\Users\tmp\Documents\Programming\Neural Nets\Poker_AI\poker_logic\train.py", line 229, in <module>
  File "<string>", line 1, in <module>
    train(model_num=3)
  File "C:\Python37\lib\multiprocessing\spawn.py", line 105, in spawn_main
  File "E:\Users\tmp\Documents\Programming\Neural Nets\Poker_AI\poker_logic\train.py", line 64, in train
    [CardGameEnv()] * hparams['parallel_environments']
    exitcode = _main(fd)
  File "E:\Users\tmp\AppData\Roaming\Python\Python37\site-packages\gin\config.py", line 1009, in wrapper
  File "C:\Python37\lib\multiprocessing\spawn.py", line 113, in _main
    preparation_data = reduction.pickle.load(from_parent)
KeyboardInterrupt
    return fn(*new_args, **new_kwargs)
  File "C:\Python37\lib\site-packages\tf_agents\environments\parallel_py_environment.py", line 70, in __init__
    self.start()
  File "C:\Python37\lib\site-packages\tf_agents\environments\parallel_py_environment.py", line 83, in start
    env.start(wait_to_start=self._start_serially)
  File "C:\Python37\lib\site-packages\tf_agents\environments\parallel_py_environment.py", line 223, in start
    self._process.start()
  File "C:\Python37\lib\multiprocessing\process.py", line 112, in start
    self._popen = self._Popen(self)
  File "C:\Python37\lib\multiprocessing\context.py", line 223, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Python37\lib\multiprocessing\context.py", line 322, in _Popen
    return Popen(process_obj)
  File "C:\Python37\lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__
    reduction.dump(process_obj, to_child)
  File "C:\Python37\lib\multiprocessing\reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
  File "C:\Python37\lib\site-packages\tf_agents\environments\parallel_py_environment.py", line 264, in __getattr__
    return self._receive()
  File "C:\Python37\lib\site-packages\tf_agents\environments\parallel_py_environment.py", line 333, in _receive
    message, payload = self._conn.recv()
  File "C:\Python37\lib\multiprocessing\connection.py", line 250, in recv
    buf = self._recv_bytes()
  File "C:\Python37\lib\multiprocessing\connection.py", line 306, in _recv_bytes
    [ov.event], False, INFINITE)
KeyboardInterrupt
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
  File "C:\Python37\lib\site-packages\tf_agents\environments\parallel_py_environment.py", line 289, in close
    self._process.join(5)
  File "C:\Python37\lib\multiprocessing\process.py", line 139, in join
    assert self._popen is not None, 'can only join a started process'
AssertionError: can only join a started process

由此我得出结论,ParallelPyEnvironment正在尝试启动的线程不能做到这一点,但由于我对Python中的线程没有太多的经验,我不知道从哪里开始,特别是如何修复这个问题。目前的培训需要很长的时间,而且根本不使用我的PC的功能(使用了3 3GB的32 3GB内存,处理器为3%,GPU几乎不能工作,但VRAM已满),因此这应该会大大加快培训时间。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-27 00:16:20

解决方案是传入可调用对象,而不是环境,这样ParallelPyEnvironment就可以自己构造它们:

代码语言:javascript
复制
train_env = tf_py_environment.TFPyEnvironment(
    ParallelPyEnvironment(
        [CardGameEnv] * hparams['parallel_environments']
    )
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57573540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档