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

注意

Ray 2.40 默认使用 RLlib 的新 API 栈。Ray 团队已基本完成将算法、示例脚本和文档迁移到新代码库。

如果你仍在使用旧的 API 栈,请参阅新 API 栈迁移指南了解如何迁移的详细信息。

../_images/rllib-logo.png

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

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

行业领导者在许多不同的垂直领域使用 RLlib 进行生产部署,例如游戏机器人金融气候和工业控制制造和物流汽车以及船只设计

60 秒了解 RLlib#

../_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())

在你的脚本结束时,你评估训练好的 Algorithm 并释放其所有资源

# ... 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 的数量(以及其他许多设置)来从环境中收集样本。EnvRunner 这一轴是完全容错的,这意味着你可以针对不稳定或频繁卡顿的自定义环境进行训练,甚至可以将所有的 EnvRunner actor 放在 spot 机器上。

你还可以通过调整 RLlib 的 DefaultModelConfig 来修改使用的 NN 架构,并通过 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 放在 spot 机器上。

  • 用于多 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 进行微调的示例

支持外部环境客户端

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

这里有一个 RLlib 作为服务器与外部环境 TCP 客户端连接的示例

了解更多#

RLlib 核心概念

了解更多关于 RLlib 的核心概念,例如算法、环境、模型和学习器。

RL 环境

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

模型 (RLModule)

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

算法

查看 RLlib 支持的众多 RL 算法,包括同策略和异策略训练、离线和基于模型的 RL、多智能体 RL 等等。

定制 RLlib#

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

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

RLlib 的 API 栈:构建在 Ray 之上,RLlib 提供了现成的、分布式和容错的算法及损失函数、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}
}