RLlib:行业级、可扩展的强化学习#

../_images/rllib-logo.png

RLlib 是一个开源的强化学习 (RL) 库,它为生产级、高度可扩展和容错的 RL 工作负载提供支持,同时为各种行业应用维护简单统一的 API。

无论是训练 多智能体 设置中的策略,还是从历史 离线 数据中训练,或是使用 外部连接的模拟器,RLlib 都为这些自主决策需求提供了简单的解决方案,并使您能够在数小时内开始运行您的实验。

行业领导者在游戏、机器人金融气候和工业控制制造和物流汽车船舶设计 等众多垂直领域中,在生产环境中都使用 RLlib。

RLlib 60 秒速览#

../_images/rllib-index-header.svg

只需几个步骤,即可在您的笔记本电脑上启动并运行您的第一个 RLlib 工作负载。安装 RLlib 和 PyTorch,如下所示:

pip install "ray[rllib]" torch

注意

要在运行 Apple Silicon 的计算机(如 M1)上安装,请 在此处按照说明操作。

注意

为了能够运行 Atari 或 MuJoCo 示例,您还需要执行以下操作:

pip install "gymnasium[atari,accept-rom-license,mujoco]"

这就全部完成了,您现在可以开始针对 RLlib 进行编码。以下是一个在 Taxi 域 上运行 PPO 算法 的示例。您首先为该算法创建一个 config,它定义了 RL 环境 以及任何其他所需的设置和参数。

from ray.rllib.algorithms.ppo import PPOConfig
from ray.rllib.connectors.env_to_module import FlattenObservations

# Configure the algorithm.
config = (
    PPOConfig()
    .environment("Taxi-v3")
    .env_runners(
        num_env_runners=2,
        # Observations are discrete (ints) -> We need to flatten (one-hot) them.
        env_to_module_connector=lambda env: FlattenObservations(),
    )
    .evaluation(evaluation_num_env_runners=1)
)

接下来,build 该算法并将其 train 五次。一次训练迭代包括 EnvRunner actor 的并行、分布式样本收集,然后是基于收集数据的损失计算和模型更新步骤。

from pprint import pprint

# Build the algorithm.
algo = config.build_algo()

# Train it for 5 iterations ...
for _ in range(5):
    pprint(algo.train())

在脚本的最后,您将评估训练好的算法并释放其所有资源。

# ... and evaluate it.
pprint(algo.evaluate())

# Release the algo's resources (remote actors, like EnvRunners and Learners).
algo.stop()

您可以使用任何 Farama-Foundation Gymnasium 注册的环境,并通过 env 参数进行指定。

config.env_runners() 中,您可以指定——除其他许多内容外——用于从环境中收集样本的并行 EnvRunner actor 的数量。

您还可以通过调整 RLlib 的 DefaultModelConfig 来调整所使用的神经网络架构,还可以通过 config.evaluation() 方法为评估 EnvRunner actor 设置单独的配置。

如果您想了解更多关于 RLlib 训练 API 的信息,请参见此处。此外,请参见此处,了解如何编写训练后的动作推理循环。

如果您想快速预览 RLlib 支持哪些 算法环境,请点击下面的下拉菜单。

RLlib 算法
RLlib 环境

Farama-Foundation 环境

gymnasium single_agent

pip install "gymnasium[atari,accept-rom-license,mujoco]"``
config.environment("CartPole-v1")  # Classic Control
config.environment("ale_py:ALE/Pong-v5")  # Atari
config.environment("Hopper-v5")  # MuJoCo

PettingZoo multi_agent

pip install "pettingzoo[all]"
from ray.tune.registry import register_env
from ray.rllib.env.wrappers.pettingzoo_env import PettingZooEnv
from pettingzoo.sisl import waterworld_v4
register_env("env", lambda _: PettingZooEnv(waterworld_v4.env()))
config.environment("env")

RLlib 多智能体

RLlib 的 MultiAgentEnv API multi_agent

from ray.rllib.examples.envs.classes.multi_agent import MultiAgentCartPole
from ray import tune
tune.register_env("env", lambda cfg: MultiAgentCartPole(cfg))
config.environment("env", env_config={"num_agents": 2})
config.multi_agent(
    policies={"p0", "p1"},
    policy_mapping_fn=lambda aid, *a, **kw: f"p{aid}",
)

为什么选择 RLlib?#

可扩展且容错

