1.RLlib 的环境概述
RLlib可以处理几种不同类型的环境,包括OpenAI Gym、用户定义的环境、多代理环境以及批处理环境。
您可以传递字符串名称或Python类来指定环境。默认情况下,字符串将被解释为gym环境名称。直接传递给训练器的自定义env类必须在构造函数中使用一个env_config
参数:
import gym, ray
from ray.rllib.agents import ppo
class MyEnv(gym.Env):
def __init__(self, env_config):
self.action_space = <gym.Space>
self.observation_space = <gym.Space>
def reset(self):
return <obs>
def step(self, action):
return <obs>, <reward: float>, <done: bool>, <info: dict>
ray.init()
trainer = ppo.PPOTrainer(env=MyEnv, config={
"env_config": {}, # config to pass to env class
})
while True:
print(trainer.train())
您还可以使用字符串名称注册自定义env creator函数。这个函数必须接受一个env_config参数并返回一个env实例:
from ray.tune.registry import register_env
def env_creator(env_config):
return MyEnv(...) # return an env instance
register_env("my_env", env_creator)
trainer = ppo.PPOTrainer(env="my_env")
有关使用自定义环境API的完整可运行代码示例,请参见custom_env.py。
注意: gym注册表与Ray不兼容。相反,始终使用上面记录的注册流来确保Ray工作人员能够访问环境。
配置环境
在上面的例子中,注意env_creator函数接受一个env_config
对象。这是一个包含通过您的训练器传递的选项dict。您还可以访问env_config.worker_index
和env_config.vector_index
获取worker id和env id(如果num_envs_per_worker >0
)
class MultiEnv(gym.Env):
def __init__(self, env_config):
# pick actual env based on worker and env indexes
self.env = gym.make(
choose_env_for(env_config.worker_index, env_config.vector_index))
self.action_space = self.env.action_space
self.observation_space = self.env.observation_space
def reset(self):
return self.env.reset()
def step(self, action):
return self.env.step(action)
register_env("multienv", lambda config: MultiEnv(config))
2.OpenAI Gym
RLlib使用Gym作为单代理训练的环境接口。有关如何实现自定义gym环境的更多信息,请参见gyn. env类定义。您可能会发现SimpleCorridor示例作为参考非常有用。
性能
有两种方法来扩大gym环境的实验收集:
-
单个进程中的向量化:尽管许多env可以实现每个核心的高帧率,但是它们的吞吐量在实践中受到步骤间策略评估的限制。例如,即使是很小的TensorFlow模型也会产生几毫秒的延迟来进行评估。这可以通过在每个进程中创建多个env并在这些env之间进行批处理策略评估来解决。
您可以配置{"num_envs_per_worker": M}
,让RLlib为每个worker创建M
个并发环境。RLlib通过vectoren .wrap()自动向量化gym环境。