外部环境和应用#

注意

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

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

在许多情况下,由 RLlib 来“步进”RL 环境是没有意义的。例如,如果你在具有自己执行循环的复杂模拟器(如游戏引擎或机器人模拟)中训练策略。一种自然且用户友好的方法是反转此设置——不是由 RLlib“步进”环境,而是允许模拟中的智能体完全控制自己的步进。一个外部的、由 RLlib 驱动的服务将可用于查询个体动作或接受批量样本数据。该服务负责训练策略的任务,但不限制模拟器每秒应该步进的时间和频率。

../_images/external_env_setup_client_inference.svg

具有客户端推理的外部应用:外部模拟器(例如游戏引擎)连接到 RLlib,RLlib 通过一个支持 TCP 的自定义 EnvRunner 作为服务器运行。模拟器会不时向服务器发送批量数据,并反过来接收权重更新。为了更好的性能,动作在客户端本地计算。#

为此,RLlib 提供了一个名为 RLlink外部消息协议,并提供了自定义 EnvRunner 类以通过 RLlink 与一个或多个客户端通信的选项。一个基于 TCP 的、使用 RLlink 的 EnvRunner 实现示例可在此处获取:https://github.com/ray-project/ray/blob/master/rllib/examples/envs/env_connecting_to_rllib_w_tcp_client.py。它还包含一个用于测试的虚拟(CartPole)客户端,可作为你的外部应用或模拟器如何使用 RLlink 协议的模板。

注意

在 RLlib 的新 API 栈上,外部应用支持仍在开发中。Ray 团队正在努力提供更多自定义 EnvRunner 实现示例(除了已有的基于 TCP 的实现)以及各种客户端非 Python 的 RLlib 适配器,例如用于流行的游戏引擎和其他模拟软件的适配器。

示例:外部客户端连接到基于 TCP 的 EnvRunner#

这里提供了一个使用 RLlink 的基于 TCP 的 EnvRunner 实现示例:https://github.com/ray-project/ray/blob/master/rllib/env/tcp_client_inference_env_runner.py。完整的端到端示例请参阅此处:https://github.com/ray-project/ray/blob/master/rllib/examples/envs/env_connecting_to_rllib_w_tcp_client.py

你可以随意修改自定义 EnvRunner 的底层逻辑,例如,可以实现一个基于共享内存的通信层(而不是基于 TCP 的通信层)。