"...resnet50_tensorflow.git" did not exist on "9cbe7fab7c658c8e1cc3816a76859d2c81ef9168"
Unverified Commit c5acd8c2 authored by SparkSnail's avatar SparkSnail Committed by GitHub
Browse files

Merge pull request #173 from microsoft/master

merge master
parents 40bae6e2 d135d184
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
- NAO: <https://github.com/renqianluo/NAO> - NAO: <https://github.com/renqianluo/NAO>
## 实验描述 ## 实验说明
为了避免算法仅仅在 **CIFAR-10** 数据集上过拟合,还对比了包括 Fashion-MNIST, CIFAR-100, OUI-Adience-Age, ImageNet-10-1 (ImageNet的子集) 和 ImageNet-10-2 (ImageNet 的另一个子集) 在内的其它 5 个数据集。 分别从 ImageNet 中抽取 10 种不同类别标签的子集,组成 ImageNet10-1 和 ImageNet10-2 数据集 。 为了避免算法仅仅在 **CIFAR-10** 数据集上过拟合,还对比了包括 Fashion-MNIST, CIFAR-100, OUI-Adience-Age, ImageNet-10-1 (ImageNet的子集) 和 ImageNet-10-2 (ImageNet 的另一个子集) 在内的其它 5 个数据集。 分别从 ImageNet 中抽取 10 种不同类别标签的子集,组成 ImageNet10-1 和 ImageNet10-2 数据集 。
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
NAO 需要太多的计算资源,因此只使用提供 Pipeline 脚本的 NAO-WS。 NAO 需要太多的计算资源,因此只使用提供 Pipeline 脚本的 NAO-WS。
对于 Autkeras,使用了 0.2.18 版本的代码, 因为这是开始实验时的最新版本。 对于 AutoKeras,使用了 0.2.18 版本的代码, 因为这是开始实验时的最新版本。
## NAS 结果对比 ## NAS 结果对比
...@@ -54,13 +54,13 @@ NAO 需要太多的计算资源,因此只使用提供 Pipeline 脚本的 NAO-W ...@@ -54,13 +54,13 @@ NAO 需要太多的计算资源,因此只使用提供 Pipeline 脚本的 NAO-W
| --------- | ------------ |:----------------:|:----------------:|:--------------:|:-----------:| | --------- | ------------ |:----------------:|:----------------:|:--------------:|:-----------:|
| CIFAR- 10 | 88.56(best) | 96.13(best) | 97.11(best) | 97.17(average) | 96.47(best) | | CIFAR- 10 | 88.56(best) | 96.13(best) | 97.11(best) | 97.17(average) | 96.47(best) |
对于 AutoKeras,由于其算法中的随机因素,它在所有数据集中的表现相对较差。 AutoKeras,由于其算法中的随机因素,它在所有数据集中的表现相对较差。
对于ENAS,ENAS(macro)在 OUI-Adience-Age 数据集中表现较好,并且 ENAS(micro)在 CIFAR-10 数据集中表现较好。 ENAS,ENAS(macro)在 OUI-Adience-Age 数据集中表现较好,并且 ENAS(micro)在 CIFAR-10 数据集中表现较好。
对于DARTS,在某些数据集上具有良好的结果,但在某些数据集中具有比较大的方差。 DARTS 三次实验中的差异在 OUI-Audience-Age 数据集上可达 5.37%(绝对值),在 ImageNet-10-1 数据集上可达4.36%(绝对值)。 对于DARTS,在某些数据集上具有良好的结果,但在某些数据集中具有比较大的方差。 DARTS 三次实验中的差异在 OUI-Audience-Age 数据集上可达 5.37%(绝对值),在 ImageNet-10-1 数据集上可达4.36%(绝对值)。
对于 NAO-WS,它在 ImageNet-10-2 中显示良好,但在 OUI-Adience-Age 中表现非常差。 NAO-WS 在 ImageNet-10-2 中表现良好,但在 OUI-Adience-Age 中表现非常差。
## 参考文献 ## 参考文献
......
...@@ -71,33 +71,33 @@ ...@@ -71,33 +71,33 @@
### 结果 ### 结果
| 算法 | 最好的损失值 | 最好的 5 次损失的平均值 | 最好的 10 次损失的平均 | | 算法 | 最好的损失值 | 最好的 5 次损失的平均值 | 最好的 10 次损失的平均 |
| ------------- | ------------ | ------------- | ------------- | | ------------------- | ------------ | ------------- | ------------- |
| Random Search | 0.418854 | 0.420352 | 0.421553 | | Random Search(随机搜索) | 0.418854 | 0.420352 | 0.421553 |
| Random Search | 0.417364 | 0.420024 | 0.420997 | | Random Search(随机搜索) | 0.417364 | 0.420024 | 0.420997 |
| Random Search | 0.417861 | 0.419744 | 0.420642 | | Random Search(随机搜索) | 0.417861 | 0.419744 | 0.420642 |
| Grid Search | 0.498166 | 0.498166 | 0.498166 | | Grid Search(遍历搜索) | 0.498166 | 0.498166 | 0.498166 |
| Evolution | 0.409887 | 0.409887 | 0.409887 | | Evolution | 0.409887 | 0.409887 | 0.409887 |
| Evolution | 0.413620 | 0.413875 | 0.414067 | | Evolution | 0.413620 | 0.413875 | 0.414067 |
| Evolution | 0.409887 | 0.409887 | 0.409887 | | Evolution | 0.409887 | 0.409887 | 0.409887 |
| Anneal | 0.414877 | 0.417289 | 0.418281 | | Anneal(退火算法) | 0.414877 | 0.417289 | 0.418281 |
| Anneal | 0.409887 | 0.409887 | 0.410118 | | Anneal(退火算法) | 0.409887 | 0.409887 | 0.410118 |
| Anneal | 0.413683 | 0.416949 | 0.417537 | | Anneal(退火算法) | 0.413683 | 0.416949 | 0.417537 |
| Metis | 0.416273 | 0.420411 | 0.422380 | | Metis | 0.416273 | 0.420411 | 0.422380 |
| Metis | 0.420262 | 0.423175 | 0.424816 | | Metis | 0.420262 | 0.423175 | 0.424816 |
| Metis | 0.421027 | 0.424172 | 0.425714 | | Metis | 0.421027 | 0.424172 | 0.425714 |
| TPE | 0.414478 | 0.414478 | 0.414478 | | TPE | 0.414478 | 0.414478 | 0.414478 |
| TPE | 0.415077 | 0.417986 | 0.418797 | | TPE | 0.415077 | 0.417986 | 0.418797 |
| TPE | 0.415077 | 0.417009 | 0.418053 | | TPE | 0.415077 | 0.417009 | 0.418053 |
| SMAC | **0.408386** | **0.408386** | **0.408386** | | SMAC | **0.408386** | **0.408386** | **0.408386** |
| SMAC | 0.414012 | 0.414012 | 0.414012 | | SMAC | 0.414012 | 0.414012 | 0.414012 |
| SMAC | **0.408386** | **0.408386** | **0.408386** | | SMAC | **0.408386** | **0.408386** | **0.408386** |
| BOHB | 0.410464 | 0.415319 | 0.417755 | | BOHB | 0.410464 | 0.415319 | 0.417755 |
| BOHB | 0.418995 | 0.420268 | 0.422604 | | BOHB | 0.418995 | 0.420268 | 0.422604 |
| BOHB | 0.415149 | 0.418072 | 0.418932 | | BOHB | 0.415149 | 0.418072 | 0.418932 |
| HyperBand | 0.414065 | 0.415222 | 0.417628 | | HyperBand | 0.414065 | 0.415222 | 0.417628 |
| HyperBand | 0.416807 | 0.417549 | 0.418828 | | HyperBand | 0.416807 | 0.417549 | 0.418828 |
| HyperBand | 0.415550 | 0.415977 | 0.417186 | | HyperBand | 0.415550 | 0.415977 | 0.417186 |
Metis 算法因为其高斯计算过程的复杂度为 O(n^3) 而运行非常慢,因此仅执行了 300 次 Trial。 Metis 算法因为其高斯计算过程的复杂度为 O(n^3) 而运行非常慢,因此仅执行了 300 次 Trial。
...@@ -188,14 +188,14 @@ IOPS 与在线处理能力有关,我们在实验中使用 IOPS 作为指标。 ...@@ -188,14 +188,14 @@ IOPS 与在线处理能力有关,我们在实验中使用 IOPS 作为指标。
#### fillrandom 基准 #### fillrandom 基准
| 模型 | 最高 IOPS(重复 1 次) | 最高 IOPS(重复 2 次) | 最高 IOPS(重复 3 次) | | 模型 | 最高 IOPS(重复 1 次) | 最高 IOPS(重复 2 次) | 最高 IOPS(重复 3 次) |
| --------- | --------------- | --------------- | --------------- | | ------------ | --------------- | --------------- | --------------- |
| Random | 449901 | 427620 | 477174 | | Random | 449901 | 427620 | 477174 |
| Anneal | 461896 | 467150 | 437528 | | Anneal(退火算法) | 461896 | 467150 | 437528 |
| Evolution | 436755 | 389956 | 389790 | | Evolution | 436755 | 389956 | 389790 |
| TPE | 378346 | 482316 | 468989 | | TPE | 378346 | 482316 | 468989 |
| SMAC | 491067 | 490472 | **491136** | | SMAC | 491067 | 490472 | **491136** |
| Metis | 444920 | 457060 | 454438 | | Metis | 444920 | 457060 | 454438 |
图: 图:
...@@ -203,14 +203,14 @@ IOPS 与在线处理能力有关,我们在实验中使用 IOPS 作为指标。 ...@@ -203,14 +203,14 @@ IOPS 与在线处理能力有关,我们在实验中使用 IOPS 作为指标。
#### readrandom 基准 #### readrandom 基准
| 模型 | 最高 IOPS(重复 1 次) | 最高 IOPS(重复 2 次) | 最高 IOPS(重复 3 次) | | 模型 | 最高 IOPS(重复 1 次) | 最高 IOPS(重复 2 次) | 最高 IOPS(重复 3 次) |
| --------- | --------------- | --------------- | --------------- | | ------------ | --------------- | --------------- | --------------- |
| Random | 2276157 | 2285301 | 2275142 | | Random | 2276157 | 2285301 | 2275142 |
| Anneal | 2286330 | 2282229 | 2284012 | | Anneal(退火算法) | 2286330 | 2282229 | 2284012 |
| Evolution | 2286524 | 2283673 | 2283558 | | Evolution | 2286524 | 2283673 | 2283558 |
| TPE | 2287366 | 2282865 | 2281891 | | TPE | 2287366 | 2282865 | 2281891 |
| SMAC | 2270874 | 2284904 | 2282266 | | SMAC | 2270874 | 2284904 | 2282266 |
| Metis | **2287696** | 2283496 | 2277701 | | Metis | **2287696** | 2283496 | 2277701 |
图: 图:
......
# 在 NNI 上自动调优 SVD
本教程中,会首先介绍 GitHub 存储库:[Recommenders](https://github.com/Microsoft/Recommenders)。 它使用 Jupyter Notebook 提供了构建推荐系统的一些示例和实践技巧。 其中大量的模型被广泛的应用于推荐系统中。 为了提供完整的体验,每个示例都通过以下五个关键任务中展示:
- [准备数据](https://github.com/Microsoft/Recommenders/blob/master/notebooks/01_prepare_data/README.md):为每个推荐算法准备并读取数据。
- [模型](https://github.com/Microsoft/Recommenders/blob/master/notebooks/02_model/README.md):使用各种经典的以及深度学习推荐算法,如交替最小二乘法([ALS](https://spark.apache.org/docs/latest/api/python/_modules/pyspark/ml/recommendation.html#ALS))或极限深度分解机([xDeepFM](https://arxiv.org/abs/1803.05170))。
- [评估](https://github.com/Microsoft/Recommenders/blob/master/notebooks/03_evaluate/README.md):使用离线指标来评估算法。
- [模型选择和优化](https://github.com/Microsoft/Recommenders/blob/master/notebooks/04_model_select_and_optimize/README.md):为推荐算法模型调优超参。
- [运营](https://github.com/Microsoft/Recommenders/blob/master/notebooks/05_operationalize/README.md):在 Azure 的生产环境上运行模型。
在第四项调优模型超参的任务上,NNI 可以发挥作用。 在 NNI 上调优推荐模型的具体示例,采用了 [SVD](https://github.com/Microsoft/Recommenders/blob/master/notebooks/02_model/surprise_svd_deep_dive.ipynb) 算法,以及数据集 Movielens100k。 此模型有超过 10 个超参需要调优。
由 Recommenders 提供的[ Jupyter notebook](https://github.com/Microsoft/Recommenders/blob/master/notebooks/04_model_select_and_optimize/nni_surprise_svd.ipynb) 中有非常详细的一步步的教程。 其中使用了不同的调优函数,包括 `Annealing``SMAC``Random Search``TPE``Hyperband``Metis` 以及 `Evolution`。 最后比较了不同调优算法的结果。 请参考此 Notebook,来学习如何使用 NNI 调优 SVD 模型,并可以继续使用 NNI 来调优 Recommenders 中的其它模型。
\ No newline at end of file
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
拉取请求需要选好正确的标签,表明是 Bug 修复还是功能改进。 所有代码都需要遵循正确的命名约定和代码风格。 拉取请求需要选好正确的标签,表明是 Bug 修复还是功能改进。 所有代码都需要遵循正确的命名约定和代码风格。
参考[如何配置 NNI 的开发环境](./SetupNNIDeveloperEnvironment.md),来安装开发环境。 参考[如何配置 NNI 的开发环境](./SetupNniDeveloperEnvironment.md),来安装开发环境。
[快速入门](QuickStart.md)类似。 其它内容,参考[NNI 文档](http://nni.readthedocs.io) [快速入门](QuickStart.md)类似。 其它内容,参考[NNI 文档](http://nni.readthedocs.io)
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
## 代码风格和命名约定 ## 代码风格和命名约定
* NNI 遵循 [PEP8](https://www.python.org/dev/peps/pep-0008/) 的 Python 代码命名约定。在提交拉取请求时,请尽量遵循此规范。 可通过`flake8``pylint`的提示工具来帮助遵循规范。 * NNI 遵循 [PEP8](https://www.python.org/dev/peps/pep-0008/) 的 Python 代码命名约定。在提交拉取请求时,请尽量遵循此规范。 可通过`flake8``pylint`的提示工具来帮助遵循规范。
* NNI 还遵循 [NumPy Docstring 风格](https://www.sphinx-doc.org/en/master/usage/extensions/example_numpy.html#example-numpy) 的 Python Docstring 命名方案。 Python API 使用了[sphinx.ext.napoleon](https://www.sphinx-doc.org/en/master/usage/extensions/napoleon.html)[生成文档](CONTRIBUTING.md#documentation) * NNI 还遵循 [NumPy Docstring 风格](https://www.sphinx-doc.org/en/master/usage/extensions/example_numpy.html#example-numpy) 的 Python Docstring 命名方案。 Python API 使用了[sphinx.ext.napoleon](https://www.sphinx-doc.org/en/master/usage/extensions/napoleon.html)[生成文档](Contributing.md#documentation)
## 文档 ## 文档
......
# NNI 中的 Curve Fitting Assessor
## 1. 介绍
Curve Fitting Assessor 是一个 LPA (learning, predicting, assessing,即学习、预测、评估) 的算法。 如果预测的Trial X 在 step S 比性能最好的 Trial 要差,就会提前终止它。
此算法中,使用了 12 条曲线来拟合学习曲线,从[参考论文](http://aad.informatik.uni-freiburg.de/papers/15-IJCAI-Extrapolation_of_Learning_Curves.pdf)中选择了大量的参数曲线模型。 学习曲线的形状与先验知识是一致的:都是典型的递增的、饱和的函数。
![](../img/curvefitting_learning_curve.PNG)
所有学习曲线模型被合并到了单个,更强大的模型中。 合并的模型通过加权线性混合:
![](../img/curvefitting_f_comb.gif)
合并后的参数向量
![](../img/curvefitting_expression_xi.gif)
假设增加一个高斯噪声,且噪声参数初始化为最大似然估计。
通过学习历史数据来确定新的组合参数向量的最大概率值。 用这样的方法来预测后面的 Trial 性能,并停止不好的 Trial 来节省计算资源。
具体来说,该算法有学习、预测和评估三个阶段。
* 步骤 1:学习。 从当前 Trial 的历史中学习,并从贝叶斯角度决定 \xi 。 首先,使用最小二乘法 (由 `fit_theta` 实现) 来节省时间。 获得参数后,过滤曲线并移除异常点(由 `filter_curve` 实现)。 最后,使用 MCMC 采样方法 (由 `mcmc_sampling` 实现) 来调整每个曲线的权重。 至此,确定了 \xi 中的所有参数。
* 步骤 2:预测。 用 \xi 和混合模型公式,在目标位置(例如 epoch 的总数)来计算期望的最终结果精度(由 `f_comb` 实现)。
* 步骤 3:如果拟合结果没有收敛,预测结果会是 `None`,并返回 `AssessResult.Good`,待下次有了更多精确信息后再次预测。 此外,会通过 `predict()` 函数获得正数。如果该值大于 __历史最好结果__ * `THRESHOLD`(默认为 0.95),则返回 `AssessResult.Good`,否则返回 `AssessResult.Bad`
下图显示了此算法在 MNIST Trial 历史数据上结果。其中绿点表示 Assessor 获得的数据,蓝点表示将来,但未知的数据,红色线条是 Curve fitting Assessor 的预测曲线。
![](../img/curvefitting_example.PNG)
## 2. 用法
要使用 Curve Fitting Assessor,需要在 Experiment 的 YAML 配置文件进行如下改动。
assessor:
builtinAssessorName: Curvefitting
classArgs:
# (必须) epoch 的总数。
# 需要此数据来决定需要预测的点。
epoch_num: 20
# (可选) 选项: maximize, minimize
* optimize_mode 的默认值是 maximize
optimize_mode: maximize
# (可选) 为了节约计算资源,在收到了 start_step 个中间结果后,才开始预测。
# start_step 的默认值是 6。
start_step: 6
# (可选) 决定是否提前终止的阈值。
# 例如,如果 threshold = 0.95, optimize_mode = maximize,最好的历史结果是 0.9,那么会在 Trial 的预测值低于 0.95 * 0.9 = 0.855 时停止。
* 阈值的默认值是 0.95。
# 注意:如果选择了 minimize 模式,要让 threshold >= 1.0 (如 threshold=1.1)
threshold: 0.95
# (可选) gap 是两次评估之间的间隔次数。
# 例如:如果 gap = 2, start_step = 6,就会评估第 6, 8, 10, 12... 个中间结果。
* gap 的默认值是 1。
gap: 1
## 3. 文件结构
Assessor 有大量的文件、函数和类。 这里只简单介绍最重要的文件:
* `curvefunctions.py` 包含了所有函数表达式和默认参数。
* `modelfactory.py` 包括学习和预测部分,并实现了相应的计算部分。
* `curvefitting_assessor.py` 是接收 Trial 历史数据并评估是否需要提前终止的 Assessor。
## 4. TODO
* 进一步提高预测精度,并在更多模型上测试。
\ No newline at end of file
...@@ -109,4 +109,4 @@ tuner: ...@@ -109,4 +109,4 @@ tuner:
### 实现更高级的自动机器学习算法 ### 实现更高级的自动机器学习算法
上述内容足够写出通用的 Tuner。 但有时可能需要更多的信息,例如,中间结果, Trial 的状态等等,从而能够实现更强大的自动机器学习算法。 因此,有另一个 `Advisor` 类,直接继承于 `MsgDispatcherBase`,它在 [`src/sdk/pynni/nni/msg_dispatcher_base.py`](https://github.com/Microsoft/nni/tree/master/src/sdk/pynni/nni/msg_dispatcher_base.py)。 参考[这里](Customize_Advisor.md)来了解如何实现自定义的 Advisor。 上述内容足够写出通用的 Tuner。 但有时可能需要更多的信息,例如,中间结果, Trial 的状态等等,从而能够实现更强大的自动机器学习算法。 因此,有另一个 `Advisor` 类,直接继承于 `MsgDispatcherBase`,它在 [`src/sdk/pynni/nni/msg_dispatcher_base.py`](https://github.com/Microsoft/nni/tree/master/src/sdk/pynni/nni/msg_dispatcher_base.py)。 参考[这里](CustomizeAdvisor.md)来了解如何实现自定义的 Advisor。
\ No newline at end of file \ No newline at end of file
# Naive Evolution Tuner
## Naive Evolution(进化算法)
进化算法来自于 [Large-Scale Evolution of Image Classifiers](https://arxiv.org/pdf/1703.01041.pdf)。 它会基于搜索空间随机生成一个种群。 在每一代中,会选择较好的结果,并对其下一代进行一些变异(例如,改动一个超参,增加或减少一层)。 进化算法需要很多次 Trial 才能有效,但它也非常简单,也很容易扩展新功能。
\ No newline at end of file
...@@ -175,7 +175,7 @@ machineList: ...@@ -175,7 +175,7 @@ machineList:
- **remote** 将任务提交到远程的 Ubuntu 上,必须用 **machineList** 来指定远程的 SSH 连接信息。 - **remote** 将任务提交到远程的 Ubuntu 上,必须用 **machineList** 来指定远程的 SSH 连接信息。
- **pai** 提交任务到微软开源的 [OpenPAI](https://github.com/Microsoft/pai) 上。 更多 OpenPAI 配置,参考 [pai 模式](./PAIMode.md) - **pai** 提交任务到微软开源的 [OpenPAI](https://github.com/Microsoft/pai) 上。 更多 OpenPAI 配置,参考 [pai 模式](./PaiMode.md)
- **kubeflow** 提交任务至 [Kubeflow](https://www.kubeflow.org/docs/about/kubeflow/)。 NNI 支持基于 Kubeflow 的 Kubenetes,以及[Azure Kubernetes](https://azure.microsoft.com/en-us/services/kubernetes-service/) - **kubeflow** 提交任务至 [Kubeflow](https://www.kubeflow.org/docs/about/kubeflow/)。 NNI 支持基于 Kubeflow 的 Kubenetes,以及[Azure Kubernetes](https://azure.microsoft.com/en-us/services/kubernetes-service/)
......
...@@ -37,6 +37,14 @@ nnictl 在执行时,使用 tmp 目录作为临时目录来复制 codeDir 下 ...@@ -37,6 +37,14 @@ nnictl 在执行时,使用 tmp 目录作为临时目录来复制 codeDir 下
将虚拟机的网络配置为桥接模式来让虚拟机能被网络访问,并确保虚拟机的防火墙没有禁止相关端口。 将虚拟机的网络配置为桥接模式来让虚拟机能被网络访问,并确保虚拟机的防火墙没有禁止相关端口。
### 无法打开 Web 界面的链接
无法打开 Web 界面的链接可能有以下几个原因:
* http://127.0.0.1,http://172.17.0.1 以及 http://10.0.0.15 都是 localhost。如果在服务器或远程计算机上启动 Experiment, 可将此 IP 替换为所连接的 IP 来查看 Web 界面,如 http://[远程连接的地址]:8080
* 如果使用服务器 IP 后还是无法看到 Web 界面,可检查此服务器上是否有防火墙或需要代理。 或使用此运行 NNI Experiment 的服务器上的浏览器来查看 Web 界面。
* 另一个可能的原因是 Experiment 启动失败了,NNI 无法读取 Experiment 的信息。 可在如下目录中查看 NNIManager 的日志: ~/nni/experiment/[your_experiment_id] /log/nnimanager.log
### Windows 本机模式 ### Windows 本机模式
参考 [NNI Windows 本机模式](WindowsLocalMode.md) 参考 [NNI Windows 本机模式](WindowsLocalMode.md)
......
...@@ -106,4 +106,4 @@ frameworkcontroller 模式中的 Trial 配置使用以下主键: ...@@ -106,4 +106,4 @@ frameworkcontroller 模式中的 Trial 配置使用以下主键:
## 版本校验 ## 版本校验
从 0.6 开始,NNI 支持查看版本,详情参考[这里](PAIMode.md) 从 0.6 开始,NNI 支持版本校验,详情参考[这里](PaiMode.md)
\ No newline at end of file \ No newline at end of file
# Grid Search
## Grid Search(遍历搜索)
Grid Search 会穷举定义在搜索空间文件中的所有超参组合。 注意,搜索空间仅支持 `choice`, `quniform`, `qloguniform``quniform``qloguniform` 中的 **数字 `q` 有不同的含义(与[搜索空间](SearchSpaceSpec.md)说明不同)。 这里的意义是在 `low``high` 之间均匀取值的数量。</p>
\ No newline at end of file
...@@ -19,7 +19,7 @@ NNI 中有三种日志。 在创建 Experiment 时,可增加命令行参数 `- ...@@ -19,7 +19,7 @@ NNI 中有三种日志。 在创建 Experiment 时,可增加命令行参数 `-
在启动 NNI Experiment 时发生的错误,都可以在这里找到。 在启动 NNI Experiment 时发生的错误,都可以在这里找到。
通过 `nnictl log stderr` 命令来查看错误信息。 参考 [NNICTL](NNICTLDOC.md) 了解更多命令选项。 通过 `nnictl log stderr` 命令来查看错误信息。 参考 [NNICTL](Nnictl.md) 了解更多命令选项。
### Experiment 根目录 ### Experiment 根目录
......
...@@ -8,7 +8,7 @@ TrainingService 是与平台管理、任务调度相关的模块。 TrainingServ ...@@ -8,7 +8,7 @@ TrainingService 是与平台管理、任务调度相关的模块。 TrainingServ
![](../img/NNIDesign.jpg) ![](../img/NNIDesign.jpg)
NNI 的架构如图所示。 NNIManager 是系统的核心管理模块,负责调用 TrainingService 来管理 Trial,并负责不同模块之间的通信。 Dispatcher 是消息处理中心。 TrainingService 是管理任务的模块,它和 NNIManager 通信,并且根据平台的特点有不同的实现。 当前,NNI 支持本地平台、[远程平台](RemoteMachineMode.md)[OpenPAI 平台](PAIMode.md)[Kubeflow 平台](KubeflowMode.md)[FrameworkController 平台](FrameworkController.md) NNI 的架构如图所示。 NNIManager 是系统的核心管理模块,负责调用 TrainingService 来管理 Trial,并负责不同模块之间的通信。 Dispatcher 是消息处理中心。 TrainingService 是管理任务的模块,它和 NNIManager 通信,并且根据平台的特点有不同的实现。 当前,NNI 支持本地平台、[远程平台](RemoteMachineMode.md)[OpenPAI 平台](PaiMode.md)[Kubeflow 平台](KubeflowMode.md)[FrameworkController 平台](FrameworkController.md)
在这个文档中,会简要介绍 TrainingService 的设计。 如果要添加新的 TrainingService,只需要继承 TrainingServcie 类并实现相应的方法,不需要理解NNIManager、Dispatcher 等其它模块的细节。 在这个文档中,会简要介绍 TrainingService 的设计。 如果要添加新的 TrainingService,只需要继承 TrainingServcie 类并实现相应的方法,不需要理解NNIManager、Dispatcher 等其它模块的细节。
## 代码文件夹结构 ## 代码文件夹结构
...@@ -151,4 +151,4 @@ NNI 提供了 TrialKeeper 工具,用来帮助维护 Trial 任务。 可以在 ...@@ -151,4 +151,4 @@ NNI 提供了 TrialKeeper 工具,用来帮助维护 Trial 任务。 可以在
## 参考 ## 参考
更多关于如何调试的信息,请[参考这里](HowToDebug.md) 更多关于如何调试的信息,请[参考这里](HowToDebug.md)
关于如何贡献代码,请[参考这里](CONTRIBUTING) 关于如何贡献代码,请[参考这里](Contributing.md)
\ No newline at end of file \ No newline at end of file
# NNI 中使用 Hyperband
## 1. 介绍
[Hyperband](https://arxiv.org/pdf/1603.06560.pdf) 是一种流行的自动机器学习算法。 Hyperband 的基本思想是对配置分组,每组有 `n` 个随机生成的超参配置,每个配置使用 `r` 次资源(如,epoch 数量,批处理数量等)。 当 `n` 个配置完成后,会选择最好的 `n/eta` 个配置,并增加 `r*eta` 次使用的资源。 最后,会选择出的最好配置。
## 2. 实现并行
首先,此样例是基于 MsgDispatcherBase 来实现的自动机器学习算法,而不是基于 Tuner 和Assessor。 这种实现方法下,Hyperband 集成了 Tuner 和 Assessor 两者的功能,因而将它叫做 Advisor。
其次,本实现完全利用了 Hyperband 内部的并行性。 具体来说,下一个分组不会严格的在当前分组结束后再运行,只要有资源,就可以开始运行新的分组。
## 3. 用法
要使用 Hyperband,需要在 Experiment 的 YAML 配置文件进行如下改动。
advisor:
#可选项: Hyperband
builtinAdvisorName: Hyperband
classArgs:
#R: 最大的步骤
R: 100
#eta: 丢弃的 Trial 的比例
eta: 3
#可选项: maximize, minimize
optimize_mode: maximize
注意,一旦使用了 Advisor,就不能在配置文件中添加 Tuner 和 Assessor。 使用 Hyperband 时,Trial 代码收到的超参(如键值对)中,除了用户定义的超参,会多一个 `TRIAL_BUDGET`**使用 `TRIAL_BUDGET`,Trial 能够控制其运行的时间。</p>
对于 Trial 代码中 `report_intermediate_result(metric)``report_final_result(metric)`**`指标` 应该是数值,或者用一个 dict,并保证其中有键值为 default 的项目,其值也为数值型**。 这是需要进行最大化或者最小化优化的数值,如精度或者损失度。
`R``eta` 是 Hyperband 中可以改动的参数。 `R` 表示可以分配给 Trial 的最大资源。 这里,资源可以代表 epoch 或 批处理数量。 `TRIAL_BUDGET` 应该被尝试代码用来控制运行的次数。 参考样例 `examples/trials/mnist-advisor/` ,了解详细信息。
`eta` 表示 `n` 个配置中的 `n/eta` 个配置会留存下来,并用更多的资源来运行。
下面是 `R=81``eta=3` 时的样例:
| | s=4 | s=3 | s=2 | s=1 | s=0 |
| - | ---- | ---- | ---- | ---- | ---- |
| i | n r | n r | n r | n r | n r |
| 0 | 81 1 | 27 3 | 9 9 | 6 27 | 5 81 |
| 1 | 27 3 | 9 9 | 3 27 | 2 81 | |
| 2 | 9 9 | 3 27 | 1 81 | | |
| 3 | 3 27 | 1 81 | | | |
| 4 | 1 81 | | | | |
`s` 表示分组, `n` 表示生成的配置数量,相应的 `r` 表示配置使用多少资源来运行。 `i` 表示轮数,如分组 4 有 5 轮,分组 3 有 4 轮。
关于如何实现 Trial 代码,参考 `examples/trials/mnist-hyperband/` 中的说明。
## 4. 待改进
当前实现的 Hyperband 算法可以通过改进支持的提前终止算法来提高,原因是最好的 `n/eta` 个配置并不一定都表现很好。 不好的配置可以更早的终止。
在当前实现中,遵循了[此论文](https://arxiv.org/pdf/1603.06560.pdf)的设计,配置都是随机生成的。 要进一步提升,配置生成过程可以利用更高级的算法。
\ No newline at end of file
# TPE, Random Search, Anneal Tuners
## TPE
Tree-structured Parzen Estimator (TPE) 是一种 sequential model-based optimization(SMBO,即基于序列模型优化)的方法。 SMBO 方法根据历史指标数据来按顺序构造模型,来估算超参的性能,随后基于此模型来选择新的超参。 TPE 方法对 P(x|y) 和 P(y) 建模,其中 x 表示超参,y 表示相关的评估指标。 P(x|y) 通过变换超参的生成过程来建模,用非参数密度(non-parametric densities)代替配置的先验分布。 细节可参考 [Algorithms for Hyper-Parameter Optimization](https://papers.nips.cc/paper/4443-algorithms-for-hyper-parameter-optimization.pdf)。 ​
## Random Search(随机搜索)
[Random Search for Hyper-Parameter Optimization](http://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf) 中介绍了随机搜索惊人的简单和效果。 建议当不清楚超参的先验分布时,采用随机搜索作为基准。
## Anneal(退火算法)
这种简单的退火算法从先前的采样开始,会越来越靠近发现的最佳点取样。 此算法是随机搜索的简单变体,利用了响应面的平滑性。 退火率不是自适应的。
\ No newline at end of file
...@@ -28,10 +28,12 @@ ...@@ -28,10 +28,12 @@
## **在 Windows 上安装** ## **在 Windows 上安装**
在第一次使用 PowerShell 运行脚本时,需要用**使用管理员权限**运行如下命令: 在第一次使用 PowerShell 运行脚本时,需要用**使用管理员权限**运行如下命令:
bash bash
Set-ExecutionPolicy -ExecutionPolicy Unrestricted 强烈推荐使用 Anaconda。 Set-ExecutionPolicy -ExecutionPolicy Unrestricted
推荐使用 Anaconda 或 Miniconda。
* **通过 pip 命令安装 NNI** * **通过 pip 命令安装 NNI**
...@@ -43,8 +45,9 @@ ...@@ -43,8 +45,9 @@
* **通过源代码安装 NNI** * **通过源代码安装 NNI**
先决条件:`python >=3.5`, `git`, `powershell` 先决条件:`python >=3.5`, `git`, `PowerShell`
可使用管理员或当前用户权限运行下列命令:
然后可以使用管理员或当前用户安装 NNI:
```bash ```bash
git clone -b v0.7 https://github.com/Microsoft/nni.git git clone -b v0.7 https://github.com/Microsoft/nni.git
...@@ -93,12 +96,12 @@ ...@@ -93,12 +96,12 @@
## 更多 ## 更多
* [概述](Overview.md) * [概述](Overview.md)
* [使用命令行工具 nnictl](NNICTLDOC.md) * [使用命令行工具 nnictl](Nnictl.md)
* [使用 NNIBoard](WebUI.md) * [使用 NNIBoard](WebUI.md)
* [定制搜索空间](SearchSpaceSpec.md) * [定制搜索空间](SearchSpaceSpec.md)
* [配置 Experiment](ExperimentConfig.md) * [配置 Experiment](ExperimentConfig.md)
* [如何在本机运行 Experiment (支持多 GPU 卡)?](LocalMode.md) * [如何在本机运行 Experiment (支持多 GPU 卡)?](LocalMode.md)
* [如何在多机上运行 Experiment?](RemoteMachineMode.md) * [如何在多机上运行 Experiment?](RemoteMachineMode.md)
* [如何在 OpenPAI 上运行 Experiment?](PAIMode.md) * [如何在 OpenPAI 上运行 Experiment?](PaiMode.md)
* [如何通过 Kubeflow 在 Kubernetes 上运行 Experiment?](KubeflowMode.md) * [如何通过 Kubeflow 在 Kubernetes 上运行 Experiment?](KubeflowMode.md)
* [如何通过 FrameworkController 在 Kubernetes 上运行 Experiment?](FrameworkControllerMode.md) * [如何通过 FrameworkController 在 Kubernetes 上运行 Experiment?](FrameworkControllerMode.md)
\ No newline at end of file
...@@ -204,6 +204,6 @@ Kubeflow 模式的配置有下列主键: ...@@ -204,6 +204,6 @@ Kubeflow 模式的配置有下列主键:
## 版本校验 ## 版本校验
从 0.6 开始,NNI 支持版本校验,详情参考[这里](PAIMode.md) 从 0.6 开始,NNI 支持版本校验,详情参考[这里](PaiMode.md)
如果在使用 Kubeflow 模式时遇到任何问题,请到 [NNI Github](https://github.com/Microsoft/nni) 中创建问题。 如果在使用 Kubeflow 模式时遇到任何问题,请到 [NNI Github](https://github.com/Microsoft/nni) 中创建问题。
\ No newline at end of file
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