NNI (Neural Network Intelligence) 是自动机器学习(AutoML)的工具包。 它通过多种调优的算法来搜索最好的神经网络结构和(或)超参,并支持单机、本地多机、云等不同的运行环境。


安装指南

兼容性

  • Linux Ubuntu 16.04 或更高版本
  • MacOS 10.14.1
  • Windows 10.1809

安装

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple nni

推荐使用清华源


工作流程&快速上手

为了理解NNI的工作流程,我们不妨来训练一个Mnist手写体识别,网络结构确定之后,NNI可以来帮你找到最优的超参。一个朴素的想法是:在有限的时间内,NNI测试一定量的超参,返回给你最优的参数组合。

为了更好地理解NNI的工作流程,首先需要认识几个概念:

  • Trial:Trial 是一次尝试,它会使用某组配置(例如,一组超参值,或者特定的神经网络架构)来进行训练,并返回该配置下的得分。本质上就是加入了NNI_API的用户的原始代码。
  • Experiment:实验是一次找到模型的最佳超参组合,或最好的神经网络架构的任务。 它由Trial和自动机器学习算法所组成。
  • Searchspace:搜索空间是模型调优的范围。 例如,超参的取值范围。
  • Configuration:配置是来自搜索空间的一个参数实例,每个超参都会有一个特定的值。
  • Tuner:Tuner是一个自动机器学习算法,会为下一个Trial生成新的配置。新的 Trial 会使用这组配置来运行。
  • Assessor:Assessor分析Trial的中间结果(例如,测试数据集上定期的精度),来确定 Trial 是否应该被提前终止。
  • Training Platform:训练平台是Trial的执行环境。根据Experiment的配置,可以是本机,远程服务器组,或其它大规模训练平台(例如,OpenPAI,Bitahub)。

那么你的实验(Experiment)便是在一定的搜索空间(Searchspace)内寻找最优的一组超参数(Configuration),使得该组参数对应的Mnist(Trail)有最大的准确率,在有限的时间和资源限制下,Tuner和Assessor帮助你更快更好的找到这组参数。

为了更更好地理解NNI的工作流程,我们一起来完成一个在本地(Training Platform)训练的,针对Mnist手写体识别(Trail)的,最佳超参搜索的实验(Experiment)。

  1. 下载Mnist TensorFlow example(选择tf是因为他自带mnist数据集无需下载)。
  2. 打开mnist.py,Ctrl+F,搜索nni,得到四个结果,分别在12、198、207、231行,换句话说,一个原本的训练Mnist手写体识别代码,加上4行代码,就可以由nni来完成超参优化的工作!原始代码见mnist_before.py
1     """A deep MNIST classifier using convolutional layers."""
......
12    import nni # import不解释 (1/4)
......
198   nni.report_intermediate_result(test_acc)    # 记录网络训练过程中的准确率 (3/4)
......
207   nni.report_final_result(test_acc)    # 返回该超参数组合下网络最终准确率 (4/4)
......
231   tuner_params = nni.get_next_parameter()    # 生成下一组超参数组合 (2/4)
......
234   params.update(tuner_params)    # 更新params字典
235   main(params)    # 将超参数组合传入主函数训练

nni嵌入原始代码生成trail的逻辑如上所示:获取超参数组合,测试该组合的效果并记录,产生下一组超参数,直到达到时间或尝试次数上限。

需要注意的是,nni对于需要搜索的超参数是根据变量名称匹配的,因此网络中超参变量名要和搜索空间中定义的一致!本例使用NNI API的方式进行嵌入,亦可使用Annotation的方式嵌入,详情参考Annotation。

3. 打开search_space.json,指定需要进行搜索的变量,以及变量的搜索空间。可以看到dropout_rate是在[0.5, 0.9]的均匀分布中取值,conv_size是在[2,3,5,7]四个值中选取。关于更多的采样策略和参数设置可以参考SearchSpace。

4. 打开对应系统的配置文件——Win:config_windows.yml;Linux,macOS:config.yml,以Win为例,我在重要配置后添加了注释,其余配置使用默认即可。

authorName: default
experimentName: example_mnist
trialConcurrency: 1                     # 并行trail数量
maxExecDuration: 1h                     # 实验执行的时间上限
maxTrialNum: 10                         # Trial任务的最大数量
#choice: local, remote, pai
trainingServicePlatform: local          # 训练平台,一般为local
searchSpacePath: search_space.json      # 搜索空间,一般为search_space.json
#choice: true, false
useAnnotation: false    # 本例中我们使用的NNI API的方法进行集成,此处选择false # 如果设置了 useAnnotation=True,searchSpacePath 字段必须被删除
tuner:#choice: TPE, Random, Anneal, Evolution, BatchTuner, MetisTuner, GPTuner#SMAC (SMAC should be installed through nnictl)builtinTunerName: TPE                         # 优化算法classArgs:#choice: maximize, minimizeoptimize_mode: maximize
trial:command: python mnist.py             codeDir: .gpuNum: 0                   # GPU可见性设置

