失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 浅析自动机器学习(AutoML)工具NNI

浅析自动机器学习(AutoML)工具NNI

时间:2019-06-20 15:42:17

相关推荐

浅析自动机器学习(AutoML)工具NNI

NNI 简介

NNI (Neural Network Intelligence) 是一个轻量级但功能强大的自动机器学习(AutoML)工具包,可帮助用户自动化特征工程、神经架构搜索、超参数调优和模型压缩,并支持单机、本地多机、云等不同的运行环境。

NNI 的主要特性

NNI 的特性主要包括:易于使用,可扩展,灵活,高效。

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

NNI 的主要概念

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

NNI 体系结构

NNI体系结构如上图所示,其中包括:

NNI Controller(nnictl): 这是个命令行工具,用于控制 Web 服务器,和其他管理功能,用户可以使用这个命令来进行管理。比如,启动 Experiment。NNI Core: 这是 NNI 的核心,实现了Web UI,nnimanager,训练服务等核心功能。当 Experiment 出现严重错误时,从它的日志中才能找到原因。(例如,Web 界面无法打开,或者训练平台失败)Advisor: Advisor是 NNI 的超参数调整系统,包括TunerAssessor,分别负责生成下一个trial和评估该trial训练平台:右侧的训练平台可以是本机/远程服务器/OpenPAI/Kubernetes等,可以将许多trial进行分配到各个平台中,完成一次尝试(trial)。

从上图中,我们也看到了 NNI Experiment 的运行过程如下:

Tuner 接收搜索空间并生成配置。这些配置将被提交到训练平台,如本机,远程服务器组或训练集群。执行的性能结果会被返回给 Tuner。然后,再生成并提交新的配置。

每次 Experiment 执行时,用户只需要定义搜索空间,改动几行代码,就能利用 NNI 内置的 Tuner/Assessor 和训练平台来搜索最好的超参组合以及神经网络结构。 基本上分为三步:

步骤一:定义搜索空间步骤二:改动模型代码步骤三:定义实验配置

NNI 的核心功能

NNI 提供了并行运行多个实例以查找最佳参数组合的能力。此功能可用于各种领域,例如,为深度学习模型查找最佳超参数,或查找具有真实数据的数据库和其他复杂系统的最佳配置。

NNI 还希望提供用于机器学习和深度学习的算法工具包,尤其是神经体系结构搜索(NAS)算法,模型压缩算法和特征工程算法。

超参数调优

这是 NNI 最核心、最基本的功能,其中提供了许多流行的自动调优算法(即 Tuner) 以及提前终止算法(即 Assessor)。

NNI 内置的 Tuner

NNI 能用简单快速的方法来配置超参调优算法,称之为Tuner

Tuner 从 Trial 中接收指标结果,来评估一组超参或网络结构的性能。 然后 Tuner 会将下一组超参或网络结构的配置发送给新的 Trial。

NNI 内置的自动调优算法如下表格所示:

NNI 内置的 Assessor

为了节省计算资源,NNI 支持提前终止策略,并且通过叫做Assessor的接口来执行此操作。

Assessor 从 Trial 中接收中间结果,并通过指定的算法决定此 Trial 是否应该终止。 一旦 Trial 满足了提前终止策略(这表示 Assessor 认为最终结果不会太好),Assessor 会终止此 Trial,并将其状态标志为==EARLY_STOPPED==

NNI 当前支持的提前终止算法如下表格:

通用 NAS 框架

此 NAS 框架可供用户轻松指定候选的神经体系结构,例如,可以为单个层指定多个候选操作(例如,可分离的 conv、扩张 conv),并指定可能的跳过连接。 NNI 将自动找到最佳候选。 另一方面,NAS 框架为其他类型的用户(如,NAS 算法研究人员)提供了简单的接口,以实现新的 NAS 算法。

NNI 通过Trial SDK支持多种 one-shot(一次性) NAS 算法,如:ENAS、DARTS。 使用这些算法时,不需要启动 NNI Experiment。 在 Trial 代码中加入算法,直接运行即可。如果要调整算法中的超参数,或运行多个实例,可以使用 Tuner 并启动 NNI Experiment

除了one-shot NAS外,NAS 还能以NNI 模式运行,其中每个候选的网络结构都作为独立 Trial 任务运行。在此模式下,与超参调优类似,必须启动 NNI Experiment 并为 NAS 选择 Tuner

模型压缩

NNI 提供了一个易于使用的模型压缩框架来压缩深度神经网络,压缩后的网络通常具有更小的模型尺寸更快的推理速度,模型性能也不会有明显的下降。 NNI 上的模型压缩包括剪枝量化算法。 这些算法通过 NNITrial SDK提供 。 可以直接在 Trial 代码中使用,并在不启动 NNI Experiment 的情况下运行 Trial 代码。 用户还可以使用 NNI 模型压缩框架集成自定义的剪枝和量化算法。

自动特征工程

自动特征工程,可以为下游任务找到最有效的特征。 自动特征工程通过 NNI Trial SDK 支持,不必创建 NNI Experiment, 只需在 Trial 代码中加入内置的自动特征工程算法,然后直接运行 Trial 代码。

自动特征工程算法通常有一些超参。 如果要自动调整这些超参,可以利用 NNI 的超参数调优,即选择调优算法(即 Tuner)并启动 NNI Experiment。

安装

通过pip安装

python3 -m pip install --upgrade nni

通过源码构建

# 拉取NNI源码并指定分支git clone -b v2.0 /Microsoft/nni.gitcd nni# 设置环境变量export NNI_RELEASE=2.0# 构建python3 -m pip install --upgrade pip setuptools wheelpython3 setup.py clean --allpython3 setup.py build_tspython3 setup.py bdist_wheel -p manylinux1_x86_64python3 -m pip install dist/nni-2.0-py3-none-manylinux1_x86_64.whl

