rllib 使用自定义注册环境
Posted
技术标签:
【中文标题】rllib 使用自定义注册环境【英文标题】:rllib use custom registered environments 【发布时间】:2020-02-21 08:44:16 【问题描述】:Rllib 文档提供了一些关于如何create and train a custom environment 的信息。有一些关于注册该环境的信息,但我想它的工作方式需要与gym registration 不同。
我正在使用SimpleCorridor 环境对此进行测试。如果我像这样将注册码添加到文件中:
from ray.tune.registry import register_env
class SimpleCorridor(gym.Env):
...
def env_creator(env_config):
return SimpleCorridor(env_config)
register_env("corridor", env_creator)
然后我可以使用字符串名称训练算法没问题:
if __name__ == "__main__":
ray.init()
tune.run(
"PPO",
stop=
"timesteps_total": 10000,
,
config=
"env": "corridor", # <--- This works fine!
"env_config":
"corridor_length": 5,
,
,
)
但是
在定义环境的同一个文件中注册环境是没有意义的,因为你可以只使用类。 OpenAI 健身房注册很好,因为如果你安装了环境,那么你可以在任何地方使用它,只需编写
include gym_corridor
我不清楚是否有办法为 rllib 注册环境做同样的事情。有没有办法做到这一点?
【问题讨论】:
【参考方案1】:ray 中的注册表功能令人头疼;我不知道为什么他们无法识别 OpenAI Gym 等其他环境。
无论如何,我解决这个问题的方法是将我的自定义环境包装在另一个自动导入环境的函数中,以便我可以重用代码。例如:
def env_creator(env_name):
if env_name == 'CustomEnv-v0':
from custom_gym.envs.custom_env import CustomEnv0 as env
elif env_name == 'CustomEnv-v1':
from custom_gym.envs.custom_env import CustomEnv1 as env
else:
raise NotImplementedError
return env
然后,要使其与tune.register_env()
一起使用,您可以将自定义环境与lambda
函数一起使用:
env = env_creator('CustomEnv-v0')
tune.register_env('myEnv', lambda: config, env(config))
从那里,tune.run()
应该可以工作。这很烦人,但这是我发现解决此注册表问题的最佳方法。
【讨论】:
是的,这就是我最终所做的。正如你所说,仍然不知道,但它有效。【参考方案2】:这是一个定义 Gym 自定义环境并注册它以在 Gym 和 RLlib 中使用的示例 https://github.com/DerwenAI/gym_example
查看 Python 示例代码:
sample.py
– 如何使用 gym.make()
创建代理来衡量随机动作基线的性能
train.py
– 注册,使用 RLlib 训练策略,衡量学习性能,展示程序化部署
环境的 Git 存储库的文件结构很棘手,但它允许从 Git 存储库、pip、conda 等 Python 导入环境——这与您的要求有关。我同意SimpleCorridor
示例几乎毫无意义,因为它在定义环境类的同一文件中注册并使用自定义环境。同样,该示例展示了如何使用 RLlib 衡量学习,但未能展示如何使用策略,即如何在用例中恢复和部署经过训练的策略的检查点。即将发布的 Ray 博客文章将更详细地探讨 gym_example
。
【讨论】:
这里有一篇文章更详细地描述了上面的 repo medium.com/distributed-computing-with-ray/…以上是关于rllib 使用自定义注册环境的主要内容,如果未能解决你的问题,请参考以下文章
RLLib - Tensorflow - InvalidArgumentError:收到的标签值 N 超出 [0, N) 的有效范围
在 Python 中编写和注册自定义 TensorFlow 操作