赞
踩
强化学习系列文章
目录
4.2 从命令行中选择PyTorch或者Tensorflow
感受深度强化学习的最好方法之一是运行算法,看看它们在不同任务上的执行情况。“玩转”的代码库使小规模(本地)试验变得很容易,在本节中,我们将讨论运行它们的两种方法:从命令行或通过脚本中的函数调用。
“玩转”使用 spinup/run.py工具
。这是一个方便的工具,允许您从命令行轻松地启动任何算法(包含任何超参数选择)。它还充当用于监视训练了的策略和绘图的实用程序的薄包装器,尽管我们将不在此页上讨论该功能(有关详细信息,请参阅有关实验输出和绘图的页面)。
从命令行运行“玩转”算法的标准方法是:
python -m spinup.run [algo name] [experiment flags]
示例如下:
python -m spinup.run ppo --env Walker2d-v2 --exp_name walker
你应该知道的:
如果您正在使用ZShell: ZShell将方括号解释为特殊字符。“玩转”在命令行参数中使用了方括号;确保对它们进行转义,如果您想在缺省情况下转义它们,请尝试这里推荐的解决方案。
详细的快速指导:
- python -m spinup.run ppo --exp_name ppo_ant --env Ant-v2 --clip_ratio 0.1 0.2
- --hid[h] [32,32] [64,32] --act torch.nn.Tanh --seed 0 10 20 --dt
- --data_dir path/to/data
在 Ant-v2的Gym环境中
运行PPO,各种设置由标志控制。
默认情况下,PyTorch版本将运行(除了TRPO,因为“玩转”至今还没有PyTorch TRPO)。使用ppo_tf1替换Tensorflow版本的ppo。
clip_ratio、hid和act是设置一些算法超参数的标志。您可以为超参数提供多个值来运行多个实验。检查文档,查看可以设置哪些超参数(单击这里查看PPO文档)。
hid和act是为算法训练的神经网络设置隐藏大小和激活函数的特殊快捷标志。
seed标志为随机数生成器设置种子。深度强化学习算法有很大的差异,所以尝试多个种子来感受性能的变化。
dt标志确保保存目录名中有时间戳(否则没有,除非在spinup/user_config.py中设置FORCE_DATESTAMP=True)。
data_dir标志允许您设置结果的保存文件夹。默认值是由spinup/user_config中的DEFAULT_DATA_DIR设置的。它将是spinningup文件夹中的一个子文件夹数据(除非您更改它)。
保存目录名称基于exp_name和任何具有多个值的标志。在目录名中将出现一个简写,而不是完整标志。用户可以在标志后面的方括号中提供缩略词,如——hid[h];否则,缩略符就是标志的子字符串(clip_ratio变为cli)。为了说明这一点,运行clip_ratio=0.1、hid=[32,32]和seed=10时的保存目录为:
path/to/data/YY-MM-DD_ppo_ant_cli0-1_h32-32/YY-MM-DD_HH-MM-SS-ppo_ant_cli0-1_h32-32_seed10
使用PyTorch版本的一个算法,运行:
python -m spinup.run [algo]_pytorch
使用一个Tensorflow版本的算法,运行:
python -m spinup.run [algo]_tf1
如果在不使用_pytorch或_tf1的情况下运行python -m spinup.run [algo],运行器将在spinup/user_config.py中查找该算法的默认版本。
每个算法中的每个超参数都可以通过命令行直接控制。如果kwarg是算法的函数调用的有效关键字arg,则可以使用标志——kwarg为其设置值。要了解哪些关键字参数是可用的,可以查看文档页面中的算法,也可以尝试一下
python -m spinup.run [algo name] --help
查看文档字符串的读出。
你应该知道的:
值在使用之前通过eval()传递,因此可以直接从命令行描述一些函数和对象。例如:
python -m spinup.run ppo --env Walker2d-v2 --exp_name walker --act torch.nn.ELU
torch.nn.ELU作为激活函数。(Tensorflow等效:使--act tf.nn.elu运行ppo_tf1)
你应该知道的:
对于接受dict值的kwarg有一些很好的处理。而不是必须提供
--key dict(v1=value_1, v2=value_2)
你能提供:
--key:v1 value_1 --key:v2 value_2
得到相同的结果。
只需为给定的参数提供多个值,就可以启动多个实验,然后依次执行。(将对每种可能的价值组合进行实验。)
例如,要使用不同的随机种子(0、10和20)启动其他等价的运行,请执行:
python -m spinup.run ppo --env Walker2d-v2 --exp_name walker --seed 0 10 20
实验不能并行启动,因为它们消耗了足够的资源,同时执行几个实验无法得到加速。
一些标志受到特殊处理。
环境标志:
--env
,
--env_name
字符串。所有的“玩转”算法都实现为接受env_fn作为参数的函数,其中env_fn必须是一个构建强化学习环境副本的可调用函数。由于最常见的用例是Gym环境,但是,所有这些环境都是通过Gym.make(env_name)构建的,所以我们允许您在命令行中指定env_name(简称env),它将被转换为一个lambda函数,用于构建正确的健身房环境。
快捷键标志:
有些算法参数相对较长,我们为它们启用了快捷方式:
--hid
,
--ac_kwargs
:hidden_sizes
整数的列表。设置神经网络中隐藏层的大小(策略和值函数)。
--act
,
--ac_kwargs
:activation
tf操作。神经网络的激活函数在actor and critic中。
这些标志对所有当前的“玩转”算法都有效。
配置标志
这些标志不是任何算法的超参数,而是以某种方式改变实验配置。
--cpu
,
--num_cpu
如果设置了这个标志,那么实验就会启动这么多进程,每个cpu一个进程,通过MPI连接。有些算法适合这种并行化,但不是全部。如果尝试为不兼容的算法设置num_cpu > 1,将引发错误。您还可以设置--num_cpu auto,它将自动使用机器上可用的所有cpu。
--exp_name
字符串。实验名称。这用于为每个实验命名保存目录。默认是“cmd”+[算法名称]。
--data_dir
路径。设置此实验或实验集的基本保存目录。如果没有给出,将使用spinup/user_config.py中的DEFAULT_DATA_DIR。
--datestamp
bool类型,在实验保存目录的名称中包括日期和时间。
特定实验的结果(超参数配置的一次运行)存储在:
data_dir/[outer_prefix]exp_name[suffix]/[inner_prefix]exp_name[suffix]_s[seed]
这里:
只有在一次运行多个实验时才会包含后缀,而且它们只包含对不同实验之间不同的超参数的引用,随机种子除外。目标是确保类似实验的结果(共享除种子之外的所有参数)被分组在同一个文件夹中。
后缀是通过结合超参数的缩写和它们的值来构造的,其中的缩写是1)从超参数名自动构造的,或者2)由用户提供的。用户可以通过在kwarg标志后面使用方括号来提供速记。
例如,考虑:
python -m spinup.run ddpg_tf1 --env Hopper-v2 --hid[h] [300] [128,128] --act tf.nn.tanh tf.nn.relu
在这里,--hid标志被赋予一个用户提供的简写,h。--act标志没有被用户赋予简写,所以会自动为它构造一个。
在这种情况下产生的后缀是:
- _h128-128_ac-actrelu
- _h128-128_ac-acttanh
- _h300_ac-actrelu
- _h300_ac-acttanh
注意,h是由用户给出的。ac-act简写是由ac_kwargs:activation (act标志的真实名称)构造的。
你实际上不需要知道这个
每个单独的算法都位于一个文件spinup/algos/BACKEND/ALGO_NAME/ALGO_NAME.py中。这些文件可以直接在命令行中使用有限的一组参数运行(其中一些参数与可用于spinup
/run.py的参数不同)。不过,单个算法文件中的命令行支持基本上已经过时,因此不推荐使用这种方法来进行实验。
这个文档页面将不描述那些命令行调用,只描述通过spinup/run.py进行的调用。
每个算法都是作为python函数实现的,可以直接从“玩转”包导入,即:
>>> from spinup import ppo_pytorch as ppo
请参阅每个算法的文档页面,以获得可能的参数的完整说明。这些方法可以用来设置专门的自定义实验,例如:
- from spinup import ppo_tf1 as ppo
- import tensorflow as tf
- import gym
-
- env_fn = lambda : gym.make('LunarLander-v2')
-
- ac_kwargs = dict(hidden_sizes=[64,64], activation=tf.nn.relu)
-
- logger_kwargs = dict(output_dir='path/to/output_dir', exp_name='experiment_name')
-
- ppo(env_fn=env_fn, ac_kwargs=ac_kwargs, steps_per_epoch=5000, epochs=250, logger_kwargs=logger_kwargs)
在机器学习研究中,使用多个可能的超参数运行同一个算法通常很有用。用一种叫做“ExperimentGrid”的简单工具和“玩转”结合起来。
考虑一下spinup/examples/pytorch/bench_ppo_cartpole.py
中的例子:
| |
(在spinup/examples/tf1/bench_ppo_cartpole.py
中有一个等效的Tensorflow示例。)
在完成ExperimentGrid 对象的制作后,添加参数
eg.add(param_name, values, shorthand, in_name)
其中in_name强制在实验名称中出现一个参数,即使它在所有实验中具有相同的值。
添加完所有参数后,
eg.run(thunk, **run_kwargs)
通过将配置作为kwargs提供给函数thunk,在网格中运行所有实验(每个有效配置一个实验)。 ExperimentGrid.run
使用一个名为call_experiment的函数来启动thunk, **run_kwargs为call_experiment指定行为。有关详细信息,请参阅文档页面。
除了没有快捷的kwargs (ac_kwargs不能为ac_kwargs:hidden_sizes使用hid
在ExperimentGrid中),实验网格的基本行为与命令行运行是相同的。(事实上,spinup.run在幕后使用了一个 ExperimentGrid
。)
在这个部分我们介绍了:
你应该知道的:
“玩转”的实现目前无法恢复部分训练的智能体的训练。如果你认为这个特性很重要,请让我们知道——或者认为它是一个黑客项目!
每个算法的设置都是为了保存训练运行的超参数配置、学习进度、经过训练的agent和值函数,以及如果可能的话,环境的副本(以便于同时加载agent和环境)。输出目录包含以下内容:
pyt_save/ | 只有PyTorch实现。一个目录包含 一切都是为了恢复受过训练的智能体和值 函数。(PyTorch保存细节如下。) |
tf1_save/ | 只有Tensorflow实现。一个目录包含 一切都是为了恢复受过训练的智能体和值 函数。(Tensorflow详细信息保存在下面。) |
config.json | 一种字典,包含尽可能完整的描述 的用来启动训练的arg和kwarg 函数。如果你传入了一些不可能 序列化为JSON的东西,它应该可以很好地由 日志程序解决,且配置文件将用字符串表示它。 注:此仅用于记录保存。启动一个 目前不支持从配置文件启动实验。 |
progress.txt | 一个标签分隔的值文件,包含度量的记录 在整个培训过程中由记录器记录。例如,
|
vars.pkl | 一个pickle文件,包含算法状态的任何内容 应该被存储。目前,所有算法只使用 这个保存环境的一个副本。 |
你应该知道的:
有时,由于环境不能被腌制,且vars.pkl为空
,导致环境保存失败。在旧版本的Gym Box2D环境中,这是一个问题,它不能以这种方式保存。
你应该知道的:
从1/30/20开始,保存目录结构略有变化。之前,Tensorflow图保存在simple_save/文件夹中;这已经被替换为tf1_save/。
你应该知道的:
这里唯一一个你必须手动使用的文件是config.json
文件。我们的智能体测试程序将从tf1_save/或pyt_save/目录加载内容,绘图器将解释progress.txt的内容
,这些是与这些输出接口交互的正确工具。但是没有用于config.json
的工具——它就在那里,如果你忘记了你用什么超参数进行实验,你可以再次检查。
pyt_save
目录包含:
model.pt ——
用torch.save创建
的文件。本质上就是一个PyTorch nn.Module。加载它会恢复一个受过训练的智能体,作为一个ActorCritic对象带有一个act方法。
tf1_save
目录包含:
variables/——
包含Tensorflow存储程序输出的目录。请参阅Tensorflow SavedModel文档。
model_info.pkl——
包含信息的dict(从键到张量名的映射)这可以帮助我们在加载后解压保存的模型。
saved_model.pb——
协议缓冲区,用于Tensorflow SavedModel。
实验结果默认保存在与“玩转”包相同的目录中,保存在data文件夹中:
spinningup/ data/ ... docs/ ... spinup/ ... LICENSE setup.py
你能通过定义在spinup/user_config.py中的DEFAULT_DATA_DIR
改变默认的地址。
如果环境存储成功
对于环境与智能体一起被成功保存的情况,可以很容易地看到经过训练的智能体在环境中的行为,使用:
python -m spinup.run test_policy path/to/output_directory
这里有几个标志可以选择:
-l
L
,
--len
=L
,
default
=0
int.测试集/轨迹/推出的最大长度。缺省值为0意味着没有最大集长度——集只有在智能体在环境中达到终端状态时才会结束。(注意:设置L=0并不会阻止被TimeLimit包装器包装的Gym env是在达到预先设定的最大集长后结束。)
-n
N
,
--episodes
=N
,
default
=100
要为其运行智能体的测试集。
-nr
,
--norender
不要将测试片段呈现到屏幕上。在本例中,test_policy将只打印集返回值和长度。(用例:渲染器降低了测试过程的速度,而您只是想快速了解代理是如何执行的,因此不必特别关注它。)
-i
I
,
--itr
=I
,
default
=-1
int.这是一种特殊情况的选项,在这个包中,算法不支持这种情况,但是可以很容易地修改它。用例:有时候从训练中的许多不同的点观察训练过的代理是很好的(例如观察迭代50、100、150等)。日志记录器可以做到这一点——从这些不同的点保存代理的快照,以便以后可以运行和监视它们。在本例中,您使用此标志来指定要运行的迭代。但同样:自启动算法在默认情况下只保存最近代理的快照,覆盖旧的快照。
此标志的默认值表示“使用最新快照”。
要修改一个算法,使它产生多个快照,请找到下面一行(在所有算法中都有):
logger.save_state({'env': env}, None)
且调整为:
logger.save_state({'env': env}, epoch)
确保随后还将save_freq设置为合理的值(因为如果默认值为1,那么对于每个快照,您将用一个save
文件夹填充您的输出目录——这会增加得很快)。
-d
,
--deterministic
另一种特殊情况,只用于SAC。自旋SAC执行训练一个随机策略,但用动作分布的确定性均值来评估。test_policy将默认使用SAC训练的随机策略,但是您应该设置确定性标志来监视确定性均值策略(SAC的正确评估策略)。此标志不用于任何其他算法。
如果环境没有成功保存,那么可以预期test_policy.py将崩溃,其结果如下所示
Traceback (most recent call last): File "spinup/utils/test_policy.py", line 153, in <module> run_policy(env, get_action, args.len, args.episodes, not(args.norender)) File "spinup/utils/test_policy.py", line 114, in run_policy "and we can't run the agent in it. :( nn Check out the readthedocs " + AssertionError: Environment not found! It looks like the environment wasn't saved, and we can't run the agent in it. :( Check out the readthedocs page on Experiment Outputs for how to handle this situation.
在这种情况下,查看智能体的表现可能会有点痛苦,但也不是不可能,只要您可以轻松地重新创建环境。在IPython中尝试以下方法:
>>> from spinup.utils.test_policy import load_policy_and_env, run_policy >>> import your_env >>> _, get_action = load_policy_and_env('/path/to/output_directory') >>> env = your_env.make() >>> run_policy(env, get_action) Logging data to /tmp/experiments/1536150702/progress.txt Episode 0 EpRet -163.830 EpLen 93 Episode 1 EpRet -346.164 EpLen 99 ...
test_policy.py工具不能帮助您查看经过训练的值函数,如果您想使用这些值函数,就必须手工进行一些挖掘。对于PyTorch情况,用 torch.load
保存模型文件且检查每个算法的文档,以查看ActorCritic对象有哪些模块。对于Tensorflow来说,使用restore_tf_graph函数加载保存的计算图,并检查每个算法的文档,查看保存了哪些函数。
“玩转”与一个简单的绘图工具一同解释结果。运行该程序:
python -m spinup.run plot [path/to/output_directory ...] [--legend [LEGEND ...]] [--xaxis XAXIS] [--value [VALUE ...]] [--count] [--smooth S] [--select [SEL ...]] [--exclude [EXC ...]]
位置参数:
logdir
字符串。与您想要绘制的日志目录(或日志目录的前缀,绘图器将在内部自动完成)一样多。对于实验输出,将递归搜索Logdirs。
你应该知道的:
内部自动补全真的很方便!假设你做了几个实验,目的是比较不同算法的性能,得到的日志目录结构为:
data/ bench_algo1/ bench_algo1-seed0/ bench_algo1-seed10/ bench_algo2/ bench_algo2-seed0/ bench_algo2-seed10/
您可以很容易地产生比较algo1和algo2的图表:
python spinup/utils/plot.py data/bench_algo
依靠自动完成来找到data/bench_algo1和data/bench_algo2。
可选参数:
-l
,
--legend
=[LEGEND ...]
字符串。为绘图指定图例的可选方法。绘图仪图例将自动从config.json文件中
使用配置中的exp_name,除非你通过这个标志告诉它。只有在为每个要绘制的目录提供一个名称时,这种方法才有效。(注意:这可能与您提供的logdir参数数目不同!)回想一下,绘图器查找logdir参数的自动完成:对于给定的logdir前缀,可能有多个匹配项,您需要为每个匹配项提供一个图例字符串——除非您已经通过sele删除了其中的一些候选项。
-x
,
--xaxis
=XAXIS
,
default
='TotalEnvInteracts'
字符串。从数据中选择用于x轴的列。
-y
,
--value
=[VALUE ...]
,
default
='Performance'
字符串。从数据中选择要在y轴上绘制的列。提交多个值将生成多个图形。默认为Performance
,这不是任何算法的实际输出。相反,Performance
是指使用策略的算法的正确性能度量平均值(AverageEpRet)或非使用策略的算法的正确性能度量平均值(AverageTestEpRet)。绘图仪将自动找出AverageEpRet或AverageTestEpRet中的哪一个为每个单独的logdir报告。
--count
可选的标记。默认情况下,绘图器显示y值,这些值是共享exp_name的所有结果的平均值,通常是一组仅在随机种子中不同的相同实验。但如果你想单独看所有这些曲线,可以用--count标记。
-s
,
--smooth
=S
,
default
=1
int.通过在固定窗口上平均来平滑数据。这个参数表示平均窗口的宽度。
--select
=[SEL ...]
字符串。可选的选择规则:绘图器将只显示来自包含所有子字符串的logdirs的曲线。
--exclude
=[EXC ...]
字符串。可选排除规则:绘图仪将只显示来自不包含这些子字符串的logdirs的曲线。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。