Unverified Commit 6c3148c7 authored by SparkSnail's avatar SparkSnail Committed by GitHub
Browse files

Merge pull request #239 from microsoft/master

merge master
parents 0fb78620 a2e524d3
......@@ -60,4 +60,4 @@ ProxylessNasMutator 还实现了可变量的前向逻辑 (即, LayerChoice)。
## 重现结果
进行中...
为了重现结果,首先运行了搜索过程。我们发现虽然需要跑许多 Epoch,但选择的架构会在头几个 Epoch 就收敛了。 这可能是由超参或实现造成的,正在分析中。 找到架构的测试精度为 top1: 72.31, top5: 90.26。
......@@ -29,11 +29,11 @@ class Net(nn.Module):
self.fc3 = nn.Linear(84, 10)
```
有关 `LayerChoice``InputChoice` 的详细描述可参考[指南](NasGuide.md)
有关 `LayerChoice``InputChoice` 的详细描述可参考[ NAS 指南](NasGuide.md)
## 选择 NAS Trainer
实例化模型后,需要通过 NAS Trainer 来训练模型。 不同的 Trainer 会使用不同的方法来从指定的神经网络模块中搜索出最好的。 NNI 提供了流行的 NAS 训练方法,如 DARTS,ENAS。 以下以 `DartsTrainer` 为例。 在 Trainer 实例化后,调用`trainer.train()` 开始搜索。
实例化模型后,需要通过 NAS Trainer 来训练模型。 不同的 Trainer 会使用不同的方法来从指定的神经网络模块中搜索出最好的。 NNI 提供了几种流行的 NAS 训练方法,如 DARTS,ENAS。 以下以 `DartsTrainer` 为例。 在 Trainer 实例化后,调用`trainer.train()` 开始搜索。
```python
trainer = DartsTrainer(net,
......@@ -54,11 +54,11 @@ trainer.train()
## NAS 可视化
正在开发 NAS 的可视化,并将很快发布。
正在研究 NAS 的可视化,并将很快发布此功能
## 重新训练导出的最佳模型
重新训练找到(导出)的网络架构非常容易。 第一步,实例化上面定义的模型。 第二步,在模型上调用 `apply_fixed_architecture`。 然后,模型会为找到(导出)的模型,可通过正常的训练方法来训练此模型。
重新训练找到(导出)的网络架构非常容易。 第一步,实例化上面定义的模型。 第二步,在模型上调用 `apply_fixed_architecture`。 然后,模型会为找到(导出的)模型。 之后,可以使用传统方法来训练此模型。
```python
model = Net()
......
......@@ -92,17 +92,11 @@ python scratch.py
.. autoclass:: nni.nas.pytorch.spos.SPOSEvolution
:members:
.. automethod:: __init__
.. autoclass:: nni.nas.pytorch.spos.SPOSSupernetTrainer
:members:
.. automethod:: __init__
.. autoclass:: nni.nas.pytorch.spos.SPOSSupernetTrainingMutator
:members:
.. automethod:: __init__
```
## 已知的局限
......
......@@ -2,10 +2,10 @@
NNI (Neural Network Intelligence) 是一个工具包,可有效的帮助用户设计并调优机器学习模型的神经网络架构,复杂系统的参数(如超参)等。 NNI 的特性包括:易于使用,可扩展,灵活,高效。
* **易于使用**:NNI 可通过 pip 安装。 只需要在代码中添加几行,就可以利用 NNI 来调优参数。 可使用命令行工具或 Web 界面来查看实验过程
* **易于使用**:NNI 可通过 pip 安装。 只需要在代码中添加几行,就可以利用 NNI 来调优参数。 可使用命令行工具或 Web 界面来查看 Experiment
* **可扩展**:调优超参或网络结构通常需要大量的计算资源。NNI 在设计时就支持了多种不同的计算资源,如远程服务器组,训练平台(如:OpenPAI,Kubernetes),等等。 通过训练平台,可拥有同时运行数百个 Trial 的能力。
* **灵活**:除了内置的算法,NNI 中还可以轻松集成自定义的超参调优算法,神经网络架构搜索算法,提前终止算法等等。 还可以将 NNI 连接到更多的训练平台上,如云中的虚拟机集群,Kubernetes 服务等等。 此外,NNI 还可以连接到外部环境中的特殊应用和模型上。
* **高效**:NNI 在系统及算法级别上不停的优化。 例如:通过 Trial 早期的反馈来加速调优过程。
* **高效**:NNI 在系统及算法级别上不断地进行优化。 例如:通过早期的反馈来加速调优过程。
下图显示了 NNI 的体系结构。
......@@ -15,17 +15,17 @@ NNI (Neural Network Intelligence) 是一个工具包,可有效的帮助用户
## 主要概念
* *Experiment(实验)*实验是一次找到模型的最佳超参组合,或最好的神经网络架构的任务。 它由 Trial 和自动机器学习算法所组成。
* *Experiment(实验)* 表示一次任务,用来寻找模型的最佳超参组合,或最好的神经网络架构。 它由 Trial 和自动机器学习算法所组成。
* *搜索空间*:是模型调优的范围。 例如,超参的取值范围。
* *Configuration(配置)*:配置是来自搜索空间的一个参数实例,每个超参都会有一个特定的值。
* *Configuration(配置)*:配置是来自搜索空间的实例,每个超参都会有特定的值。
* *Trial*: Trial 是一次尝试,它会使用某组配置(例如,一组超参值,或者特定的神经网络架构)。 Trial 会基于提供的配置来运行。
* *Trial*: 是一次独立的尝试,它会使用某组配置(例如,一组超参值,或者特定的神经网络架构)。 Trial 会基于提供的配置来运行。
* *Tuner*: Tuner 是一个自动机器学习算法,会为下一个 Trial 生成新的配置。 新的 Trial 会使用这组配置来运行。
* *Tuner(调优器)*: Tuner 个自动机器学习算法,会为下一个 Trial 生成新的配置。 新的 Trial 会使用这组配置来运行。
* *Assessor*:Assessor 分析 Trial 的中间结果(例如,测试数据集上定期的精度),来确定 Trial 是否应该被提前终止。
* *Assessor(评估器)*分析 Trial 的中间结果(例如,定期评估数据集上的精度),来确定 Trial 是否应该被提前终止。
* *训练平台*:是 Trial 的执行环境。 根据 Experiment 的配置,可以是本机,远程服务器组,或其它大规模训练平台(如,OpenPAI,Kubernetes)。
......@@ -53,25 +53,25 @@ NNI 还希望提供用于机器学习和深度学习的算法工具包,尤其
### 超参调优
这是 NNI 最核心、基本的功能,其中提供了许多流行的[自动调优算法](Tuner/BuiltinTuner.md) ( Tuner) 以及 [提前终止算法](Assessor/BuiltinAssessor.md) ( Assessor)。 可查看[快速入门](Tutorial/QuickStart.md)来调优模型或系统。 基本上通过以上三步,就能开始NNI Experiment。
这是 NNI 最核心、基本的功能,其中提供了许多流行的[自动调优算法](Tuner/BuiltinTuner.md) ( Tuner) 以及 [提前终止算法](Assessor/BuiltinAssessor.md) ( Assessor)。 可查看[快速入门](Tutorial/QuickStart.md)来调优模型或系统。 基本上通过以上三步,就能开始 NNI Experiment。
### 通用 NAS 框架
此 NAS 框架可供用户轻松指定候选的神经体系结构,例如,可以为单个层指定多个候选操作(例如,可分离的 conv、扩张 conv),并指定可能的跳过连接。 NNI 将自动找到最佳候选。 另一方面,NAS 框架为其他类型的用户(如,NAS 算法研究人员)提供了简单的接口,以实现新的 NAS 算法。 详情及用法参考[这里](NAS/Overview.md)
此 NAS 框架可供用户轻松指定候选的神经体系结构,例如,可以为单个层指定多个候选操作(例如,可分离的 conv、扩张 conv),并指定可能的跳过连接。 NNI 将自动找到最佳候选。 另一方面,NAS 框架为其他类型的用户(如,NAS 算法研究人员)提供了简单的接口,以实现新的 NAS 算法。 NAS 详情及用法参考[这里](NAS/Overview.md)
NNI 通过 Trial SDK 支持多种 one-shot NAS 算法,如:ENAS、DARTS。 使用这些算法时,不需启动 NNI Experiment。 在 Trial 代码中加入算法,直接运行即可。 如果要调整算法中的超参数,或运行多个实例,可以使用 Tuner 并启动 NNI Experiment。
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 Trial SDK 提供。 可以直接在 Trial 代码中使用,并在不启动 NNI Experiment 的情况下运行 Trial 代码。 详情及用法参考[这里](Compressor/Overview.md)
NNI 上的模型压缩包括剪枝和量化算法。 这些算法通过 NNI Trial SDK 提供。 可以直接在 Trial 代码中使用,并在不启动 NNI Experiment 的情况下运行 Trial 代码。 模型压缩的详细说明和算法可在[这里](Compressor/Overview.md)找到
模型压缩中有不同的超参。 一种类型是在输入配置中的超参,例如,压缩算法的稀疏性、量化的位宽。 另一种类型是压缩算法的超参。 NNI 的超参调优可以自动找到最佳的压缩模型。 参考[简单示例](Compressor/AutoCompression.md)
### 自动特征工程
自动特征工程,为下游任务找到最有效的特征。 详情及用法参考[这里](FeatureEngineering/Overview.md)。 通过 NNI Trial SDK 支持,不必创建 NNI Experiment。 只需在 Trial 代码中加入内置的自动特征工程算法,然后直接运行 Trial 代码。
自动特征工程,为下游任务找到最有效的特征。 自动特征工程及其用法的详细说明可在[这里](FeatureEngineering/Overview.md)找到。 通过 NNI Trial SDK 支持,不必创建 NNI Experiment。 只需在 Trial 代码中加入内置的自动特征工程算法,然后直接运行 Trial 代码。
自动特征工程算法通常有一些超参。 如果要自动调整这些超参,可以利用 NNI 的超参数调优,即选择调优算法(即 Tuner)并启动 NNI Experiment。
......
# 更改日志
## 发布 1.4 - 2/19/2020
### 主要功能
#### 神经网络架构搜索
* 支持 [C-DARTS](https://github.com/microsoft/nni/blob/v1.4/docs/en_US/NAS/CDARTS.md) 算法,并增加对应[示例](https://github.com/microsoft/nni/tree/v1.4/examples/nas/cdarts)
* 初步支持 [ProxylessNAS](https://github.com/microsoft/nni/blob/v1.4/docs/en_US/NAS/Proxylessnas.md) 以及对应[示例](https://github.com/microsoft/nni/tree/v1.4/examples/nas/proxylessnas)
* 为 NAS 框架增加单元测试
#### 模型压缩
* 为压缩模型增加 DataParallel,并提供相应的 [示例](https://github.com/microsoft/nni/blob/v1.4/examples/model_compress/multi_gpu.py)
* 支持压缩模型的[加速](https://github.com/microsoft/nni/blob/v1.4/docs/en_US/Compressor/ModelSpeedup.md)(试用版)
#### 训练平台
* 通过允许指定 OpenPAI 配置文件路径,来支持完整的 OpenPAI 配置
* 为新的 OpenPAI 模式(又称,paiK8S)增加示例配置 YAML 文件
* 支持删除远程模式下使用 sshkey 的 Experiment (感谢外部贡献者 @tyusr)
#### Web 界面
* Web 界面重构:采用 fabric 框架
#### 其它
* 支持[在前台运行 NNI Experiment](https://github.com/microsoft/nni/blob/v1.4/docs/en_US/Tutorial/Nnictl.md#manage-an-experiment),即,`nnictl create/resume/view``--foreground` 参数
* 支持取消 UNKNOWN 状态的 Trial。
* 支持最大 50MB 的搜索空间文件 (感谢外部贡献者 @Sundrops)
### 文档
* 改进 NNI readthedocs 的[目录索引结构](https://nni.readthedocs.io/en/latest/)
* 改进 [NAS 文档](https://github.com/microsoft/nni/blob/v1.4/docs/en_US/NAS/NasGuide.md)
* 改进[新的 OpenPAI 模式的文档](https://github.com/microsoft/nni/blob/v1.4/docs/en_US/TrainingService/PaiMode.md)
*[NAS](https://github.com/microsoft/nni/blob/v1.4/docs/en_US/NAS/QuickStart.md)[模型压缩](https://github.com/microsoft/nni/blob/v1.4/docs/en_US/Compressor/QuickStart.md)增加入门指南
* 改进支持 [EfficientNet](https://github.com/microsoft/nni/blob/v1.4/docs/en_US/TrialExample/EfficientNet.md) 的文档
### 修复的 Bug
* 修复在指标数据和 JSON 格式中对 NaN 的支持
* 修复搜索空间 `randint` 类型的 out-of-range Bug
* 修复模型压缩中导出 ONNX 模型时的错误张量设备的 Bug
* 修复新 OpenPAI 模式(又称,paiK8S)下,错误处理 nnimanagerIP 的 Bug
## 发布 1.3 - 12/30/2019
### 主要功能
......@@ -12,10 +58,10 @@
* [知识蒸馏](https://github.com/microsoft/nni/blob/v1.3/docs/zh_CN/TrialExample/KDExample.md)算法和使用示例
* Pruners
* [L2Filter Pruner](https://github.com/microsoft/nni/blob/master/docs/zh_CN/Compressor/Pruner.md#l2filter-pruner)
* [ActivationAPoZRankFilterPruner](https://github.com/microsoft/nni/blob/master/docs/zh_CN/Compressor/Pruner.md#activationapozrankfilterpruner)
* [ActivationMeanRankFilterPruner](https://github.com/microsoft/nni/blob/master/docs/zh_CN/Compressor/Pruner.md#activationmeanrankfilterpruner)
* [BNN Quantizer](https://github.com/microsoft/nni/blob/v1.3/docs/zh_CN/Compressor/Quantizer.md#bnn-quantizer)
* [L2Filter Pruner](https://github.com/microsoft/nni/blob/v1.3/docs/en_US/Compressor/Pruner.md#3-l2filter-pruner)
* [ActivationAPoZRankFilterPruner](https://github.com/microsoft/nni/blob/v1.3/docs/en_US/Compressor/Pruner.md#1-activationapozrankfilterpruner)
* [ActivationMeanRankFilterPruner](https://github.com/microsoft/nni/blob/v1.3/docs/en_US/Compressor/Pruner.md#2-activationmeanrankfilterpruner)
* [BNN Quantizer](https://github.com/microsoft/nni/blob/v1.3/docs/en_US/Compressor/Quantizer.md#bnn-quantizer)
#### 训练平台
......@@ -43,12 +89,12 @@
### 主要功能
* [特征工程](https://github.com/microsoft/nni/blob/v1.2/docs/zh_CN/FeatureEngineering/Overview.md)
* [特征工程](https://github.com/microsoft/nni/blob/v1.2/docs/en_US/FeatureEngineering/Overview.md)
- 新增特征工程接口
- 特征选择算法: [Gradient feature selector](https://github.com/microsoft/nni/blob/v1.2/docs/zh_CN/FeatureEngineering/GradientFeatureSelector.md) & [GBDT selector](https://github.com/microsoft/nni/blob/v1.2/docs/zh_CN/FeatureEngineering/GBDTSelector.md)
- [特征工程示例](https://github.com/microsoft/nni/tree/v1.2/examples/feature_engineering)
- 神经网络结构搜索在 NNI 上的应用
- [新的 NAS 接口](https://github.com/microsoft/nni/blob/v1.2/docs/zh_CN/NAS/NasInterface.md)
- [新的 NAS 接口](https://github.com/microsoft/nni/blob/v1.2/docs/en_US/NAS/NasInterface.md)
- NAS 算法: [ENAS](https://github.com/microsoft/nni/blob/v1.2/docs/zh_CN/NAS/Overview.md#enas), [DARTS](https://github.com/microsoft/nni/blob/v1.2/docs/zh_CN/NAS/Overview.md#darts), [P-DARTS](https://github.com/microsoft/nni/blob/v1.2/docs/zh_CN/NAS/Overview.md#p-darts) (PyTorch)
- 经典模式下的 NAS(每次 Trial 独立运行)
- 模型压缩
......@@ -69,7 +115,7 @@
- 文档
- 改进了 NNI API 文档,增加了更多的 docstring。
### Bug 修复
### 修复的 Bug
- 修复当失败的 Trial 没有指标时,表格的排序问题。 -Issue #1773
- 页面切换时,保留选择的(最大、最小)状态。 -PR#1710
......@@ -81,7 +127,7 @@
### 主要功能
* 新 Tuner: [PPO Tuner](https://github.com/microsoft/nni/blob/v1.1/docs/zh_CN/Tuner/PPOTuner.md)
* [查看已停止的 Experiment](https://github.com/microsoft/nni/blob/master/docs/zh_CN/Tutorial/Nnictl.md#view)
* [查看已停止的 Experiment](https://github.com/microsoft/nni/blob/v1.1/docs/en_US/Tutorial/Nnictl.md#view)
* Tuner 可使用专门的 GPU 资源(参考[教程](https://github.com/microsoft/nni/blob/v1.1/docs/zh_CN/Tutorial/ExperimentConfig.md)中的 `gpuIndices` 了解详情)
* 改进 WEB 界面
- Trial 详情页面可列出每个 Trial 的超参,以及开始结束时间(需要通过 "add column" 添加)
......@@ -137,7 +183,7 @@
+ 添加配置示例
+ [Web 界面描述改进](Tutorial/WebUI.md) -PR #1419
### Bug 修复
### 修复的 Bug
* (Bug 修复)修复 0.9 版本中的链接 -Issue #1236
* (Bug 修复)自动完成脚本
......@@ -158,7 +204,7 @@
### 主要功能
* 生成 NAS 编程接口
* 通用 NAS 编程接口
* 为 NAS 接口添加 `enas-mode``oneshot-mode`[PR #1201](https://github.com/microsoft/nni/pull/1201#issue-291094510)
* [有 Matern 核的高斯 Tuner](Tuner/GPTuner.md)
......@@ -202,7 +248,7 @@
* 在已经运行非 NNI 任务的 GPU 上也能运行 Trial
* 支持 Kubeflow v1beta2 操作符
* 支持 Kubeflow TFJob/PyTorchJob v1beta2
* [通用 NAS 编程接口](https://github.com/microsoft/nni/blob/v0.8/docs/zh_CN/GeneralNasInterfaces.md)
* [通用 NAS 编程接口](https://github.com/microsoft/nni/blob/v0.8/docs/en_US/GeneralNasInterfaces.md)
* 实现了 NAS 的编程接口,可通过 NNI Annotation 很容易的表达神经网络架构搜索空间
* 提供新命令 `nnictl trial codegen` 来调试 NAS 代码生成部分
* 提供 NAS 编程接口教程,NAS 在 MNIST 上的示例,用于 NAS 的可定制的随机 Tuner
......@@ -246,7 +292,7 @@
* 为 nnictl 提供更友好的错误消息
* 为 YAML 文件格式错误提供更有意义的错误信息
### Bug 修复
### 修复的 Bug
* 运行 nnictl stop 的异步 Dispatcher 模式时,无法杀掉所有的 Python 线程
* nnictl --version 不能在 make dev-install 下使用
......@@ -265,7 +311,7 @@
* 使日志集合功能可配置
* 为所有 Trial 增加中间结果的视图
### Bug 修复
### 修复的 Bug
* [为 OpenPAI 增加 shmMB 配置](https://github.com/microsoft/nni/issues/842)
* 修复在指标为 dict 时,无法显示任何结果的 Bug。
......@@ -290,7 +336,7 @@
* 修复了在某些极端条件下,不能正确存储任务的取消状态。
* 修复在使用 SMAC Tuner 时,解析搜索空间的错误。
* 修复 CIFAR-10 例中的 broken pipe 问题。
* 修复 CIFAR-10 例中的 broken pipe 问题。
* 为本地训练和 NNI 管理器添加单元测试。
* 为远程服务器、OpenPAI 和 Kubeflow 训练平台在 Azure 中增加集成测试。
* 在 OpenPAI 客户端中支持 Pylon 路径。
......@@ -438,7 +484,7 @@
### 新示例
*的 NNI Docker 映像:
*的 NNI Docker 映像:
```bash
docker pull msranni/nni:latest
......
**在 DLTS 上运行 Experiment**
===
NNI 支持在 [DLTS](https://github.com/microsoft/DLWorkspace.git) 上运行 Experiment ,称之为 dlts 模式。 在开始使用 NNI dlts 模式之前,应该有访问 DLTS 仪表板的账号。
## 设置环境
步骤 1. 从 DLTS 仪表板中选择集群,关于仪表板地址,需咨询管理员。
![选择集群](../../img/dlts-step1.png)
步骤 2. 准备 NNI 配置 YAML,如下所示:
```yaml
# 将此字段设置为 "dlts"
trainingServicePlatform: dlts
authorName: your_name
experimentName: auto_mnist
trialConcurrency: 2
maxExecDuration: 3h
maxTrialNum: 100
searchSpacePath: search_space.json
useAnnotation: false
tuner:
builtinTunerName: TPE
classArgs:
optimize_mode: maximize
trial:
command: python3 mnist.py
codeDir: .
gpuNum: 1
image: msranni/nni
# 访问 DLTS 的配置
dltsConfig:
dashboard: # Ask administrator for the cluster dashboard URL
```
记得将群集仪表板地址填到最后一行。
步骤 3. 打开群集的工作目录,将 NNI 配置和相关代码放入目录中。
![复制配置](../../img/dlts-step3.png)
步骤 4. 将 NNI 管理器任务提交到指定的群集。
![提交 Job](../../img/dlts-step4.png)
步骤 5. 转到新创建的任务选项卡,单击端口 40000 的链接检查 Trial 的信息。
![查看 NNI Web 界面](../../img/dlts-step5.png)
......@@ -4,9 +4,9 @@ NNI 可以通过 SSH 在多个远程计算机上运行同一个 Experiment,称
## 远程计算机的要求
* 仅支持 Linux 作为远程计算机,其[配置需求](../Tutorial/Installation.md)与 NNI 本机模式相同。
* 仅支持 Linux 作为远程计算机,其[配置需求](../Tutorial/InstallationLinux.md)与 NNI 本机模式相同。
* 根据[安装文章](../Tutorial/Installation.md),在每台计算机上安装 NNI。
* 根据[安装文章](../Tutorial/InstallationLinux.md),在每台计算机上安装 NNI。
* 确保远程计算机满足 Trial 代码的环境要求。 如果默认环境不符合要求,可以将设置脚本添加到 NNI 配置的 `command` 字段。
......
......@@ -45,7 +45,7 @@ RECEIVED_PARAMS = nni.get_next_parameter()
nni.report_intermediate_result(metrics)
```
`指标`可以是任意的 Python 对象。 如果使用了 NNI 内置的 Tuner/Assessor,`指标`只可以是两种类型:1) 数值类型,如 float、int, 2) dict 对象,其中必须由键名为 `default`,值为数值的项目。 `指标`会发送给 [Assessor](../Assessor/BuiltinAssessor.md)。 通常,`指标`损失值或精度。
`指标`可以是任意的 Python 对象。 如果使用了 NNI 内置的 Tuner/Assessor,`指标`只可以是两种类型:1) 数值类型,如 float、int, 2) dict 对象,其中必须由键名为 `default`,值为数值的项目。 `指标`会发送给 [Assessor](../Assessor/BuiltinAssessor.md)。 通常,`指标`包含了定期评估的损失值或精度。
* 返回配置的最终性能
......@@ -53,11 +53,11 @@ nni.report_intermediate_result(metrics)
nni.report_final_result(metrics)
```
`指标`可以是任意的 Python 对象。 如果使用了内置的 Tuner/Assessor,`指标`格式和 `report_intermediate_result` 中一样,这个数值表示模型的性能,如精度、损失值等。 `指标`会发送给 [Tuner](../Tuner/BuiltinTuner.md)
`指标`可以是任意的 Python 对象。 如果使用了内置的 Tuner/Assessor,`指标`格式和 `report_intermediate_result` 中一样,这个数值表示模型的性能,如精度、损失值等。 `指标`会发送给 [Tuner](../Tuner/BuiltinTuner.md)
### 第三步:启用 NNI API
要启用 NNI 的 API 模式,需要将 useAnnotation 设置为 *false*,并提供搜索空间文件的路径即第一步中定义的文件
要启用 NNI 的 API 模式,需要将 useAnnotation 设置为 *false*,并提供搜索空间文件的路径即第一步中定义的文件:
```yaml
useAnnotation: false
......@@ -72,10 +72,10 @@ searchSpacePath: /path/to/your/search_space.json
## NNI Annotation
另一种实现 Trial 的方法是使用 Python 注释来标记 NNI。 就像其它 Python Annotation,NNI 的 Annotation 和代码中的注释一样。 不需要在代码中做大量改动。 只需要添加一些 NNI Annotation,就能够:
另一种实现 Trial 的方法是使用 Python 注释来标记 NNI。 NN Annotation 很简单,类似于注释。 不必对现有代码进行结构更改。 只需要添加一些 NNI Annotation,就能够:
* 标记需要调整的参数变量
* 指定变量的搜索空间范围
* 指定要在其中调整的变量的范围
* 标记哪个变量需要作为中间结果范围给 `Assessor`
* 标记哪个变量需要作为最终结果(例如:模型精度)返回给 `Tuner`
......@@ -89,7 +89,7 @@ searchSpacePath: /path/to/your/search_space.json
2. 每执行 100 步返回 test\_acc
3. 最后返回 test\_acc 作为最终结果。
新添加的代码都是注释,不会影响以前的执行逻辑。因此这些代码仍然能在没有安装 NNI 的环境中运行。
值得注意的是,新添加的代码都是注释,不会影响以前的执行逻辑。因此这些代码仍然能在没有安装 NNI 的环境中运行。
```diff
with tf.Session() as sess:
......@@ -120,7 +120,7 @@ with tf.Session() as sess:
**注意**
* `@nni.variable` 会对它的下面一行进行修改,左边被赋值变量必须 `@nni.variable``name` 参数中指定
* `@nni.variable` 会对它的下面一行进行修改,左边被赋值变量必须 `@nni.variable`关键字 `name` 相同
* `@nni.report_intermediate_result`/`@nni.report_final_result` 会将数据发送给 Assessor、Tuner。
Annotation 的语法和用法等,参考 [Annotation](../Tutorial/AnnotationSpec.md)
......
......@@ -4,4 +4,4 @@
Batch Tuner 能让用户简单的提供几组配置(如,超参选项的组合)。 当所有配置都执行完后,Experiment 即结束。 Batch Tuner 的[搜索空间](../Tutorial/SearchSpaceSpec.md)只支持 `choice`
建议场景:如果 Experiment 配置已确定,可通过 choice 将它们罗列到搜索空间文件中运行即可。
\ No newline at end of file
建议场景:如果 Experiment 配置已确定,可通过 `choice` 将它们罗列到搜索空间文件中运行即可。
\ No newline at end of file
......@@ -10,7 +10,7 @@ BOHB 依赖 HB(Hyperband)来决定每次跑多少组参数和每组参数分
### HB(Hyperband)
按照 Hyperband 的方式来选择每次跑的参数个数与分配多少资源(budget),并继续使用连续减半(SuccessiveHalving)”策略,更多有关Hyperband算法的细节,参考[NNI 中的 Hyperband](HyperbandAdvisor.md)[Hyperband 的参考论文](https://arxiv.org/abs/1603.06560)。 下面的伪代码描述了这个过程。
按照 Hyperband 的方式来选择资源(budget),并继续使用 "连续减半(SuccessiveHalving)" 策略。 更多细节,参考 [NNI 中的 Hyperband](HyperbandAdvisor.md)[Hyperband 的参考论文](https://arxiv.org/abs/1603.06560)。 下面的伪代码描述了这个过程。
![](../../img/bohb_1.png)
......@@ -36,13 +36,13 @@ BOHB 的 BO 与 TPE 非常相似, 它们的主要区别是: BOHB 中使用一个
以上这张图展示了 BOHB 的工作流程。 将每次训练的最大资源配置(max_budget)设为 9,最小资源配置设为(min_budget)1,逐次减半比例(eta)设为 3,其他的超参数为默认值。 那么在这个例子中,s_max 计算的值为 2, 所以会持续地进行 {s=2, s=1, s=0, s=2, s=1, s=0, ...} 的循环。 在“逐次减半”(SuccessiveHalving)算法的每一个阶段,即图中橙色框,都将选取表现最好的前 1/eta 个参数,并在赋予更多计算资源(budget)的情况下运行。不断重复“逐次减半” (SuccessiveHalving)过程,直到这个循环结束。 同时,收集这些试验的超参数组合,使用了计算资源(budget)和其表现(metrics),使用这些数据来建立一个以使用了多少计算资源(budget)为维度的多维核密度估计(KDE)模型。 这个多维的核密度估计(KDE)模型将用于指导下一个循环的参数选择。
有关如何使用多维的KDE模型来指导参数选择的采样规程,用以下伪代码来描述。
有关如何使用多维的 KDE 模型来指导参数选择的采样规程,用以下伪代码来描述。
![](../../img/bohb_4.png)
## 3. 用法
BOHB advisor 的使用依赖 [ConfigSpace](https://github.com/automl/ConfigSpace),在第一次使用 BOHB 的时候,在命令行运行以下的指令来安装要求的 ConfigSpace
BOHB Advisor 需要 [ConfigSpace](https://github.com/automl/ConfigSpace)。 可以使用以下命令安装 ConfigSpace。
```bash
nnictl package install --name=SMAC
......@@ -66,27 +66,27 @@ advisor:
min_bandwidth: 0.001
```
**需要的参数**
**classArgs 要求:**
* **optimize_mode** (*maximize 或 minimize, 可选项, 默认值为 maximize*) - 如果为 'maximize',表示 Tuner 的目标是将指标最大化。 如果为 'minimize',表示 Tuner 的目标是将指标最小化。
* **optimize_mode** (*maximize 或 minimize, 可选项, 默认值为 maximize*) - 如果为 'maximize',表示 Tuner 会试着最大化指标。 如果为 'minimize',表示 Tuner 的目标是将指标最小化。
* **min_budget** (*整数, 可选项, 默认值为 1*) - 运行一个试验给予的最低计算资源(budget),这里的计算资源通常使用mini-batches 或者 epochs。 该参数必须为正数。
* **max_budget** (*整数, 可选项, 默认值为 3*) - 运行一个试验给予的最大计算资源(budget),这里的计算资源通常使用 mini-batches 或者 epochs。 该参数必须大于“min_budget”。
* **eta** (*整数, 可选项, 默认值为3*) - 在每次迭代中,执行完整的“连续减半”算法。 在这里,当一个使用相同计算资源的子集结束后,选择表现前 1/eta 好的参数,给予更高的优先级,进入下一轮比较(会获得更多计算资源)。 该参数必须大于等于 2。
* **min_points_in_model**(*整数, 可选项, 默认值为None*): 建立核密度估计(KDE)要求的最小观察到的点。 默认值 None 表示 dim+1,当在该计算资源(budget)下试验过的参数已经大于等于`max{dim+1, min_points_in_model}` 时,BOHB 将会开始建立这个计算资源(budget)下对应的核密度估计(KDE)模型,然后用这个模型来指导参数的选取。 该参数必须为正数。dim 指的是搜索空间中超参数的维度)
* **top_n_percent**(*整数, 可选, 默认值为15*): 认为观察点为好点的百分数(在 1 到 99 之间,默认值为 15)。 区分表现好的点与坏的点是为了建立树形核密度估计模型。 如,如果观察到了100个点的表现情况,同时把 top_n_percent 设置为 15,那么表现最好的 15个点将用于创建表现好的点的分布 "l(x)",剩下的85个点将用于创建表现坏的点的分布 “g(x)
* **num_samples** (*整数, 可选项, 默认值为64*): 用于优化 EI 值的采样个数(默认值为64)。 在这个例子中,将根据 l(x) 的分布采样“num_samples”(默认值为64)个点。若优化的目标为最大化指标,则会返回其中 l(x)/g(x) 值最大的点作为下一个试验的参数。 否则,使用值最小的点。
* **min_points_in_model**(*整数, 可选项, 默认值为None*): 建立核密度估计(KDE)要求的最小观察到的点。 默认值 None 表示 dim+1,当在该计算资源(budget)下试验过的参数已经大于等于`max{dim+1, min_points_in_model}` 时,BOHB 将会开始建立这个计算资源(budget)下对应的核密度估计(KDE)模型,然后用这个模型来指导参数的选取。 该参数必须为正数。 (dim 表示搜索空间中超参的数量)
* **top_n_percent**(*整数, 可选, 默认值为 15*): 认为观察点为好点的百分数 (在 1 到 99 之间)。 区分表现好的点与坏的点是为了建立树形核密度估计模型。 如,如果有 100 个观察到的 Trial,top_n_percent 为 15,则前 15% 的点将用于构建好点模型 "l(x)"。 其余 85% 的点将用于构建坏点模型 "g(x)"
* **num_samples** (*整数, 可选项, 默认值为64*): 用于优化 EI 值的采样个数(默认值为64)。 在这种情况下,将对 "num_samples" 点进行采样,并比较 l(x)/g(x) 的结果。 然后,如果 optimize_mode 是 `maximize`,就会返回其中 l(x)/g(x) 值最大的点作为下一个配置参数。 否则,使用值最小的点。
* **random_fraction**(*浮点数, 可选项, 默认值为0.33*): 使用模型的先验(通常是均匀)来随机采样的比例。
* **bandwidth_factor**(< 1>浮点数, 可选, 默认值为3.0 </em>): 为了鼓励多样性,把优化EI的点加宽,即把KDE中采样的点乘以这个因子,从而增加KDE中的带宽。 如果不熟悉 KDE,建议保留默认值。
* **min_bandwidth**(< 1>float, 可选, 默认值 = 0.001 </em>): 为了保持多样性, 即使所有好的样本对其中一个参数具有相同的值,使用最小带宽 (默认值: 1e-3) 而不是零。 如果不熟悉 KDE,建议保留默认值。
* **bandwidth_factor**(< 1>浮点数, 可选, 默认值为3.0 </em>): 为了鼓励多样性,把优化EI的点加宽,即把KDE中采样的点乘以这个因子,从而增加KDE中的带宽。 如果不熟悉 KDE,建议使用默认值。
* **min_bandwidth**(< 1>float, 可选, 默认值 = 0.001 </em>): 为了保持多样性, 即使所有好的样本对其中一个参数具有相同的值,使用最小带宽 (默认值: 1e-3) 而不是零。 如果不熟悉 KDE,建议使用默认值。
*目前 NNI 的浮点类型仅支持十进制表示必须使用 0.333 来代替 1/3,0.001代替 1e-3。*
*请注意,浮点类型当前仅支持十进制表示必须使用 0.333 而不是 1/3 ,0.001 而不是 1e-3。*
## 4. 文件结构
Advisor 有大量的文件、函数和类。 文件内容的简单介绍
Advisor 有大量的文件、函数和类。 这里只简单介绍最重要的文件
* `bohb_advisor.py` BOHB类的定义, 包括与dispatcher进行交互的部分,以及控制新试验的生成,计算资源以及试验结果的处理。 基本包含了HB(Hyperband)的实现部分。
* `config_generator.py` 包含了BO(贝叶斯优化)算法的实验部分。 内置函数 *get_config* 使用基于贝叶斯优化生成一个新的参数组合, 内置函数 *new_result* 接受新的结果并使用这些结果来更新贝叶斯优化模型。
* `bohb_advisor.py` BOHB 类的定义, 包括与 Dispatcher 进行交互的部分,以及控制新 Trial 的生成,计算资源以及结果的处理。 包含了 HB(Hyperband)的实现部分。
* `config_generator.py` 包含了 BO(贝叶斯优化)算法的实。 内置函数 *get_config* 使用基于贝叶斯优化生成一个新的参数组合内置函数 *new_result* 接受新的结果并使用这些结果来更新贝叶斯优化模型。
## 5. 实验
......@@ -94,8 +94,8 @@ Advisor 有大量的文件、函数和类。 文件内容的简单介绍:
源码地址: [examples/trials/mnist-advisor](https://github.com/Microsoft/nni/tree/master/examples/trials/)
使用BOHB这个调参算法,在CNN模型上跑MNIST数据集。 下面是实验结果:
使用 BOHB 调参算法,在 CNN 模型上跑 MNIST 数据集。 下面是实验结果:
![](../../img/bohb_5.png)
更多的实验结果可以在 [参考论文](https://arxiv.org/abs/1807.01774)中看到,们可以发现BOHB很好的利用了之前的试验结果,且在开发与探索中得到了一个很好的平衡。
\ No newline at end of file
更多实验结果可以在[参考文献](https://arxiv.org/abs/1807.01774)中找到。 可以看到,BOHB 充分利用了以往的成果,在探索和挖掘方面有很好的平衡。
\ No newline at end of file
This diff is collapsed.
......@@ -2,4 +2,4 @@
## Naïve Evolution(进化算法)
进化算法来自于 [Large-Scale Evolution of Image Classifiers](https://arxiv.org/pdf/1703.01041.pdf)。 它会基于搜索空间随机生成一个种群。 在每一代中,会选择较好的结果,并对其下一代进行一些变异(例如,改动一个超参,增加或减少一层)。 进化算法需要很多次 Trial 才能有效,但它也非常简单,也很容易扩展新功能。
\ No newline at end of file
进化算法来自于 [Large-Scale Evolution of Image Classifiers](https://arxiv.org/pdf/1703.01041.pdf)。 它会基于搜索空间随机生成一个种群。 在每一代中,会选择较好的结果,并对其下一代进行一些变异(例如,改动一个超参,增加或减少一层,等)。 进化算法需要很多次 Trial 才能有效,但它也非常简单,也很容易扩展新功能。
\ No newline at end of file
......@@ -4,7 +4,7 @@
贝叶斯优化会构建一个能最好的描述优化目标的后验分布函数(使用高斯过程)。 随着观测值的增加,后验分布会得到改善,会在参数空间中确定哪些范围值得进一步探索,哪一些不值得。
GP Tuner 被设计为通过最大化或最小化步数来找到最接近最优结果的参数组合。 GP Tuner 使用了代理优化问题(找到采集函数的最大值)。虽然这仍然是个难题,但成本更低(从计算的角度来看),并且通用工具。 因此,贝叶斯优化适合于采样函数的成本非常高时来使用。
GP Tuner 被设计为通过最大化或最小化步数来找到最接近最优结果的参数组合。 GP Tuner 使用了代理优化问题(找到采集函数的最大值)。虽然这仍然是个难题,但成本更低(从计算的角度来看),并且适合于作为通用工具。 因此,贝叶斯优化适合于采样函数的成本非常高时来使用。
注意,搜索空间接受的类型包括 `randint`, `uniform`, `quniform`, `loguniform`, `qloguniform`,以及数值的 `choice`
......
......@@ -6,9 +6,9 @@
## 2. 实现并行
首先,此示例是基于 MsgDispatcherBase 来实现的自动机器学习算法,而不是基于 Tuner 和Assessor。 这种实现方法下,Hyperband 集成了 Tuner 和 Assessor 两者的功能,因而将它叫做 Advisor。
首先,此示例是基于 MsgDispatcherBase 来实现的自动机器学习算法,而不是基于 Tuner 和 Assessor。 这种实现方法下,Hyperband 集成了 Tuner 和 Assessor 两者的功能,因而将它叫做 Advisor。
其次,本实现完全利用了 Hyperband 内部的并行性。 具体来说,下一个分组不会严格的在当前分组结束后再运行只要有资源,就可以开始运行新的分组。
其次,本实现完全利用了 Hyperband 内部的并行性。 具体来说,下一个分组不会严格的在当前分组结束后再运行只要有资源,就可以开始运行新的分组。
## 3. 用法
......@@ -26,7 +26,7 @@
optimize_mode: maximize
注意,一旦使用了 Advisor,就不能在配置文件中添加 Tuner 和 Assessor。 使用 Hyperband 时,Trial 代码收到的超参(如键值对)中,除了用户定义的超参,会多一个 `TRIAL_BUDGET`**使用 `TRIAL_BUDGET`,Trial 能够控制其运行的时间。</p>
注意,一旦使用了 Advisor,就不能在配置文件中添加 Tuner 和 Assessor。 使用 Hyperband 时,Trial 代码收到的超参(如键值对)中,会多一个用户定义的 `TRIAL_BUDGET`**使用 `TRIAL_BUDGET`,Trial 能够控制其运行的时间。</p>
对于 Trial 代码中 `report_intermediate_result(metric)``report_final_result(metric)`**`指标` 应该是数值,或者用一个 dict,并保证其中有键值为 default 的项目,其值也为数值型**。 这是需要进行最大化或者最小化优化的数值,如精度或者损失度。
......@@ -49,8 +49,8 @@
关于如何实现 Trial 代码,参考 `examples/trials/mnist-hyperband/` 中的说明。
## 4. 改进
## 4. 未来的改进
当前实现的 Hyperband 算法可以通过改进支持的提前终止算法来提高,原因是最好的 `n/eta` 个配置并不一定都表现很好。 不好的配置可以更早的终止。
当前实现的 Hyperband 算法可以通过改进支持的提前终止算法来提高,因为最好的 `n/eta` 个配置并不一定都表现很好。 不好的配置应该更早的终止。
在当前实现中,遵循了[此论文](https://arxiv.org/pdf/1603.06560.pdf)的设计,配置都是随机生成的。 要进一步提升,配置生成过程可以利用更高级的算法。
\ No newline at end of file
......@@ -6,7 +6,7 @@ Tree-structured Parzen Estimator (TPE) 是一种 sequential model-based optimiza
### TPE 的并行优化
为了利用多个计算节点,TPE 方法是异步运行的,这样能避免浪费时间等待 Trial 评估的完成。 算法设计的初衷是优化序列。 当在高并发情况下使用 TPE,性能会非常差。 通过 Constant Liar 算法优化了这种情况。 关于优化的原理,参考[文档](../CommunitySharings/ParallelizingTpeSearch.md)
为了利用多个计算节点,TPE 方法是异步运行的,这样能避免浪费时间等待 Trial 评估的完成。 对原始算法设计进行了顺序计算优化。 如果要大并发的使用 TPE,性能将会较差。 通过 Constant Liar 算法优化了这种情况。 关于优化的原理,参考[文档](../CommunitySharings/ParallelizingTpeSearch.md)
### 用法
......@@ -21,15 +21,15 @@ tuner:
constant_liar_type: min
```
**参数**
**classArgs 要求:**
* **optimize_mode** (*maximize 或 minimize, 可选项, 默认值为 maximize*) - 如果为 'maximize',表示 Tuner 的目标是将指标最大化。 如果为 'minimize',表示 Tuner 的目标是将指标最小化。
* **optimize_mode** (*maximize 或 minimize, 可选项, 默认值为 maximize*) - 如果为 'maximize',表示 Tuner 会试着最大化指标。 如果为 'minimize',表示 Tuner 的目标是将指标最小化。
* **parallel_optimize** (*bool, 可选, 默认值为 False*) - 如果为 True,TPE 会使用 Constant Liar 算法来优化并行超参调优。 否则,TPE 不会区分序列或并发的情况。
* **constant_liar_type** (*min、max 或 mean, 可选, 默认值为 min*) - 使用的 constant liar 类型,会在 X 点根据 y 的取值来确定。对应三个值:min{Y}, max{Y}, 和 mean{Y}。
## Random Search(随机搜索)
[Random Search for Hyper-Parameter Optimization](http://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf) 中介绍了随机搜索惊人的简单和效果。 建议当不清楚超参的先验分布时,用随机搜索作为基准。
[Random Search for Hyper-Parameter Optimization](http://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf) 中介绍了随机搜索惊人的简单和效果。 建议在不知道超参的先验分布时,使用随机搜索作为基准。
## Anneal(退火算法)
......
......@@ -2,18 +2,18 @@
## Metis Tuner
大多数调参工具仅仅预测最优配置,而 [Metis](https://www.microsoft.com/zh-cn/research/publication/metis-robustly-tuning-tail-latencies-cloud-systems/) 的优势在于有两个输出:(a) 最优配置的当前预测结果, 以及 (b) 下一次 Trial 的建议。 不再需要随机猜测!
[Metis](https://www.microsoft.com/en-us/research/publication/metis-robustly-tuning-tail-latencies-cloud-systems/) 相对于别的调优算法,有几个优势。 大多数调参工具仅仅预测最优配置,而 Metis 具有两个输出,最优配置的预测, 以及下一次 Trial 的建议。 不再需要随机猜测
大多数工具假设训练集没有噪声数据,但 Metis 会知道是否需要对某个超参重新采样。
大多数工具都有着重于在已有结果上继续发展的问题,而 Metis 的搜索策略可以在探索,发展和重新采样(可选)中进行平衡。
Metis 属于基于序列的贝叶斯优化 (SMBO) 的类别,它也基于贝叶斯优化框架。 为了对超参-性能空间建模,Metis 同时使用了高斯过程(Gaussian Process)和高斯混合模型(GMM)。 由于每次 Trial 都可能有很高的时间成本,Metis 大量使用了已有模型来进行推理计算。 在每次迭代中,Metis 执行两个任务:
Metis 属于基于序列的贝叶斯优化 (SMBO) 算法的类别,它也基于贝叶斯优化框架。 为了对超参-性能空间建模,Metis 同时使用了高斯过程(Gaussian Process)和高斯混合模型(GMM)。 由于每次 Trial 都可能有很高的时间成本,Metis 大量使用了已有模型来进行推理计算。 在每次迭代中,Metis 执行两个任务:
在高斯过程空间中找到全局最优点。 这一点表示了最佳配置。
* 在高斯过程空间中找到全局最优点。 这一点表示了最佳配置。
它会标识出下一个超参的候选项。 这是通过对隐含信息的探索、挖掘和重采样来实现的。
* 它会标识出下一个超参的候选项。 这是通过对隐含信息的探索、挖掘和重采样来实现的。
此 Tuner 搜索空间仅接受 `quniform``uniform``randint` 和数值的 `choice` 类型。
更多详情,参考论文:https://www.microsoft.com/en-us/research/publication/metis-robustly-tuning-tail-latencies-cloud-systems/
\ No newline at end of file
更多详情,参考[论文](https://www.microsoft.com/en-us/research/publication/metis-robustly-tuning-tail-latencies-cloud-systems/)
\ No newline at end of file
......@@ -4,7 +4,7 @@
[Autokeras](https://arxiv.org/abs/1806.10282) 是使用 Network Morphism 算法的流行的自动机器学习工具。 Autokeras 的基本理念是使用贝叶斯回归来预测神经网络架构的指标。 每次都会从父网络生成几个子网络。 然后使用朴素贝叶斯回归,从网络的历史训练结果来预测它的指标值。 接下来,会选择预测结果最好的子网络加入训练队列中。 在[此代码](https://github.com/jhfjhfj1/autokeras)的启发下,我们在 NNI 中实现了 Network Morphism 算法。
要了解 Network Morphism Trial 的用法,参考 [Readme_zh_CN.md](https://github.com/Microsoft/nni/blob/master/examples/trials/network_morphism/README_zh_CN.md),了解更多细节
要了解 Network Morphism Trial 的用法,参考 [Readme_zh_CN.md](https://github.com/Microsoft/nni/blob/master/examples/trials/network_morphism/README_zh_CN.md)
## 2. 用法
......@@ -52,7 +52,7 @@ net = build_graph_from_json(RCV_CONFIG)
nni.report_final_result(best_acc)
```
如果需要保存并**读取最佳模型**,推荐采用以下方法。
如果需要保存并读取**最佳模型**,推荐采用以下方法。
```python
# 1. 使用 NNI API
......@@ -100,7 +100,7 @@ loaded_model = torch.load("model-{}.pt".format(model_id))
## 3. 文件结构
Tuner 有大量的文件、函数和类。 这里简单介绍最重要的文件:
Tuner 有大量的文件、函数和类。 这里简单介绍最重要的文件:
- `networkmorphism_tuner.py` 是使用 network morphism 算法的 Tuner。
......@@ -117,13 +117,13 @@ Tuner 有大量的文件、函数和类。 这里只简单介绍最重要的文
- `layers.py` 包括模型中用到的所有层。
- `layer_transformer.py` 包含了一些层转换,包括变宽,变深,或在层中增加跳跃连接。
- `nn.py`生成初始网的类。
- `nn.py`生成初始网的类。
- `metric.py` 包括了一些指标类,如 Accuracy 和 MSE。
- `utils.py` 是使用 Keras 在数据集 `cifar10` 上搜索神经网络的示例。
## 4. 网络表示的 JSON 示例
这是定义的中间表示 JSON 示例,在架构搜索过程中会从 Tuner 传到 Trial。 可调用 "json\_to\_graph()" 函数来将 JSON 文件转化为 Pytoch 或 Keras 模型。 示例如下。
这是定义的中间表示 JSON 示例,在架构搜索过程中会从 Tuner 传到 Trial。 可调用 Trial 代码中的 "json\_to\_graph()" 函数来将 JSON 文件转化为 Pytoch 或 Keras 模型。
```json
{
......@@ -216,19 +216,19 @@ Tuner 有大量的文件、函数和类。 这里只简单介绍最重要的文
}
```
每个模型的定义都是一个 JSON 对象 (也可以认为模型是一个 [有向无环图](https://en.wikipedia.org/wiki/Directed_acyclic_graph))
可将模型视为[有向无环图](https://en.wikipedia.org/wiki/Directed_acyclic_graph)。 每个模型的定义都是一个 JSON 对象
- `input_shape` 是整数的列表,不包括批量维度。
- `weighted` 表示是否权重和偏移值应该包含在此神经网络图中。
- `operation_history` 是保存了所有网络形态操作的列表。
- `layer_id_to_input_node_ids` 是字典实例,将层的标识映射到输入节点标识。
- `layer_id_to_output_node_ids` 是字典实例,将层的标识映射到输出节点标识。
- `adj_list` 是二维列表是图的邻接表。 第一维是张量标识。 在每条边的列表中,元素是两元组(张量标识,层标识)。
- `layer_id_to_input_node_ids` 是字典,将层的标识映射到输入节点标识。
- `layer_id_to_output_node_ids` 是字典,将层的标识映射到输出节点标识。
- `adj_list` 是二维列表是图的邻接表。 第一维是张量标识。 在每条边的列表中,元素是两元组(张量标识,层标识)。
- `reverse_adj_list` 是与 adj_list 格式一样的反向邻接列表。
- `node_list` 是一个整数列表。 列表的索引是标识。
- `layer_list` 是层的列表。 列表的索引是标识。
- 对于 `StubConv (StubConv1d, StubConv2d, StubConv3d)`,后面的数字表示节点的输入 id(或 id 列表),节点输出 id,input_channel,filters,kernel_size,stride 和 padding。
- 对于 `StubConv(StubConv1d, StubConv2d, StubConv3d)`,后面的数字表示节点的输入 id(或 id 列表),节点输出 id,input_channel,filters,kernel_size,stride 和 padding。
- 对于 `StubDense`,后面的数字表示节点的输入 id (或 id 列表),节点输出 id,input_units 和 units。
......@@ -242,4 +242,4 @@ Tuner 有大量的文件、函数和类。 这里只简单介绍最重要的文
## 5. TODO
下一步,会将 API 从固定的网络生成方法改为更多的网络操作生成方法。 此外,还会使用 ONNX 格式来替代 JSON 作为中间表示结果。
\ No newline at end of file
下一步,会将 API 从固定网络生成器,改为有更多可用操作的网络生成器。 会使用 ONNX 格式来替代 JSON 作为中间表示结果。
\ No newline at end of file
......@@ -2,7 +2,7 @@
## PPOTuner
这是通常用于 NAS 接口的 NNI Tuner使用了 [PPO 算法](https://arxiv.org/abs/1707.06347)。 此实现继承了[这里](https://github.com/openai/baselines/tree/master/baselines/ppo2)的主要逻辑,(即 OpenAI 的 PPO2),并为 NAS 场景做了适配。
这是一个用于 NNI 神经网络架构搜索(NAS接口的 Tuner。 它使用了 [ppo 算法](https://arxiv.org/abs/1707.06347)。 此实现继承了 [OpenAI 的 ppo2 实现](https://github.com/openai/baselines/tree/master/baselines/ppo2)的主要逻辑,并为 NAS 场景做了适配。
它能成功调优 [mnist-nas 示例](https://github.com/microsoft/nni/tree/master/examples/trials/mnist-nas),结果如下:
......@@ -12,7 +12,7 @@
![](../../img/enas_search_space.png)
上图是某个选定的架构,用来展示搜索空间。 每个方块是一层,其操作可从 6 个操作中选择。 每条虚线是直通连接,每个方块都可以有 0 或 1 条直通连接获得前面层的输出。 **注意**,在原始的宏搜索空间中,每个方块层可选择任意条直通连接,在此实现中,仅允许 0 或 1条。
上图是所选的结构。 每个方块是一层,可从 6 个操作中选择。 每条虚线是直通连接,每个方块都可以有 0 或 1 条直通连接获得前面层的输出。 **注意**,在原始的宏搜索空间中,每个方块层可选择任意条直通连接,在此实现中,仅允许 0 或 1条。
结果如下图所示([配置文件](https://github.com/microsoft/nni/blob/master/examples/trials/nas_cifar10/config_ppo.yml)):
......
......@@ -2,94 +2,94 @@
## 概述
[Docker](https://www.docker.com/) 是一种工具, 可通过启动容器, 使用户能够更轻松地根据自己的操作系统部署和运行应用程序。 Docker 不是虚拟机, 它不创建虚拟操作系统, 但是它允许不同的应用程序使用相同的操作系统内核, 并通过容器隔离不同的应用程序。
[Docker](https://www.docker.com/) 是一种工具, 可通过启动容器, 使用户能够更轻松地根据自己的操作系统部署和运行应用程序。 Docker 不是虚拟机它不创建虚拟操作系统,但它允许不同的应用程序使用相同的操作系统内核并通过容器隔离不同的应用程序。
用户可使用docker进行 NNI 实验, NNI 在docker hub提供了一个官方的[msranni/nni](https://hub.docker.com/r/msranni/nni)
用户可使用 Docker 来启动 NNI Experiment。 NNI 在 Docker Hub 上也提供了官方的 Docker 映[msranni/nni](https://hub.docker.com/r/msranni/nni)
## 在本机使用docker
### 第一步:docker的安装
### 第一步:Docker 的安装
开始使用docker进行NNI实验之前,首先需要在本地机器上安装docker运行程序。 [参考](https://docs.docker.com/install/linux/docker-ce/ubuntu/)
在开始使用 Docker 运行 NNI Experiment 前,首先需要在本机安装 Docker 运行程序。 [参考这里](https://docs.docker.com/install/linux/docker-ce/ubuntu/)
### 第二步:启动docker容器
### 第二步:启动 Docker 容器
如果已经在本地机器上安装了docker程序,可以启动docker容器来运行NNI实验了。 因为NNI会在docker容器里启动web UI进程,并监听一个端口,因此需要指定一个在主机和docker容器里面的端口映射,这个映射可以让你在容器外访问docker容器里的进程。 通过访问主机的ip和端口,就可以访问容器里的Web网页进程了。
如果已经在本地机器上安装了 Docker 程序,可以启动 Docker 容器来运行 NNI 示例。 因为 NNI 会在 Docker 容器里启动 Web 界面进程,并监听端口,因此需要指定一个在主机和 Docker 容器映射的端口,可在容器外访问 Docker 容器里的进程。 通过访问主机的 IP 和端口,就可以访问容器里的 Web 网页进程了。
例如,你可以通过如下命令来启动docker容器:
例如,通过如下命令来启动 Docker 容器:
docker run -i -t -p [hostPort]:[containerPort] [image]
-i: 使用交互模式启动docker
-i: 使用交互模式启动 Docker
-t: Docker分配一个输入终端。
-t: Docker 分配一个输入终端。
-p: 端口映射,映射主机端口和容器端口。
可以参考[这里](https://docs.docker.com/v17.09/edge/engine/reference/run/),获取更多的命令参考
更多命令信息,可[参考这里](https://docs.docker.com/v17.09/edge/engine/reference/run/)
注意:
NNI只支持UbuntumacOS操作系统,请指定正确的docker镜像。如果你希望在docker里面使用gpu,请使用nvidia-docker。
NNI 目前仅支持本机模式下的 UbuntumacOS 系统,请使用正确的 Docker 映像类型。 如果想要在 Docker 容器里面使用 GPU,请使用 nvidia-docker。
### 步骤3:在docker容器里运行NNI
### 第三步:在 Docker 容器里运行 NNI
如果直接使用NNI的官方镜像`msranni/nni`来启动实验,你可以直接使用`nnictl`命令。 NNI官方镜像有最基础的python环境和深度学习框架。
如果直接使用 NNI 的官方镜像 `msranni/nni` 来启动 Experiment,可以直接使用 `nnictl` 命令。 NNI 官方镜像有最基础的 Python 环境和深度学习框架。
如果使用自己的 Docker 镜像,需要首先[安装 NNI](InstallationLinux.md)
如果你想要使用NNI的官方例子,你可以通过以下git命令来克隆NNI:
如果要使用 NNI 的官方示例,可以通过以下 git 命令来克隆 NNI:
git clone https://github.com/Microsoft/nni.git
然后可以进入`nni/examples/trials`文件夹来启动实验
然后可以进入 `nni/examples/trials` 文件夹来启动 Experiment
等你准备完NNI环境,你可以通过`nnictl`命令来启动实验,[参考](QuickStart.md).
准备好 NNI 的环境后,可使用 `nnictl` 命令开始新的 Experiment。 [参考这里](QuickStart.md)
## 在远程平台上运行docker
## 在远程平台上运行 Docker
NNI支持在[远程平台](../TrainingService/RemoteMachineMode.md)上启动实验,在远程机器里运行任务。 因为docker可以运行独立的Ubuntu系统和SSH服务,因此docker容器可以作为远程平台来运行NNI.
NNI 支持在[远程平台](../TrainingService/RemoteMachineMode.md)上启动 Experiment,并在远程机器里运行 Trial。 因为 Docker 可以运行独立的 Ubuntu 系统和 SSH 服务,因此 Docker 容器可以作为远程平台来运行 NNI
### 步骤1:设置docker环境
### 第一步:设置 Docker 环境
首先应该在远程机器上安装docker工具,[参考](https://docs.docker.com/install/linux/docker-ce/ubuntu/).
首先在远程机器上安装 Docker 工具,[参考这里](https://docs.docker.com/install/linux/docker-ce/ubuntu/)
保证docker容器可以被NNI实验连接上,你应该在你自己的docker容器里安装SSH服务,并做SSH相关配置。 如果你想在docker容器里使用SSH服务,你应该配置SSH密码登录或者私钥登录,[参考](https://docs.docker.com/engine/examples/running_ssh_service/)
为保证 Docker 容器可以被 NNI Experiment 连接上,要在自己的 Docker 容器里安装 SSH 服务,或使用已经配置好 SSH 的映像。 如果要在 Docker 容器里使用 SSH 服务,需要配置 SSH 密码登录或者私钥登录,[参考这里](https://docs.docker.com/engine/examples/running_ssh_service/)
注意:
NNI的官方镜像msranni/nni暂不支持SSH服务,你应该构建自己的带有SSH服务的像,或者使用其他的带有SSH服务的镜像。
NNI 的官方镜像 msranni/nni 暂不支持 SSH 服务,构建自己的带有 SSH 服务的像,或者使用其他的带有 SSH 服务的镜像。
### 第二步:在远程机器上启动docker容器
### 第二步:在远程机器上启动 Dokcer 容器
SSH容器需要一个端口,你需要把dockerSSH服务端口暴露给NNI作为连接端口。 例如,如果设置容器的端口**`A`**作为SSH端口,你应该把端口**`A`**映射到主机的端口**`B`**,NNI会连接端口**`B`**作为SSH服务端口,你的主机会把连接到端口**`B`**的连接映射到端口**`A`**,NNI就可以连接到你的容器中了。
SSH 服务需要端口,要把 DockerSSH 服务端口暴露给 NNI 作为连接端口。 例如,如果设置容器的端口 **`A`** 作为 SSH 端口,把端口 **`A`** 映射到主机的端口 **`B`**,NNI 会连接端口**`B`** 作为 SSH 服务端口,主机会把连接到端口 **`B`** 的连接映射到端口 **`A`**,NNI 就可以连接到容器中了。
例如,你可以通过如下命令来启动docker容器:
例如,通过如下命令来启动 Docker 容器:
docker run -dit -p [hostPort]:[containerPort] [image]
`containerPort`是在docker容器中指定的端口,`hostPort`是主机的端口。 你可以设置你的NNI配置,连接到`hostPort`,这个连接会被转移到你的docker容器。 更多的命定信息,可[参考](https://docs.docker.com/v17.09/edge/engine/reference/run/).
`containerPort`是在 Docker 容器中指定的端口,`hostPort` 是主机的端口。 可设置 NNI 配置,连接到 `hostPort`,这个连接会被转发到 Docker 容器。 更多命令信息,可[参考这里](https://docs.docker.com/v17.09/edge/engine/reference/run/)
注意:
如果使用自己构建的docker容器,请保证这个容器中有基础的python运行时环境和NNI SDK环境。 如果想要在docker容器里面使用gpu,请使用nvidia-docker。
如果使用自己构建的 Docker 映像,确保有基础的 Python 运行时和 NNI SDK 环境。 如果想要在 Docker 容器里面使用 GPU,请使用 nvidia-docker。
### 步骤三:运行NNI实验
### 第三步:运行 NNI Experiment
可以在你的配置文件中,设置训练平台为远程平台,然后设置`machineList`配置。[参考](../TrainingService/RemoteMachineMode.md)。 注意应该设置正确的`port``username`, `passwd`或者`sshKeyPath`
可以在配置文件中,设置训练平台为远程平台,然后设置 `machineList` 配置。[参考这里](../TrainingService/RemoteMachineMode.md)。 注意应该设置正确的 `port``username`,以及 `passwd``sshKeyPath`
`port`: 主机的端口,映射到dockerSSH端口
`port`: 主机的端口,映射到 DockerSSH 端口。
`username`: docker容器的用户名。
`username`:Docker 容器的用户名。
`passWd: ` docker容器的密码。
`passWd: ` Docker 容器的密码。
`sshKeyPath:` docker容器私钥的存储路径。
`sshKeyPath:` Docker 容器私钥的存储路径。
设置完配置文件,你就可以启动实验了,[参考](QuickStart.md)
\ No newline at end of file
设置完配置文件,就可以启动 Experiment 了,[参考这里](QuickStart.md)
\ No newline at end of file
......@@ -18,7 +18,7 @@
先决条件:`python 64-bit >=3.5`, `git`, `wget`
bash
git clone -b v1.3 https://github.com/Microsoft/nni.git
git clone -b v1.4 https://github.com/Microsoft/nni.git
cd nni
./install.sh
......@@ -33,7 +33,7 @@
* 通过克隆源代码下载示例。
```bash
git clone -b v1.3 https://github.com/Microsoft/nni.git
git clone -b v1.4 https://github.com/Microsoft/nni.git
```
* 运行 MNIST 示例。
......@@ -71,7 +71,7 @@ You can use these commands to get more information about the experiment
-----------------------------------------------------------------------
```
* 在浏览器中打开 `Web UI url`,可看到下图的 Experiment 详细信息,以及所有的 Trial 任务。 查看[这里](../Tutorial/WebUI.md)的更多页面。
* 在浏览器中打开 `Web UI url`,可看到下图的实验详细信息,以及所有的尝试任务。 查看[这里](../Tutorial/WebUI.md)的更多页面。
![概述](../../img/webui_overview_page.png)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment