容错与弹性训练#

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

RLlib 的容错支持主要体现在三个方面:

  • Worker 恢复

  • 环境容错

  • Ray Tune 提供的实验级别容错

Worker 恢复#

RLlib 支持用于训练和评估 EnvRunner worker 的 EnvRunnerGroup 的自恢复和弹性。这提供了 worker 级别的容错。

这意味着,如果您有 n 个位于不同机器上的 EnvRunner worker,而其中一台机器被预占,RLlib 仍能以最少的干扰继续训练和评估。

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

  • 弹性:即使在移除 EnvRunner 的情况下,RLlib 也能继续训练。例如,如果 RLlib 试验使用抢占式实例,Ray 可能会从集群中移除节点,从而可能导致 Ray 无法调度一部分 worker。在这种情况下,RLlib 会以较低的速度继续运行剩余健康的 EnvRunner 实例。

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

您可以通过设置 config.fault_tolerance(restart_failed_env_runners=True) 来开启 worker 容错。

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

环境容错#

除了 worker 容错之外,RLlib 还提供环境级别的容错。

Rollout 或评估 worker 通常会并行运行多个环境,以利用 GPU 提供的并行计算能力等。您可以使用 num_envs_per_env_runner 配置来控制这种并行性。如果 RLlib 因为单个环境的错误而需要重新构建整个 worker,这可能会造成浪费。

在这种情况下,RLlib 提供了在不将错误冒泡到更高级别组件的情况下重启单个环境的能力。您可以通过开启配置 restart_failed_sub_environments 来轻松实现这一点。

注意

环境重启是阻塞的。

Rollout worker 会等待环境恢复并完成初始化。因此,对于 on-policy 算法,最好在 worker 级别进行恢复,以确保训练能够以弹性的 worker 集继续进行,同时 RLlib 重建环境。具体来说,请使用配置 num_envs_per_env_runner=1restart_failed_sub_environments=Falserestart_failed_env_runners=True

Ray Tune 提供的容错与恢复#

Ray Tune 在实验 trial 级别提供容错与恢复。

在使用 Ray Tune 配合 RLlib 时,您可以启用周期性检查点,该功能会将实验的状态保存到用户指定的持久化存储位置。如果 trial 失败,Ray Tune 会自动从最新的检查点状态重新启动它。

其他杂项注意事项#

默认情况下,RLlib 在初始 worker 构建期间会运行健康检查。如果在训练开始时 RLlib 无法建立一个完全健康的 worker 团队,整个作业将出错。如果某个环境本身就容易出现故障,您可能希望通过将配置 validate_env_runners_after_construction 设置为 False 来关闭此功能。

最后,在一种极端情况下,如果不再有健康的 worker 可用于训练,RLlib 会等待一定数量的迭代,直到一些 worker 恢复,然后整个训练作业才会失败。您可以使用配置 num_consecutive_env_runner_failures_tolerance 来配置 RLlib 等待的迭代次数。