RLlib 扩展指南#

RLlib 是一个基于 Ray 的分布式、可扩展的强化学习库。RLlib 的 Algorithm 在其子组件需要并行化以提高样本和学习吞吐量时,会利用 Ray actors

../_images/scaling_axes_overview.svg

RLlib 中的扩展轴:所有 RLlib Algorithm 类都提供三个扩展轴:#

  • EnvRunnerGroup 中的 EnvRunner actor 的数量,可通过 config.env_runners(num_env_runners=n) 设置。

  • 每个 EnvRunner actor 上的矢量化子环境的数量,可通过 config.env_runners(num_envs_per_env_runner=p) 设置。

  • LearnerGroup 中的 Learner actor 的数量,可通过 config.learners(num_learners=m) 设置。

扩展 EnvRunner actor 的数量#

您可以通过以下方式在配置中增加 EnvRunnerGroup 中远程 EnvRunner actor 的数量,来控制 Algorithm 的采样机制的并行度。

from ray.rllib.algorithms.ppo import PPOConfig

config = (
    PPOConfig()
    # Use 4 EnvRunner actors (default is 2).
    .env_runners(num_env_runners=4)
)

要为每个 EnvRunner 分配资源,请使用以下配置设置

config.env_runners(
    num_cpus_per_env_runner=..,
    num_gpus_per_env_runner=..,
)

请参阅此 需要 GPU 资源的 EnvRunner 和 RL 环境的示例

GPU 数量可以是小数,例如 0.5,表示每个 EnvRunner 分配 GPU 的一部分。

请注意,EnvRunnerGroup 中始终有一个“本地” EnvRunner。如果您只想使用此本地 EnvRunner 进行采样,请将 num_env_runners=0。此本地 EnvRunner 直接位于主 Algorithm 进程中。

提示

Ray 团队可能会在未来某个时候弃用本地 EnvRunner。它仍然存在是出于历史原因。它在集合中的保留效用仍在讨论中。

扩展每个 EnvRunner actor 的环境数量#

RLlib 通过 gymnasium 的 VectorEnv API 在 EnvRunner actor 上对 RL 环境 进行矢量化。要在每个 EnvRunner 中创建多个环境副本,请在配置中设置以下内容

from ray.rllib.algorithms.ppo import PPOConfig

config = (
    PPOConfig()
    # Use 10 sub-environments (vector) per EnvRunner.
    .env_runners(num_envs_per_env_runner=10)
)

注意

与单智能体环境不同,RLlib 目前还无法对多智能体设置进行矢量化。Ray 团队正在通过利用 gymnasium >= 1.x 的自定义矢量化功能来解决此限制。

这样做可以让 EnvRunner 上的 RLModule 在数据批次上运行推理,从而并行计算所有子环境的动作。

默认情况下,矢量化 stepreset 中的各个子环境是按顺序进行的,只有 RL 环境循环的动作计算是并行的,因为观察结果可以成批通过模型。然而,gymnasium 支持异步矢量化设置,其中每个子环境都有自己的 Python 进程。这样,矢量化环境就可以并行 stepreset。通过以下方式激活此异步矢量化行为:

import gymnasium as gym

config.env_runners(
    gym_env_vectorize_mode=gym.envs.registration.VectorizeMode.ASYNC,  # default is `SYNC`
)

此设置可以显著加快采样过程,尤其是在 num_envs_per_env_runner > 1 并且 RL 环境的步进过程耗时较长时。

请参阅此 示例脚本,该脚本演示了异步矢量化带来的巨大加速。

扩展 Learner actor 的数量#

学习更新发生在 LearnerGroup 中,它管理单个本地 Learner 实例或任意数量的远程 Learner actor。

通过以下方式设置远程 Learner actor 的数量

from ray.rllib.algorithms.ppo import PPOConfig

config = (
    PPOConfig()
    # Use 2 remote Learner actors (default is 0) for distributed data parallelism.
    # Choosing 0 creates a local Learner instance on the main Algorithm process.
    .learners(num_learners=2)
)

通常,您使用的 Learner actor 的数量等于您用于训练的 GPU 数量。确保将每个 Learner 的 GPU 数量设置为 1

config.learners(num_gpus_per_learner=1)

警告

对于某些算法,例如 IMPALA 和 APPO,单个远程 Learner actor(num_learners=1)与单个本地 Learner 实例(num_learners=0)的性能,取决于您是否有 GPU。如果只有一个 GPU 可用,您应该使用 num_learners=0, num_gpus_per_learner=1 来运行这两个算法;如果没有 GPU 可用,则设置为 num_learners=1, num_gpus_per_learner=0。如果有多于 1 个 GPU 可用,则设置为 num_learners=.., num_gpus_per_learner=1

GPU 数量可以是小数,例如 0.5,表示每个 EnvRunner 分配 GPU 的一部分。例如,您可以通过设置 num_learners=1, num_gpus_per_learner=0.2 将五个 Algorithm 实例打包到一个 GPU 上。有关详细信息,请参阅此 分数 GPU 示例

注意

如果您指定了 num_gpus_per_learner > 0 并且您的机器没有足够的 GPU 可用,实验可能会暂停,直到 Ray 自动缩放器启动足够的机器来满足资源请求。如果您的集群关闭了自动缩放,此设置将导致实验运行看似停滞。

另一方面,如果您设置 num_gpus_per_learner=0,RLlib 将仅在 CPU 上构建 RLModule 实例,即使群集中有 GPU 可用。

展望:更多应该扩展的 RLlib 组件#

RLlib 中还有其他组件和方面应该能够进行扩展。

例如,由于 RLlib 扩展 Learner actor 的唯一方法是“分布式数据并行”(DDP),模型大小仅限于能够装入单个 GPU 的范围。

Ray 团队正在努力弥合这些差距。特别是,未来的改进领域包括

  • 支持**训练非常大的模型**,例如“大型语言模型”(LLM)。团队正在积极开发“人类反馈强化学习”(RLHF)原型设置。要解决的主要问题是跨多个 GPU 的模型并行和张量并行分布,以及权重在 Ray actor 之间合理快速的传输。

  • 支持**数千个多智能体策略**的训练。解决此扩展问题的可能方法是将 MultiRLModule 分割成可管理的小组,分布在各个 EnvRunnerLearner actor 上。

  • 实现**多智能体的矢量化环境**。