Tune概述
本篇主要介绍Tune的使用向导,首先是Tune的运行框架(如下图),然后具体介绍实验配置信息(Training API、启动和自定义的trial)、Trailing特征(Tune的搜索空间、多次采样、GPU的使用、Trial的检测点和实验的恢复)、大数据的处理、输出结果的自动填充、日志和结果的可视化(自定义日志和自定义同步和上传命令)、Tune客户机API和Tune命令行。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GN1p39fS-1572334107360)(https://ray.readthedocs.io/en/releases-0.7.3/_images/tune-api.svg)]
Tune调度集群中进行多次实验。 每个trial都运行一个用户定义的Python函数或类,并通过Tune的Variant Generator的配置变量或用户指定的搜索算法进行参数化。 trial由实验调度员安排和管理。
关于实验调度和搜索算法请参考官网。
导包和初始化Ray
import ray
import ray.tune as tune
# 启动Ray
ray.init()
实验配置
本节将介绍修改代码以运行Tune所需的主要步骤:使用Training API并执行Tune实验。如需看实例源码,点击。
Training API
可以使用基于函数的API( the function-based API)或Trainable API进行训练。
Python函数需要具有以下签名:
def trainable(config, reporter):
"""
Args:
config (dict):搜索算法或者 variant generation.
reporter (Reporter): 报告器,Handle to report intermediate metrics to Tune.
"""
while True:
# ...
reporter(**kwargs)
上边的trainable(config, reporter)
函数是一个基于函数的API,这个函数名字可以任意命令,其中参数config
主要是用来训练时参数的传递,参数reporter主要是把训练标准传递给tune进行优化,报告用于调度,搜索或提前停止的指标。
Tune将在Ray actor进程中的单独线程上运行此函数。 请注意,此API不是可检查的,因为该线程永远不会将控制权返回给其调用者。
注意:如果你有一个想要训练的lambda函数,你需要先注册函数:tune.register_trainable(“lambda_id”,lambda x:...)
。 然后,您可以使用lambda_id
代替my_trainable
。更多请参考例子tune_mnist_keras 中的train_mnist函数或者hyperopt_example.py中的easy_objective函数。
传递给Tune的Python类需要子类ray.tune.Trainable,Trainable接口链接。除报告的指标外,Trainable和基于函数的API都具有自动填充指标。
基于类的calss-based API
class MyClass(Trainable):
def _setup(self):
self.saver = tf.train.Saver()
self.sess = ...
self.iteration = 0
def _train(self):
self.sess.run(...)
self.iteration += 1
def _save(self, checkpoint_dir):
return self.saver.save(
self.sess, checkpoint_dir + "/save",
global_step=self.iteration)
def _restore(self, path):
return self.saver.restore(self.sess, path)
Training的类MyClass(Trainable)
是基于类的Training API,类名可以任意的取,其中参数Trainable是ray.tune封装好的类,其中有函数_setup()
,_train()
,_save(checkpoint_dir)
,_restore(path)
是封装好的接口,在用的时候只需实现即可,Trainable还封装了其他函数如_log_result(result)
,_stop()
,_export_model(export_formats, export_dir)
等方法,更多信息看tune的API。
其中
_setup()
是初始化函数,在调用类时直接初始化,一般用作数据初始化等。
对一个可训练对象调用_train()
将执行一个训练的逻辑迭代。根据经验,一次训练(trial)调用执行时间应该足够长,以避免开销(即超过几秒),但要也足够短,以便定期报告进度(即最多几分钟)。
调用_save()
应该将可训练对象的训练状态保存到磁盘,而_restore(path)
应该将可训练对象恢复到给定的状态。
通常,当子类化Trainable时,只需要在这里实现_setup()
、_train
、_save
和_restore
。
注意 ,如果您不需要检查点/恢复功能,那么您也可以只向配置提供一个my_train(config, reporter)函数,而不是实现这个类。该函数将自动转换为该接口(没有检查点功能)。
启动实验
Tune提供了一个generates(生成器)和运行试验的run
函数。
ray.tune.run(run_or_experiment, name=None, stop=None, config=None,
resources_per_trial=None, num_samples=1, local_dir=None, upload_dir=None,
trial_name_creator=None, loggers=None, sync_function=None, checkpoint_freq=0,
checkpoint_at_end=False, export_formats=None, max_failures=3, restore=None,
search_alg=None, scheduler=None, with_server=False, server_port=4321,
verbose=2, resume=False, queue_trials=False, reuse_actors=False,
trial_executor=None, raise_on_failed_trial=True)
执行训练。
参数:
run_or_experiment (function|class|str|Experiment) -如果是function | class | str,
那么这就是要训练的算法或模型。 这可以指内置算法的名称(例如RLLib的DQN或PPO),
用户定义的Trainable函数或类,或者在tune注册表中注册的Trainable函数或类的字符串标
识符。 如果是Experiment,那么Tune将根据Experiment.spec执行训练。
name (str) – 实验名称。
stop (dict) – 停止条件。键可以是' train() '返回结果中的任何字段,以先到达的字段为准。
默认为空dict。
config (dic