RLlib 工作负载沿多个轴进行扩展。

  • 要使用的 EnvRunner actor 的数量。这可以通过 config.env_runners(num_env_runners=...) 进行配置,使您能够扩展(模拟器)数据收集步骤的速度。此 EnvRunner 轴完全 容错,这意味着您可以对抗不稳定的或频繁中断执行的自定义环境进行训练,甚至可以将所有 EnvRunner actor 放在竞价实例上。

  • 用于 多 GPU 训练Learner actor 的数量。这可以通过 config.learners(num_learners=...) 进行配置,您通常将其设置为可用的 GPU 数量(请确保您也设置 config.learners(num_gpus_per_learner=1)),或者——如果您没有 GPU——您可以使用此设置来 在 CPU 上进行 DDP 风格的训练

多智能体强化学习 (MARL)

RLlib 原生支持多智能体强化学习 (MARL),从而允许您在任何复杂的配置中运行。

  • 独立 的多智能体学习(默认):每个智能体收集数据以更新其自身的策略网络,将其他智能体视为环境的一部分。

  • 协作 训练:训练一个智能体团队,该团队可以共享相同的策略(共享参数),或者其中一些智能体拥有自己的策略网络。您还可以根据需要,在团队的所有成员或其中的一些成员之间共享价值函数,从而允许优化全局与局部目标。

  • 对抗 训练:让智能体在竞争环境中与其他智能体对抗。使用自我对抗或基于联盟的自我对抗来训练智能体,使其学会如何在难度不断增加的各种阶段进行游戏。

  • 以上任意组合! 是的,您可以训练任意数量的智能体组成的团队,与其他团队进行对抗,每个团队中的智能体可能拥有单独的子目标,并且存在一组不参与任何竞争的中立智能体。

离线 RL 和行为克隆

Ray.Data 已集成到 RLlib 中,为离线 RL 和行为克隆 (BC) 工作负载启用 大规模数据摄入

有关行为克隆算法的基本 调整示例,请参见此处,有关如何 使用 BC 预训练策略,然后使用在线 PPO 进行微调,请参见此处。

支持外部环境客户端

通过自定义 RLlib 拥有的内部 gymnasium 环境到外部、TCP 连接的环境的 EnvRunner 逻辑,可以实现对外部连接的 RL 环境的支持,这些环境可以独立运行,甚至可以通过 ONNX 等执行自己的动作推理。

有关 RLlib 作为服务器,并连接外部环境 TCP 客户端的示例,请参见此处

了解更多#

RLlib 核心概念

详细了解 RLlib 的核心概念,如算法、环境、模型和学习器。

RL 环境

开始使用 RLlib 支持的环境,例如 Farama Foundation 的 Gymnasium、Petting Zoo 以及用于向量化和多智能体环境的许多自定义格式。

模型 (RLModule)

了解如何配置 RLlib 的默认模型,并通过 RLModule API 实现您自己的自定义模型,这些 API 支持使用 PyTorch 的任意架构、复杂的多个模型设置以及具有智能体之间共享组件的多智能体模型。

算法

请参阅 RLlib 提供的众多 RL 算法,用于在线和离线策略训练、离线和基于模型的 RL、多智能体 RL 等。

自定义 RLlib#

RLlib 提供了强大且易于使用的 API,用于自定义您的实验和生产训练工作流的各个方面。例如,您可以使用 Python 编写自己的 环境,使用 Farama Foundation 的 gymnasium 或 DeepMind 的 OpenSpiel,提供自定义 PyTorch 模型,编写自己的 优化器设置和损失定义,或者定义自定义 探索行为

../_images/rllib-new-api-stack-simple.svg

RLlib 的 API 堆栈: RLlib 构建在 Ray 之上,提供现成的、分布式的、容错的算法和损失函数、PyTorch 默认模型、多 GPU 训练和多智能体支持。用户通过子类化现有抽象来定制他们的实验。#

引用 RLlib#

如果 RLlib 有助于您的学术研究,Ray RLlib 团队鼓励您引用这些论文。

@inproceedings{liang2021rllib,
    title={{RLlib} Flow: Distributed Reinforcement Learning is a Dataflow Problem},
    author={
        Wu, Zhanghao and
        Liang, Eric and
        Luo, Michael and
        Mika, Sven and
        Gonzalez, Joseph E. and
        Stoica, Ion
    },
    booktitle={Conference on Neural Information Processing Systems ({NeurIPS})},
    year={2021},
    url={https://proceedings.neurips.cc/paper/2021/file/2bce32ed409f5ebcee2a7b417ad9beed-Paper.pdf}
}

@inproceedings{liang2018rllib,
    title={{RLlib}: Abstractions for Distributed Reinforcement Learning},
    author={
        Eric Liang and
        Richard Liaw and
        Robert Nishihara and
        Philipp Moritz and
        Roy Fox and
        Ken Goldberg and
        Joseph E. Gonzalez and
        Michael I. Jordan and
        Ion Stoica,
    },
    booktitle = {International Conference on Machine Learning ({ICML})},
    year={2018},
    url={https://arxiv.org/pdf/1712.09381}
}