Microsoft NNI 入门 —— Mnist样例运行内置Tunner算法

前四种TPE、Random、Anneal、Naive Evolution方法,比较容易,只需要修改config.yml文件,其余方法会在算法介绍中详细解释使用过程中遇到的问题:
NNI提供了几种最新的Tunner算法,以下是官方github文档对算法的解释和实验结果截图+除官方文档给出的步骤以外的步骤记录:
1、TPE:是一种sequential model-based optimization(SMBO,即基于序列模型优化)的方法。 SMBO 方法根据历史指标数据来按顺序构造模型,来估算超参的性能,随后基于此模型来选择新的超参。

Microsoft NNI 入门 —— Mnist样例运行内置Tunner算法_第1张图片
TPE

记得把config.yml设置参数gpuNum=1,即可使用GPU计算,否则默认是不会使用GPU的。

2、Random:在超参优化时,随机搜索算法展示了其惊人的简单和效果。 建议当不清楚超参的先验分布时,采用随机搜索作为基准。


Microsoft NNI 入门 —— Mnist样例运行内置Tunner算法_第2张图片
Random

3、Anneal:这种简单的退火算法从先前的采样开始,会越来越靠近发现的最佳点取样。 此算法是随机搜索的简单变体,利用了反应曲面的平滑性。 退火率不是自适应的。


Microsoft NNI 入门 —— Mnist样例运行内置Tunner算法_第3张图片
Anneal

4、Naive Evolution:朴素进化算法来自于大规模图像分类进化。 它会基于搜索空间随机生成一个种群。 在每一代中,会选择较好的结果,并对其下一代进行一些变异(例如,改动一个超参,增加或减少一层)。 进化算法需要很多次 Trial 才能有效,但它也非常简单,也很容易扩展新功能。


Microsoft NNI 入门 —— Mnist样例运行内置Tunner算法_第4张图片
Naive Evolution

5、SMAC: 基于 Sequential Model-Based Optimization (SMBO,即序列的基于模型优化方法)。 它会利用使用过的结果好的模型(高斯随机过程模型),并将随机森林引入到 SMBO 中,来处理分类参数。 SMAC 算法包装了 Github 的 SMAC3。 注意:SMAC 需要通过 nnictl package 命令来安装。
分别运行一下两个命令:
conda install gxx_linux-64 gcc_linux-64 swig
nnictl package install --name SMAC
即可成功安装。

(CentOS(Conda 4.5.4)上提示 ModuleNotFoundError: No module named '_regression' ,可能是之前安装的包影响了环境,直接新建了conda的虚拟环境,重新进行安装。)

Microsoft NNI 入门 —— Mnist样例运行内置Tunner算法_第5张图片
SMAC

  • 安装时候遇到的问题
  1. 使用nnictl package的时候,如果服务器网速不给力,SMAC很有可能安装失败,(如果可以直接使用pip中的smac包就好了)。
  2. SMAC成功安装以后,其中使用到的一个包SpaceConfig在我使用的conda(conda 5+,清华的源)中没有找到,因此安装失败,运行的时候会报错,使用pip install SpaceConfig手动安装这个包即可解决。
  3. 运行Mnist-annotation中的例子会失败,config中配置的useAnnotation=true,换成了mnist中的例子即可(查看了ERR觉得是这个元婴,但是并不确定),并且指定参数空间(SearchSpace)。
  4. SMAC不可以使用combine_params类型的参数文件。

TIPS:

  • 使用nnictl experiment show可以查到本次实验的编号id,可以找到log文件和一些配置文件、运行文件的位置,在调试的时候,非常有效,或者网页中查看日志文件,位置一般是:/home/XXX/nni/experiments/nptml4D,其中最后一个是随机id。
  • nnictl 可以同时运行多个实验,只要使用不同的端口,(如果可以把所有的实验都能用一个网页显示,选择不同id的实验查看是不是更方便?)nnictl create --config config.yml --port 8081,运行时候会生成id,此时需要对相应id的时候进行操作就需要直接加上id号:nnictl experiment show nptml4D即可。