那么以上配置便意味着我们给nni一个小时的时间、十次尝试机会,在同时只能运行一个trail以及使用TPE优化算法的情况下来寻找最优的超参组合。

除实例教程的基本配置文件外,还有一些配置推荐使用:

logDir: 默认为<user home directory>/nni/experiment    # 指定log输出路径
logLevel: 支持trace, debug, info, warning, error, fatal,默认为info # 指定log信息输出登记

详情请参考配置。

5. 打开Windows命令行,进入安装了nni的环境,然后启动MNIST Experiment。

nnictl create --config config_windows.yml

nnictl是一个命令行工具,用来控制NNI Experiment,如启动、停止、继续Experiment,启动、停止 NNIBoard 等等。更多用法请参考nnictl。

6. 启动Experiment 后,可以在命令行界面找到WebUI的地址,在浏览器打开地址就可以看到实验的详细信息,详细教程可参考WebUI。

7. 实验完成后,WebUI一直可以访问,直到我们在命令行停止实验nnictl stop

至此,NNI的基本使用情况已介绍完毕。


系统架构

  • NNIManager是系统的核心管理模块,负责调用TrainingService来管理Trial,并负责不同模块之间的通信。
  • Dispatcher是消息处理中心。
  • TrainingService是平台管理、任务调度相关的模块,它和 NNIManager 通信,并且根据平台的特点有不同的实现。NNI 支持本机,远程平台(SSH方法调用多台GPU协同实验),OpenPAI 平台,Kubeflow 平台 以及 FrameworkController 平台。
  • DB是DateBase管理训练数据.

AutoML我懂,NNI我也懂,代码我都写好了,就差一块GPU了?

没有GPU是问题吗?能用钱解决的问题都不是问题!问题是没钱?

BitaHub了解一下。

