NNI否决指标,nni指标什么意思
简介NNI是微软的开源自动参数调整工具。手动调整参数太麻烦了。最近试着下水了,感觉还不错。我可以帮你调整参数,一起做可视化工作。简单明了。它可以看到当前实验的进度,搜索一些结果最好的超参数组合。例如:
通过下面的色图,我们可以直观的看到红色(即高精度的超参数组合)线条所表达的丰富信息。诸如
卷积核越大,性能越好。整个连接层大不一定好。可能是训练时间增加,训练速度太慢。但学习率较低(小于0.03),表现基本良好。ReLU比tanh等其他激活函数好很多。…
通过测试状态页面,可以看到每次测试的时长以及具体的超参数组合。
通过控制页面,您还可以实时增加测试的超参数组合,或者调整超参数的范围。
本文分为以下两个部分:
如何安装使用nni调试经验错误总结第一步:安装NNI安装非常简单。您可以通过pip命令安装它。提供示例以供参考。
先决条件:tensorflow,python=3.5,
#安装NNI python 3-m pip install-upgrade ni #学习git clone https://github.com/Microsoft/nni.git的示例程序#如果要运行此示例程序,需要安装tensor flow python 3-m pip install tensor flow。第二步:设置超级参数的搜索范围。先打开nni的样本程序看看吧。
敕令书/NNI/examples/trials/mnist/你可以看到目录里有三个文件:config.yml,mnist.py和search_space.json这三个文件分别决定了我们的NNI配置文件,main.py和超参数搜索空间。
1.打开search_space.json文件
{ dropout _ rate :{ _ type : uniform , _value:[0.5,0.9]}, conv_size:{_type:choice , _value:[2,3,5,7]}, hidden_size:{_type:choice ,_ value: [124,512,1024]}, batch _ size: {_ type: choice , _ value: [1,4,8,16,32
搜索的类型有很多种,如统一、选择等。
但是因为这个例子只描述了uniform和choice的用法,所以其他很多博客只介绍了choice和uniform的用法,这里补充一下。详见NNI的github帮助文档。
{_ type: choice , _ value :options } # drop _ rate :{ _ type : uniform , _ value: [0.5,0.9]}结果高0.5或0.9 {_ type: uniform 。#优化时,这个变量值会在区间两边。{_ type: Quniform , _ value: [low,high,q]} #从低到高开始,步长为q. #例如{_ type: Quniform , _ value: [0,10,2]}结果为0,2,4,6,8,10 {_ type: normal , _ value: [mu,sigma]} #变量值为实数。优化时,此变量不受约束。{_ type: randint , _ value: [lower,upper]} #从下限(含)到上限(不含)之间选择一个随机整数。步骤2:配置config.yaml
打开config.yaml
author name:defaultexperimentName:example _ mnisttrialConcurrency:1 maxexectduration:1 hmaxtrialnum:10 # choice:local,remote,paitrainingservice platform:localsearchSpacePath:search _ space . JSON # choice:true,false use annotation:false tuner:# choice:TPE,Random,Anneal,Evolution,BatchTuner,MetisTuner,GPTuner #SMAC (SMAC应通过nnictl安装)builtin tunername:TPE class args:# choice:maximize,Minimize _ mode:maximize试用:commandgpuNum: 0除了command、maxExecDuration、trialConcurrency、gpuNum、optimize _ mode需要更改外,这里的参数一般不需要更改。
命令nni是运行后要执行的命令。mnist.py更改为您的主程序,如main.py或train.py
MaxExecDuration是整个NNI自动调整参数的时间。注意不是训练时间(我一开始就理解为一次训练所需的最大时间)。如果用gpu运行,要训练10个不同的参数,每个训练需要2个小时,所以这个值设为20h。
TrialConcurrency是trail的并发数。这个需要根据GPU的数量来设置,而不是下面的gpuNum!为什么?因为trail代表了一个参数调优的过程,理解为用一个超级参数运行你的train.py。如果并发数设为X,则有X个培训师在培训!
GpuNum是每次试验所需的GPU数量,而不是整个nni调优所需的GPU数量。对于大型任务,如果单次训练需要N个GPU,那么这个值设置为N;如果单次训练一个GPU就够了,请把这个值设为1;没有GPU?我想写一句悲伤的话…
所以你最终需要的GPU总数是trialConcurrencygpuNum,也就是踪迹的数量和每条踪迹需要的GPU数量。
Optimize_mode对应优化的方向。有两种方式:最大和最小。下一步会提到如何设置。
总的来说,这里的配置足够了。
如果需要调整网格搜索的算法等更详细的东西,可以参考NI的github帮助文档。
第三步是修改我们的代码#引入nniimport nni 来设置要自动更新的参数,假设params是我们的默认参数注意params是* * dictionary * * 类型的变量params=vars(get _ params())tuner _ params=nni . get _ next _ parameter()#这将在搜索空间中获得一组参数params.update(tuner_params)。向nni报告我们的结果。如果test_acc是准确的,那么第二步(5)optimize_mode就是选择最大化。如果这里的test_acc是loss,那么第二步(5)optimize_mode是minimize,还可以填写其他训练指标。另外,这里的报告结果都是数字。选择通用浮动类型“nni”。Report _ intermediate _ result(test _ ACC) Report _ intermediate _ result是报告的中间结果,一般来说,您可以在每个epoch nni设置一个报告。report_final_result(best_acc) Report _ final _ result是最终的报告结果,可以是last_acc也可以是best _ ACC 很多体验者说report_intermediate_result报告损失,Report _ final _ result报告准确性,这
这两份报告的内容应该具有相同的含义(都是损失或准确性或其他)
原因将在下面讨论。
第四步:运行光盘。/your code _ Dirnnictl Create-config config . yml-P888直接用两行代码。切换到代码的目录,直接运行。
-p代表使用的端口号。注意,如果代码使用conda虚拟环境,则需要激活conda虚拟环境。
检查培训过程。我相信你此刻应该已经看到了成功这几个字。不要激动。这并不意味着你已经成功开始参加培训。反正我也不知道经历了多少次才成功。
打开命令行给出的网站,如下图,点击Trail Detial-Intermediate result。
如果你开得太快,它应该在等待。别担心,过一会儿就开始运行了。如果它直接失败,请检查您代码。
如果report_intermediate_result在每个时期报告一次,那么在运行一个时期后,您将看到有一个默认指标,后跟一个括号(最新)。这个时候工作基本完成了。恭喜你!
如果report_final_result是在训练结束时报告,则在训练之后将有默认度量(最终)的值。
因此,这说明report_intermediate_result和report_final_result实际上都是默认的度量,是对意义的度量,用来衡量模型的质量。
下图是一条超参数曲线。事实上,从上面的图片可以看出,我刚刚开始调整参数,只有少数线索是成功的。但是我想说,在这种条件下!这曲线太美了!
第六步停止当不想继续搜索超级参数时,可以使用nnictl stop停止自动参数调整。
但这只是意味着下一条审判不会开始,没有结束的审判会继续执行。如果要终止trail,可以使用在nvidia-smi中找到的训练进程的PID,然后用kill -9 PID杀死这个进程。