0

我试图首先在一个简单的环境中训练一个 PPOTrainer 进行 250 次迭代,然后在修改后的环境中完成训练。(环境之间的唯一区别是环境配置参数之一的变化)。

到目前为止,我已经尝试实现以下内容:

ray.init()
config = ppo.DEFAULT_CONFIG.copy()
config["env_config"] = defaultconfig
trainer = ppo.PPOTrainer(config=config, env=qsd.QSDEnv)
trainer.config['env_config']['meas_quant']=1
for i in range(250):
    result = trainer.train()

#attempt to change the parameter 'meas_quant' from 1 to 2
trainer.config['env_config']['meas_quant'] = 2
trainer.workers.local_worker().env.meas_quant = 2

for i in range(250):
    result = trainer.train()

但是,第二次训练仍然使用初始环境配置。任何帮助弄清楚如何解决这个问题将不胜感激!

4

1 回答 1

2

我建议两种方法之一

创建一个新的 Trainer 实例并从第一个实例恢复

ray.init()
env_config["meas_quant"] = 1    # Assuming env_config is set
config = {"env_config": env_config}  
trainer = ppo.PPOTrainer(config=config, env=qsd.QSDEnv)
for i in range(250):
    result = trainer.train()
checkpoint = trainer.save_to_object()

env_config['meas_quant'] = 2
config["env_config"] = env_config
trainer2 = ppo.PPOTrainer(config=config, env=qsd.QSDEnv)
trainer2.restore_from_object(checkpoint)
# Do whathever is needed ...

直接为每个工人改变环境

可能需要修改环境以设置您要更改的参数。

# After the first training loop
trainer.workers.foreach_worker(
    lambda w: w.foreach_env(lambda e: e.meas_quant = 2)
)
# Do your stuff ...

顺便说一句,我会避免使用它,DEFAULT_CONFIG.copy因为它只会创建字典的浅表副本,因此对嵌套配置字典的更改可能会改变原始默认配置。另外,RLlibTrainer已经深度合并了您使用默认配置传递给它的任何配置字典。

于 2020-07-10T16:08:35.967 回答