BitaHub(http://www.bitahub.com)面向AI开发者提供快速构建、训练模型的能力,让开发者专注于业务和科研。新用户注册即免费赠送20算力!

点击https://forum.bitahub.com/views/page-registe.html?inviteid=_b1f099806011453ebaaec2e2b2bb8cec完成注册!

注册后请先阅读一下BitaHub的帮助手册。


Bitahub&NNI

以上文提到的mnist实验为例,下面我们展示如何在Bitahub上优雅的使用NNI。

实验中相关文件如Dockerfile、trail代码请在(https://github.com/SonghuaW/bita_nni)下载。

  1. 新建镜像:NNI提供了官方Docker镜像,为了适配Bitahub平台,我对NNI镜像做了一些修改,并上传至dockerhub:wushhub/nni_bitahub,在Bitahub平台上,选择我的镜像(https://www.bitahub.com/personalmirror)-新建镜像(编程语言算法框架可任意选择,但需要与后文创建的项目一致)-上传Dockerfile-提交生成。等待镜像生成成功。
  2. 创建项目:此时项目的编程语言算法框架应选择与新建镜像时的选择一致。代码选择Github上的mnist文件夹。
  3. 运行任务:Bitahub上的任务分两种,debug类型和非debug类型。debug类型提供jupyterlab给用户调试。非debug类型无法调试,直接提交任务,输出结果。由于Docker端口映射的限制,只有在debug模式下,用户才可以使用WebUI。下面详细介绍两种任务类型下如何使用NNI。
  • debug模式:
  1. 点击新建任务

2. 配置参数,镜像选择我们刚刚制作好的镜像;GPU类型选择dubug;启动命令可以在/mnist/nni.txt中复制。

debug模式下启动命令为:停止ssh服务;创建/output/nni文件夹作为文件输出目录;启动Experiment并将WebUI端口指定为22;cat占位等待,否则任务将直接结束。

service ssh stop; mkdir -p /output/nni && nnictl create --config /code/mnist/config.yml --port 22 && cat

3. 查看WebUI,当任务状态变成运行中时,点击查看。

在查看页面下拉至底部

打开202.38.95.226:13304即可访问WebUI。

4. 在任务查看界面选择Output,即可查看输出文件。

5. 任务结束后,点击停止即可,此后WebUI无法访问,但输出文件一直可以查看。

  • 非debug模式:点击新建任务,配置参数,镜像选择我们刚刚制作好的镜像;GPU类型选择dubug;启动命令可以在/mnist/nni.txt中复制。
mkdir -p /output/nni && nnictl create --config /code/mnist/config.yml --port 22 && python3 /code/mnist/watch.py && nnictl stop

非debug模式下我们加入了一个监视器watch.py,实时监控experiment的信息,当在nni的log文件中找到‘Experiment done’的字符串时,return并执行nnictl stop。注意,在此模式下我们无法访问WebUI,但仍可读取输出文件。任务在执行nnictl stop后会自行结束,无需手动停止。


Open for comments and suggestions!

wsh0913@mail.ustc.edu.cn

鹏城实验室人工智能中心


Reference

https://github.com/microsoft/nni

tensowflow 训练 远程提交_深度解析AutoML工具——NNI:带上超参一起训练相关推荐

  1. tensowflow 训练 远程提交_一文说清楚Tensorflow分布式训练必备知识

    Note: 原文发表于我的知乎专栏:算法工程师的自我修养,欢迎关注! Methods that scale with computation are the future of AI. -Rich S ...

  2. c++test能不能导入keil工程_深度解析AutoML框架——H2O:小白也能使用的自动机器学习平台...

    H2O是一个完全开源的.分布式的.具有线性可扩展性的内存的机器学习平台. 它具有以下特点: 支持R和Python 支持最广泛使用的统计和机器学习的算法,包括DRF,GBM,XGBoost,DL等 具有 ...

  3. 主程序与子程序不在同一程序模块中_深度解析S7200系列PLC带参数子程序用法

    一.导读 当控制要求相同或具有相同的算法时,(如对电机的控制,若需要对多台电机进行控制,且每台电机具有相同的控制方式)此时可考虑根据该控要求,编写一个功能块,然后重复调用该功能块,然后赋予不同的实参来 ...

  4. python中superclass是什么_深度解析并实现python中的super(转载,好文)

    大神半个月的成绩,让我看的叹为观止,建议看原帖地址,会让你对Python的描述符有更强的认识. 原文链接:https://blog.csdn.net/zhangjg_blog/article/deta ...

  5. 完整的连接器设计手册_深度解析特斯拉的电池快充连接器技术|附视频

    推荐:GSAuto联盟|三电技术专家委员会,初期仅对主机厂.Tirl1等公司新能源汽车三电研发管理制造方面人员.大学及科研机构等新能源汽车三电研究人员,现已招募480+人,主要分布在50+主机厂.50 ...

  6. 深度学习 训练吃显卡_深度学习小钢炮攒机心得:规避一些你看不到的坑

    ------------------- 已经2017年了,从90年代初的品牌机流行,90年代末的组装机流行,2000-2010桌面级逐渐被移动PC/Mac取代,一直到现在移动终端大行其道,攒机似乎已经 ...

  7. 上新了! 热门开源 AutoML 工具 NNI 2.0 来袭!

    编者按:NNI(Neural Network Intelligence)是微软亚洲研究院为研究人员和算法工程师量身定制的自动机器学习(AutoML)工具.在过去的两年中,NNI 不断迭代更新,持续将最 ...

  8. 深度学习 训练吃显卡_深度学习训练如何更快些?GPU性能的I/O优化你试过吗?...

    原本,有多少人已经准备好最新显卡,足够的硬盘空间,甚至请好年假,只为十天后去那个仰慕已久的赛博朋克世界里体验一番-- 结果他们又发了一张「黄色背景图」,告诉大家要跳票--再一次-- 好吧,你有了大量闲 ...

  9. mysql 5.7临时表空间_深度解析MySQL 5.7之临时表空间

    临时表 临时表顾名思义,就是临时的,用完销毁掉的表. 数据既可以保存在临时的文件系统上,也可以保存在固定的磁盘文件系统上. 临时表有下面几种: 1.全局临时表 这种临时表从数据库实例启动后开始生效,在 ...

最新文章

  1. 我用python10年后,我发现学python必看这三本书! 1
  2. pythonslice_shift_3. 数据模型
  3. 汇编指令mrs_汇编指令 - Mrs.kang - 博客园
  4. Oralce日常高效率巡检_数据库性能、安全检查
  5. mysql 获取 row的id_转: MYSQL获取更新行的主键ID
  6. 数据分析python有趣分享_Python有趣|数据分析三板斧
  7. python字符串split_python字符串之split
  8. [html] H5播放的video视频,如何实现对视频截图?
  9. alt php,我怎样才能在PHP中获取a p标签的alt属性?
  10. Oracle 关于WKT构造SDO_GEOMETRY的问题。
  11. cocos2dx实现翻书效果。
  12. 笑谈ArcToolbox (1) ArcToolbox 的发展方向
  13. android在线查看源码工具
  14. Linux下查杀进程的方法说明
  15. MDK5 安装指导书
  16. 2019年CSDN博客排名前10名
  17. Ardupilot 绕圈模式分析
  18. Excel基础-数据方向
  19. [Power Query] 分组依据
  20. Java基础之面向对象详解

热门文章

  1. SolrJ查询Solr数据
  2. Electron Built-in AutoUpdater 踩坑记录
  3. Androidstudio高效管理第三方API的KEY及Gradle版本管理
  4. 浅析Objective-C字面量
  5. Java中的观察者模式
  6. 霍布森选择效应(Hobson choice Effect)
  7. 笔记-【6】-JS中JSON的基础理解!
  8. ios 如何对UITableView中的内容进行排序
  9. NFS v3 RPC
  10. Mybatis分库分表扩展插件