nri指标,否定指标nni
简介NNI是微软的开源自动参数调整工具。手动调整参数太麻烦了。最近试着下水了,感觉还不错。我可以帮你调整参数,一起做可视化工作。简单明了。然后感觉很多博客不太懂,打算自己补充一下。如果你觉得你的一些问题已经解决了,请注意。
本文分为以下两个部分:
如何安装使用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]} #从下限(含)到上限(不含)之间选择一个随机整数。第二步:配置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个小时。该值设置为20小时。
trialConcurrency是trail的并发数,这个需要根据自己的GPU数量来设置,而不是下面的gpuNum!为什么?因为trail代表了一个参数调优的过程,理解为用一个超级参数运行你的train.py。如果并发数设为X,则有X个培训师在培训!
GpuNum是每个trail所需要的gpu个数,不是整个nni调优所需的GPU数量。对于大型任务,如果单次训练需要N个GPU,那么这个值设置为N;如果单次训练,一个GPU就足够,请把这个值设置为1;没有GPU?我想写一句悲伤的话…
所以你最终需要的GPU总数是trialConcurrency*gpuNum,也就是踪迹数*每个踪迹需要的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杀死这个进程。
常见的坑比较好吃,但是nni其实很简单,但是时间长。在这里,我把我走过的坑分享给你,让你少走弯路。
1.你的参数应该是个字典,比如args[batch_size]而非args.batch_size
因为nni.get_next_parameter()获取字典,而字典的更新方法params.update(tuner_params)用于params,所以params应该是字典格式,使用params[batch_size]
2. Fail了怎么办?
我一开始也失败过很多次(nni启动成功,打开网站运行,但是还没运行一个epoch就失败了)。在这种情况下,建议注释掉下面三行代码nni.get _ next _ parameter()、nni.report _ final _ result()和nni.report _ intermediate _ result(),然后运行程序看看有没有bug。这也是调试程序的重要手段!如果没有bug,就看report的值是不是数字。报告必须是数字,而不是张量等其他变量。另外,你还需要看看GPU是否可用。如果GPU内存不够,就会报错。
3.一直都在Waiting
Nni开始了,但是一直在等。可能你的config.yaml配置错了。参考第二步,检查gpuNum和trialConcurrency的值是否正确。如果不是,请填写1。此外,nvidia-smi还会查看您的GPU使用情况。如果第六步的stop只是STOP,没有kill进程,你的GPU可能还在运行之前的trail。4. train detail没有result
程序一直在运行。早该结束一个纪元了,但是网页里没有数值显示?检查报告功能。报告必须是一个数字,而不是其他变量,如张量5.网页打不开。
使用Linux远程GPU服务器,在本地打不开网页怎么办?不要慌,可以重定向。在本地命令行输入。
ssh-p remote _ port-L 8888:127 . 0 . 0 . 1:8888用户名@remote_ip,
远程端口是服务器端口号,
27.0.0.1代表本地主机,
前面8888是第四步-p后面写的端口号,
后面的8888是你要重定向到本机的端口号,你可以随意填写。
Username是服务器的用户名,remote_ip是服务器的ip地址。
然后打开自己电脑上的浏览器输入127.0.0.1:8888,就ok6.报错NoneType了。
请注意,使用的是nni,必须使用nnictl create --config config.yml启动程序,不能直接Run7.学会利用日志log。
虽然在终端上不能直接看到训练日志,但是实际上我们设置的实验路径下有一个日志文件,记录了所有的stdout内容,可以方便我们调试程序。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。