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注册环境。有办法吗?
答案 0 :(得分:6)
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()
应该起作用。这很烦人,但这是我发现可以解决此注册表问题的最佳方法。
答案 1 :(得分:0)
这里是定义Gym自定义环境并将其注册以供Gym和RLlib使用的示例 https://github.com/DerwenAI/gym_example
请参阅以下内容中的Python示例代码:
环境的Git存储库的文件结构比较棘手,但是允许从Git存储库,pip,conda等中以Python方式导入环境-与您的要求有关。我同意SimpleCorridor
示例几乎毫无意义,因为它在定义环境类的同一文件中注册和使用自定义环境。同样,该示例显示了如何使用RLlib衡量学习程度,但没有显示如何使用策略,即如何在用例中还原和部署经过训练的策略的检查点。 Ray即将发表的博客文章更详细地探讨了gym_example
。