Stable Baselines/用户向导/矢量化环境

本文档介绍了Stable Baselines库中的矢量化环境,它能将多个独立环境组合为一个,提高强化学习(RL)训练效率。讨论了如何在不同环境间同步操作,包括VecEnv抽象类、DummyVecEnv和SubprocVecEnv实现,以及帧堆叠和其他封装器如VecNormalize。注意使用时需考虑线程安全和环境同步问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Stable Baselines官方文档中文版 Github CSDN
尝试翻译官方文档,水平有限,如有错误万望指正

矢量化环境是一种将多重独立环境堆叠成单一环境的方法。相比于每步在单一环境上训练RL智体,矢量化环境允许我们每步在n个环境上训练RL智体。因为这个原因,传递给环境的actions是一个n维环境,观察、奖励和事件约束信号也是一样的。类似Dict或Tuple这种非数组观测空间的case中,不同子空间有不同形状,子观测值为n维向量。

NameBoxDiscreteDictTupleMulti Processing
DummyVecEnv✔️✔️✔️✔️❌️
SubprocVecEnv✔️✔️✔️✔️✔️

当使用包装器进行帧堆叠或标准化时就需要矢量化环境

当使用矢量化环境,环境会在每集结束后自动重置。因此,当done[i]为真时第i次环境返回的观测值就成为下一环节的初始观测值,而非刚结束这部分的最后观测值。你可访问“real”终止章节的最终观测值-那就是,伴随潜在环境提供的done事件,用vecenv返回的info字典中terminal_observation

@@@惨不忍睹,我也没太看懂,后续懂了再来修改

警告:

