更改 Ray RLlib Training 的 Logdir 而不是 ~/ray_results

Nyx*_*nyx 7 python reinforcement-learning ray rllib ray-tune

我正在使用 Ray & RLlib 在 Ubuntu 系统上训练 RL 代理。Tensorboard 用于通过将其指向~/ray_results所有运行的所有日志文件的存储位置来监控训练进度。未使用 Ray Tune。

例如,在开始新的 Ray/RLlib 训练运行时,将在以下位置创建一个新目录

~/ray_results/DQN_ray_custom_env_2020-06-07_05-26-32djwxfdu1
Run Code Online (Sandbox Code Playgroud)

为了可视化训练进度,我们需要使用以下命令启动 Tensorboard

tensorboard --logdir=~/ray_results
Run Code Online (Sandbox Code Playgroud)

问题:是否可以配置 Ray/RLlib 以将日志文件的输出目录从~/ray_results其他位置更改?

另外,不是登录到一个名为类似的目录DQN_ray_custom_env_2020-06-07_05-26-32djwxfdu1,这个目录名称可以由我们自己设置吗?


尝试失败:尝试设置

os.environ['TUNE_RESULT_DIR'] = '~/another_dir`
Run Code Online (Sandbox Code Playgroud)

在运行之前ray.init(),但结果日志文件仍在写入~/ray_results

X. *_*ang 6

不使用 Tune,您可以使用 rllib 的“Trainer”更改日志目录。如果您想指定保存日志的位置,“Trainer”类会采用可选的“logger_creator”(请参阅​​此处)。

一个具体的例子:

  1. 定义您的自定义记录器创建器(您可以简单地修改默认记录器创建器):
def custom_log_creator(custom_path, custom_str):

    timestr = datetime.today().strftime("%Y-%m-%d_%H-%M-%S")
    logdir_prefix = "{}_{}".format(custom_str, timestr)

    def logger_creator(config):

        if not os.path.exists(custom_path):
            os.makedirs(custom_path)
        logdir = tempfile.mkdtemp(prefix=logdir_prefix, dir=custom_path)
        return UnifiedLogger(config, logdir, loggers=None)

    return logger_creator
Run Code Online (Sandbox Code Playgroud)
  1. 将此 logger_creator 传递给训练器,并开始训练:
trainer = PPOTrainer(config=config, env='CartPole-v0',
                     logger_creator=custom_log_creator(os.path.expanduser("~/another_ray_results/subdir"), 'custom_dir'))

for i in range(ITER_NUM):
    result = trainer.train()
Run Code Online (Sandbox Code Playgroud)

您将发现训练结果(即 TensorBoard 事件文件、参数、模型等)按照您指定的命名约定保存在“~/another_ray_results/subdir”下。


Pav*_*kyi 5

是否可以配置 Ray/RLlib 将日志文件的输出目录从 ~/ray_results 更改为另一个位置?

目前无法使用 RLib CLI 工具 ( rllib)进行配置。

如果您对 Python API 没问题,那么,如文档中所述local_dir参数 oftune.run负责指定输出目录,默认为~/ray_results.

另外,不是登录到名为 DQN_ray_custom_env_2020-06-07_05-26-32djwxfdu1 之类的目录,而是可以自己设置该目录名称吗?

这由 的trial_name_creator参数控制tune.run。它必须是一个接受试验对象并将其格式化为字符串的函数,如下所示:

def trial_name_id(trial):
    return f"{trial.trainable_name}_{trial.trial_id}"

tune.run(...trial_name_creator=trial_name_id)
Run Code Online (Sandbox Code Playgroud)