跳转至

PlugRL

PlugRL 是一套面向分布式强化学习实验的基础设施。训练端与环境端通过统一协议解耦。

Note: PlugRL 是一组可插拔的 Python 包。你的 env、policy、algorithm 可以放在自己的包里,只要在使用侧 import 并完成注册。

快速开始

两个进程:训练端持有策略,环境端跑环境并向它请求动作。下面这一对真的会学 —— FPO + HalfCheetah-v5,纯 CPU,不需要 GPU,也不需要下载任何资源文件。

# 终端 1 —— 训练端
plugrl-run-server fpo-policy default fpo default \
    --port 8000 --policy.device cpu \
    --algo.global-steps 500000 --algo.buffer-size 4096

# 终端 2 —— 环境端
plugrl-run-env-client mujoco-v1 \
    --server-host 127.0.0.1 --server-port 8000 \
    --num-envs 1 --num-episodes 600 --runner.replan-steps 1 --runner.seed 0

HalfCheetah-v5 的观测是 17 维、动作是 6 维,正好是 fpo-policy 的默认值, 所以不需要任何配置。环境端需要 plugrl-env-client[mujoco]

episode 回报从 -300 附近起步。三个随机种子里,到第 2 万步仍有种子会掉回 -300 区间, 均值在约 6 万步处越过零点,到 50 万步达到 1928 ± 224 —— 在做这次测量的纯 CPU 机器上大约一百分钟。最初几分钟全是噪声,要按几万步的尺度看,而不是看屏幕上 最先出现的那几行。曲线、种子与日志:E6

--algo.buffer-size 不是装饰

FPO 在 rollout buffer 填满时、或运行到最后一步时才学习。按默认的 buffer_size=983040,任何少于约一百万步的运行只会在最后学一次 —— 你得到的是一个点,不是一条曲线。

只想确认能连通?

plugrl-run-server dummy-policy default dummy default
plugrl-run-env-client dummy-v1 --num-episodes 2 --server-host 127.0.0.1 --server-port 8000

dummy 算法的 learn 是一个 sleep,不会移动任何权重。它用来确认两端能对话, 不是用来训练的。

验证

  • server 打印 WebSocket 监听地址
  • env client 打印 server 元信息(策略名、动作形状)并开始跑 episode
  • fpo 时,server 的指标表里 rollout/reward 会上升

真实 VLA,端到端

同样的两个进程也能承载一个完整尺寸的 pi0.5:环境端步进 LIBERO,服务端返回动作, FPO 用回传的反馈训练。边界本身没有任何改动,变的只是策略。

作为对照,未经微调的 checkpoint 在 libero_spatial 上 99/100、在 libero_10 上 185/200,与 openpi 公布的 98.8 与 92.4 一致;而且服务端记录的回合数与步数和客户端 逐一相等——正是这一条说明传输层没有悄悄丢掉任何东西。

强化学习的结果是负面的。 在最难的那个任务上,一轮 FPO 把成功率从 26/50 打到 0/50;而且这次训练并不完整,10 轮只跑完 1 轮——第二次 learn 装不下,它要和第一次 分配的优化器状态挤在同一张 24 GB 卡上。预测是预注册的,其中一条被证伪。数字、两个 进程各自被记录下来的环境,以及这些数据不能支持的结论,见 E11

组件

  • plugrl-server:训练端,负责算法、策略、checkpoint、指标追踪
  • plugrl-env-client:环境端,负责创建环境并采集 rollout
  • plugrl-protocol:协议与序列化层,WebSocket 与 msgpack

前两者之间的边界就是通信协议,而且它是被写下来的而非 默认的:环境端不必是 Python,也不必是这个代码库。

常用参数

  • env client 通过 --server-host--server-port 连接 server
  • --num-procs 可以起多个环境端进程连同一个 server

关于 plugrl-run-server-ray

确实有一个基于 Ray 的启动器,但目前不是受支持的路径。它需要 dppo extra;它用本机的 GPU 数构建 worker 列表,所以即使 Ray 连上多节点集群 也只看得见头节点;而且它的服务端说的是比 WebSocket 版更旧的协议方言, 见 SPEC.md 第 5.3 节。 除非你就是在改 Ray 这条路径,否则请用 plugrl-run-server

下一步