RLlib 扩展指南#
注意
Ray 2.40 默认使用 RLlib 的新 API 栈。Ray 团队已基本完成将算法、示例脚本和文档迁移到新的代码库。
如果您仍在使用旧的 API 栈,请参阅新 API 栈迁移指南了解如何迁移的详细信息。
RLlib 是一个基于 Ray 的分布式、可扩展的 RL 库。RLlib Algorithm
在其子组件的并行化能够加速采样和学习吞吐量的地方,会使用 Ray actors。
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
在一批数据上运行推理,从而并行计算所有子环境的动作。
默认情况下,向量环境中的单个子环境按顺序 step
和 reset
,只有 RL 环境循环中的动作计算是并行的,因为观察可以在批量中通过模型移动。然而,gymnasium 支持异步向量化设置,其中每个子环境都有自己的 Python 进程。这样,向量环境可以并行地进行 step
或 reset
。通过以下配置激活此异步向量化行为
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)
)
通常,您会使用与可用于训练的 GPU 数量一样多的 Learner
Actor。请确保将每个 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
。如果可用 GPU 数量大于 1,请设置 num_learners=.., num_gpus_per_learner=1
。
GPU 数量可以是小数,例如 0.5,以便为每个 EnvRunner
只分配一部分 GPU。例如,通过设置 num_learners=1, num_gpus_per_learner=0.2
,您可以在一个 GPU 上打包五个 Algorithm
实例。有关详细信息,请参阅此小数 GPU 示例。
注意
如果您指定 num_gpus_per_learner > 0
但您的机器没有所需数量的 GPU 可用,实验可能会停滞,直到 Ray 自动扩展器启动足够的机器来满足资源请求。如果您的集群关闭了自动扩展,此设置将导致实验运行看似挂起。
另一方面,如果您设置 num_gpus_per_learner=0
,即使集群上有 GPU 可用,RLlib 也只会使用 CPU 构建 RLModule
实例。
展望:更多 RLlib 元素应具备扩展能力#
RLlib 中还有其他组件和方面应具备向上扩展的能力。
例如,模型大小受限于单个 GPU 的容量,因为“分布式数据并行”(DDP) 是 RLlib 扩展 Learner
Actor 的唯一方式。
Ray 团队正致力于弥补这些差距。特别是,未来的改进领域包括
支持训练超大型模型,例如“大型语言模型”(LLM)。团队正积极研发“基于人类反馈的强化学习”(RLHF) 原型设置。需要解决的主要问题是跨多个 GPU 的模型并行和张量并行分布,以及 Ray Actor 之间权重的快速传输。
支持使用数千个多智能体策略进行训练。解决这个扩展问题的一个可能方案是将
MultiRLModule
分割成可管理的独立策略组,分布在各种EnvRunner
和Learner
Actor 上。为多智能体启用向量环境。