本篇是 NNI 系列文章的开篇, 将首先介绍 NNI 的特点和价值, 然后用一个简单的 mnist 样例带您开启自动化机器学习之旅. 后续系列文章还将从 NNI 的高效率 -- 能够帮助节省时间和减少代码, NNI 的分布式 -- 支持 OpenPAI 等多端部署, NNI 的可扩展性 -- 支持多种 tuner 和 assessor 等特点介绍 NNI.
在机器学习建模时, 除了准备数据, 最耗时耗力的就是尝试各种超参组合, 找到最佳模型的过程了. 对于初学者来说, 常常是无从下手. 即使是对于有经验的算法工程师和数据科学家, 也是很难把握所有的规律, 只能多次尝试, 找到较好的超参组合. 而自动机器学习这两年成为了热门领域, 着力解决超参调试过程的挑战, 通过超参选择算法和强大的算力来加速超参搜索的过程. NNI (Neural Network Intelligence) 是微软开源的自动机器学习工具包. 与当前的各种自动机器学习服务或工具相比, 有非常独特的价值.
NNI 的众多特点
1. 安装简洁: 通过 pip 命令就能完成安装;
2. 支持私有部署, 用自己的计算资源就能进行自动机器学习;
3. 支持分布式调度: NNI 可以在单机上进行试验, 还支持多种分布式调度平台, 如通过 SSH 控制多台 GPU 服务器协同完成试验, 或通过 OpenPAI, Azure, Kubernetes 等在独立的 Docker 中运行;
4. 对超参搜索的底层支持: 大部分自动机器学习服务与工具的服务都是针对于图片分类等特定的任务. 而 NNI 通过让用户提供训练代码和超参搜索范围, 依靠 NNI 内置算法和训练服务来搜索最佳的超参和神经架构, NNI 为有一定模型训练经验的用户提供更加通用的调参方式, 便于用户做出更多尝试, 决策和加入思考, 并完整参与整个训练过程;
5. 随库自带众多实例和流行的调参算法;
6. 架构简洁, 对开发和扩展及其友好.
开启你的第一次 NNI 之旅
这部分将以识别手写字体 mnist 为例介绍 NNI 如何在本地机器使用注释方式定义搜索空间提交训练任务而提高效率, 并介绍 NNI 的基础功能与使用. 要通过 NNI 进行实验, 用户只需要三步即可完成实验准备, (1)定义搜索空间 (search space); (2) 上传代码 (codes); (3) 定义实验 , 用户可以使用一行命令行即可开始实验, 并可使用 webUI 在网页端实时查看实验进程和结果.
读完这部分, 你将了解如何编写配置文件和通过注释形式定义搜索空间, 你将了解如何使用 NNI 在本地机器上提交任务, 并了解如何通过 webUI 清晰地检查实验结果和超参数的使用对结果的影响. nni 提供的 mnist 代码示例文件已开源至 GitHub, 克隆后可在目录~/nni/examples/mnist 中查看, 此外本例依赖 tensorflow 框架, 还需要使用 pip 安装 tensorflow.
- $ Git clone https://github.com/Microsoft/nni.git
- $ python3 -m pip install tensorflow
. 安装
介绍例子之前首先安装 NNI,NNI 提供简单快速的源码编译或 pip 安装方式, NNI 目前支持在 Ubuntu 16.04 及更高版本和 Mac OS 系统上进行安装, 用户需要环境中安装有 python 高于 3.5 的版本, 本例在 ubuntu16.04 系统上通过一行 pip 命令安装 :
$ python3 -m pip install --user --upgrade nni
. 三步准备实验
用户只需要三步即可完成实验准备,(1)定义搜索空间 (search space);(2) 上传代码 (codes);(3) 定义实验(experiment) .
代码结构非常简单, 其中文件 search_space.JSON 代表定义搜索空间, 代码 mnist.py 代表上传代码, 配置文件 config.YAML 代码定义实验, 可在~/nni/example/trials/mnist 目录中看到目录结构.
(1) 准备搜索空间
首先使用 JSON 文件定义超参数的搜索空间, 搜索空间包括搜索的变量名, 搜索的类型和搜索的值范围. 此例定义了网络的卷积层尺寸 (conv_size) 在(2,3,5,7)的范围中搜索, 隐藏层的尺寸 (hidden_size) 在(124,512,1024)的范围搜索, 学习率 (learning_rate) 在(0.0001,0.1)的范围搜索等等.
(2) 准备实验代码
在实验代码中引入 nni 包, 并以几行代码加入 nni 的参数传递和结果回传即可将 nni 与实验代码结合起来.
(3)定义实验
通过 YAML 配置文件来定义实验, 配置文件中包含实验的基础信息, 训练平台的选择, 搜索空间的使用注释选择, 协调器的选择和训练任务的配置等. 此处定义方式是: 在本地训练任务, 使用注释方式定义搜索空间, 使用 TPE 协调器, 其内容基本如下所示:
. 一行命令开始训练
完成以上三步 (定义搜索空间, 上传代码, 定义实验) 后, 你已经有配置文件, 搜索空间和训练代码, 配置文件的训练任务配置中连接了定义主代码的路径和执行命令, 定义搜索空间定义方式及位置. 此时, 只需要一句命令即可提交任务.
$ nnictl create --config ~/nni/examples/trials/mnist-annotation/config.YAML
. webUI 查看结果
提交训练任务之后终端会返回提交任务的索引 ID 及 webUI 的网址, 在浏览器中打开 url 地址即可得到 NNI 解析出的实验信息及实验实时结果.
首页可以所有训练信息和具体的超参组合, 并支持对回传结果排序.
优化进度页面可以看到按时序排列的精度或损失值(此图为精度). 可以看到, 时间越靠后(右侧), 精度高的越多, 这说明选择的超参探索算法随着时间能找到一些好的超参空间继续探索.
通过超参的分布图来直观地看到哪些超参值会明显比较好, 或者看出它们之间的关联. 通过下面的颜色图就能直观地看到红色 (即精度较高的超参组合) 线条所表达的丰富信息. 如: 卷积核大一些会表现较好; 学习率小一些, 表现基本都不错; Batch_size 较大时变现更好等等.
第一次 NNI 之旅的体验如何? 本文通过阐述 NNI 的特点, 后续的安装和如何使用简单例程动手实践对 NNI 做了一个简单的介绍, 但 NNI 的功能不止于此, 它的多平台支持, 多种配置方式, 分布式调度模式, 多种算法支持还等待你来发现和发掘, 甚至你也可以作为 NNI 代码的贡献者来自己定义需求.
来源: https://www.cnblogs.com/ms-uap/p/10194758.html