备注

Ray 2.10.0 引入了 RLlib 的“新 API 栈”的 alpha 阶段。Ray 团队计划将算法、示例脚本和文档迁移到新的代码库中,从而在 Ray 3.0 之前的后续小版本中逐步替换“旧 API 栈”(例如,ModelV2、Policy、RolloutWorker)。

然而,请注意,到目前为止,只有 PPO(单代理和多代理)和 SAC(仅单代理)支持“新 API 堆栈”,并且默认情况下继续使用旧 API 运行。您可以继续使用现有的自定义(旧堆栈)类。

请参阅此处 以获取有关如何使用新API堆栈的更多详细信息。

容错与弹性训练#

RLlib 处理常见的故障模式,如机器故障、竞价实例抢占、网络中断或 Ray 集群故障。

RLlib 故障容错支持主要有三个方面:

  • Worker 恢复

  • 环境容错

  • 使用 Ray Tune 进行实验级别的容错

Worker Recovery#

RLlib 支持自我恢复和弹性的 EnvRunnerGroup,适用于 训练和评估 EnvRunner 工作者。这提供了工作者级别的容错能力。

这意味着如果你有 n 个 EnvRunner 工作进程分布在不同的机器上,并且一台机器被抢占,RLlib 可以继续训练和评估,中断最小。

RLlib 在这里支持的两个属性是自我恢复和弹性:

  • 弹性:即使移除了 EnvRunner,RLlib 仍会继续训练。例如,如果 RLlib 试验使用按需实例,集群中的节点可能会被移除,可能导致部分工作进程未被调度。在这种情况下,RLlib 将以降低的速度继续使用剩余的健康 EnvRunner 实例。

  • 自我恢复:在可能的情况下,RLlib 将尝试恢复任何先前移除的 EnvRunner。在恢复过程中,RLlib 会在新剧集采样之前,将最新状态同步到恢复的 EnvRunner

可以通过将配置 recreate_failed_env_runners 设置为 True 来开启工作节点容错。

RLlib 通过利用 状态感知和容错的actor管理器 实现这一点。在底层,RLlib 依赖 Ray Core actor 故障恢复 来自动恢复失败的 worker actor。

环境容错#

除了工作节点容错外,RLlib 还提供环境级别的容错功能。

部署或评估工作线程通常会并行运行多个环境,以利用例如GPU提供的并行计算能力。这可以通过 num_envs_per_env_runner 配置来控制。如果由于单个环境中的错误需要重建整个工作线程,这可能是浪费的。

在这种情况下,RLlib 提供了在不将错误传递到更高层组件的情况下重新启动单个环境的能力。您可以通过启用配置 restart_failed_sub_environments 轻松实现这一点。

备注

环境重启是阻塞的。

一个推出工作者将等待环境返回并完成初始化。因此,对于策略算法,在工作者级别恢复可能更好,以确保在环境重建时训练进程与弹性工作者集一起进行。更具体地说,使用配置 num_envs_per_env_runner=1restart_failed_sub_environments=False,和 recreate_failed_env_runners=True

Ray Tune 提供的容错和恢复#

Ray Tune 在实验试运行级别提供容错和恢复功能。

在使用 Ray Tune 与 RLlib 时,您可以启用 定期检查点保存,这将把实验状态保存到用户指定的持久存储位置。如果试验失败,Ray Tune 将自动从最新的 检查点 状态重新启动它。

其他杂项考虑#

默认情况下,RLlib 在初始化工作进程时会运行健康检查。如果在训练运行开始时无法建立完全健康的工作进程群,整个任务将会出错。如果环境本质上是不稳定的,您可能希望通过将配置 validate_env_runners_after_construction 设置为 False 来关闭此功能。

最后,在极端情况下,如果没有健康的工人进行训练,RLlib 将在整个训练任务失败之前等待一定数量的迭代,以便一些工人恢复。等待的迭代次数可以通过配置 num_consecutive_env_runner_failures_tolerance 来设置。