备注
Ray 2.10.0 引入了 RLlib 的“新 API 栈”的 alpha 阶段。Ray 团队计划将算法、示例脚本和文档迁移到新的代码库中,从而在 Ray 3.0 之前的后续小版本中逐步替换“旧 API 栈”(例如,ModelV2、Policy、RolloutWorker)。
然而,请注意,到目前为止,只有 PPO(单代理和多代理)和 SAC(仅单代理)支持“新 API 堆栈”,并且默认情况下继续使用旧 API 运行。您可以继续使用现有的自定义(旧堆栈)类。
请参阅此处 以获取有关如何使用新API堆栈的更多详细信息。
示例#
本页面包含 RLlib 的 示例文件夹 中所有 Python 脚本的索引,展示了该库的不同用例和功能。
备注
RLlib 目前正处于从“旧API堆栈”向“新API堆栈”的过渡状态。这里的一些示例尚未被翻译到新堆栈,并且在顶部标记有以下注释行:# @OldAPIStack
。所有示例脚本迁移到“新API堆栈”的工作正在进行中,预计将在2024年底完成。
备注
如果任何新API堆栈示例被破坏,或者如果您想向此页面添加示例,请随时在 RLlib的github仓库 上提出问题。
文件夹结构#
示例文件夹 被结构化为几个子目录,其所有内容将在下面详细描述。
如何运行示例脚本#
大多数示例脚本是自执行的,这意味着你可以直接 cd
进入相应的目录,并使用 python 运行脚本:
$ cd ray/rllib/examples/multi_agent
$ python multi_agent_pendulum.py --enable-new-api-stack --num-agents=2
使用 --help
命令行参数,让每个脚本打印出其支持的命令行选项。
大多数脚本共享一个通用的、普遍适用的命令行参数子集,例如 --num-env-runners
、--no-tune
或 --wandb-key
。
所有子文件夹#
算法#
- 如何编写一个结合在线和离线策略训练的自定义 Algorith.training_step() 方法:
如何重写
training_step()
方法以并行训练两种不同的策略(也使用多智能体API)的示例。
检查点#
- 如何使用一个或多个自定义标准从 n Tune 试验中提取检查点。:
如何在使用
Tuner.fit()
后根据一些自定义标准找到 检查点 的示例。
连接器#
备注
RLlib 的连接器 API 已为新的 API 堆栈 () 从头开始重写。连接器组件和管道现在被称为 ConnectorV2`(相对于仅在旧 API 堆栈 |old_stack| 上继续工作的 ``Connector`
)。
- 如何堆叠Atari图像观察:
一个使用Atari帧堆叠的例子,以非常高效的方式进行,不是在环境中(作为
gym.Wrapper
),而是通过使用EnvToModule
和LearnerConnector
管道实时堆叠观察结果。这种帧堆叠方法更高效,因为它避免了必须通过网络(ray)发送大的观察张量。
- 如何使用均值/标准差过滤观测值:
一个
ConnectorV2
的示例,它使用简单的均值/标准差过滤器(通过均值平移并除以标准差)过滤来自环境的所有观察值。这个示例展示了有状态的ConnectorV2
类如何将其状态(这里是个体观察项的均值和标准差)从不同的EnvRunner
实例中 a) 合并到一个公共状态中,然后 b) 再次广播回远程的EnvRunner
工作者。
- 如何在RLModule输入中包含先前的动作和/或先前的奖励:
一个
ConnectorV2
的例子,它将前 n 个动作和/或前 m 个奖励添加到 RLModule 的输入字典中(用于执行其前向传递,无论是推理还是训练)。
- 如何在嵌套动作空间中训练:
在任意嵌套的动作空间中学习,使用一个环境,其中动作空间等于观察空间(两者都是复杂、嵌套的字典),策略必须选择与之前看到的观察结果紧密匹配(或相同)的动作。
- 如何使用嵌套的观察空间进行训练:
在任意嵌套的观测空间中学习(使用带有嵌套字典观测空间的 CartPole-v1 变体)。
课程学习#
- 如何使用自定义回调API设置课程学习:
如何使环境通过不同难度级别(从简单到更难解决)的示例,从而帮助学习算法应对原本无法解决的任务。另请参阅文档中的 课程学习指南。
调试#
- 如何使用确定性/可重现的设置训练RLlib算法:
示例展示了如何使用种子设定以确定性、可重复的方式训练 RLlib 算法。
环境#
- 如何注册一个自定义的gymnasium环境:
示例展示了如何使用
gymnasium
编写自己的 RL 环境,并将其注册以使用 RLlib 针对此环境训练您的算法。
- 如何在训练期间使用 WandB 设置环境的轨迹渲染(和录制):
示例展示了如何渲染和记录你的gymnasium环境中的剧集轨迹,并将视频记录到WandB。
- 如何在本地运行Unity3D多代理环境:
如何设置一个针对本地运行的 Unity3D 编辑器实例的 RLlib 算法以学习任何 Unity3D 游戏(包括多智能体支持)的示例。使用此示例尝试操作,并在编辑器中实时观看游戏和学习进度。提供一个已编译的游戏,此示例还可以在
num_env_runners > 0
的情况下以分布式方式运行。对于更重量级、分布式、基于云的示例,请参见下面的Unity3D 客户端/服务器
。
- 如何使用Unity3D客户端/服务器设置运行:
如何在云中设置 n 个分布式 Unity3D(编译)游戏,这些游戏作为数据收集客户端,针对一个中央 RLlib 策略服务器,学习如何玩游戏。n 个分布式客户端本身可以是外部/人类玩家的服务器,并允许控制完全掌握在 Unity 实体手中,而不是 RLlib。注意:使用 Unity 的 MLAgents SDK(>=1.0),并支持所有提供的 MLAgents 示例游戏和多代理设置。
- 如何使用CartPole客户端/服务器设置运行:
简单 CartPole 策略的预测在线服务示例。
评估#
- 如何使用自定义评估函数运行评估:
如何编写一个自定义的评估函数,该函数将替代默认行为,即通过设置的评估工作线程运行n个回合。
- 如何在训练过程中并行运行评估:
示例展示了评估工作者和“普通”回滚工作者如何(在一定程度上)并行运行以加速训练。
GPU(用于训练和采样)#
- 如何使用分数GPU进行RLModule训练:
如果你的模型很小,可以轻松地放在单个GPU上,并且你希望因此同时训练其他模型以节省时间和成本,这个脚本展示了如何使用学习者(模型训练)端的部分GPU数量来设置你的RLlib配置。
分层训练#
- 如何设置层次化训练:
使用多智能体API进行分层训练的示例。
推理(模型/策略)#
- 如何使用已经训练好的策略进行推理:
如何在已经训练好的策略上执行推理(计算动作)的示例。
- 如何使用已经训练好的(LSTM)策略进行推理:
如何在已经训练好的(LSTM)策略上执行推理(计算动作)的示例。
- 如何使用已经训练好的(注意力)策略进行推理:
如何在已经训练好的(注意力)策略上执行推理(计算动作)的示例。
指标#
- 如何在 RLlib 中编写自己的自定义指标和回调:
如何将自定义训练指标输出到 TensorBoard 的示例。
多智能体强化学习#
- 如何设置独立的多个代理训练:
设置 RLlib 以在(独立的)多智能体模式下运行任何算法,针对多智能体环境。
- 如何设置共享参数的多智能体训练:
设置 RLlib 以在(共享参数)多智能体模式下运行任何算法,针对多智能体环境。
- 如何在石头剪刀布游戏中比较启发式策略与训练策略 和 石头剪刀布训练策略对训练策略:
在石头剪刀布环境中,两种不同的启发式和学习策略相互竞争的两个例子。
- 如何在多智能体环境中使用智能体分组(两步游戏):
在多智能体环境中如何使用智能体分组的示例(来自 QMIX 论文 的两步游戏)。
- 如何在PettingZoo环境中设置多智能体训练:
如何在 PettingZoo 多智能体环境中使用 RLlib 进行学习的示例。
- 如何手动编码一个(启发式)策略:
运行自定义手动编码策略与可训练策略并行的示例。
- 如何训练一个控制多个代理的单一策略(权重共享):
在两个不同策略之间定义权重共享层的示例。
- 如何编写和设置一个集中式评论家模型:
自定义PPO以利用集中值函数的示例。
- 如何在环境中使用集中式评论家编写和设置模型:
通过将全局信息添加到代理观察中来实现集中式评论家的更简单方法。
- 如何使用多智能体API将多个算法组合成一个:
DQN 和 PPO 之间交替训练的示例。
离线强化学习#
- 如何使用CQL运行一个离线RL实验:
示例展示了如何使用历史数据JSON文件运行离线RL训练任务。
- 如何从环境中保存经验以用于离线强化学习:
如何在RLlib兼容的格式中外部生成经验批次示例。
Ray Serve 和 RLlib#
- 如何使用训练好的 RLlib 算法与 Ray Serve
此脚本提供了一个简单的流程,用于 1) 首先使用 RLlib 训练策略,2) 创建新策略 3) 从训练的策略中恢复其权重,并使用 Ray Serve 提供新策略。
Ray Tune 和 RLlib#
- 如何定义一个自定义进度报告器并在 Ray Tune 和 RLlib 中使用它:
如何编写自己的进度报告器(用于多智能体实验)并与 Ray Tune 和 RLlib 一起使用的示例。
- 如何在 Ray Tune 和 RLlib 中定义并接入自定义日志记录器:
如何在 RLlib 中设置自定义 Logger 对象并将其与 Ray Tune 一起使用。
- 如何自定义调优实验:
如何使用RLlib在自定义训练和评估阶段运行自定义Ray Tune实验。
RLModules#
- 如何配置一个自回归动作分布:
使用自回归动作分布进行学习(例如,两个动作组件,其中第二个组件的分布取决于第一个组件的实际采样值)。
- 如何使用参数化动作进行训练:
如何处理可变长度或参数化动作空间的示例。
- 如何在RLlib中使用“重复”空间处理可变长度的观察:
如何使用 RLlib 的
Repeated
空间来处理可变长度的观测。
- 如何编写自定义Keras模型:
使用自定义 Keras 模型的示例。
- 如何使用监督损失注册自定义模型:
定义和注册带有监督损失的自定义模型的示例。
- 如何使用批量归一化进行训练:
在自定义模型中添加批量归一化层的示例。
- 如何使用自定义API编写自定义模型:
展示了如何在 RLlib 中定义自定义模型 API,以便在某些算法中使用。
- 如何编写一个利用模型的“轨迹视图API”:
一个关于模型如何使用轨迹视图API来指定其自身输入的示例。
- 如何将 MobileNetV2 封装到你的 RLlib 模型中:
tf.keras.applications.mobilenet_v2.MobileNetV2
和torch.hub (mobilenet_v2)
包装示例模型的实现。
- 如何设置可微分神经计算机:
DeepMind 的可微分神经计算机的示例,用于部分可观测环境。
调整示例#
tuned examples 文件夹包含 python 配置文件(旧 API 堆栈为 yaml 格式),这些文件可以类似地执行此处描述的所有其他示例脚本,以便为不同的算法和不同环境类型运行调整后的学习实验。
例如,请参见这个针对PPO的调整后的Atari示例,它在大约5分钟内学会了解决Pong环境。可以在具有4个GPU和96个CPU的单个g5.24xlarge(或g6.24xlarge)机器上这样运行:
$ cd ray/rllib/tuned_examples/ppo
$ python atari_ppo.py --env ALE/Pong-v5 --num-gpus=4 --num-env-runners=95
请注意,此文件夹中的一些文件也用于 RLlib 的每日或每周发布测试。
社区示例#
- Arena AI:
一个用于单/多智能体智能的通用评估平台和构建工具包,带有由RLlib生成的基线。
- 多智能体强化学习中对抗性通信的涌现:
使用图神经网络和RLlib来训练多个合作和对抗的智能体,以解决“覆盖区域”问题,从而学习如何最好地进行通信(或在对抗情况下如何干扰通信)(代码).
- Flatland:
一个密集交通模拟环境,带有RLlib生成的基线。
- mobile-env:
一个开放、极简的 Gymnasium 环境,用于无线移动网络中的自主协调。包含一个使用 Ray RLlib 进行多智能体强化学习的示例笔记本。
- Neural MMO:
一个受大型多人在线(MMO)角色扮演游戏启发的多智能体AI研究环境——自成一体的世界,每个持久宏观宇宙中包含数千个智能体,多样化的技能系统,本地和全球经济,复杂的新兴社会结构,以及临时的高风险单人和团队冲突。
- NeuroCuts:
使用 RLlib / 多智能体在类似强盗的环境中构建数据包分类树的示例。
- NeuroVectorizer:
使用 RLlib 学习 C 和 C++ 代码中循环的最佳 LLVM 向量化编译器杂注的示例。
- Roboschool / SageMaker:
在 SageMaker 中使用 RLlib 训练机器人控制策略的示例。
- 使用Ray和RLlib的单个RL的简单自定义环境:
使用 Ray 2.0 和 Tune 创建自定义环境并训练单个代理的强化学习。
- StarCraft2:
在 StarCraft2 地图上使用 RLlib / 多智能体进行训练的示例。
- 交通流量:
使用 RLlib / 多智能体优化混合自主交通模拟的示例。
博客文章#
- 使用 RLlib 的 Trajectory View API 实现注意力网络及其他:
描述 RLlib 新“轨迹视图 API”的博客,以及它如何实现 GTrXL(注意力网络)架构的实现。
- 在Unity游戏引擎中使用RLlib进行强化学习:
关于如何将 RLlib 与 Unity3D 游戏引擎连接以运行基于视觉和物理的 RL 实验的指南。
- 在TF和PyTorch中实现12个深度RL算法的经验教训:
关于Ray团队如何将RLlib的12种算法从TensorFlow移植到PyTorch以及所学到的教训的讨论。
- 扩展多智能体强化学习:
关于多智能体强化学习及其在 RLlib 中设计的简短教程的博客文章。
- 使用 Keras 和 TensorFlow Eager 进行功能性强化学习:
探索实现强化学习(RL)算法的功能范式。