Stable Baselines/用户向导/矢量化环境
矢量化环境是一种将多重独立环境堆叠成单一环境的方法。相比于每步在单一环境上训练RL智体,矢量化环境允许我们每步在n个环境上训练RL智体。因为这个原因,传递给环境的actions是一个n维环境,观察、奖励和事件约束信号也是一样的。类似Dict或Tuple这种非数组观测空间的case中,不同子空间有不同形状,子观测值为n维向量。
| Name |
Box
|Discrete
|Dict
|Tuple
| Multi Processing | | ——————- | ——- | ————— | ——— | ———- | ———————— | | DummyVecEnv | ✔️ | ✔️ | ✔️ | ✔️ | ❌️ | | SubprocVecEnv | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |当使用包装器进行帧堆叠或标准化时就需要矢量化环境
当使用矢量化环境,环境会在每集结束后自动重置。因此,当done[i]为真时第i次环境返回的观测值就成为下一环节的初始观测值,而非刚结束这部分的最后观测值。你可访问“real”终止章节的最终观测值-那就是,伴随潜在环境提供的done事件,用
vecenv
返回的info
字典中terminal_observation
键@@@惨不忍睹,我也没太看懂,后续懂了再来修改
警告:
当使用
SubprocVecEnv
,用户如果用forkserver
或spawn
启动方法(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 | 字符串 | 调用的环境方法 | | indices | list,int | 方法被调用的环境的索引 | | method_args | tuple | 调用中提供的任何位置参数 | | metho_kwargs | dict | 调用中提供的任何关键字参数 |
返回:环境的方法调用返回项的列表
get_attr(attr_name, indices=None)
从矢量化环境返回属性
| 参数 | 数据类型 | 意义 | | ————- | ———— | —————————————— | | attr_name | str | 值被返回的那个属性的名字 | | indices | list,int | 从中获取属性的哪些环境的索引 |
返回:所有环境中”attr_name”值的列表
get_images()
从每个环境中返回RGB图像
getattr_depth_check(name, already_found)
检查属性引用是否隐藏在对
__getattr__
的递归调用中。| 参数 | 数据类型 | 意义 | | ——————- | ———— | ————————————— | | name | str | 需检查那个属性的名字 | | already_found | bool | 是否已在包装器中找到此属性 |
返回:(str or None)属性被隐藏的模型名字(如果有被隐藏的话)
render(*args, **kwargs)
呈现Gym环境
| 参数 | 数据类型 | 意义 | | —— | ———— | ———— | | mode | str | 呈现类型 |
reset()
重置所有环境,返回一个观测数组或观测数组构成的元组。
如果
step_async
还在工作,该工作会被取消,在step_async()
被调用之前不再调用step_wait()
返回:([int] or [float])观测
set_attr(attr_name, value, indices=None)
设置矢量化环境内的属性
| 参数 | 数据类型 | 意义 | | ————- | ———— | —————————- | | attr_name | str | 被赋新值的属性名称 | | value | obj | 赋给attr_name的值 | | indices | list,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环境
| 参数 | 数据类型 | 意义 | | —— | ———— | ———— | | mode | str | 呈现类型 |
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环境
| 参数 | 数据类型 | 意义 | | —— | ———— | ———— | | mode | str | 呈现类型 |
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)
| 参数 | 数据类型 | 意义 | | —— | ———— | ———————— | | path | str | 载入文件夹的路径 |
reset()
重置所有环境
save_running_average(path)
| 参数 | 数据类型 | 意义 | | —— | ———— | ———————— | | path | str | 载入文件夹的路径 |
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)
| 参数 | 数据类型 | 意义 | | —— | ———— | ———————— | | path | str | 载入文件夹的路径 |
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)观测、奖励、完成、信息