当使用SubprocVecEnv,用户如果用forkserverspawn启动方法(Windows中默认),需要将代码封装在if __name__=="__main__":。在Linux中,默认启动方法时fork,并不是线程安全的,可以创建死锁。

  • VecEnv

    class stable_baselines.common.vec_env.VecEnv(num_envs, observation_space, action_space)
    

    抽象异步,矢量化环境。

    参数:

    • num_envs - (int)环境的数量
    • observation_space - (Gym空间)观测空间
    • action_space - (Gym空间)行动空间

    函数:

    • close()
      

      清理环境资源

    • env_method(method_name, *method_args, indices=None, **method_kwargs)
      

      调用矢量化环境的实例方法。

      参数数据类型意义
      method_name字符串调用的环境方法
      indiceslist,int方法被调用的环境的索引
      method_argstuple调用中提供的任何位置参数
      metho_kwargsdict调用中提供的任何关键字参数

      返回:环境的方法调用返回项的列表

    • get_attr(attr_name, indices=None) 
      

      从矢量化环境返回属性

      参数数据类型意义
      attr_namestr值被返回的那个属性的名字
      indiceslist,int从中获取属性的哪些环境的索引

      返回:所有环境中"attr_name"值的列表

    • get_images() 
      

      从每个环境中返回RGB图像

    • getattr_depth_check(name, already_found)
      

      检查属性引用是否隐藏在对__getattr__的递归调用中。

      参数数据类型意义
      namestr需检查那个属性的名字
      already_foundbool是否已在包装器中找到此属性

      返回:(str or None)属性被隐藏的模型名字(如果有被隐藏的话)

    • render(*args, **kwargs)
      

      呈现Gym环境

      参数数据类型意义
      modestr呈现类型
    • reset()
      

      重置所有环境,返回一个观测数组或观测数组构成的元组。

      如果step_async还在工作,该工作会被取消,在step_async()被调用之前不再调用step_wait()

      返回:([int] or [float])观测

    • set_attr(attr_name, value, indices=None)
      

      设置矢量化环境内的属性

      参数数据类型意义
      attr_namestr被赋新值的属性名称
      valueobj赋给attr_name的值
      indiceslist,int被赋值环境的索引

      返回:(NoneType)

    • step(actions)
      

      使用给定行动逐步处理环境

      参数数据类型意义
      actions[int] or [float]行动

      返回:([int] or [float], [float], [bool], dict)观测、奖励、完成、信息

    • step_async(actions)
      

      告诉环境用给定动作开始逐步处理。调用step_wait()来获取此步的结果

      如果一个step_async运行已被挂起,你就不应调用step_async()

    • step_wait()
      

      等待step_async()执行的步

      返回:([int] or [float], [float], [bool], dict)观测、奖励、完成、信息

  • DummyVecEnv

    class stable_baselines.common.vec_env.DummyVecEnv(env_fns)
    

    为多环境创建矢量化封装器,在当前Python进程中,逐个调用序列中的环境。这对于像cartpole-v1这种计算简单的环境很有用,因为多进程或多线程的总开销超过了环境计算时间。这也可用于需要矢量化环境,但只用一个环境来训练的RL方法

    参数:

    • env_fns- ([Gym Environment])需矢量化的环境列表

    函数:

    • close()
      

      清理环境资源

    • env_method(method_name, *method_args, indices=None, **method_kwargs)
      

      调用矢量化环境的实例方法。

    • get_attr(attr_name, indices=None) 
      

      从矢量化环境返回属性(参见基类)

    • get_images() 
      

      从每个环境中返回RGB图像

    • render(*args, **kwargs)
      

      呈现Gym环境

      参数数据类型意义
      modestr呈现类型
    • reset()
      

      重置所有环境,返回一个观测数组或观测数组构成的元组。

      如果step_async还在工作,该工作会被取消,在step_async()被调用之前不再调用step_wait()

      返回:([int] or [float])观测

    • set_attr(attr_name, value, indices=None)
      

      设置矢量化环境内的属性(参见基类)

    • step_async(actions)
      

      告诉环境用给定动作开始逐步处理。调用step_wait()来获取此步的结果

      如果一个step_async运行已被挂起,你就不应调用step_async()

    • step_wait()
      

      等待step_async()执行的步

      返回:([int] or [float], [float], [bool], dict)观测、奖励、完成、信息

  • SubprocVecEnv

    class stable_baselines.common.vec_env.SubprocVecEnv(env_fns, start_method=None)
    

    为多种环境创建一个多进程矢量化封装器,为每个进程分配一个环境。当环境计算复杂时允许显著加速。

    基于性能考虑,如果你的环境没有IO限制,环境数量不应超过你CPU核数。

    警告:

    只有"forkserver"和"spawn"启动方法是线程安全的。当父类中使用TensorFlow绘画或其他非线程安全库时,这是非常重要的(参见issue#217)。然而,相比于"fork"他们的启动成本较低,并对全局变量有限制。用这些方法,用户必须将代码封装到if __name__=="__main__":更多信息,参见多进程文档

    参数:

    • env_fns- ([Gym Environment])需矢量化的环境列表
    • start_method - (str)启动子进程的方法。必须是 multiprocessing.get_all_start_methods()返回方法中的一种。在可用平台上默认’fork’,其他用’spawn’。

    函数:

    • close()
      

      清理环境资源

    • env_method(method_name, *method_args, indices=None, **method_kwargs)
      

      调用矢量化环境的实例方法。

    • get_attr(attr_name, indices=None) 
      

      从矢量化环境返回属性(参见基类)

    • get_images() 
      

      从每个环境中返回RGB图像

    • render(*args, **kwargs)
      

      呈现Gym环境

      参数数据类型意义
      modestr呈现类型
    • reset()
      

      重置所有环境,返回一个观测数组或观测数组构成的元组。

      如果step_async还在工作,该工作会被取消,在step_async()被调用之前不再调用step_wait()

      返回:([int] or [float])观测

    • set_attr(attr_name, value, indices=None)
      

      设置矢量化环境内的属性(参见基类)

    • step_async(actions)
      

      告诉环境用给定动作开始逐步处理。调用step_wait()来获取此步的结果

      如果一个step_async运行已被挂起,你就不应调用step_async()

    • step_wait()
      

      等待step_async()执行的步

      返回:([int] or [float], [float], [bool], dict)观测、奖励、完成、信息

  • Wrappers

    • VecFrameStack

      class stable_baselines.common.vec_env.VecFrameStack(venv, n_stack)
      

      用于向量化环境的帧堆积包装器

      参数:

      • venv - (VecEnv)需要被包装的矢量化环境

      • n_stacks - (int)用于堆叠的frames数量

      • close()
        

        清理环境资源

      • reset()
        

        重置所有环境

      • step_wait()
        

        等待step_async()执行的步

        返回:([int] or [float], [float], [bool], dict)观测、奖励、完成、信息

    • VecNormalize

      class stable_baselines.common.vec_env.VecNormalize(venv, training=True, norm_obs=True, norm_reward=True, clip_obs=10.0, clip_reward=10.0, gamma=0.99, epsilon=1e-08)
      

      一种矢量化环境的移动平均、标准化封装器。支持保存/载入移动平均。

      参数:

      • venv - (VecEnv)需要被包装的矢量化环境

      • training - (bool)是否更新移动平均

      • norm_obs - (bool)是否标准化观测(默认True)

      • norm_reward - (bool)是否标准化奖励(默认True)

      • clip_obs - (float)观测的最大绝对值

      • clip_reward - (float)折扣奖励的最大绝对值

      • gamma - (float)折扣因子

      • epsilon - (float)避免被0除

      • get_original_obs()
        

        返回非标准化观测

        返回:(numpy float)

      • load_running_average(path)
        
        参数数据类型意义
        pathstr载入文件夹的路径
      • reset()
        

        重置所有环境

      • save_running_average(path)
        
        参数数据类型意义
        pathstr载入文件夹的路径
      • step_wait()
        

        将动作序列应用到环境动作序列–>(观测、奖励、新信息)

        "new"是布尔因子,表明每个元素是否是新的。

    • VecVideoRecorder

      class stable_baselines.common.vec_env.VecVideoRecorder(venv, video_folder, record_video_trigger, video_length=200, name_prefix='rl-video')
      

      封装一个VecEnv或VecEncWrapper对象成mp4视频,以记录呈现的图像。它要求机器安装ffmpeg或avconv。

      参数:

      • venv - (VecEnv or VecEnvWrapper)

      • video_folder - (str)视频保存地址

      • record_video_trigger - (func)定义何时开始记录的函数。该函数接受当前的步骤数,并返回是否开始记录

      • video_length - (int)视频长度

      • name_prefix - (str)视频名称前缀

      • close()
        

        清理环境资源

      • load_running_average(path)
        
        参数数据类型意义
        pathstr载入文件夹的路径
      • reset()
        

        重置所有环境,返回一个观测数组或观测数组构成的元组。

        如果step_async还在工作,该工作会被取消,在step_async()被调用之前不再调用step_wait()

        返回:([int] or [float])观测

      • step_wait()
        

        等待step_async()执行的步

        返回:([int] or [float], [float], [bool], dict)观测、奖励、完成、信息

    • VecCheckNan

      class stable_baselines.common.vec_env.VecCheckNan(venv, raise_exception=False, warn_once=True, check_inf=True)
      

      默认情况下,矢量化环境的NaN和inf检查包装器会提出警告,让你知道NaN和inf源自何处。

      参数:

      • venv - (VecEnv)需封装的矢量化环境

      • raise_exception - (bool)是否提出ValueError,而不是UserWarning

      • warn_once - (bool)是否只是警告一次

      • check_inf - (bool)是否也检查+inf或-inf

      • reset()
        

        重置所有环境,返回一个观测数组或观测数组构成的元组。

        如果step_async还在工作,该工作会被取消,在step_async()被调用之前不再调用step_wait()

        返回:([int] or [float])观测

      • step_async(actions)
        

        告诉环境用给定动作开始逐步处理。调用step_wait()来获取此步的结果

        如果一个step_async运行已被挂起,你就不应调用step_async()

      • step_wait()
        

        等待step_async()执行的步

        返回:([int] or [float], [float], [bool], dict)观测、奖励、完成、信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值