在RLlib中注册Gym环境时如何传入可选参数
解决方法
RLlib 提供了官方的自定义环境传参通道,按以下步骤操作即可:
1. 正确注册环境
注册时直接将回调接收的config参数透传给你的自定义环境即可,不需要在注册环节硬编码参数:
# start Ray -- add `local_mode=True` here for debugging ray.init(ignore_reinit_error=True) # register the custom environment select_env = "example-v0" register_env(select_env, lambda config: Example_v0(**config))
这里回调函数接收的config参数,就是你后续在训练配置中定义的env_config字典,直接解包传入环境构造函数即可。
2. 训练配置中传入自定义参数
在构造训练配置时,通过env_config字段传入所有你需要的环境参数即可,不需要重复注册环境:
RLlib 2.x 版本写法(推荐)
from ray.rllib.algorithms.ppo import PPOConfig config = ( PPOConfig() .environment( env=select_env, # 此处传入所有自定义环境参数 env_config={ "optional_arg": 10, "another_param": "custom_value", "max_episode_steps": 500 } ) # 其他训练配置省略,例如资源、算法超参等 .resources(num_gpus=0) .rollouts(num_rollout_workers=2) ) # 初始化算法开始训练 algo = config.build() for _ in range(10): train_result = algo.train() print(f"episode reward mean: {train_result['episode_reward_mean']}")
旧版字典配置写法
config = { "env": select_env, "env_config": { "optional_arg": 10, "another_param": "custom_value" }, # 其他训练参数 "num_workers": 2, "framework": "torch", "lr": 5e-4 } # 初始化算法 agent = ppo.PPO(config=config)
原写法失效的常见原因
如果你是在循环中动态修改n的值来生成不同参数的环境,Python的lambda闭包存在延迟绑定特性,所有lambda实例都会捕获最后一次迭代的n值,导致参数不生效,用官方提供的env_config传参方案可以完全规避这个问题。
内容的提问来源于stack exchange,提问作者hughes
相关产品推荐
相关产品推荐

