注意
Ray 2.40 默认使用 RLlib 的新 API 堆栈。Ray 团队已基本完成算法、示例脚本和文档到新代码库的迁移。
如果您仍在使用旧 API 堆栈,请参阅新 API 堆栈迁移指南了解如何迁移的详细信息。
容错与弹性训练#
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
,然后再采样新的回合。
您可以通过设置 config.fault_tolerance(restart_failed_env_runners=True)
来开启 worker 容错。
RLlib 通过利用一个状态感知且容错的 actor 管理器来实现这一点。其底层依赖于 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=1
、restart_failed_sub_environments=False
和 restart_failed_env_runners=True
。
Ray Tune 提供的容错和恢复#
Ray Tune 提供实验试验级别的容错和恢复。
在使用 Ray Tune 和 RLlib 时,您可以启用定期检查点,这将实验状态保存到用户指定的持久存储位置。如果试验失败,Ray Tune 会自动从最新的检查点状态重新启动。
其他杂项考虑因素#
默认情况下,RLlib 在 worker 初始构建期间运行健康检查。如果在训练运行开始时 RLlib 无法建立完全健康的 worker 集群,整个作业将报错。如果环境本身就不稳定(flaky),您可能希望通过设置配置 validate_env_runners_after_construction
为 False 来关闭此功能。
最后,在极端情况下,当没有健康的 worker 剩余进行训练时,RLlib 会等待一定数量的迭代,直到部分 worker 恢复,然后整个训练作业才会失败。您可以使用配置 num_consecutive_env_runner_failures_tolerance
来配置 RLlib 等待的迭代次数。