使用NNI进行自动超参数调优

有中文文档

NNI (Neural Network Intelligence) 是一个工具包,可有效的帮助用户设计并调优机器学习模型的神经网络架构,复杂系统的参数(如超参)等。 NNI 的特性包括:易于使用,可扩展,灵活,高效。

  • 易于使用:NNI 可通过 pip 安装。 只需要在代码中添加几行,就可以利用 NNI 来调优参数。 可使用命令行工具或 Web 界面来查看 Experiment。
  • 可扩展:调优超参或网络结构通常需要大量的计算资源。NNI 在设计时就支持了多种不同的计算资源,如远程服务器组,训练平台(如:OpenPAI,Kubernetes),等等。 通过训练平台,可拥有同时运行数百个 Trial 的能力。
  • 灵活:除了内置的算法,NNI 中还可以轻松集成自定义的超参调优算法,神经网络架构搜索算法,提前终止算法等等。 还可以将 NNI 连接到更多的训练平台上,如云中的虚拟机集群,Kubernetes 服务等等。 此外,NNI 还可以连接到外部环境中的特殊应用和模型上。
  • 高效:NNI 在系统及算法级别上不断地进行优化。 例如:通过早期的反馈来加速调优过程。

主要概念

  • Experiment(实验): 表示一次任务,用来寻找模型的最佳超参组合,或最好的神经网络架构等。 它由 Trial 和自动机器学习算法所组成。
    搜索空间:是模型调优的范围。 例如,超参的取值范围。
  • Configuration(配置):配置是来自搜索空间的实例,每个超参都会有特定的值。
  • Trial: 是一次独立的尝试,它会使用某组配置(例如,一组超参值,或者特定的神经网络架构)。 Trial 会基于提供的配置来运行。
  • Tuner(调优器): Tuner 个自动机器学习算法,会为下一个 Trial 生成新的配置。 新的 Trial 会使用这组配置来运行。
  • Assessor(评估器):分析 Trial 的中间结果(例如,定期评估数据集上的精度),来确定 Trial 是否应该被提前终止。
    训练平台:是 Trial 的执行环境。 根据 Experiment 的配置,可以是本机,远程服务器组,或其它大规模训练平台(如,OpenPAI,Kubernetes)。

1. 安装NNI

python3 -m pip install --upgrade nni

2. 修改模型脚本run_demo.py

使模型接受json格式的参数,并可以输出你所需的评价指标(可以是复数指标)。一种写法如下:

# 类似这样
import nni
...def run_trail(lr,dropout,a,b,c,...):...return {'default': percision(y_hat,y),  # default标识的评价指标被视作主要评价指标'metric2': recall(y_hat,y),...}params = nni.get_next_parameter() # 某组参数metrics = run_trail(lr=params['lr'],params['dropout'],a=1,b=2,c=params['c'],...)nni.report_final_result(metrics)

可以看到,最少只要加三行代码就行了。

另外一种写法是使用注释Annotation。使用注释的好处在于它可以不修改原代码结构且不影响文件原有的运行表现,只有在文件被NNI调用时,注释才会起效。

3. 定义参数搜索空间search_space.json

准备一个json格式的文件,列出所有要调的超参和对应的取值范围。形式如下:

 {"lr":{"_type":"loguniform","_value":[0.001, 0.1]},"dropout":{"_type":"uniform","_value":[0,0.7]}"c":{"_type":"normal","_value":[0,3]},"hidden_size":{"_type":"choice","_value":[124, 512, 1024]},"batch_size": {"_type":"choice", "_value": [1, 4, 8, 16, 32]},}

其中_type表示取值方式,_value是对应取值方式的参数。

常见的取值方式有choice随机选择一个选项、randint区间内随机整数、uniform区间内均匀采样、loguniform区间内对数均匀采样、normal在给定的正态分布下采样等。详见参数空间。

4. 写配置文件config.yml

声明上述运行文件和参数空间定义文件的地址及其他。下面给出一个本地运行的配置文件示例:

# 基础设置
authorName: az  # 必填
experimentName: demo  # 必填trialConcurrency: 5 # 必填,指定同时运行的 Trial 任务的最大数量。
# ! 如果 trialGpuNum 大于空闲的 GPU 数量,并且并发的 Trial 任务数量还没达到 trialConcurrency,Trial 任务会被放入队列,等待分配 GPU 资源。maxExecDuration: 24h #  可选。 整个调参过程最长运行时间。 默认值:999d。
maxTrialNum: 10 # 可选。 NNI 创建的最大 Trial 任务数。 默认值:99999。
trainingServicePlatform: local  # 指定运行 Experiment 的平台,包括 local, remote, pai, kubeflow, frameworkcontroller# 搜索空间文件
searchSpacePath: search_space.json
useAnnotation: false # 如果 useAnnotation 为 true,searchSpacePath 字段会被删除。# 日志
logDir: ./log  # 可选。 目录的路径。 默认值:<user home directory>/nni-experiments
logLevel: info# 调参器
tuner:builtinTunerName: TPE # 指定内置的调参算法# 运行的命令,以及 Trial 代码的路径
trial:command: python3 run_demo.pycodeDir: . #  必需字符串。 指定 Trial 文件的目录。gpuNum: 1 #  可选、整数。 指定了运行每个 Trial 进程的 GPU 数量。 默认值为 0。# 本机模式下配置,可选。
localConfig:gpuIndices: 0,3 # 默认值none。设置后,只有指定的 GPU 会被用来运行 Trial 任务。# ! 和CUDA_VISIBLE_DEVICE=0,3 的效果相同,在程序内部的gpu编号依旧是从0开始的maxTrialNumPerGpu: 2 #  默认值1。指定1个GPU上最大并发trail的数量useActiveGpu: false #  默认值false。是否使用已经被其他进程使用的gpu。

可以通过Tuner字段设置不同的调优算法,NNI内置了十余个调优算法,常见的有随机搜索、遍历搜索、退火算法、TPE等。详见Tuner。需要注意的是,不同的Tuner支持的参数类型不同,详见 每种 Tuner 支持的搜索空间类型。

此外还可以在配置中设置Assessor评估器,来提前终止表现不佳的trial(需要在代码中加入nni.report_intermediate_result(metrics)提交训练过程中的模型表现)。详见Assessor。

也可以设置Advisor代替Tuner和Assessor。目前提供了两种Advisor,BOHB和Hyperband。

更多配置详见实验配置。

5. 运行

nnictl create --config config.yml -p 8080

nnictl 是一个命令行工具,用来控制 NNI Experiment,如启动、停止(nnictl stop)、继续 Experiment,启动、停止 NNIBoard 等等。 点击 这里 查看 nnictl 的更多用法。

成功运行的输出如下:

INFO: Starting restful server...
INFO: Successfully started Restful server!
INFO: Setting local config...
INFO: Successfully set local config!
INFO: Starting experiment...
INFO: Successfully started experiment!
-----------------------------------------------------------------------
The experiment id is egchD4qy
The Web UI urls are: [Your IP]:8080
-----------------------------------------------------------------------You can use these commands to get more information about the experiment
-----------------------------------------------------------------------commands                       description1. nnictl experiment show        show the information of experiments
2. nnictl trial ls               list all of trial jobs
3. nnictl top                    monitor the status of running experiments
4. nnictl log stderr             show stderr log content
5. nnictl log stdout             show stdout log content
6. nnictl stop                   stop an experiment
7. nnictl trial kill             kill a trial job by id
8. nnictl --help                 get help information about nnictl
-----------------------------------------------------------------------

6. 查看运行情况

输入上一步显示的web地址[Your IP]:8080,在浏览器中进行访问。详见 Web界面。




使用NNI进行自动超参数调优相关推荐

  1. 结合Sklearn的网格和随机搜索进行自动超参数调优

    什么是超参数? 今天,隐藏着数学世界的算法只需要几行代码就可以训练出来.它们的成功首先取决于训练的数据,然后取决于用户使用的超参数.这些超参数是什么? 超参数是用户定义的值,如kNN中的k和Ridge ...

  2. Keras Tuner模型自动超参数调优

    Keras Tuner安装 pip install keras-tuner from tensorflow.keras import layers from tensorflow import ker ...

  3. 开源sk-dist,超参数调优仅需3.4秒,sk-learn训练速度提升100倍

    作者 | Evan Harris 译者 | Monanfei 编辑 | Jane  出品 | AI科技大本营(ID:rgznai100) [导语]这篇文章为大家介绍了一个开源项目--sk-dist.在 ...

  4. 机器学习模型评估与超参数调优详解

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:李祖贤  深圳大学,Datawhale高校群成员 机器学习分为两类 ...

  5. python minimize_简单三步实现Python脚本超参数调优(附代码)

    作者:Jakub Czakon, Neptune.ai 翻译:陈之炎 校对:和中华 本文约1500字,建议阅读5分钟. Python机器学习模型建立起来之后,如何对它的性能进行优化?按照本指南中的三个 ...

  6. 独家 | 简单三步实现Python脚本超参数调优(附代码)

    作者:Jakub Czakon, Neptune.ai 翻译:陈之炎 校对:和中华 本文约1500字,建议阅读5分钟. Python机器学习模型建立起来之后,如何对它的性能进行优化?按照本指南中的三个 ...

  7. 深度学习-超参数调优

    在机器学习中有很多调优的方式机器学习--超参数调优,深度学习中也存在同样的方式,接下来,介绍一下深度学习框架里边的自动调参模块. 1. 基于Tensorflow的Keras tuner 官方教程如下: ...

  8. 深度神经网络之Keras(三)——正则化、超参数调优和学习方向

    深度神经网络之Keras(三)--正则化.超参数调优和学习方向 本文将继续探索Keras框架下的深度神经网络知识,主要介绍了利用Keras构建的深度神经网络正则化及超参数调优问题. 目录 深度神经网络 ...

  9. 贝叶斯优化: 一种更好的超参数调优方式

    简介 本文受 浅析 Hinton 最近提出的 Capsule 计划 启发,希望以更通俗的方式推广机器学习算法,让有数学基础和编程能力的人能够乐享其中. 目前人工智能和深度学习越趋普及,大家可以使用开源 ...

最新文章

  1. 用于单图像超分辨率的对偶回归网络,达到最新SOTA | CVPR 2020
  2. matlab game of life,模拟器cellular auotomata元胞自动机 matlab
  3. Synergy 共享键盘和鼠标
  4. 新手第一课-什么是深度学习
  5. 单向链表操作之删除倒数第n个结点
  6. 6.6.1最优二叉树(赫夫曼树)
  7. ECCV 2020 | 图匠数据、华中师范提出低质退化文本识别算法PlugNet
  8. Tiled Map的使用说明
  9. 数据库系统概念第七版(Database System concepts 7th)课后答案英文版答案
  10. C++一本通在线测评网站 题目1224
  11. html5设计页面背景颜色,网页背景设计全攻略
  12. html p 会自动换行,css如何设置p标签不换行?
  13. ASIHTTPRequest类库的简单介绍
  14. AI换脸在电竞圈火了!大司马PDD大秀肌肉辣舞
  15. maven LTDM 部署前台Tomcat 各种折腾---自己总结经验
  16. 将视频背景扣掉换成白色相关知识
  17. 计算机的标准输入法,计算机操作系统标准教程 第4章 五笔字型输入法.pdf
  18. Learning Angular 学习Angular Lynda课程中文字幕
  19. ricky java_恕我直言你可能真的不会java第8篇-函数式接口
  20. SpringCloud微服务(七)——Bus服务消息总线

热门文章

  1. Java之IO流技术详解
  2. json转对象(GsonFormatPlus)
  3. 关于寻迹小车组装建议
  4. JSON转List集合
  5. (NLP)文本预处理
  6. 模版消息智能推送!我们教你发得更快更多更省
  7. 软件设计模式——建造者模式
  8. java中多重if结构_java中的多重if
  9. tm1688_TM1668驱动LED 子程序
  10. led台灯哪个牌子效果最好?2022最新国产led灯品牌排行