6、Batch tuner: Batch Tuner 能让用户简单的提供几组配置(如,超参选项的组合)。 当所有配置都执行完后,Experiment 即结束。 Batch Tuner 仅支持 choice 类型。
searchSpacePath中定义搜索空间json文件,
searchSpacePath: search_space.json
注意: useAnnotation和searchSpacePath两个字段互斥,useAnnotation=True,searchSpacePath 字段必须被删除。useAnnotation 定义使用标记来分析代码并生成搜索空间。
使用了/mnist/例子中的的配置运行,运行后发生错误,查看log(experiment中有logPath),发现搜索空间的.json文件,必须要用combine_params

logPath

实验结果
Microsoft NNI 入门 —— Mnist样例运行内置Tunner算法_第6张图片
BatchTuner

7、Grid Search:网格搜索会穷举定义在搜索空间文件中的所有超参组合。 网格搜索可以使用的类型有 choice, quniform, qloguniform。 quniform 和 qloguniform 中的数值 q 具有特别的含义(不同于搜索空间文档中的说明)。 它表示了在最高值与最低值之间采样的值的数量。
实验运行时,第一次参数是uniform类型的,发现直接改成quniform,需要再加一个q的参数值,文档中有对q参数进行说明。
本次实验直接定义了 choice类型的数值,

Microsoft NNI 入门 —— Mnist样例运行内置Tunner算法_第7张图片
GridSearch

8、Hyperband:Hyperband 试图用有限的资源来探索尽可能多的组合,并发现最好的结果。 它的基本思路是生成大量的配置,并运行少量的步骤来找到有可能好的配置,然后继续训练找到其中更好的配置。


Microsoft NNI 入门 —— Mnist样例运行内置Tunner算法_第8张图片
Hyperband

9、Network Morphism:Network Morphism 提供了深度学习模型的自动架构搜索功能。 每个子网络都继承于父网络的知识和形态,并变换网络的不同形态,包括深度,宽度,跨层连接(skip-connection)。 然后使用历史的架构和指标,来估计子网络的值。 最后会选择最有希望的模型进行训练。

Microsoft NNI 入门 —— Mnist样例运行内置Tunner算法_第9张图片
Network Morphism

由于计算资源受限,因此目前还没有跑出完整的结果,但是可以看到最高的得分0.91,最低的0.88。
安装过程中,pytorch版本的样例代码中,from network_morphism import utils,这样会报错,选择/nni/examples/trials,运行代码即可。后续文档希望可以晚上一下~
在运行cifar的程序过程中,由于网速太慢,可能会出现Time out的错误。
运行过程中出现BrokenPipeError: [Errno 32] Broken pipe,由于nni 0.4.1之前的版本有一些错误,所以出现错误,可以根据nni中issue解决-->ISSUE。我直接删除了调用的包中的相关语句,或者安装高版本的nni。
10、Metis Tuner:大多数调参工具仅仅预测最优配置,而 Metis 的优势在于有两个输出:(a) 最优配置的当前预测结果, 以及 (b) 下一次 Trial 的建议。 它不进行随机取样。 大多数工具假设训练集没有噪声数据,但 Metis 会知道是否需要对某个超参重新采样。
Microsoft NNI 入门 —— Mnist样例运行内置Tunner算法_第10张图片
Metis Tuner

默认配置下没有找到比较好的配置的结果。
简单分析:

算法 最高分数 最低分数 >0.80次数 >0.90次数 >0.95次数 总次数
TPE 0.9834 0.0958 7 5 3 10
Random 0.9823 0.0982 3 3 2 10
Anneal 0.9837 0.0892 2 2 2 10
Naive Evolution 0.9692 0.0958 2 1 1 10
Batch Tuner 0.9877 0.1135 3 3 2 6
Grid Search 0.988 0.0892 343 274 162 600
SMAC 0.9733 0.098 5 4 1 10
Hyperband 0.9831 0.0958 5 5 4 10

(使用NNI的Mnist-annotation例子分析,不同tuner算法的NNI WebUI的训练结果界面截图图像(以tuner命名),简单总结结果)

你可能感兴趣的:(Microsoft NNI 入门 —— Mnist样例运行内置Tunner算法)