示例#
此页面包含RLlib的examples文件夹中所有Python脚本的索引,演示了该库的不同用例和功能。
注意
RLlib目前正处于从旧API栈到新API栈的过渡状态。Ray团队已将大多数示例脚本转换为新栈,并将仍在使用旧栈的脚本标记为在顶部带有此注释行:# @OldAPIStack。将所有示例脚本迁移到新栈的工作仍在进行中。
注意
如果您发现任何新API栈的示例出现问题,或者您想在此页面上添加一个示例,请在RLlib GitHub仓库中创建一个issue。
文件夹结构#
下面的examples文件夹包含几个子目录,下面将详细介绍。
如何运行示例脚本#
大多数示例脚本都是自可执行的,这意味着您可以cd到相应目录,并直接使用Python运行脚本。
$ cd ray/rllib/examples/multi_agent
$ python multi_agent_pendulum.py --num-agents=2
使用--help命令行参数,每个脚本都会打印出它支持的命令行选项。
大多数脚本共享一组通用的、通常适用的命令行参数,例如--num-env-runners,用于扩展EnvRunner actor的数量;--no-tune,用于关闭与Ray Tune的运行;--wandb-key,用于记录到WandB;或--verbose,用于控制日志的详细程度。
所有示例子文件夹#
动作#
算法#
- 模型无关元学习(MAML)算法的自定义实现:
展示了如何在“无限任务”环境中稳定地训练模型,其中每个任务对应一个具有随机采样的幅度和相位的正弦函数。由于每个新任务都会引入数据分布的偏移,传统的学习算法将无法泛化。
- 自定义“原始策略梯度”(VPG)算法:
展示了如何从头开始编写一个非常简单的策略梯度
Algorithm,包括匹配的AlgorithmConfig,定义损失函数的匹配Learner,以及算法的training_step()实现。
- 自定义算法,具有一个全局共享的数据actor,用于将EnvRunners操纵的奖励发送到Learners:
展示了如何编写一个自定义的共享数据actor,该actor可以从算法的其他actor(如
EnvRunner和Learner)访问。新actor在每次采样的episode下以唯一的、每个episode的键存储操纵的奖励,然后将此信息提供给Learner,以便将这些奖励添加到训练批次中。
检查点#
- 按自定义标准检查点:
展示了如何基于自定义标准创建检查点,使用户能够控制模型快照在训练期间的保存时间。
- 从检查点继续训练:
演示了从保存的检查点恢复训练,这对于延长训练会话或从中断中恢复非常有用。
- 从检查点恢复N个代理中的1个:
从多代理检查点恢复一个特定的代理,允许选择性加载,适用于只需要某些代理恢复训练的环境。
连接器#
注意
RLlib的Connector API已在新API栈中从头开始重写。Connector-pieces和-pipelines现在被称为ConnectorV2,以区别于Connector类,后者仅在旧API栈上继续工作。
- 展平并one-hot化观测:
演示了如何对离散观测空间进行one-hot编码和/或展平复杂的观测,如Dict或Tuple,使RLlib能够将任意观测数据处理为展平的1D向量。适用于具有复杂、离散或分层观测的环境。
- 观测帧堆叠:
实现帧堆叠,其中N个连续帧堆叠在一起,为代理提供时间上下文。这种技术在状态连续变化的环境中很常见,例如雅达利游戏中的视频帧。使用连接器进行帧堆叠效率更高,因为它避免了将大型观测张量通过ray远程调用传输。
- 均值/标准差过滤:
为观测添加均值和标准差归一化,通过均值移位并除以标准差。这种类型的过滤可以通过将观测值缩放到归一化范围来提高具有高度可变状态幅度的环境的学习稳定性。
- 多代理观测预处理器,增强非马尔可夫观测到马尔可夫观测:
多代理预处理器增强了多代理环境中每个代理的观测,这些观测本身是非马尔可夫的、部分的观测,并通过添加来自其他代理的信息将其转换为马尔可夫观测。策略只能通过此附加信息才能最优地训练。
- 前一个动作、前一个奖励连接器:
用前一个动作和奖励增强观测,为代理提供短期内的历史事件记忆,这可以改善在部分可观察或顺序依赖任务中的决策。
- 单代理观测预处理器:
一个连接器将CartPole-v1环境的观测值从马尔可夫的4元组(x位置、角度位置、x速度、角度速度)更改为非马尔可夫的、更简单的2元组(仅x位置和角度位置)。由此产生的问题只能通过具有记忆/状态的模型来解决,例如LSTM。
好奇心#
- 基于计数的探索:
实现基于计数的内在动机,以鼓励探索访问较少的状态。在稀疏奖励环境中,探索好奇心是有益的,因为代理可能难以找到奖励路径。然而,基于计数的方法仅适用于观测空间较小的环境。
- 基于欧几里得距离的好奇心:
使用状态与初始状态之间的欧几里得距离来衡量新颖性,通过奖励代理到达环境的“遥远”区域来鼓励探索。适用于稀疏奖励任务,其中多样化探索是成功的关键。
- 基于内在好奇心模型(ICM)的好奇心:
添加了一个内在好奇心模型(ICM),该模型学习预测下一个状态以及两个状态之间的动作,以衡量新颖性。ICM的损失越高,“新颖性”就越高,内在奖励也越高。适用于观测空间大且奖励信号稀疏的复杂环境。
课程学习#
- 雅达利Pong的课程学习:
演示使用
frameskip为雅达利Pong进行课程学习,以增加任务的难度。这种方法实现了渐进式学习,允许代理在掌握更慢的反应(较低的frameskip)后再学习更快的反应(较高的frameskip)。另请参阅文档中的课程学习指南。
调试#
环境#
- 异步gym向量化,并行化子环境:
展示了如果您的RL环境速度较慢且您使用了
num_envs_per_env_runner > 1,gym_env_vectorize_mode配置设置如何显著加速您的EnvRunneractor。性能提升的原因是每个子环境都在自己的进程中运行。
- 自定义环境渲染方法:
演示了如何为(自定义)环境添加自定义的
render()方法,允许可视化代理交互。
- 自定义 gymnasium 环境:
从头开始实现自定义的gymnasium环境,展示了如何定义观测和动作空间、任意奖励函数以及step和reset逻辑。
- 环境通过tcp客户端连接到RLlib:
一个外部环境,在RLlib之外运行并充当客户端,连接到RLlib作为服务器。外部环境使用ONNX模型执行自己的动作推理,将收集到的数据发送回RLlib进行训练,并偶尔从RLlib接收模型更新。
- 环境渲染和录制:
说明了RLlib中的环境渲染和录制设置,捕获视觉输出来供以后查看(例如在WandB上),这对于跟踪训练中的代理行为至关重要。
- 具有protobuf观测的环境:
使用Protobuf进行观测,演示了处理环境中的序列化数据的先进方法。此方法对于集成复杂的外部数据源作为观测值非常有用。
评估#
容错#
- 崩溃和停止的环境:
模拟一个随机崩溃或停止的环境,允许用户测试RLlib的容错机制。此脚本对于评估RLlib如何处理中断和从训练中的意外故障中恢复非常有用。
用于训练和采样的GPU#
- Float16训练和推理:
配置用于float16训练和推理的设置,通过减少内存使用量和加速计算来优化性能。这对于兼容GPU上的大规模模型尤其有用。
- 每个Learner的Fractional GPU:
演示为单个Learner分配Fractional GPU,从而在多模型设置中实现更精细的资源分配。当训练许多可以安装在单个GPU上的小型模型时,有助于节省资源。
- 混合精度训练和float16推理:
在训练时使用混合精度(float32和float16),在推理时切换到float16精度,平衡了训练期间的稳定性和评估期间的性能改进。
- 在EnvRunners上使用GPU:
演示了
EnvRunner实例(单代理或多代理)如何通过config.env_runners(num_gpus_per_env_runner=..)设置请求GPU。
分层训练#
- 分层RL训练:
展示了一个受自动子目标发现和子策略专业化启发的层次化RL设置。一个高级策略在时间限制内选择子目标并将三个专业化的低级策略之一分配给它们,以实现这些子目标,从而鼓励专业化和高效的任务解决。代理需要导航一个复杂网格世界的环境。该示例通过在具有挑战性的、面向目标任务中展示显著提高的学习性能,突出了分层学习相对于扁平化方法的优势。
模型或策略的推理#
学习器#
- 自定义损失函数,简单:
实现自定义的训练损失函数,演示了用户如何为特定的环境或行为定义定制的损失目标。
- 自定义torch学习率调度器:
为PPO添加学习率调度,展示了如何使用PyTorch调度器动态调整学习率以提高训练稳定性。
- 值函数的独立学习率和优化器:
为值函数和策略网络配置独立学习率和独立优化器,从而实现RL算法中策略和值估计之间的差异化训练动态。
指标#
- 在Algorithm.training_step中记录自定义指标:
展示了如何在自定义
Algorithm中通过重写`:py:meth:``方法并在MetricsLogger实例中调用log_value()方法来记录自定义指标。
- 在EnvRunners中记录自定义指标:
演示了向
EnvRunneractor添加自定义指标,提供了一种跟踪标准RLlib指标以外的特定性能和环境指标的方法。
多代理RL#
- 自定义启发式策略:
在
MultiAgentCartPole环境中演示了混合策略设置,其中一个代理遵循手工编写的随机策略,而另一个代理使用PPO进行训练。此示例突出了集成静态和动态策略,适用于具有固定策略和自适应代理混合的环境。
- 不同代理的不同观测和动作空间:
在同一个环境中配置具有不同观测和动作空间的代理,展示了RLlib在单个多代理环境中对具有不同空间需求的异构代理的支持。另一个示例也利用了连接器,并且涵盖了相同的主题(代理具有不同的空间),可以在这里找到。
- 多代理CartPole:
运行CartPole环境的多代理版本,每个代理独立学习平衡其杆。此示例作为简单、独立任务中多代理强化学习场景的基础测试。
- 多代理Pendulum:
将经典的Pendulum环境扩展为多代理设置,其中多个代理尝试平衡各自的Pendulum。此示例突出了RLlib对具有复制动态但不同代理策略的环境的支持。
- PettingZoo独立学习:
将RLlib与PettingZoo集成,以促进多个代理之间的独立学习。每个代理在共享环境中独立优化其策略。
- PettingZoo参数共享:
使用PettingZoo用于所有代理共享单个策略的环境。
- PettingZoo共享值函数:
同样使用PettingZoo,此示例探索了代理之间的共享值函数。它演示了协作学习场景,其中代理集体估计一个值函数,而不是单独的策略。
- 石头剪刀布启发式 vs 学习:
模拟一个石头剪刀布游戏,其中一个代理由启发式驱动,另一个代理由学习驱动。它提供了在对抗性游戏中结合固定和自适应策略时的性能洞察。
- 石头剪刀布学习 vs 学习:
设置一个石头剪刀布游戏,您可以在其中训练两个代理学习如何相互对抗的策略。这对于评估简单对抗性设置中的性能非常有用。
- 自我对抗,基于联盟,使用OpenSpiel:
使用OpenSpiel演示基于联盟的自我对抗,代理与各种版本的自己(冻结的或正在训练的)进行对抗,通过竞争性互动来提高。
- 使用Footsies和PPO算法的自对抗:
使用Footsies环境(两人零和游戏)实现自对抗。此示例突出了RLlib连接到运行游戏引擎的外部二进制文件的能力,以及设置多代理自对抗训练场景。
- 使用OpenSpiel的自对抗:
与基于联盟的自对抗类似,但更简单。此脚本利用OpenSpiel进行两人游戏,允许代理在不构建复杂、结构化联盟的情况下通过直接的自我对抗来提高。
离线RL#
- 使用行为克隆(BC)训练,使用PPO进行微调:
结合了行为克隆预训练和PPO微调,提供了一个两阶段的训练策略。首先进行离线模仿学习,然后进行在线强化学习。
Ray Serve和RLlib#
- 使用Ray Serve和RLlib:
将RLlib与Ray Serve集成,展示如何将训练好的
RLModule实例部署为RESTful服务。此设置非常适合在生产环境中以基于API的交互方式部署模型。
Ray Tune和RLlib#
RLModules#
- 自定义CNN-based RLModule:
演示了一个自定义CNN架构,该架构实现为一个
RLModule,能够根据环境的视觉观测进行卷积特征提取。
- 自定义LSTM-based RLModule:
在
RLModule中使用自定义LSTM,允许处理时间序列,这对于具有顺序依赖性的部分可观测环境很有益。
- 通过配置将ModelV2迁移到RLModule:
展示了如何使用(旧API栈的)
AlgorithmConfig实例,将基于ModelV2的设置(旧API栈)迁移到新API栈的RLModule。
- 通过策略检查点将ModelV2迁移到RLModule:
通过直接加载策略检查点,将ModelV2(旧API栈)迁移到新API栈的
RLModule,从而在保留学习参数的同时,顺利过渡到新API栈。
- 预训练单代理策略,然后在多代理环境中训练:
演示了预训练单代理模型并将其迁移到多代理设置,这对于使用预训练策略初始化多代理场景很有用。
调优示例#
包含tuned_examples文件夹中的Python配置文件,您可以像这里描述的所有其他示例脚本一样运行它们,以运行不同算法和环境类型的调优学习实验。
例如,请看这个PPO的调优雅达利示例,它在大约5分钟内学会了解决Pong环境。您可以在一台拥有4个GPU和96个CPU的g5.24xlarge或g6.24xlarge机器上按如下方式运行它。
$ cd ray/rllib/tuned_examples/ppo
$ python atari_ppo.py --env=ale_py:ALE/Pong-v5 --num-learners=4 --num-env-runners=95
请注意,RLlib的每日或每周发布测试也使用此文件夹中的一些文件。
社区示例#
注意
此处列出的社区示例均指RLlib的旧API栈。
- Arena AI:
一个用于单/多代理智能的通用评估平台和构建工具包,具有RLlib生成的基线。
- 多代理强化学习中对抗性通信的出现:
使用图神经网络和RLlib训练多个合作和对抗性代理来解决“覆盖区域”问题,从而学会如何最好地通信或(在对抗性情况下)如何干扰通信(代码)。
- Flatland:
一个密集的交通模拟环境,包含 RLlib 生成的基线。
- GFootball:
使用 RLlib 设置 GFootball 多智能体版本的示例。
- mobile-env:
一个开放、极简的 Gymnasium 环境,用于无线移动网络中的自主协调。包含一个使用 Ray RLlib 进行 mobile-env 多智能体 RL 的示例笔记本。
- Neural MMO:
一个受大型多人在线 (MMO) 角色扮演游戏启发的**多智能体 AI 研究环境**——具有数千个智能体、多样化的技能系统、本地和全球经济、复杂的涌现社会结构以及临时性的高风险单人和团队冲突的自包含世界。
- NeuroCuts:
在类似 Bandit 的环境中,使用 RLlib / 多智能体构建数据包分类树的示例。
- NeuroVectorizer:
使用 RLlib 学习 C 和 C++ 代码中循环的最优 LLVM 向量化编译器指令的示例。
- Roboschool / SageMaker:
在 SageMaker 中使用 RLlib 训练机器人控制策略的示例。
- Sequential Social Dilemma Games:
使用多智能体 API 对几个**社会困境游戏**进行建模的示例。
- 用于 Ray 和 RLlib 单智能体 RL 的简单自定义环境:
使用 Ray 2.0 和 Tune 创建自定义环境并训练单智能体 RL。
- StarCraft2:
使用 RLlib / 多智能体在 StarCraft2 地图中进行训练的示例。
- Traffic Flow:
使用 RLlib / 多智能体优化混合自主交通模拟的示例。
博客文章#
注意
此处列出的博客文章均引用了 RLlib 旧的 API 堆栈。
- RLlib 的 Trajectory View API 及其注意力网络等:
描述 RLlib 新的“trajectory view API”以及它如何支持 GTrXL 注意力网络架构实现的博客。
- 在 Unity 游戏引擎中使用 RLlib 进行强化学习:
关于将 RLlib 与 Unity3D 游戏引擎连接以运行基于视觉和物理的 RL 实验的 How-To 指南。
- 在 TF 和 PyTorch 中实现 12 种深度 RL 算法的经验:
讨论 Ray 团队如何将 RLlib 的 12 种算法从 TensorFlow 移植到 PyTorch 以及从中获得的经验。
- 扩展多智能体强化学习:
关于多智能体 RL 及其在 RLlib 中设计的简要教程的博客文章。
- 使用 Keras 和 TensorFlow Eager 进行函数式 RL:
探索一种实现强化学习 (RL) 算法的函数式范例。