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

使用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  # 可选。 目录的路径。 默认值:/nni-experiments
logLevel: info

# 调参器
tuner:
  builtinTunerName: TPE # 指定内置的调参算法

# 运行的命令,以及 Trial 代码的路径
trial:
  command: python3 run_demo.py
  codeDir: . #  必需字符串。 指定 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                       description

1. 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张图片
使用NNI进行自动超参数调优_第2张图片
使用NNI进行自动超参数调优_第3张图片
使用NNI进行自动超参数调优_第4张图片

你可能感兴趣的:(ml,机器学习,调参,炼丹,深度学习)