跳转至

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 训练中是必要的优化。