venv.py — ReconfigureSubprocEnv 扩展了 Gymnasium 的 `SubprocVe...¶
文件路径:
verl/experimental/vla/envs/libero_env/venv.py模块路径:verl.experimental.vla.envs.libero_env.venv
文件概述¶
ReconfigureSubprocEnv 扩展了 Gymnasium 的 SubprocVectorEnv,增加了动态重配置能力。在训练过程中,可以通过 IPC(进程间通信)动态改变子进程环境的任务和初始状态,而不需要销毁和重建环境进程。
核心设计问题¶
标准的 SubprocVectorEnv 创建后,每个子进程的环境就固定了。但在 VLA 训练中,我们需要:
- 在不同训练步骤切换不同的任务
- 从不同的初始状态开始
- 避免频繁创建/销毁进程的开销
关键代码¶
动态重配置¶
class ReconfigureSubprocEnv(SubprocVectorEnv):
"""支持运行时重配置的向量化子进程环境"""
def reconfigure(self, env_idx, new_config):
"""通过 IPC 管道发送重配置命令给子进程
Args:
env_idx: 要重配置的环境索引
new_config: 新的环境配置(任务ID、初始状态等)
"""
# 通过管道发送 "reconfigure" 命令
self.parent_pipes[env_idx].send(("reconfigure", new_config))
# 等待确认
result = self.parent_pipes[env_idx].recv()
return result
子进程处理¶
def _worker(pipe, env_fn, ...):
"""子进程的主循环
除了标准的 step/reset 命令外,
还处理 reconfigure 命令。
"""
env = env_fn()
while True:
command, data = pipe.recv()
if command == "step":
obs, reward, done, truncated, info = env.step(data)
pipe.send((obs, reward, done, truncated, info))
elif command == "reset":
obs, info = env.reset(**data)
pipe.send((obs, info))
elif command == "reconfigure":
# 动态重配置环境
env = reconfigure_env(env, data)
pipe.send("ok")
核心类/函数列表¶
| 名称 | 类型 | 说明 |
|---|---|---|
ReconfigureSubprocEnv |
类 | 可重配置的向量化环境 |
reconfigure |
方法 | 发送重配置命令 |
与其他模块的关系¶
- 被
LiberoEnv(libero_env.py)使用 - 继承自 Gymnasium 的
SubprocVectorEnv
小结¶
ReconfigureSubprocEnv 通过 IPC 管道实现了环境的动态重配置,避免了频繁创建/销毁进程的开销。这在需要频繁切换任务的 VLA 训练中是必要的优化。