NNI 提供了大量可用于超参优化的 内置 Tuner, Advisor 和 Assessor ,其他算法可在 NNI 安装后,通过 nnictl algo register --meta <path_to_meta_file>
安装。 可通过 nnictl package list
命令查看其它算法。
NNI 中,还可以创建自定义的 Tuner,Advisor 和 Assessor。 并根据 Experiment 配置文件的说明来使用这些自定义的算法,可参考 自定义 Tuner , Advisor 和 Assessor。
用户可将自定义的算法作为内置算法安装,以便像其它内置 Tuner、Advisor、Assessor 一样使用。 更重要的是,这样更容易向其他人分享或发布自己实现的算法。 自定义的 Tuner、Advisor、Assessor 可作为内置算法安装到 NNI 中,安装完成后,可在 Experiment 配置文件中像内置算法一样使用。 例如,将自定义的算法 mytuner
安装到 NNI 后,可在配置文件中直接使用:
tuner:
builtinTunerName: mytuner
可参考下列步骤来构建自定义的 Tuner、Assessor、Advisor,并作为内置算法安装。
参考下列说明来创建:
NNI 提供了 ClassArgsValidator
接口,自定义的算法可用它来验证 Experiment 配置文件中传给构造函数的 classArgs 参数。
ClassArgsValidator
接口如下:
class ClassArgsValidator(object):
def validate_class_args(self, **kwargs):
"""
Experiment 配置中的 classArgs 字段会作为 dict
传入到 kwargs。
"""
pass
例如,可将 Validator 如下实现:
from schema import Schema, Optional
from nni import ClassArgsValidator
class MedianstopClassArgsValidator(ClassArgsValidator):
def validate_class_args(self, **kwargs):
Schema({
Optional('optimize_mode'): self.choices('optimize_mode', 'maximize', 'minimize'),
Optional('start_step'): self.range('start_step', int, 0, 9999),
}).validate(kwargs)
在 Experiment 启动时,会调用 Validator,检查 classArgs 字段是否正确。
首先,自定义的算法需要被打成 python 包。 然后你可以通过以下命令把算法包安装到 python 环境中:
- 在包目录中运行
python setup.py develop
,此命令会在开发者模式下安装包。如果算法正在开发中,推荐使用此命令。 - 在包目录中运行
python setup.py bdist_wheel
命令,会构建 whl 文件。 可通过pip3 install sklearn
命令来安装。
使用以下关键词创建 YAML 文件:
algoType
: 算法类型,可为tuner
,assessor
,advisor
builtinName
: 在 Experiment 配置文件中使用的内置名称- className: Tuner 类名,包括模块名,例如:
demo_tuner.DemoTuner
- classArgsValidator: 类的参数验证类 validator 的类名,包括模块名,如:
demo_tuner.MyClassArgsValidator
YAML 文件示例:
algoType: tuner
builtinName: demotuner
className: demo_tuner.DemoTuner
classArgsValidator: demo_tuner.MyClassArgsValidator
运行以下命令将自定义算法加入到 NNI 的内置算法中:
nnictl algo register --meta <path_to_meta_file>
<path_to_meta_file>
是上一节创建的 YAML 文件的路径。
参考 这里 获取完整示例。
在自定义算法安装后,可用其它内置 Tuner、Assessor、Advisor 的方法在 Experiment 配置文件中使用,例如:
tuner:
builtinTunerName: demotuner
classArgs:
# 可选项: maximize, minimize
optimize_mode: maximize
运行以下命令列出已安装的包:
nnictl algo list
+-----------------+------------+-----------+--------=-------------+------------------------------------------+
| Name | Type | Source | Class Name | Module Name |
+-----------------+------------+-----------+----------------------+------------------------------------------+
| TPE | tuners | nni | HyperoptTuner | nni.hyperopt_tuner.hyperopt_tuner |
| Random | tuners | nni | HyperoptTuner | nni.hyperopt_tuner.hyperopt_tuner |
| Anneal | tuners | nni | HyperoptTuner | nni.hyperopt_tuner.hyperopt_tuner |
| Evolution | tuners | nni | EvolutionTuner | nni.evolution_tuner.evolution_tuner |
| BatchTuner | tuners | nni | BatchTuner | nni.batch_tuner.batch_tuner |
| GridSearch | tuners | nni | GridSearchTuner | nni.gridsearch_tuner.gridsearch_tuner |
| NetworkMorphism | tuners | nni | NetworkMorphismTuner | nni.networkmorphism_tuner.networkmo... |
| MetisTuner | tuners | nni | MetisTuner | nni.metis_tuner.metis_tuner |
| GPTuner | tuners | nni | GPTuner | nni.gp_tuner.gp_tuner |
| PBTTuner | tuners | nni | PBTTuner | nni.pbt_tuner.pbt_tuner |
| SMAC | tuners | nni | SMACTuner | nni.smac_tuner.smac_tuner |
| PPOTuner | tuners | nni | PPOTuner | nni.ppo_tuner.ppo_tuner |
| Medianstop | assessors | nni | MedianstopAssessor | nni.medianstop_assessor.medianstop_... |
| Curvefitting | assessors | nni | CurvefittingAssessor | nni.curvefitting_assessor.curvefitt... |
| Hyperband | advisors | nni | Hyperband | nni.hyperband_advisor.hyperband_adv... |
| BOHB | advisors | nni | BOHB | nni.bohb_advisor.bohb_advisor |
+-----------------+------------+-----------+----------------------+------------------------------------------+
运行以下命令卸载已安装的包:
nnictl algo unregister <包名称>
例如:
nnictl algo unregister demotuner