Docker安装

# 拉取NNI镜像docker pull msranni/nni:v2.2# 启动NNI容器docker run -i -t -p 9090:8080 msranni/nni:v2.0

备注:

在Docer中运行NNI的时候

如果直接使用 NNI 的官方镜像msranni/nni来启动 Experiment,可以直接使用nnictl命令。 NNI 官方镜像有最基础的 Python 环境和深度学习框架。

如果使用自己的 Docker 镜像,需要首先安装 NNI, 如python3 -m pip install --upgrade nni

NNI 超参数调优实验的简单示例

NNI 用来帮助超参调优的伪代码如下:

输入: 搜索空间, Trial 代码, 配置文件输出: 一组最优的参数配置

1: For t = 0, 1, 2, ..., maxTrialNum,2:hyperparameter = 从搜索空间选择一组参数3:final result = run_trial_and_evaluate(hyperparameter)4:返回最终结果给 NNI5:If 时间达到上限,6:停止实验7: 返回最好的实验结果

开发并启动一个 NNI 实验

启动 Experiment 的包含如下三个步骤:

第一步:编写 JSON 格式的搜索空间文件,包括所有需要搜索的超参的名称分布(离散和连续值均可)。

search_space.json

{"batch_size": {"_type":"choice", "_value": [16, 32, 64, 128]},"hidden_size":{"_type":"choice","_value":[128, 256, 512, 1024]},"lr":{"_type":"choice","_value":[0.0001, 0.001, 0.01, 0.1]},"momentum":{"_type":"uniform","_value":[0, 1]}}

第二步:修改Trial代码来从 NNI 获取超参,并返回 NNI 最终结果。

mnist.py

import nnidef main(args):# 下载数据train_loader = torch.utils.data.DataLoader(datasets.MNIST(...), batch_size=args['batch_size'], shuffle=True)test_loader = torch.tuils.data.DataLoader(datasets.MNIST(...), batch_size=1000, shuffle=True)# 构造模型model = Net(hidden_size=args['hidden_size'])optimizer = optim.SGD(model.parameters(), lr=args['lr'], momentum=args['momentum'])# 训练for epoch in range(10):train(args, model, device, train_loader, optimizer, epoch)test_acc = test(args, model, device, test_loader)print(test_acc)nni.report_intermeidate_result(test_acc) print('final accuracy:', test_acc)# 报告评估指标nni.report_final_result(test_acc)if __name__ == '__main__':# 设置超参数默认值params = {'batch_size': 32, 'hidden_size': 128, 'lr': 0.001, 'momentum': 0.5}# 获取一次Trail的超参数params = nni.get_next_parameter()main(params)

第三步: 定义 YAML 格式的配置文件,声明搜索空间和 Trail 文件的路径。 它还提供其他信息,例如调整算法,最大 Trial 运行次数和最大持续时间的参数。

config.yml

authorName: defaultexperimentName: example_mnisttrialConcurrency: 1maxExecDuration: 1hmaxTrialNum: 10trainingServicePlatform: local# 搜索空间文件路径searchSpacePath: search_space.jsonuseAnnotation: falsetuner:builtinTunerName: TPE# 运行的命令,以及 Trial 代码的路径trial:command: python3 mnist.pycodeDir: .gpuNum: 0

最后,从命令行使用config.yml文件启动 MNIST Experiment 。

nnictl create --config config.yml

注意

如果要使用远程服务器或集群作为训练平台,为了避免产生过大的网络压力,NNI 限制了文件的最大数量为 2000,大小为 300 MB。 如果 codeDir 中包含了过多的文件,可添加.nniignore文件来排除部分,与.gitignore文件用法类似。

在命令行中等待输出INFO: Successfully started experiment!。 此消息表明实验已成功启动。 期望的输出如下:

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 egchD4qyThe 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 experiments2. nnictl trial lslist all of trial jobs3. nnictl topmonitor the status of running experiments4. nnictl log stderr show stderr log content5. nnictl log stdout show stdout log content6. nnictl stop stop an experiment7. nnictl trial kill kill a trial job by id8. nnictl --help get help information about nnictl-----------------------------------------------------------------------

如果根据上述步骤准备好了相应Trial搜索空间配置,并成功创建的 NNI 任务。NNI 会自动开始通过配置的搜索空间来运行不同的超参集合,搜索最好的超参。 通过 Web 界面可看到 NNI 的进度。

通过Web UI 可视化实验过程

启动 Experiment 后,可以在命令行界面找到如下的Web 界面地址

The Web UI urls are: [Your IP]:8080

在浏览器中打开Web 界面地址(即:[IP地址]:8080),就可以看到 Experiment 的详细信息,以及所有的 Trial 任务。

查看概要页面

Experiment 相关信息会显示在界面上,如配置和搜索空间等。 NNI 还支持通过Experiment summary按钮下载这些信息和参数。

查看 Trial 详情页面

可以在此页面中看到最佳的尝试指标和超参数图。 当您单击按钮Add/Remove columns时,表格内容包括更多列。 当您单击按钮Add/Remove columns时,表格内容包括更多列。

查看 Experiment 管理页面

All experiments页面可以查看计算机上的所有实验。

到处为止,一次AutoML超参数调优的实验运行就已经完成。

总结

本文简单介绍了自动机器学习工具NNI的基本概念、主要功能特点以及如何使用NNI进行一个超参调优实验,希望能够帮助到你。

参考文档

NNI source codeNNI官方文档-中文版NNI官方文档-英文版

如果觉得《浅析自动机器学习(AutoML)工具NNI》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。