diff --git a/README_zh_CN.md b/README_zh_CN.md index 7d05ea9c26..cdd5bf7cff 100644 --- a/README_zh_CN.md +++ b/README_zh_CN.md @@ -10,10 +10,10 @@ NNI (Neural Network Intelligence) 是自动机器学习(AutoML)的工具包。 它通过多种调优的算法来搜索最好的神经网络结构和(或)超参,并支持单机、本地多机、云等不同的运行环境。 -### **NNI [v0.9](https://github.com/Microsoft/nni/releases) 已发布!** +### **NNI [v0.9](https://github.com/Microsoft/nni/releases) 已发布!  [](#nni-released-reminder)**

- +

@@ -28,11 +28,11 @@ NNI (Neural Network Intelligence) 是自动机器学习(AutoML)的工具包 - + - - +
- 训练服务 + 训练平台
    @@ -46,39 +46,45 @@ NNI (Neural Network Intelligence) 是自动机器学习(AutoML)的工具包
  • Theano
- Tuner(调参器) - - Assessor(评估器) + + Tuner(调参器) +
+ 通用 Tuner +
  • Random Search(随机搜索)
  • +
  • Naïve Evolution(进化算法)
  • + 超参 Tuner +
  • TPE
  • +
  • Anneal(退火算法)
  • +
  • SMAC
  • +
  • Batch(批处理)
  • +
  • Grid Search(遍历搜索)
  • +
  • Hyperband
  • +
  • Metis Tuner
  • +
  • BOHB
  • +
  • GP Tuner
  • + 网络结构 Tuner +
  • Network Morphism
  • +
  • ENAS
  • + + Assessor(评估器) +
    @@ -122,7 +128,7 @@ python -m pip install --upgrade nni * 如果需要将 NNI 安装到自己的 home 目录中,可使用 `--user`,这样也不需要任何特殊权限。 * 目前,Windows 上的 NNI 支持本机,远程和 OpenPAI 模式。 强烈推荐使用 Anaconda 或 Miniconda 在 Windows 上安装 NNI。 -* 如果遇到如`Segmentation fault` 这样的任何错误请参考[常见问题](docs/zh_CN/FAQ.md)。 +* 如果遇到如`Segmentation fault` 这样的任何错误请参考[常见问题](docs/zh_CN/Tutorial/FAQ.md)。 **通过源代码安装** @@ -133,7 +139,7 @@ Linux 和 macOS * 在 `python >= 3.5` 的环境中运行命令: `git` 和 `wget`,确保安装了这两个组件。 ```bash - git clone -b v0.8 https://github.com/Microsoft/nni.git + git clone -b v0.9 https://github.com/Microsoft/nni.git cd nni source install.sh ``` @@ -143,14 +149,14 @@ Windows * 在 `python >=3.5` 的环境中运行命令: `git` 和 `PowerShell`,确保安装了这两个组件。 ```bash - git clone -b v0.8 https://github.com/Microsoft/nni.git + git clone -b v0.9 https://github.com/Microsoft/nni.git cd nni powershell -ExecutionPolicy Bypass -file install.ps1 ``` -参考[安装 NNI](docs/zh_CN/Installation.md) 了解系统需求。 +参考[安装 NNI](docs/zh_CN/Tutorial/Installation.md) 了解系统需求。 -Windows 上参考 [Windows 上使用 NNI](docs/zh_CN/NniOnWindows.md)。 +Windows 上参考 [Windows 上使用 NNI](docs/zh_CN/Tutorial/NniOnWindows.md)。 **验证安装** @@ -159,7 +165,7 @@ Windows 上参考 [Windows 上使用 NNI](docs/zh_CN/NniOnWindows.md)。 * 通过克隆源代码下载示例。 ```bash - git clone -b v0.8 https://github.com/Microsoft/nni.git + git clone -b v0.9 https://github.com/Microsoft/nni.git ``` Linux 和 macOS @@ -207,7 +213,7 @@ You can use these commands to get more information about the experiment ----------------------------------------------------------------------- ``` -* 在浏览器中打开 `Web UI url`,可看到下图的 Experiment 详细信息,以及所有的 Trial 任务。 查看[这里](docs/zh_CN/WebUI.md)的更多页面。 +* 在浏览器中打开 `Web UI url`,可看到下图的 Experiment 详细信息,以及所有的 Trial 任务。 查看[这里](docs/zh_CN/Tutorial/WebUI.md)的更多页面。 @@ -216,43 +222,69 @@ You can use these commands to get more information about the experiment ## **文档** +主要文档都可以在[这里](https://nni.readthedocs.io/cn/latest/Overview.html)找到,文档均从本代码库生成。 +点击阅读: + * [NNI 概述](docs/zh_CN/Overview.md) -* [快速入门](docs/zh_CN/QuickStart.md) +* [快速入门](docs/en_US/Tutorial/QuickStart.md) +* [贡献](docs/en_US/Tutorial/Contributing.md) +* [示例](docs/en_US/examples.rst) +* [参考](docs/en_US/reference.rst) +* [Web 界面教程](docs/en_US/Tutorial/WebUI.md) ## **入门** -* [安装 NNI](docs/zh_CN/Installation.md) -* [使用命令行工具 nnictl](docs/zh_CN/Nnictl.md) -* [使用 NNIBoard](docs/zh_CN/WebUI.md) -* [如何定义搜索空间](docs/zh_CN/SearchSpaceSpec.md) -* [如何编写 Trial 代码](docs/zh_CN/Trials.md) -* [如何选择 Tuner、搜索算法](docs/zh_CN/BuiltinTuner.md) -* [配置 Experiment](docs/zh_CN/ExperimentConfig.md) -* [如何使用 Annotation](docs/zh_CN/Trials.md#nni-python-annotation) +* [安装 NNI](docs/en_US/Tutorial/Installation.md) +* [使用命令行工具 nnictl](docs/en_US/Tutorial/Nnictl.md) +* [使用 NNIBoard](docs/en_US/Tutorial/WebUI.md) +* [如何定义搜索空间](docs/en_US/Tutorial/SearchSpaceSpec.md) +* [如何实现 Trial 代码](docs/en_US/TrialExample/Trials.md) +* [如何选择 Tuner、搜索算法](docs/en_US/Tuner/BuiltinTuner.md) +* [配置 Experiment](docs/en_US/Tutorial/ExperimentConfig.md) +* [如何使用 Annotation](docs/en_US/TrialExample/Trials.md#nni-python-annotation) ## **教程** -* [在本机运行 Experiment (支持多 GPU 卡)](docs/zh_CN/LocalMode.md) -* [在多机上运行 Experiment](docs/zh_CN/RemoteMachineMode.md) -* [在 OpenPAI 上运行 Experiment](docs/zh_CN/PaiMode.md) -* [在 Kubeflow 上运行 Experiment。](docs/zh_CN/KubeflowMode.md) -* [尝试不同的 Tuner](docs/zh_CN/tuners.rst) -* [尝试不同的 Assessor](docs/zh_CN/assessors.rst) -* [实现自定义 Tuner](docs/zh_CN/CustomizeTuner.md) -* [实现自定义 Assessor](docs/zh_CN/CustomizeAssessor.md) -* [使用进化算法为阅读理解任务找到好模型](examples/trials/ga_squad/README_zh_CN.md) +* [在 OpenPAI 上运行 Experiment](docs/en_US/TrainingService/PaiMode.md) +* [在 Kubeflow 上运行 Experiment](docs/en_US/TrainingService/KubeflowMode.md) +* [在本机运行 Experiment (支持多 GPU 卡)](docs/en_US/TrainingService/LocalMode.md) +* [在多机上运行 Experiment](docs/en_US/TrainingService/RemoteMachineMode.md) +* [尝试不同的 Tuner](docs/en_US/Tuner/BuiltinTuner.md) +* [尝试不同的 Assessor](docs/en_US/Assessor/BuiltinAssessor.md) +* [实现自定义 Tuner](docs/en_US/Tuner/CustomizeTuner.md) +* [实现自定义 Assessor](docs/en_US/Assessor/CustomizeAssessor.md) +* [使用进化算法为阅读理解任务找到好模型](docs/en_US/TrialExample/SquadEvolutionExamples.md) ## **贡献** -欢迎贡献代码或提交建议,可在 [GitHub issues](https://github.com/Microsoft/nni/issues) 跟踪需求和 Bug。 +非常欢迎通过各种方式参与此项目,例如: + +* 审查[源代码改动](https://github.com/microsoft/nni/pulls) +* 审查[文档](https://github.com/microsoft/nni/tree/master/docs)中从拼写错误到新内容的任何内容,并提交拉取请求。 +* 找到标有 ['good first issue'](https://github.com/Microsoft/nni/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) 或 ['help-wanted'](https://github.com/microsoft/nni/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) 标签的 Issue。这些都是简单的 Issue,新的贡献者可以从这些问题开始。 + +在提交代码前,需要遵循以下的简单准则: + +* [如何调试](docs/en_US/Tutorial/HowToDebug.md) +* [代码风格和命名约定](docs/en_US/Tutorial/Contributing.md) +* 如何设置 [NNI 开发环境](docs/zh_CN/Tutorial/SetupNniDeveloperEnvironment.md) +* 查看[贡献说明](docs/en_US/Tutorial/Contributing.md)并熟悉 NNI 的代码贡献指南 + +## **外部代码库** -推荐新贡献者从标有 **good first issue** 的简单需求开始。 +下面是一些贡献者为 NNI 提供的使用示例 谢谢可爱的贡献者! 欢迎越来越多的人加入我们! -如要安装 NNI 开发环境,参考:[配置 NNI 开发环境](docs/zh_CN/SetupNniDeveloperEnvironment.md)。 +* 在 NNI 中运行 [ENAS](examples/tuners/enas_nni/README_zh_CN.md) +* 在 NNI 中运行 [神经网络架构结构搜索](examples/trials/nas_cifar10/README_zh_CN.md) -在写代码之前,请查看并熟悉 NNI 代码贡献指南:[贡献](docs/zh_CN/Contributing.md)。 +## **反馈** -我们正在编写[如何调试](docs/zh_CN/HowToDebug.md) 的页面,欢迎提交建议和问题。 +* [报告 Bug](https://github.com/microsoft/nni/issues/new/choose)。 + +* [请求新功能](https://github.com/microsoft/nni/issues/new/choose). +* 在 [Gitter](https://gitter.im/Microsoft/nni?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) 中参与讨论 +* 在 [Stack Overflow](https://stackoverflow.com/questions/tagged/nni?sort=Newest&edited=true) 上使用 nni 的标签提问,或[在 Github 上提交 Issue](https://github.com/microsoft/nni/issues/new/choose)。 +* 我们正在实现[如何调试](docs/zh_CN/Tutorial/HowToDebug.md)的页面,欢迎提交建议和问题。 ## **许可协议** diff --git a/crowdin.yml b/crowdin.yml new file mode 100644 index 0000000000..a701d92d35 --- /dev/null +++ b/crowdin.yml @@ -0,0 +1,12 @@ +files: + - source: '/**/*.[mM][dD]' + ignore: + - '*_%locale_with_underscore%.md' + - /docs + - /%locale_with_underscore% + - '**/ISSUE_TEMPLATE/**' + translation: /%original_path%/%file_name%_%locale_with_underscore%.md + - source: /docs/en_US/**/* + ignore: + - /docs/%locale_with_underscore%/**/*.* + translation: /docs/%locale_with_underscore%/**/%original_file_name% diff --git a/docs/en_US/CommunitySharings/ParallelizingTpeSearch.md b/docs/en_US/CommunitySharings/ParallelizingTpeSearch.md index d7796e2ee2..0090ad37bf 100644 --- a/docs/en_US/CommunitySharings/ParallelizingTpeSearch.md +++ b/docs/en_US/CommunitySharings/ParallelizingTpeSearch.md @@ -2,7 +2,7 @@ TPE approaches were actually run asynchronously in order to make use of multiple compute nodes and to avoid wasting time waiting for trial evaluations to complete. For the TPE approach, the so-called constant liar approach was used: each time a candidate point x∗ was proposed, a fake fitness evaluation of the y was assigned temporarily, until the evaluation completed and reported the actual loss f(x∗). -## Introducion and Problems +## Introduction and Problems ### Sequential Model-based Global Optimization @@ -19,7 +19,7 @@ Since calculation of p(y|x) is expensive, TPE approach modeled p(y|x) by p(x|y) ![](../../img/parallel_tpe_search_tpe.PNG) where l(x) is the density formed by using the observations {x(i)} such that corresponding loss -f(x(i)) was less than y∗ and g(x) is the density formed by using the remaining observations. TPE algorithm depends on a y∗ that is larger than the best observed f(x) so that some points can be used to form l(x). The TPE algorithm chooses y∗ to be some quantile γ of the observed y values, so that p(y<`y∗`) = γ, but no specific model for p(y) is necessary. The tree-structured form of l and g makes it easy to draw manycandidates according to l and evaluate them according to g(x)/l(x). On each iteration, the algorithm returns the candidate x∗ with the greatest EI. +f(x(i)) was less than y∗ and g(x) is the density formed by using the remaining observations. TPE algorithm depends on a y∗ that is larger than the best observed f(x) so that some points can be used to form l(x). The TPE algorithm chooses y∗ to be some quantile γ of the observed y values, so that p(y<`y∗`) = γ, but no specific model for p(y) is necessary. The tree-structured form of l and g makes it easy to draw many candidates according to l and evaluate them according to g(x)/l(x). On each iteration, the algorithm returns the candidate x∗ with the greatest EI. Here is a simulation of the TPE algorithm in a two-dimensional search space. The difference of background color represents different values. It can be seen that TPE combines exploration and exploitation very well. (Black indicates the points of this round samples, and yellow indicates the points has been taken in the history.) @@ -69,13 +69,13 @@ We have simulated the method above. The following figure shows the result of usi ### Branin-Hoo -The four optimization strtigeies presented in the last section are now complared on the Branin-Hoo function which is a classical test-case in global optimization. +The four optimization strategies presented in the last section are now compared on the Branin-Hoo function which is a classical test-case in global optimization. ![](../../img/parallel_tpe_search_branin.PNG) The recommended values of a, b, c, r, s and t are: a = 1, b = 5.1 ⁄ (4π2), c = 5 ⁄ π, r = 6, s = 10 and t = 1 ⁄ (8π). This function has three global minimizers(-3.14, 12.27), (3.14, 2.27), (9.42, 2.47). -Next is the comparaison of the q-EI associated with the q first points (q ∈ [1,10]) given by the constant liar strategies (min and max), 2000 q-points designs uniformly drawn for every q, and 2000 q-points LHS designs taken at random for every q. +Next is the comparison of the q-EI associated with the q first points (q ∈ [1,10]) given by the constant liar strategies (min and max), 2000 q-points designs uniformly drawn for every q, and 2000 q-points LHS designs taken at random for every q. ![](../../img/parallel_tpe_search_result.PNG) diff --git a/docs/en_US/Tutorial/SearchSpaceSpec.md b/docs/en_US/Tutorial/SearchSpaceSpec.md index 433e969c3b..e2d742510a 100644 --- a/docs/en_US/Tutorial/SearchSpaceSpec.md +++ b/docs/en_US/Tutorial/SearchSpaceSpec.md @@ -54,7 +54,7 @@ All types of sampling strategies and their parameter are listed here: * When optimizing, this variable is constrained to be positive. * {"_type":"qloguniform","_value":[low, high, q]} - * Which means the variable value is a value like clip(round(loguniform(low, high)) / q) * q, low, high), where the clip operation is used to constraint the generated value in the bound. + * Which means the variable value is a value like clip(round(loguniform(low, high) / q) * q, low, high), where the clip operation is used to constraint the generated value in the bound. * Suitable for a discrete variable with respect to which the objective is "smooth" and gets smoother with the size of the value, but which should be bounded both above and below. * {"_type":"normal","_value":[mu, sigma]} @@ -104,4 +104,4 @@ Known Limitations: * We do not support nested search space "Hyper Parameter" in visualization now, the enhancement is being considered in #1110(https://github.com/microsoft/nni/issues/1110), any suggestions or discussions or contributions are warmly welcomed -[1]: ../AdvancedFeature/GeneralNasInterfaces.md \ No newline at end of file +[1]: ../AdvancedFeature/GeneralNasInterfaces.md diff --git a/docs/zh_CN/AdvancedNas.md b/docs/zh_CN/AdvancedFeature/AdvancedNas.md similarity index 100% rename from docs/zh_CN/AdvancedNas.md rename to docs/zh_CN/AdvancedFeature/AdvancedNas.md diff --git a/docs/zh_CN/AdvancedFeature/GeneralNasInterfaces.md b/docs/zh_CN/AdvancedFeature/GeneralNasInterfaces.md new file mode 100644 index 0000000000..1fa699cb3b --- /dev/null +++ b/docs/zh_CN/AdvancedFeature/GeneralNasInterfaces.md @@ -0,0 +1,237 @@ +# 神经网络架构搜索的通用编程接口(测试版) + +** 这是一个测试中的功能,目前只实现了通用的 NAS 编程接口。 在随后的版本中会支持权重共享。* + +自动化的神经网络架构(NAS)搜索在寻找更好的模型方面发挥着越来越重要的作用。 最近的研究工作证明了自动化 NAS 的可行性,并发现了一些超越手动设计和调整的模型。 代表算法有 [NASNet](https://arxiv.org/abs/1707.07012),[ENAS](https://arxiv.org/abs/1802.03268),[DARTS](https://arxiv.org/abs/1806.09055),[Network Morphism](https://arxiv.org/abs/1806.10282),以及 [Evolution](https://arxiv.org/abs/1703.01041) 等。 新的算法还在不断涌现。 然而,实现这些算法需要很大的工作量,且很难重用其它算法的代码库来实现。 + +要促进 NAS 创新(例如,设计实现新的 NAS 模型,并列比较不同的 NAS 模型),易于使用且灵活的编程接口非常重要。 + + + +## 编程接口 + +在两种场景下需要用于设计和搜索模型的新的编程接口。 1) 在设计神经网络时,层、子模型或连接有多个可能,并且不确定哪一个或哪种组合表现最好。 如果有一种简单的方法来表达想要尝试的候选层、子模型,将会很有价值。 2) 研究自动化 NAS 时,需要统一的方式来表达神经网络架构的搜索空间, 并在不改变 Trial 代码的情况下来使用不同的搜索算法。 + +本文基于 [NNI Annotation](../Tutorial/AnnotationSpec.md) 实现了简单灵活的编程接口 。 通过以下示例来详细说明。 + +### 示例:为层选择运算符 + +在设计此模型时,第四层的运算符有多个可能的选择,会让模型有更好的表现。 如图所示,在模型代码中可以对第四层使用 Annotation。 此 Annotation 中,共有五个字段: + +![](../../img/example_layerchoice.png) + +* **layer_choice**:它是函数调用的 list,每个函数都要在代码或导入的库中实现。 函数的输入参数格式为:`def XXX (input, arg2, arg3, ...)`,其中输入是包含了两个元素的 list。 其中一个是 `fixed_inputs` 的 list,另一个是 `optional_inputs` 中选择输入的 list。 `conv` 和 `pool` 是函数示例。 对于 list 中的函数调用,无需写出第一个参数(即 input)。 注意,只会从这些函数调用中选择一个来执行。 +* **fixed_inputs** :它是变量的 list,可以是前一层输出的张量。 也可以是此层之前的另一个 `nni.mutable_layer` 的 `layer_output`,或此层之前的其它 Python 变量。 list 中的所有变量将被输入 `layer_choice` 中选择的函数(作为输入 list 的第一个元素)。 +* **optional_inputs** :它是变量的 list,可以是前一层的输出张量。 也可以是此层之前的另一个 `nni.mutable_layer` 的 `layer_output`,或此层之前的其它 Python 变量。 只有 `optional_input_size` 变量被输入 `layer_choice` 到所选的函数 (作为输入 list 的第二个元素)。 +* **optional_input_size** :它表示从 `input_candidates` 中选择多少个输入。 它可以是一个数字,也可以是一个范围。 范围 [1, 3] 表示选择 1、2 或 3 个输入。 +* **layer_output** :表示输出的名称。本例中,表示 `layer_choice` 选择的函数的返回值。 这是一个变量名,可以在随后的 Python 代码或 `nni.mutable_layer` 中使用。 + +此示例有两种写 Annotation 的方法。 对于上面的示例,输入函数的形式是 `[[], [out3]]` 。 对于下面的示例,输入的形式是 `[[out3], []]`。 + +**调试**:`nnictl trial codegen` 命令可帮助调试 NAS 编程接口。 如果 Experiment `YYY` 中的 Trial 的 `XXX` 出错了,可以运行 `nnictl trial codegen YYY --trial_id XXX` 在当前目录下生成这个 Trial 的可执行代码。 通过运行此代码,可以不需要 NNI 就能调试 Trial 失败的原因。 此命令会编译 Trial 代码,并用实际选择的层次和输入来替换 NNI 的 NAS 代码。 + +### 示例:为层选择输入的连接 + +设计层的连接对于制作高性能模型至关重要。 通过此接口,可选择一个层可以采用哪些连接来作为输入。 可以从一组连接中选择几个。 下面的示例从三个候选输入中为 `concat` 这个函数选择两个输入 。 `concat` 还会使用 `fixed_inputs` 获取其上一层的输出 。 + +![](../../img/example_connectchoice.png) + +### 示例:同时选择运算符和连接 + +此示例从三个运算符中选择一个,并为其选择两个连接作为输入。 由于输入会有多个变量,,在函数的开头需要调用 `concat` 。 + +![](../../img/example_combined.png) + +### 示例:[ENAS](https://arxiv.org/abs/1802.03268) 宏搜索空间 + +为了证明编程接口带来的便利,使用该接口来实现 “ENAS + 宏搜索空间” 的 Trial 代码。 左图是 ENAS 论文中的宏搜索空间。 + +![](../../img/example_enas.png) + +## 统一的 NAS 搜索空间说明 + +通过上面的 Annotation 更新 Trial 代码后,即在代码中隐式指定了神经网络架构的搜索空间。 基于该代码,NNI 将自动生成一个搜索空间文件,可作为调优算法的输入。 搜索空间文件遵循以下 JSON 格式。 + +```javascript +{ + "mutable_1": { + "_type": "mutable_layer", + "_value": { + "layer_1": { + "layer_choice": ["conv(ch=128)", "pool", "identity"], + "optional_inputs": ["out1", "out2", "out3"], + "optional_input_size": 2 + }, + "layer_2": { + ... + } + } + } +} +``` + +相应生成的神经网络结构(由调优算法生成)如下: + +```javascript +{ + "mutable_1": { + "layer_1": { + "chosen_layer": "pool", + "chosen_inputs": ["out1", "out3"] + }, + "layer_2": { + ... + } + } +} +``` + +通过对搜索空间格式和体系结构选择 (choice) 表达式的说明,可以自由地在 NNI 上实现神经体系结构搜索的各种或通用的调优算法。 接下来的工作会提供一个通用的 NAS 算法。 + +## 支持 One-Shot NAS + +One-Shot NAS 是流行的,能在有限的时间和资源预算内找到较好的神经网络结构的方法。 本质上,它会基于搜索空间来构建完整的图,并使用梯度下降最终找到最佳子图。 它有不同的训练方法,如:[training subgraphs (per mini-batch)](https://arxiv.org/abs/1802.03268) ,[training full graph through dropout](http://proceedings.mlr.press/v80/bender18a/bender18a.pdf),以及 [training with architecture weights (regularization)](https://arxiv.org/abs/1806.09055) 。 + +如上所示,NNI 支持通用的 NAS。 从用户角度来看,One-Shot NAS 和 NAS 具有相同的搜索空间规范,因此,它们可以使用相同的编程接口,只是在训练模式上有所不同。 NNI 提供了四种训练模式: + +***classic_mode***: [上文](#ProgInterface)对此模式有相应的描述,每个子图是一个 Trial 任务。 要使用此模式,需要启用 NNI Annotation,并在 Experiment 配置文件中为 NAS 指定一个 Tuner。 [这里](https://github.com/microsoft/nni/tree/master/examples/trials/mnist-nas)是如何实现 Trial 和配置文件的例子。 [这里](https://github.com/microsoft/nni/tree/master/examples/tuners/random_nas_tuner)是一个简单的 NAS Tuner。 + +***enas_mode***: 参考 [ENAS 论文](https://arxiv.org/abs/1802.03268)的训练方法。 它基于神经网络架构搜索空间来构建全图,每个 mini-batch 只激活一个子图。 [详细说明](#ENASMode)。 (当前仅支持 TensorFlow)。 + +要使用 enas_mode,需要在配置的 `trial` 部分增加如下字段。 + +```diff +trial: + command: 运行 Trial 的命令 + codeDir: Trial 代码的目录 + gpuNum: 每个 Trial 所需要的 GPU 数量 + ++ #choice: classic_mode, enas_mode, oneshot_mode ++ nasMode: enas_mode +``` + +与 classic_mode 类似,在 enas_mode 中,需要为 NAS 指定 Tuner,其会从 Tuner(或者论文中的术语:Controller)中接收子图。 由于 Trial 任务要从 Tuner 中接收多个子图,每个子图用于一个 mini-batch,需要在 Trial 代码中增加两行来接收下一个子图(`nni.training_update`),并返回当前子图的结果。 示例如下: + +```python +for _ in range(num): + # 接收并启用一个新的子图 + """@nni.training_update(tf=tf, session=self.session)""" + loss, _ = self.session.run([loss_op, train_op]) + # 返回这个 mini-batch 的损失值 + """@nni.report_final_result(loss)""" +``` + +在这里,`nni.training_update`用来在全图上进行更新。 在 enas_mode 中,更新表示接收一个子图,并在下一个 mini-batch 中启用它。 在 darts_mode 中,更新表示训练架构权重(参考 darts_mode 中的详细说明)。 在 enas_mode 中,需要将导入的 TensorFlow 包传入 `tf`,并将会话传入 `session`。 + +***oneshot_mode***: 遵循[论文](http://proceedings.mlr.press/v80/bender18a/bender18a.pdf)中的训练方法。 与 enas_mode 通过训练大量子图来训练全图有所不同,oneshot_mode 中构建了全图,并将 dropout 添加到候选的输入以及候选的输出操作中。 然后像其它深度学习模型一样进行训练。 [详细说明](#OneshotMode)。 (当前仅支持 TensorFlow)。 + +要使用 oneshot_mode,需要在配置的 `trial` 部分增加如下字段。 此模式不需要 Tuner,因此不用在配置文件中指定 Tuner。 (注意,当前仍然需要在配置文件中指定任一一个 Tuner。)此模式下也不需要添加 `nni.training_update`,因为在训练过程中不需要特别的更新过程。 + +```diff +trial: + command: 运行 Trial 的命令 + codeDir: Trial 代码的目录 + gpuNum: 每个 Trial 所需要的 GPU 数量 + ++ #choice: classic_mode, enas_mode, oneshot_mode ++ nasMode: oneshot_mode +``` + +***darts_mode***: 参考 [论文](https://arxiv.org/abs/1806.09055)中的训练方法。 与 oneshot_mode 类似。 有两个不同之处,首先 darts_mode 只将架构权重添加到候选操作的输出中,另外是交错的来训练模型权重和架构权重。 [详细说明](#DartsMode)。 + +要使用 darts_mode,需要在配置的 `trial` 部分增加如下字段。 此模式不需要 Tuner,因此不用在配置文件中指定 Tuner。 (注意,当前仍需要在配置文件中指定任意一个 Tuner。) + +```diff +trial: + command: 运行 Trial 的命令 + codeDir: Trial 代码的目录 + gpuNum: 每个 Trial 所需要的 GPU 数量 + ++ #choice: classic_mode, enas_mode, oneshot_mode ++ nasMode: darts_mode +``` + +在使用 darts_mode 时,需要按照如下所示调用 `nni.training_update`,来更新架构权重。 更新架构权重时,和训练数据一样也需要`损失值`(即, `feed_dict`)。 + +```python +for _ in range(num): + # 训练架构权重 + """@nni.training_update(tf=tf, session=self.session, loss=loss, feed_dict=feed_dict)""" + loss, _ = self.session.run([loss_op, train_op]) +``` + +**注意**:对于 enas_mode、oneshot_mode、以及 darts_mode,NNI 仅能在训练阶段时有用。 NNI 不处理它们的推理阶段。 对于 enas_mode,推理阶段需要通过 Controller 来生成新的子图。 对于 oneshot_mode,推理阶段会随机采样生成新的子图,并选择其中好的子图。 对于 darts_mode,推理过程会根据架构权重来修剪掉一些候选的操作。 + + + +### enas_mode + +在 enas_mode 中,编译后的 Trial 代码会构建完整的图形(而不是子图),会接收所选择的架构,并在完整的图形上对此体系结构进行小型的批处理训练,然后再请求另一个架构。 它通过 [NNI 多阶段 Experiment](./multiPhase.md) 来支持。 + +具体来说,使用 TensorFlow 的 Trial,通过 TensorFlow 变量来作为信号,并使用 TensorFlow 的条件函数来控制搜索空间(全图)来提高灵活性。这意味着根据这些信号,可以变为不同的多个子图。 [这是 enas_mode]() 的示例。 + + + +### oneshot_mode + +下图展示了 Dropout 通过 `nni.mutable_layers` 添加在全图的位置,输入的是 1-k 个候选输入,4 个操作是候选的操作。 + +![](../../img/oneshot_mode.png) + +如[论文](http://proceedings.mlr.press/v80/bender18a/bender18a.pdf)中的建议,应该为每层的输入实现 Dropout 方法。 当 0 < r < 1 是模型超参的取值范围(默认值为 0.01),k 是某层可选超参的数量,Dropout 比率设为 r^(1/k)。 fan-in 越高,每个输入被丢弃的可能性越大。 但某层丢弃所有可选输入的概率是常数,与 fan-in 无关。 假设 r = 0.05。 如果某层有 k = 2 个可选的输入,每个输入都会以独立的 0.051/2 ≈ 0.22 的概率被丢弃,也就是说有 0.78 的概率被保留。 如果某层有 k = 7 个可选的输入,每个输入都会以独立的 0.051/7 ≈ 0.65 的概率被丢弃,也就是说有 0.35 的概率被保留。 在这两种情况下,丢弃所有可选输入的概率是 5%。 候选操作的输出会通过同样的方法被丢弃。 [这里]()是 oneshot_mode 的示例。 + + + +### darts_mode + +下图显示了通过 `nni.mutable_layers` 在全图中为某层加入架构权重,每个候选操作的输出会乘以架构权重。 + +![](../../img/darts_mode.png) + +在 `nni.training_update` 中,TensorFlow 的 MomentumOptimizer 通过传递的 `loss` 和 `feed_dict` 来训练架构权重。 [这是 darts_mode]() 的示例。 + +### [**待实现**] One-Shot NAS 的多 Trial 任务。 + +One-Shot NAS 通常只有一个带有完整图的 Trial 任务。 但是,同时运行多个 Trial 任务会很有用。 例如,在 enas_mode 中,多个 Trial 任务可以共享全图的权重来加速模型训练或收敛。 一些 One-Shot 不够稳定,运行多个 Trial 任务可以提升找到更好模型的概率。 + +NNI 原生支持运行多个 Trial 任务。 下图显示了 NNI 上如何运行多个 Trial 任务。 + +![](../../img/one-shot_training.png) + +============================================================= + +## NNI 上 NAS 的系统设计 + +### Experiment 执行的基本流程 + +NNI 的 Annotation 编译器会将 Trial 代码转换为可以接收架构选择并构建相应模型(如图)的代码。 NAS 的搜索空间可以看作是一个完整的图(在这里,完整的图意味着允许所有提供的操作符和连接来构建图),调优算法所选择的是其子图。 默认情况下,编译时 Trial 代码仅构建并执行子图。 + +![](../../img/nas_on_nni.png) + +上图显示了 Trial 代码如何在 NNI 上运行。 `nnictl` 处理 Trial 代码,并生成搜索空间文件和编译后的 Trial 代码。 前者会输入 Tuner,后者会在 Trial 代码运行时使用。 + +[使用 NAS 的简单示例](https://github.com/microsoft/nni/tree/master/examples/trials/mnist-nas)。 + +### [**待实现**] 权重共享 + +在所选择的架构(即 Trial)之间共享权重可以加速模型搜索。 例如,适当地继承已完成 Trial 的权重可加速新 Trial 的收敛。 One-shot NAS(例如,ENAS,Darts)更为激进,不同架构(即子图)的训练会在完整图中共享相同的权重。 + +![](../../img/nas_weight_share.png) + +权重分配(转移)在加速 NAS 中有关键作用,而找到有效的权重共享方式仍是热门的研究课题。 NNI 提供了一个键值存储,用于存储和加载权重。 Tuner 和 Trial 使用 KV 客户端库来访问存储。 + +NNI 上的权重共享示例。 + +## 通用的 NAS 调优算法 + +与超参数调优一样,NAS 也需要相对通用的算法。 通用编程接口使其更容易。 这是 NAS 上[基于 PPO 算法的 RL Tuner](https://github.com/microsoft/nni/tree/master/src/sdk/pynni/nni/ppo_tuner)。 期待社区努力设计和实施更好的 NAS 调优算法。 + +## [**待实现**] 导出最佳神经网络架构和代码 + +Experiment 完成后,可通过 `nnictl experiment export --code` 来导出用最好的神经网络结构和 Trial 代码。 + +## 结论和未来的工作 + +如本文所示,不同的 NAS 算法和执行模式,可通过相同的编程接口来支持。 + +在这一领域有许多系统和机器学习方向的有趣的研究主题。 \ No newline at end of file diff --git a/docs/zh_CN/MultiPhase.md b/docs/zh_CN/AdvancedFeature/MultiPhase.md similarity index 66% rename from docs/zh_CN/MultiPhase.md rename to docs/zh_CN/AdvancedFeature/MultiPhase.md index 0c16bf2cad..42e93eae10 100644 --- a/docs/zh_CN/MultiPhase.md +++ b/docs/zh_CN/AdvancedFeature/MultiPhase.md @@ -12,7 +12,7 @@ ## 创建多阶段的 Experiment -### 编写使用多阶段的 Trial 代码: +### 实现使用多阶段的 Trial 代码: **1. 更新 Trial 代码** @@ -33,13 +33,34 @@ Trial 代码中使用多阶段非常容易,样例如下: ``` -**2. 修改 Experiment 配置** - -要启用多阶段,需要在 Experiment 的 YAML 配置文件中增加 `multiPhase: true`。 如果不添加此参数,`nni.get_next_parameter()` 会一直返回同样的配置。 对于所有内置的 Tuner 和 Advisor,不需要修改任何代码,就直接支持多阶段请求配置。 +**2. Experiment 配置** + +要启用多阶段,需要在 Experiment 的 YAML 配置文件中增加 `multiPhase: true`。 如果不添加此参数,`nni.get_next_parameter()` 会一直返回同样的配置。 + +多阶段 Experiment 配置示例: + + authorName: default + experimentName: multiphase experiment + trialConcurrency: 2 + maxExecDuration: 1h + maxTrialNum: 8 + trainingServicePlatform: local + searchSpacePath: search_space.json + multiPhase: true + useAnnotation: false + tuner: + builtinTunerName: TPE + classArgs: + optimize_mode: maximize + trial: + command: python3 mytrial.py + codeDir: . + gpuNum: 0 + -### 编写使用多阶段的 Tuner: +### 实现使用多阶段的 Tuner: -强烈建议首先阅读[自定义 Tuner](https://nni.readthedocs.io/en/latest/Customize_Tuner.html),再开始编写多阶段 Tuner。 与普通 Tuner 一样,需要从 `Tuner` 类继承。 当通过配置启用多阶段时(将 `multiPhase` 设为 true),Tuner 会通过下列方法得到一个新的参数 `trial_job_id`: +强烈建议首先阅读[自定义 Tuner](https://nni.readthedocs.io/zh/latest/Tuner/CustomizeTuner.html),再开始实现多阶段 Tuner。 与普通 Tuner 一样,需要从 `Tuner` 类继承。 当通过配置启用多阶段时(将 `multiPhase` 设为 true),Tuner 会通过下列方法得到一个新的参数 `trial_job_id`: generate_parameters generate_multiple_parameters @@ -50,6 +71,10 @@ Trial 代码中使用多阶段非常容易,样例如下: 有了这个信息, Tuner 能够知道哪个 Trial 在请求配置信息, 返回的结果是哪个 Trial 的。 通过此信息,Tuner 能够灵活的为不同的 Trial 及其阶段实现功能。 例如,可在 generate_parameters 方法中使用 trial_job_id 来为特定的 Trial 任务生成超参。 -当然,要使用自定义的多阶段 Tuner ,也需要**在 Experiment 的 YAML 配置文件中增加`multiPhase: true`**。 +### 支持多阶段 Experiment 的 Tuner: + +[TPE](../Tuner/HyperoptTuner.md), [Random](../Tuner/HyperoptTuner.md), [Anneal](../Tuner/HyperoptTuner.md), [Evolution](../Tuner/EvolutionTuner.md), [SMAC](../Tuner/SmacTuner.md), [NetworkMorphism](../Tuner/NetworkmorphismTuner.md), [MetisTuner](../Tuner/MetisTuner.md), [BOHB](../Tuner/BohbAdvisor.md), [Hyperband](../Tuner/HyperbandAdvisor.md), [ENAS Tuner ](https://github.com/countif/enas_nni/blob/master/nni/examples/tuners/enas/nni_controller_ptb.py). + +### 支持多阶段 Experiment 的训练平台: -[ENAS Tuner](https://github.com/countif/enas_nni/blob/master/nni/examples/tuners/enas/nni_controller_ptb.py) 是多阶段 Tuner 的样例。 \ No newline at end of file +[本机](../TrainingService/LocalMode.md), [远程计算机](../TrainingService/RemoteMachineMode.md), [OpenPAI](../TrainingService/PaiMode.md) \ No newline at end of file diff --git a/docs/zh_CN/BuiltinAssessor.md b/docs/zh_CN/Assessor/BuiltinAssessor.md similarity index 100% rename from docs/zh_CN/BuiltinAssessor.md rename to docs/zh_CN/Assessor/BuiltinAssessor.md diff --git a/docs/zh_CN/CurvefittingAssessor.md b/docs/zh_CN/Assessor/CurvefittingAssessor.md similarity index 95% rename from docs/zh_CN/CurvefittingAssessor.md rename to docs/zh_CN/Assessor/CurvefittingAssessor.md index 65a1d1ef9a..b713fba2b1 100644 --- a/docs/zh_CN/CurvefittingAssessor.md +++ b/docs/zh_CN/Assessor/CurvefittingAssessor.md @@ -6,15 +6,15 @@ Curve Fitting Assessor 是一个 LPA (learning, predicting, assessing,即学 此算法中,使用了 12 条曲线来拟合学习曲线,从[参考论文](http://aad.informatik.uni-freiburg.de/papers/15-IJCAI-Extrapolation_of_Learning_Curves.pdf)中选择了大量的参数曲线模型。 学习曲线的形状与先验知识是一致的:都是典型的递增的、饱和的函数。 -![](../img/curvefitting_learning_curve.PNG) +![](../../img/curvefitting_learning_curve.PNG) 所有学习曲线模型被合并到了单个,更强大的模型中。 合并的模型通过加权线性混合: -![](../img/curvefitting_f_comb.gif) +![](../../img/curvefitting_f_comb.gif) 合并后的参数向量 -![](../img/curvefitting_expression_xi.gif) +![](../../img/curvefitting_expression_xi.gif) 假设增加一个高斯噪声,且噪声参数初始化为最大似然估计。 @@ -30,7 +30,7 @@ Curve Fitting Assessor 是一个 LPA (learning, predicting, assessing,即学 下图显示了此算法在 MNIST Trial 历史数据上结果。其中绿点表示 Assessor 获得的数据,蓝点表示将来,但未知的数据,红色线条是 Curve fitting Assessor 的预测曲线。 -![](../img/curvefitting_example.PNG) +![](../../img/curvefitting_example.PNG) ## 2. 用法 diff --git a/docs/zh_CN/CustomizeAssessor.md b/docs/zh_CN/Assessor/CustomizeAssessor.md similarity index 92% rename from docs/zh_CN/CustomizeAssessor.md rename to docs/zh_CN/Assessor/CustomizeAssessor.md index d163b92efd..27da5f374c 100644 --- a/docs/zh_CN/CustomizeAssessor.md +++ b/docs/zh_CN/Assessor/CustomizeAssessor.md @@ -56,5 +56,5 @@ assessor: 更多样例,可参考: -> - [medianstop-assessor](https://github.com/Microsoft/nni/tree/master/src/sdk/pynni/nni/medianstop_assessor) -> - [curvefitting-assessor](https://github.com/Microsoft/nni/tree/master/src/sdk/pynni/nni/curvefitting_assessor) \ No newline at end of file +> * [medianstop-assessor](https://github.com/Microsoft/nni/tree/master/src/sdk/pynni/nni/medianstop_assessor) +> * [curvefitting-assessor](https://github.com/Microsoft/nni/tree/master/src/sdk/pynni/nni/curvefitting_assessor) \ No newline at end of file diff --git a/docs/zh_CN/MedianstopAssessor.md b/docs/zh_CN/Assessor/MedianstopAssessor.md similarity index 100% rename from docs/zh_CN/MedianstopAssessor.md rename to docs/zh_CN/Assessor/MedianstopAssessor.md diff --git a/docs/zh_CN/CommunitySharings/HpoComparision.md b/docs/zh_CN/CommunitySharings/HpoComparision.md index f2fdd4e913..428d6264ea 100644 --- a/docs/zh_CN/CommunitySharings/HpoComparision.md +++ b/docs/zh_CN/CommunitySharings/HpoComparision.md @@ -6,15 +6,15 @@ 超参数优化算法如下: -- [Random Search(随机搜索)](../BuiltinTuner.md) -- [Grid Search(遍历搜索)](../BuiltinTuner.md) -- [Evolution](../BuiltinTuner.md) -- [Anneal(退火算法)](../BuiltinTuner.md) -- [Metis](../BuiltinTuner.md) -- [TPE](../BuiltinTuner.md) -- [SMAC](../BuiltinTuner.md) -- [HyperBand](../BuiltinTuner.md) -- [BOHB](../BuiltinTuner.md) +- [Random Search(随机搜索)](../Tuner/BuiltinTuner.md) +- [Grid Search(遍历搜索)](../Tuner/BuiltinTuner.md) +- [Evolution](../Tuner/BuiltinTuner.md) +- [Anneal(退火算法)](../Tuner/BuiltinTuner.md) +- [Metis](../Tuner/BuiltinTuner.md) +- [TPE](../Tuner/BuiltinTuner.md) +- [SMAC](../Tuner/BuiltinTuner.md) +- [HyperBand](../Tuner/BuiltinTuner.md) +- [BOHB](../Tuner/BuiltinTuner.md) 所有算法都在 NNI 本机环境下运行。 @@ -34,7 +34,7 @@ ### 问题描述 -超参搜索上的非凸问题 [AutoGBDT](../gbdt_example.md)。 +超参搜索上的非凸问题 [AutoGBDT](../TrialExample/GbdtExample.md)。 ### 搜索空间 diff --git a/docs/zh_CN/CommunitySharings/ParallelizingTpeSearch.md b/docs/zh_CN/CommunitySharings/ParallelizingTpeSearch.md new file mode 100644 index 0000000000..545feb0c63 --- /dev/null +++ b/docs/zh_CN/CommunitySharings/ParallelizingTpeSearch.md @@ -0,0 +1,111 @@ +# 并行化顺序算法:TPE + +为了利用多个计算节点,TPE 方法是异步运行的,这样能避免浪费时间等待 Trial 评估的完成。 TPE 方法使用了叫做 constant liar 的方法:每次候选点 x* 生成时,会临时分配一个假的评估结果 y。在评估完成后,用返回的真实损失值 f(x*) 来替换假的评估结果。 + +## 介绍和问题 + +### 基于顺序模型的全局优化 + +基于顺序模型的全局优化(SMBO)算法已经用于许多应用中,但适应度函数的评估成本比较高。 在应用中,真实的适应度函数 f: X → R 评估成本较高,通过采用基于模型算法近似的 f 来替代,可降低其评估成本。 通常,在 SMBO 算法内层循环是用数值优化或其它转换方式来替代。 点 x* 最大化的替代项(或它的转换形式)作为真实函数 f 评估的替代值。 这种类似于主动学习的算法模板总结如下。 SMBO 算法的不同之处在于,给定一个 f 的模型(或替代项)的情况下,获得 x* 的优化的标准,以及通过观察历史 H 来模拟 f。 + +![](../../img/parallel_tpe_search4.PNG) + +本算法优化了预期改进(Expected Improvement,EI)的标准。 其它建议的标准包括,概率改进(Probability of Improvement)、预期改进(Expected Improvement)最小化条件熵(minimizing the Conditional Entropy of the Minimizer)、以及 bandit-based 的标准。 在 TPE 中考虑到直观,选择了 EI,其在多种设置下都展示了较好的效果。 预期改进(EI)是在模型 M 下,当 f(x) (负向)超过某个阈值 y* 时,对 f 的预期:X → RN。 + +![](../../img/parallel_tpe_search_ei.PNG) + +由于 p(y|x) 计算成本较高,TPE 通过 p(x|y) 和 p(y) 来为 p(y|x) 建模。TPE 通过下列两个密度来定义 p(x|y): + +![](../../img/parallel_tpe_search_tpe.PNG) + +l(x) 是通过观察 {x(i)} 来形成的密度,使得相应的损失 f(x(i)) 小于 y∗,而 g(x) 是使用剩余的观测值来形成的密度。 TPE 算法取决于 y∗ 大于观测到的最好的 f(x),这样可以使用一些点来形成 l(x)。 TPE 算法选择了 y* 来作为一些观测值 y 的分位数 γ,因此 p(y<`y∗`) = γ,但不需要为特定的 p(y) 建模。 l 和 g 的树形结构使得根据 l 来计算多个候选项变得容易,可根据 g(x)/l(x) 来进行评估。 在每次迭代中,算法返回了具有最大 EI 的候选 x*。 + +这是 TPE 算法在二维搜索空间上的模拟。 不同的背景色表示了不同的值。 可以看出,TPE 在探索(exploration)和挖掘(exploitation)方面的表现都很好。 (黑色表示此轮样本的点,黄色表示历史点。) + +![](../../img/parallel_tpe_search1.gif) + +**由于 EI 是连续函数,因此 EI 的最高 x 在某个状态下是确定的 。** 如下图所示,蓝色三角形表示在当前状态下最有可能进行采样的点。 + +![](../../img/parallel_tpe_search_ei2.PNG) + +TPE 在顺序执行时表现很好,但当并发性较大时,会**在相同的 EI 状态下产生大量的点**,过于集中的点会减少 Tuner 探索的能力,造成了资源的浪费。 + +这是当 `concurrency=60` 时的模拟图,这种现象非常明显。 + +![](../../img/parallel_tpe_search2.gif) + +## 研究的解决方案 + +### 近似 q-EI 最大化 + +下面介绍的多点标准的新的 Experiment 设计一步解决此优化问题。 + +![](../../img/parallel_tpe_search_qEI.PNG) + +但是,当 q 增加时,q-EI 的计算变得很密集。 研究发现,四种流行的贪心策略可在解决此问题时,减少计算成本。 + +#### 方案 1: Believing the OK Predictor: KB(Kriging Believer) 启发式策略 + +Kriging Believer 策略用等价于 Kriging 预测期望值的确定性值替换在最后一次迭代中选择的位置的响应的条件知识。 保持与上次相同的记号,此策略可归纳如下: + +![](../../img/parallel_tpe_search_kb.PNG) + +这种顺序策略使用了 q-points 设计,在计算量上是可承受的,因为它依赖于分析已知的 EI,在 d 维上进行了优化。 但此方法有失败的风险,因为相信 OK Predictor 可以预测超过观察到的数据,可能导致多轮迭代中的序列会陷入非最优区域。 第二种策略可降低这种风险。 + +#### 方案 2: CL(Constant Liar) 启发式策略 + +考虑一种顺序策略,在每次迭代时会更新元模型(但不会重新估计超参),其中值 L 来自外部固定值,称为”lie(谎言)”。 Constant Liar 策略在每次迭代时使用相同的值 L:最大化 EI(即找到 xn+1),将模型实现为 y(xn+1) = L,始终使用 L∈R: + +![](../../img/parallel_tpe_search_cl.PNG) + +L 应在逻辑上根据 y 在 X 处获取的值来确定,可考虑使用的三个值:min{Y}, mean{Y}, 以及 max{Y}。 **L 越大,算法的探索性就越大,反之亦然。** + +根据上述方法进行模拟。 下图显示了使用均值 liar,来最大化 q-EI。 能看到这些点开始分散了。 + +![](../../img/parallel_tpe_search3.gif) + +## Experiment + +### Branin-Hoo + +最后一章介绍的四种优化方法通过 Branin-Hoo 函数进行了比较,这是全局优化中的经典测试用例。 + +![](../../img/parallel_tpe_search_branin.PNG) + +a, b, c, r, s 以及 t 的推荐值分别为:a = 1, b = 5.1 ⁄ (4π2), c = 5 ⁄ π, r = 6, s = 10, t = 1 ⁄ (8π)。 此函数有三个全局最小值点 (-3.14, 12.27), (3.14, 2.27), (9.42, 2.47)。 + +下表为给定 constant liar 策略(最小、最大值)下,比较了前 q 个点(q ∈ [1,10])。每个 q 绘制 2000 个 q 点,这 2000 个 q 点随机采用 LHS。 + +![](../../img/parallel_tpe_search_result.PNG) + +正如图中所见,,CL[max] 和 CL[min] 与随机相比,产生了更好的 q-EI 结果,尤其是 q 值很小时。 + +### 高斯混合模型函数(Gaussian Mixed Model function) + +以下比较了使用和不使用并行优化的情况。 二维多模的高斯混合分布的模拟结果如下: + +| | concurrency=80 | concurrency=60 | concurrency=40 | concurrency=20 | concurrency=10 | +| ------- | ---------------------------- | ---------------------------- | ---------------------------- | ---------------------------- | ---------------------------- | +| 未使用并行优化 | avg = 0.4841 +var = 0.1953 | avg = 0.5155 +var = 0.2219 | avg = 0.5773 +var = 0.2570 | avg = 0.4680 +var = 0.1994 | avg = 0.2774 +var = 0.1217 | +| 使用了并行优化 | avg = 0.2132 +var = 0.0700 | avg = 0.2177 +var = 0.0796 | avg = 0.1835 +var = 0.0533 | avg = 0.1671 +var = 0.0413 | avg = 0.1918 +var = 0.0697 | + + +注意:每次测试的样本总数为 240(确保成本相等)。 每种形式下的 Trial 重复了 1000 次,表中值为 1000 个 Trial 中最好结果的平均值和方差。 + +## 参考 + +[1] James Bergstra, Remi Bardenet, Yoshua Bengio, Balazs Kegl. "Algorithms for Hyper-Parameter Optimization". [链接](https://papers.nips.cc/paper/4443-algorithms-for-hyper-parameter-optimization.pdf) + +[2] Meng-Hiot Lim, Yew-Soon Ong. "Computational Intelligence in Expensive Optimization Problems". [链接](https://link.springer.com/content/pdf/10.1007%2F978-3-642-10701-6.pdf) + +[3] M. Jordan, J. Kleinberg, B. Scho¨lkopf. "Pattern Recognition and Machine Learning". [链接](http://users.isr.ist.utl.pt/~wurmd/Livros/school/Bishop%20-%20Pattern%20Recognition%20And%20Machine%20Learning%20-%20Springer%20%202006.pdf) \ No newline at end of file diff --git a/docs/zh_CN/CommunitySharings/NniPracticeSharing/RecommendersSvd.md b/docs/zh_CN/CommunitySharings/RecommendersSvd.md similarity index 100% rename from docs/zh_CN/CommunitySharings/NniPracticeSharing/RecommendersSvd.md rename to docs/zh_CN/CommunitySharings/RecommendersSvd.md diff --git a/docs/zh_CN/community_sharings.rst b/docs/zh_CN/CommunitySharings/community_sharings.rst similarity index 54% rename from docs/zh_CN/community_sharings.rst rename to docs/zh_CN/CommunitySharings/community_sharings.rst index 82f65c9b7a..98e6633473 100644 --- a/docs/zh_CN/community_sharings.rst +++ b/docs/zh_CN/CommunitySharings/community_sharings.rst @@ -7,6 +7,7 @@ .. toctree:: :maxdepth: 2 - NNI 经验分享 - 神经网络结构搜索的对比 - 超参调优算法的对比 + Recommenders 中使用 NNI + 神经网络结构搜索(NAS)的对比 + 超参调优算法的对比 + TPE 的并行优化 diff --git a/docs/zh_CN/GeneralNasInterfaces.md b/docs/zh_CN/GeneralNasInterfaces.md deleted file mode 100644 index 0b48c751ed..0000000000 --- a/docs/zh_CN/GeneralNasInterfaces.md +++ /dev/null @@ -1,136 +0,0 @@ -# 神经网络架构搜索的通用编程接口(测试版) - -** 这是一个测试中的功能,目前只实现了通用的 NAS 编程接口。 接下来的版本会基于此接口支持权重共享和 one-shot NAS。* - -自动化的神经网络架构(NAS)搜索在寻找更好的模型方面发挥着越来越重要的作用。 最近的研究工作证明了自动化 NAS 的可行性,并发现了一些超越手动设计和调整的模型。 代表算法有 [NASNet](https://arxiv.org/abs/1707.07012),[ENAS](https://arxiv.org/abs/1802.03268),[DARTS](https://arxiv.org/abs/1806.09055),[Network Morphism](https://arxiv.org/abs/1806.10282),以及 [Evolution](https://arxiv.org/abs/1703.01041) 等。 新的算法还在不断涌现。 然而,实现这些算法需要很大的工作量,且很难重用其它算法的代码库来实现。 - -要促进 NAS 创新(例如,设计实现新的 NAS 模型,并列比较不同的 NAS 模型),易于使用且灵活的编程接口非常重要。 - -## 编程接口 - -在两种场景下需要用于设计和搜索模型的新的编程接口。 1) 在设计神经网络时,层、子模型或连接有多个可能,并且不确定哪一个或哪种组合表现最好。 如果有一种简单的方法来表达想要尝试的候选层、子模型,将会很有价值。 2) 研究自动化 NAS 时,需要统一的方式来表达神经网络架构的搜索空间, 并在不改变 Trial 代码的情况下来使用不同的搜索算法。 - -本文基于 [NNI Annotation](./AnnotationSpec.md) 实现了简单灵活的编程接口 。 通过以下示例来详细说明。 - -### 示例:为层选择运算符 - -在设计此模型时,第四层的运算符有多个可能的选择,会让模型有更好的表现。 如图所示,在模型代码中可以对第四层使用 Annotation。 此 Annotation 中,共有五个字段: - -![](../img/example_layerchoice.png) - -* **layer_choice**:它是函数调用的 list,每个函数都要在代码或导入的库中实现。 函数的输入参数格式为:`def XXX (input, arg2, arg3, ...)`,其中输入是包含了两个元素的 list。 其中一个是 `fixed_inputs` 的 list,另一个是 `optional_inputs` 中选择输入的 list。 `conv` 和 `pool` 是函数示例。 对于 list 中的函数调用,无需写出第一个参数(即 input)。 注意,只会从这些函数调用中选择一个来执行。 -* **fixed_inputs** :它是变量的 list,可以是前一层输出的张量。 也可以是此层之前的另一个 `nni.mutable_layer` 的 `layer_output`,或此层之前的其它 Python 变量。 list 中的所有变量将被输入 `layer_choice` 中选择的函数(作为输入 list 的第一个元素)。 -* **optional_inputs** :它是变量的 list,可以是前一层的输出张量。 也可以是此层之前的另一个 `nni.mutable_layer` 的 `layer_output`,或此层之前的其它 Python 变量。 只有 `optional_input_size` 变量被输入 `layer_choice` 到所选的函数 (作为输入 list 的第二个元素)。 -* **optional_input_size** :它表示从 `input_candidates` 中选择多少个输入。 它可以是一个数字,也可以是一个范围。 范围 [1, 3] 表示选择 1、2 或 3 个输入。 -* **layer_output** :表示输出的名称。本例中,表示 `layer_choice` 选择的函数的返回值。 这是一个变量名,可以在随后的 Python 代码或 `nni.mutable_layer` 中使用。 - -此示例有两种写 Annotation 的方法。 对于上面的示例,输入函数的形式是 `[[], [out3]]` 。 对于下面的示例,输入的形式是 `[[out3], []]`。 - -**调试**:`nnictl trial codegen` 命令可帮助调试 NAS 编程接口。 如果 Experiment `YYY` 中的 Trial 的 `XXX` 出错了,可以运行 `nnictl trial codegen YYY --trial_id XXX` 在当前目录下生成这个 Trial 的可执行代码。 通过运行此代码,可以不需要 NNI 就能调试 Trial 失败的原因。 此命令会编译 Trial 代码,并用实际选择的层次和输入来替换 NNI 的 NAS 代码。 - -### 示例:为层选择输入的连接 - -设计层的连接对于制作高性能模型至关重要。 通过此接口,可选择一个层可以采用哪些连接来作为输入。 可以从一组连接中选择几个。 下面的示例从三个候选输入中为 `concat` 这个函数选择两个输入 。 `concat` 还会使用 `fixed_inputs` 获取其上一层的输出 。 - -![](../img/example_connectchoice.png) - -### 示例:同时选择运算符和连接 - -此示例从三个运算符中选择一个,并为其选择两个连接作为输入。 由于输入会有多个变量,,在函数的开头需要调用 `concat` 。 - -![](../img/example_combined.png) - -### 示例:[ENAS](https://arxiv.org/abs/1802.03268) 宏搜索空间 - -为了证明编程接口带来的便利,使用该接口来实现 “ENAS + 宏搜索空间” 的 Trial 代码。 左图是 ENAS 论文中的宏搜索空间。 - -![](../img/example_enas.png) - -## 统一的 NAS 搜索空间说明 - -通过上面的 Annotation 更新 Trial 代码后,即在代码中隐式指定了神经网络架构的搜索空间。 基于该代码,NNI 将自动生成一个搜索空间文件,可作为调优算法的输入。 搜索空间文件遵循以下 JSON 格式。 - -```json -{ - "mutable_1": { - "layer_1": { - "layer_choice": ["conv(ch=128)", "pool", "identity"], - "optional_inputs": ["out1", "out2", "out3"], - "optional_input_size": 2 - }, - "layer_2": { - ... - } - } -} -``` - -相应生成的神经网络结构(由调优算法生成)如下: - -```json -{ - "mutable_1": { - "layer_1": { - "chosen_layer": "pool", - "chosen_inputs": ["out1", "out3"] - }, - "layer_2": { - ... - } - } -} -``` - -通过对搜索空间格式和体系结构选择 (choice) 表达式的说明,可以自由地在 NNI 上实现神经体系结构搜索的各种或通用的调优算法。 接下来的工作会提供一个通用的 NAS 算法。 - -============================================================= - -## 神经网络结构搜索在 NNI 上的应用 - -### Experiment 执行的基本流程 - -NNI 的 Annotation 编译器会将 Trial 代码转换为可以接收架构选择并构建相应模型(如图)的代码。 NAS 的搜索空间可以看作是一个完整的图(在这里,完整的图意味着允许所有提供的操作符和连接来构建图),调优算法所选择的是其子图。 默认情况下,编译时 Trial 代码仅构建并执行子图。 - -![](../img/nas_on_nni.png) - -上图显示了 Trial 代码如何在 NNI 上运行。 `nnictl` 处理 Trial 代码,并生成搜索空间文件和编译后的 Trial 代码。 前者会输入 Tuner,后者会在 Trial 代码运行时使用。 - -[使用 NAS 的简单示例](https://github.com/microsoft/nni/tree/v0.8/examples/trials/mnist-nas)。 - -### [**待实现**] 权重共享 - -在所选择的架构(即 Trial)之间共享权重可以加速模型搜索。 例如,适当地继承已完成 Trial 的权重可加速新 Trial 的收敛。 One-shot NAS(例如,ENAS,Darts)更为激进,不同架构(即子图)的训练会在完整图中共享相同的权重。 - -![](../img/nas_weight_share.png) - -权重分配(转移)在加速 NAS 中有关键作用,而找到有效的权重共享方式仍是热门的研究课题。 NNI 提供了一个键值存储,用于存储和加载权重。 Tuner 和 Trial 使用 KV 客户端库来访问存储。 - -NNI 上的权重共享示例。 - -### [**待实现**] 支持 One-Shot NAS - -One-Shot NAS 是流行的,能在有限的时间和资源预算内找到较好的神经网络结构的方法。 本质上,它会基于搜索空间来构建完整的图,并使用梯度下降最终找到最佳子图。 它有不同的训练方法,如:[training subgraphs (per mini-batch)](https://arxiv.org/abs/1802.03268) ,[training full graph through dropout](http://proceedings.mlr.press/v80/bender18a/bender18a.pdf),以及 [training with architecture weights (regularization)](https://arxiv.org/abs/1806.09055) 。 这里会关注第一种方法,即训练子图(ENAS)。 - -使用相同 Annotation Trial 代码,可选择 One-Shot NAS 作为执行模式。 具体来说,编译后的 Trial 代码会构建完整的图形(而不是上面演示的子图),会接收所选择的架构,并在完整的图形上对此体系结构进行小型的批处理训练,然后再请求另一个架构。 它通过 [NNI 多阶段 Experiment](./multiPhase.md) 来支持。 因为子图训练非常快,而每次启动子图训练时都会产生开销,所以采用此方法。 - -![](../img/one-shot_training.png) - -One-Shot NAS 的设计如上图所示。 One-Shot NAS 通常只有一个带有完整图的 Trial 任务。 NNI 支持运行多个此类 Trial 任务,每个任务都独立运行。 由于 One-Shot NAS 不够稳定,运行多个实例有助于找到更好的模型。 此外,Trial 任务之间也能在运行时同步权重(即,只有一份权重数据,如异步的参数 — 服务器模式)。 这样有可能加速收敛。 - -One-Shot NAS 示例。 - -## [**待实现**] NAS 的一般调优算法。 - -与超参数调优一样,NAS 也需要相对通用的算法。 通用编程接口使其更容易。 贡献者为 NAS 提供了基于 RL 的调参算法。 期待社区努力设计和实施更好的 NAS 调优算法。 - -NAS 的一般调优算法。 - -## [**待实现**] 导出最佳神经网络架构和代码 - -Experiment 完成后,可通过 `nnictl experiment export --code` 来导出用最好的神经网络结构和 Trial 代码。 - -## 结论和未来的工作 - -如本文所示,不同的 NAS 算法和执行模式,可通过相同的编程接口来支持。 - -在这一领域有许多系统和机器学习方向的有趣的研究主题。 \ No newline at end of file diff --git a/docs/zh_CN/HyperoptTuner.md b/docs/zh_CN/HyperoptTuner.md deleted file mode 100644 index 8eec53e3b7..0000000000 --- a/docs/zh_CN/HyperoptTuner.md +++ /dev/null @@ -1,13 +0,0 @@ -# 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 diff --git a/docs/zh_CN/Overview.md b/docs/zh_CN/Overview.md index cad8b33676..c37b16f53c 100644 --- a/docs/zh_CN/Overview.md +++ b/docs/zh_CN/Overview.md @@ -10,7 +10,7 @@ NNI (Neural Network Intelligence) 是一个工具包,可有效的帮助用户 下图显示了 NNI 的体系结构。

    -drawing +绘图

    ## 主要概念 @@ -31,29 +31,29 @@ NNI (Neural Network Intelligence) 是一个工具包,可有效的帮助用户 Experiment 的运行过程为:Tuner 接收搜索空间并生成配置。 这些配置将被提交到训练平台,如本机,远程服务器组或训练集群。 执行的性能结果会被返回给 Tuner。 然后,再生成并提交新的配置。 -每次 Experiment 执行时,用户只需要定义搜索空间,改动几行代码,就能利用 NNI 内置的 Tuner/Assessor 和训练服务来搜索最好的超参组合以及神经网络结构。 基本上分为三步: +每次 Experiment 执行时,用户只需要定义搜索空间,改动几行代码,就能利用 NNI 内置的 Tuner/Assessor 和训练平台来搜索最好的超参组合以及神经网络结构。 基本上分为三步: -> 第一步:[定义搜索空间](SearchSpaceSpec.md) +> 第一步:[定义搜索空间](Tutorial/SearchSpaceSpec.md) > -> 第二步:[改动模型代码](Trials.md) +> 第二步:[改动模型代码](TrialExample/Trials.md) > -> 第三步:[定义 Experiment 配置](ExperimentConfig.md) +> 第三步:[>定义 Experiment 配置](Tutorial/ExperimentConfig.md)

    -drawing +绘图

    -更多 Experiment 运行的详情,参考[快速入门](QuickStart.md)。 +更多 Experiment 运行的详情,参考[快速入门](Tutorial/QuickStart.md)。 ## 了解更多信息 -* [开始使用](QuickStart.md) -* [如何为 NNI 调整代码?](Trials.md) -* [NNI 支持哪些 Tuner?](BuiltinTuner.md) -* [如何自定义 Tuner?](CustomizeTuner.md) -* [NNI 支持哪些 Assessor?](BuiltinAssessors.md) -* [如何自定义 Assessor?](CustomizeAssessor.md) -* [如何在本机上运行 Experiment?](LocalMode.md) -* [如何在多机上运行 Experiment?](RemoteMachineMode.md) -* [如何在 OpenPAI 上运行 Experiment?](PaiMode.md) -* [样例](MnistExamples.md) \ No newline at end of file +* [入门](Tutorial/QuickStart.md) +* [如何为 NNI 调整代码?](TrialExample/Trials.md) +* [NNI 支持哪些 Tuner?](Tuner/BuiltinTuner.md) +* [如何自定义 Tuner?](Tuner/CustomizeTuner.md) +* [NNI 支持哪些 Assessor?](Assessor/BuiltinAssessor.md) +* [如何自定义 Assessor?](Assessor/CustomizeAssessor.md) +* [如何在本机上运行 Experiment?](TrainingService/LocalMode.md) +* [如何在多机上运行 Experiment?](TrainingService/RemoteMachineMode.md) +* [如何在 OpenPAI 上运行 Experiment?](TrainingService/PaiMode.md) +* [示例](TrialExample/MnistExamples.md) \ No newline at end of file diff --git a/docs/zh_CN/Release.md b/docs/zh_CN/Release.md index a9f905e9af..99429e668e 100644 --- a/docs/zh_CN/Release.md +++ b/docs/zh_CN/Release.md @@ -1,5 +1,41 @@ # 更改日志 +## 发布 0.9 - 7/1/2019 + +### 主要功能 + +* 生成 NAS 编程接口 + * 为 NAS 接口添加 `enas-mode` 和 `oneshot-mode`:[PR #1201](https://github.com/microsoft/nni/pull/1201#issue-291094510) +* [有 Matern 核的高斯 Tuner](Tuner/GPTuner.md) + +* 支持多阶段 Experiment + + * 为多阶段 Experiment 增加新的训练平台:pai 模式从 v0.9 开始支持多阶段 Experiment。 + * 为以下内置 Tuner 增加多阶段的功能: + + + * TPE, Random Search, Anneal, Naïve Evolution, SMAC, Network Morphism, Metis Tuner。 + + 有关详细信息,参考[实现多阶段的 Tuner](AdvancedFeature/MultiPhase.md)。 + +* Web 界面 + + * 在 Web 界面中可比较 Trial。 有关详细信息,参考[查看 Trial 状态](Tutorial/WebUI.md) + * 允许用户调节 Web 界面的刷新间隔。 有关详细信息,参考[查看概要页面](Tutorial/WebUI.md) + * 更友好的显示中间结果。 有关详细信息,参考[查看 Trial 状态](Tutorial/WebUI.md) +* [命令行接口](Tutorial/Nnictl.md) + * `nnictl experiment delete`:删除一个或多个 Experiment,包括其日志,结果,环境信息核缓存。 用于删除无用的 Experiment 结果,或节省磁盘空间。 + * `nnictl platform clean`:用于清理目标平台的磁盘空间。 所提供的 YAML 文件包括了目标平台的信息,与 NNI 配置文件的格式相同。 + +### Bug 修复和其它更新 + +* 改进 Tuner 安装过程:增加 [sklearn](https://scikit-learn.org/stable/) 依赖。 +* (Bug 修复) 连接 OpenPAI 失败的 HTTP 代码 - [Issue #1076](https://github.com/microsoft/nni/issues/1076) +* (Bug 修复) 为 OpenPAI 平台验证文件名 - [Issue #1164](https://github.com/microsoft/nni/issues/1164) +* (Bug 修复) 更新 Metis Tunerz 中的 GMM +* (Bug 修复) Web 界面负数的刷新间隔时间 - [Issue #1182](https://github.com/microsoft/nni/issues/1182), [Issue #1185](https://github.com/microsoft/nni/issues/1185) +* (Bug 修复) 当只有一个超参时,Web 界面的超参无法正确显示 - [Issue #1192](https://github.com/microsoft/nni/issues/1192) + ## 发布 0.8 - 6/4/2019 ### 主要功能 @@ -12,7 +48,7 @@ * 在已经运行非 NNI 任务的 GPU 上也能运行 Trial * 支持 Kubeflow v1beta2 操作符 * 支持 Kubeflow TFJob/PyTorchJob v1beta2 -* [通过 NAS 编程接口](./GeneralNasInterfaces.md) +* [生成 NAS 编程接口](AdvancedFeature/GeneralNasInterfaces.md) * 实现了 NAS 的编程接口,可通过 NNI Annotation 很容易的表达神经网络架构搜索空间 * 提供新命令 `nnictl trial codegen` 来调试 NAS 代码生成部分 * 提供 NAS 编程接口教程,NAS 在 MNIST 上的示例,用于 NAS 的可定制的随机 Tuner @@ -31,22 +67,22 @@ * 修复表格的 Bug * 优化嵌套搜索空间 * 优化 'randint' 类型,并支持下限 -* [比较不同超参搜索调优算法](./CommunitySharings/HpoComparision.md) -* [NAS 算法的对比](./CommunitySharings/NasComparision.md) -* [Recommenders 上的实践](./CommunitySharings/NniPracticeSharing/RecommendersSvd.md) +* [比较不同超参搜索调优算法](CommunitySharings/HpoComparision.md) +* [NAS 算法的对比](CommunitySharings/NasComparision.md) +* [Recommenders 上的实践](CommunitySharings/RecommendersSvd.md) ## 发布 0.7 - 4/29/2018 ### 主要功能 -* [支持在 Windows 上使用 NNI](./WindowsLocalMode.md) +* [支持在 Windows 上使用 NNI](Tutorial/NniOnWindows.md) * NNI 可在 Windows 上使用本机模式 -* [支持新的 Advisor: BOHB](./BohbAdvisor.md) +* [支持新的 Advisor: BOHB](Tuner/BohbAdvisor.md) * 支持新的 BOHB Advisor,这是一个健壮而有效的超参调优算法,囊括了贝叶斯优化和 Hyperband 的优点 -* [支持通过 nnictl 来导入导出 Experiment 数据](./Nnictl.md#experiment) +* [支持通过 nnictl 来导入导出 Experiment 数据](Tutorial/Nnictl.md#experiment) * 在 Experiment 执行完后,可生成分析结果报告 * 支持将先前的调优数据导入到 Tuner 和 Advisor 中 -* [可为 NNI Trial 任务指定 GPU](./ExperimentConfig.md#localConfig) +* [可为 NNI Trial 任务指定 GPU](Tutorial/ExperimentConfig.md#localConfig) * 通过 gpuIndices 配置来为 Trial 任务指定GPU。如果 Experiment 配置文件中有 gpuIndices,则只有指定的 GPU 会被用于 NNI 的 Trial 任务。 * 改进 Web 界面 * 在 Web 界面上使用十进制格式的指标 @@ -66,18 +102,18 @@ ### 主要功能 -* [版本检查](https://github.com/Microsoft/nni/blob/master/docs/zh_CN/PaiMode.md#version-check) +* [版本检查](TrainingService/PaiMode.md) * 检查 nniManager 和 trialKeeper 的版本是否一致 -* [提前终止的任务也可返回最终指标](https://github.com/Microsoft/nni/issues/776) - * 如果 includeIntermediateResults 为 true,最后一个 Assessor 的中间结果会被发送给 Tuner 作为最终结果。 includeIntermediateResults 的默认值为 false。 -* [分离 Tuner/Assessor](https://github.com/Microsoft/nni/issues/841) +* [提前终止的任务也可返回最终指标](https://github.com/microsoft/nni/issues/776) + * 如果 includeIntermediateResults 为 true,最后一个 Assessor 的中间结果会被发送给 Tuner 作为最终结果。 includeIntermediateResults 的默认值为 false。 +* [分离 Tuner/Assessor](https://github.com/microsoft/nni/issues/841) * 增加两个管道来分离 Tuner 和 Assessor 的消息 * 使日志集合功能可配置 * 为所有 Trial 增加中间结果的视图 ### Bug 修复 -* [为 OpenPAI 增加 shmMB 配置](https://github.com/Microsoft/nni/issues/842) +* [为 OpenPAI 增加 shmMB 配置](https://github.com/microsoft/nni/issues/842) * 修复在指标为 dict 时,无法显示任何结果的 Bug。 * 修复 hyperband 中浮点类型的计算问题 * 修复 SMAC Tuner 中搜索空间转换的错误 @@ -93,15 +129,15 @@ ### 文档 * 发布中文文档网站:https://nni.readthedocs.io/zh/latest/ -* 调试和维护:https://nni.readthedocs.io/en/latest/HowToDebug.html -* Tuner、Assessor 参考:https://nni.readthedocs.io/en/latest/sdk_reference.html#tuner +* 调试和维护:https://nni.readthedocs.io/zh/latest/Tutorial/HowToDebug.html +* Tuner、Assessor 参考:https://nni.readthedocs.io/zh/latest/sdk_reference.html#tuner ### Bug 修复和其它更新 * 修复了在某些极端条件下,不能正确存储任务的取消状态。 * 修复在使用 SMAC Tuner 时,解析搜索空间的错误。 * 修复 CIFAR-10 样例中的 broken pipe 问题。 -* 为本地训练服务和 NNI 管理器添加单元测试。 +* 为本地训练和 NNI 管理器添加单元测试。 * 为远程服务器、OpenPAI 和 Kubeflow 训练平台在 Azure 中增加集成测试。 * 在 OpenPAI 客户端中支持 Pylon 路径。 @@ -109,8 +145,8 @@ ### 改进 -* [日志目录](https://github.com/Microsoft/nni/blob/v0.5.1/docs/zh_CN/ExperimentConfig.md)可配置。 -* 支持[不同级别的日志](https://github.com/Microsoft/nni/blob/v0.5.1/docs/zh_CN/ExperimentConfig.md),使其更易于调试。 +* 可配置[日志目录](https://github.com/microsoft/nni/blob/v0.5.1/docs/ExperimentConfig_zh_CN.md)。 +* 支持[不同级别的日志](https://github.com/microsoft/nni/blob/v0.5.1/docs/ExperimentConfig_zh_CN.md),使其更易于调试。 ### 文档 @@ -128,14 +164,14 @@ #### 支持新的 Tuner 和 Assessor -* 支持新的 [Metis Tuner](MetisTuner.md)。 **在线**超参调优的场景下,Metis 算法已经被证明非常有效。 +* 支持新的 [Metis Tuner](Tuner/MetisTuner.md)。 **在线**超参调优的场景下,Metis 算法已经被证明非常有效。 * 支持 [ENAS customized tuner](https://github.com/countif/enas_nni)。由 GitHub 社区用户所贡献。它是神经网络的搜索算法,能够通过强化学习来学习神经网络架构,比 NAS 的性能更好。 -* 支持 [Curve fitting (曲线拟合)Assessor](CurvefittingAssessor.md),通过曲线拟合的策略来实现提前终止 Trial。 -* 进一步支持 [Weight Sharing(权重共享)](./AdvancedNas.md):为 NAS Tuner 通过 NFS 来提供权重共享。 +* 支持 [Curve fitting (曲线拟合)Assessor](Assessor/CurvefittingAssessor.md),通过曲线拟合的策略来实现提前终止 Trial。 +* 进一步支持 [Weight Sharing(权重共享)](AdvancedFeature/AdvancedNas.md):为 NAS Tuner 通过 NFS 来提供权重共享。 #### 改进训练平台 -* [FrameworkController 训练平台](./FrameworkControllerMode.md): 支持使用在 Kubernetes 上使用 FrameworkController。 +* [FrameworkController 训练平台](TrainingService/FrameworkControllerMode.md):支持使用在 Kubernetes 上使用 FrameworkController 运行。 * FrameworkController 是 Kubernetes 上非常通用的控制器(Controller),能用来运行基于各种机器学习框架的分布式作业,如 TensorFlow,Pytorch, MXNet 等。 * NNI 为作业定义了统一而简单的规范。 * 如何使用 FrameworkController 的 MNIST 样例。 @@ -153,11 +189,11 @@ #### 支持新的 Tuner -* 支持新的 [network morphism](NetworkmorphismTuner.md) Tuner。 +* 支持新的 [network morphism](Tuner/NetworkmorphismTuner.md) Tuner。 #### 改进训练平台 -* 将[Kubeflow 训练平台](KubeflowMode.md)的依赖从 kubectl CLI 迁移到 [Kubernetes API](https://kubernetes.io/docs/concepts/overview/kubernetes-api/) 客户端。 +* 将 [Kubeflow 训练平台](TrainingService/KubeflowMode.md)的依赖从 kubectl CLI 迁移到 [Kubernetes API](https://kubernetes.io/docs/concepts/overview/kubernetes-api/) 客户端。 * Kubeflow 训练平台支持 [Pytorch-operator](https://github.com/kubeflow/pytorch-operator)。 * 改进将本地代码文件上传到 OpenPAI HDFS 的性能。 * 修复 OpenPAI 在 WEB 界面的 Bug:当 OpenPAI 认证过期后,Web 界面无法更新 Trial 作业的状态。 @@ -177,18 +213,18 @@ ### 新示例 -* [FashionMnist](https://github.com/Microsoft/nni/tree/master/examples/trials/network_morphism),使用 network morphism Tuner -* 使用 PyTorch 的[分布式 MNIST 样例](https://github.com/Microsoft/nni/tree/master/examples/trials/mnist-distributed-pytorch) +* [FashionMnist](https://github.com/microsoft/nni/tree/master/examples/trials/network_morphism),使用 network morphism Tuner +* 使用 PyTorch 的[分布式 MNIST 样例](https://github.com/microsoft/nni/tree/master/examples/trials/mnist-distributed-pytorch) ## 发布 0.4 - 12/6/2018 ### 主要功能 -* [Kubeflow 训练服务](./KubeflowMode.md) +* [Kubeflow 训练平台](TrainingService/KubeflowMode.md) * 支持 tf-operator - * 使用 Kubeflow 的[分布式 Trial 样例](https://github.com/Microsoft/nni/tree/master/examples/trials/mnist-distributed/dist_mnist.py) -* [网格搜索 Tuner](GridsearchTuner.md) -* [Hyperband Tuner](HyperbandAdvisor.md) + * 使用 Kubeflow 的[分布式 Trial 样例](https://github.com/microsoft/nni/tree/master/examples/trials/mnist-distributed/dist_mnist.py) +* [遍历搜索 Tuner](Tuner/GridsearchTuner.md) +* [Hyperband Tuner](Tuner/HyperbandAdvisor.md) * 支持在 MAC 上运行 NNI Experiment * Web 界面 * 支持 hyperband Tuner @@ -204,7 +240,7 @@ * 异步调度 * 更新 Docker 文件,增加 pytorch 库 * 重构 'nnictl stop' 过程,发送 SIGTERM 给 NNI 管理器进程,而不是调用停止 Restful API. -* 修复 OpenPAI 训练服务的 Bug +* 修复 OpenPAI 训练平台的 Bug * 在 NNI 管理器中为 OpenPAI 集群配置文件支持 IP 配置(nniManagerIp),来修复用户计算机没有 eth0 设备的问题。 * codeDir 中的文件数量上限改为1000,避免用户无意中填写了 root 目录。 * 移除 OpenPAI 作业的 stdout 日志中无用的 ‘metrics is empty’。 在新指标被记录时,仅输出有用的消息,来减少用户检查 OpenPAI Trial 输出时的困惑。 @@ -215,29 +251,29 @@ ### NNICTL 的新功能和更新 * 支持同时运行多个 Experiment。 - - 在 v0.3 以前,NNI 仅支持一次运行一个 Experiment。 此版本开始,用户可以同时运行多个 Experiment。 每个 Experiment 都需要一个唯一的端口,第一个 Experiment 会像以前版本一样使用默认端口。 需要为其它 Experiment 指定唯一端口: - - ```bash - nnictl create --port 8081 --config - ``` + + 在 v0.3 以前,NNI 仅支持一次运行一个 Experiment。 此版本开始,用户可以同时运行多个 Experiment。 每个 Experiment 都需要一个唯一的端口,第一个 Experiment 会像以前版本一样使用默认端口。 需要为其它 Experiment 指定唯一端口: + + ```bash + nnictl create --port 8081 --config + ``` -* 支持更新最大 Trial 的数量。 使用 `nnictl update --help` 了解详情。 或参考 [NNICTL](Nnictl.md) 查看完整帮助。 +* 支持更新最大 Trial 的数量。 使用 `nnictl update --help` 了解详情。 或参考 [NNICTL](Tutorial/Nnictl.md) 查看完整帮助。 ### API 的新功能和更新 * 不兼容的改动:nn.get_parameters() 改为 nni.get_next_parameter。 所有以前版本的样例将无法在 v0.3 上运行,需要重新克隆 NNI 代码库获取新样例。 如果在自己的代码中使用了 NNI,也需要相应的更新。 * 新 API **nni.get_sequence_id()**。 每个 Trial 任务都会被分配一个唯一的序列数字,可通过 nni.get_sequence_id() API 来获取。 - - ```bash - git clone -b v0.3 https://github.com/Microsoft/nni.git - ``` + + ```bash + git clone -b v0.3 https://github.com/microsoft/nni.git + ``` * **nni.report_final_result(result)** API 对结果参数支持更多的数据类型。 - - 可用类型: - + + 可用类型: + * int * float * 包含有 'default' 键值的 dict,'default' 的值必须为 int 或 float。 dict 可以包含任何其它键值对。 @@ -249,39 +285,34 @@ ### 新示例 * 公开的 NNI Docker 映像: - - ```bash - docker pull msranni/nni:latest - ``` + + ```bash + docker pull msranni/nni:latest + ``` -* 新的 Trial 样例: [NNI Sklearn 样例](https://github.com/Microsoft/nni/tree/master/examples/trials/sklearn) +* 新的 Trial 样例:[NNI Sklearn 样例](https://github.com/microsoft/nni/tree/master/examples/trials/sklearn) -* 新的竞赛样例:[Kaggle Competition TGS Salt](https://github.com/Microsoft/nni/tree/master/examples/trials/kaggle-tgs-salt) +* 新的竞赛样例:[Kaggle Competition TGS Salt](https://github.com/microsoft/nni/tree/master/examples/trials/kaggle-tgs-salt) ### 其它 -* 界面重构,参考[网页文档](WebUI.md),了解如何使用新界面。 +* 界面重构,参考[网页文档](Tutorial/WebUI.md),了解如何使用新界面。 * 持续集成:NNI 已切换到 Azure pipelines。 -* [0.3.0 的已知问题](https://github.com/Microsoft/nni/labels/nni030knownissues)。 ## 发布 0.2.0 - 9/29/2018 ### 主要功能 -* 支持 [OpenPAI](https://github.com/Microsoft/pai) (又称 pai) 训练服务 (参考[这里](./PaiMode.md)来了解如何在 OpenPAI 下提交 NNI 任务) - * 支持 pai 模式的训练服务。 NNI Trial 可发送至 OpenPAI 集群上运行 +* 支持 [OpenPAI](https://github.com/microsoft/pai) (又称 pai) 训练平台 (参考[这里](TrainingService/PaiMode.md)来了解如何在 OpenPAI 下提交 NNI 任务) + * 支持 pai 模式的训练平台。 NNI Trial 可发送至 OpenPAI 集群上运行 * NNI Trial 输出 (包括日志和模型文件) 会被复制到 OpenPAI 的 HDFS 中。 -* 支持 [SMAC](https://www.cs.ubc.ca/~hutter/papers/10-TR-SMAC.pdf) Tuner (参考[这里](SmacTuner.md),了解如何使用 SMAC Tuner) +* 支持 [SMAC](https://www.cs.ubc.ca/~hutter/papers/10-TR-SMAC.pdf) Tuner (参考[这里](Tuner/SmacTuner.md),了解如何使用 SMAC Tuner) * [SMAC](https://www.cs.ubc.ca/~hutter/papers/10-TR-SMAC.pdf) 基于 Sequential Model-Based Optimization (SMBO). 它会利用使用过的结果好的模型(高斯随机过程模型),并将随机森林引入到 SMBO 中,来处理分类参数。 NNI 的 SMAC 通过包装 [SMAC3](https://github.com/automl/SMAC3) 来支持。 * 支持将 NNI 安装在 [conda](https://conda.io/docs/index.html) 和 Python 虚拟环境中。 * 其它 * 更新 ga squad 样例与相关文档 * 用户体验改善及 Bug 修复 -### 已知问题 - -[0.2.0 的已知问题](https://github.com/Microsoft/nni/labels/nni020knownissues)。 - ## 发布 0.1.0 - 9/10/2018 (首个版本) 首次发布 Neural Network Intelligence (NNI)。 @@ -302,8 +333,4 @@ * 持续集成 * 使用 Ubuntu 的 [travis-ci](https://github.com/travis-ci) 来支持持续集成 * 其它 - * 支持简单的 GPU 任务调度 - -### 已知问题 - -[0.1.0 的已知问题](https://github.com/Microsoft/nni/labels/nni010knownissues)。 \ No newline at end of file + * 支持简单的 GPU 任务调度 \ No newline at end of file diff --git a/docs/zh_CN/FrameworkControllerMode.md b/docs/zh_CN/TrainingService/FrameworkControllerMode.md similarity index 94% rename from docs/zh_CN/FrameworkControllerMode.md rename to docs/zh_CN/TrainingService/FrameworkControllerMode.md index 3a8278a7bd..6f6d6cc417 100644 --- a/docs/zh_CN/FrameworkControllerMode.md +++ b/docs/zh_CN/TrainingService/FrameworkControllerMode.md @@ -1,6 +1,6 @@ # 在 FrameworkController 上运行 Experiment -=== NNI 支持使用 [FrameworkController](https://github.com/Microsoft/frameworkcontroller),来运行 Experiment,称之为 frameworkcontroller 模式。 FrameworkController 构建于 Kubernetes 上,用于编排各种应用。这样,可以不用为某个深度学习框架安装 Kubeflow 的 tf-operator 的 pytorch-operator 等。 而直接用 FrameworkController 作为 NNI Experiment 的训练服务。 +=== NNI 支持使用 [FrameworkController](https://github.com/Microsoft/frameworkcontroller),来运行 Experiment,称之为 frameworkcontroller 模式。 FrameworkController 构建于 Kubernetes 上,用于编排各种应用。这样,可以不用为某个深度学习框架安装 Kubeflow 的 tf-operator 或 pytorch-operator 等。 而直接用 FrameworkController 作为 NNI Experiment 的训练平台。 ## 私有部署的 Kubernetes 的准备工作 @@ -15,7 +15,7 @@ ``` -6. 参考[指南](QuickStart.md)安装 **NNI**。 +6. 参考[指南](../Tutorial/QuickStart.md)安装 **NNI**。 ## Azure 部署的 Kubernetes 的准备工作 @@ -30,7 +30,7 @@ ## 设计 -参考[Kubeflow 训练服务](./KubeflowMode.md),FrameworkController 服务管道非常类似。 +参考[Kubeflow 训练平台](KubeflowMode.md)的设计,FrameworkController 训练平台与其类似。 ## 样例 @@ -109,7 +109,7 @@ frameworkcontroller 模式中的 Trial 配置使用以下主键: ## 如何运行示例 -准备好配置文件后,通过运行 nnictl 来启动 Experiment。 在 FrameworkController 上开始 Experiment 的方法与 Kubeflow 类似,可参考[指南](./KubeflowMode.md)了解更多信息。 +准备好配置文件后,通过运行 nnictl 来启动 Experiment。 在 FrameworkController 上开始 Experiment 的方法与 Kubeflow 类似,可参考[指南](KubeflowMode.md)了解更多信息。 ## 版本校验 diff --git a/docs/zh_CN/HowToImplementTrainingService.md b/docs/zh_CN/TrainingService/HowToImplementTrainingService.md similarity index 94% rename from docs/zh_CN/HowToImplementTrainingService.md rename to docs/zh_CN/TrainingService/HowToImplementTrainingService.md index 2fe63355aa..eaf2824a18 100644 --- a/docs/zh_CN/HowToImplementTrainingService.md +++ b/docs/zh_CN/TrainingService/HowToImplementTrainingService.md @@ -6,9 +6,9 @@ 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 支持[本机](LocalMode.md),[远程平台](RemoteMachineMode.md),[OpenPAI 平台](PaiMode.md),[Kubeflow 平台](KubeflowMode.md) 以及 [FrameworkController 平台](FrameworkControllerMode.md)。 本文中,会介绍 TrainingService 的简要设计。 如果要添加新的 TrainingService,只需要继承 TrainingServcie 类并实现相应的方法,不需要理解NNIManager、Dispatcher 等其它模块的细节。 @@ -160,12 +160,12 @@ NNI 提供了 TrialKeeper 工具,用来帮助维护 Trial 任务。 可以在 TrialKeeper 的架构如下: -![](../img/trialkeeper.jpg) +![](../../img/trialkeeper.jpg) 当用户需要在远程云平台上运行作业,要把作业启动的命令行传入 TrailKeeper 中,并在远程云平台上启动 TrailKeeper 进程。 注意,TrialKeeper 在远程平台中使用 RESTful 服务来和 TrainingService 进行通信,用户需要在本地机器启动一个 RESTful 服务来接受 TrialKeeper 的请求。 关于 RESTful 服务的源代码可以在 `nni/src/nni_manager/training_service/common/clusterJobRestServer.ts` 文件夹中找到. ## 参考 -有关调试的进一步信息,可参考[这里](HowToDebug.md)。 +有关调试的进一步信息,可参考[这里](../Tutorial/HowToDebug.md)。 -如何参与贡献的指南,请参考[这里](Contributing.md)。 \ No newline at end of file +如何参与贡献的指南,请参考[这里](../Tutorial/Contributing.md)。 \ No newline at end of file diff --git a/docs/zh_CN/KubeflowMode.md b/docs/zh_CN/TrainingService/KubeflowMode.md similarity index 94% rename from docs/zh_CN/KubeflowMode.md rename to docs/zh_CN/TrainingService/KubeflowMode.md index 0eee21db24..6e2f58f07e 100644 --- a/docs/zh_CN/KubeflowMode.md +++ b/docs/zh_CN/TrainingService/KubeflowMode.md @@ -13,7 +13,7 @@ NNI 支持在 [Kubeflow](https://github.com/kubeflow/kubeflow)上运行,称为 5. 准备 **NFS 服务器** 并导出通用的装载 (mount),推荐将 NFS 服务器路径映射到 `root_squash 选项`,否则可能会在 NNI 复制文件到 NFS 时出现权限问题。 参考[页面](https://linux.die.net/man/5/exports),来了解关于 root_squash 选项,或 **Azure File Storage**。 6. 在安装 NNI 并运行 nnictl 的计算机上安装 **NFS 客户端**。 运行此命令安装 NFSv4 客户端: ```apt-get install nfs-common``` -7. 参考[指南](QuickStart.md)安装 **NNI**。 +7. 参考[指南](../Tutorial/QuickStart.md)安装 **NNI**。 ## Azure 部署的 Kubernetes 的准备工作 @@ -25,9 +25,9 @@ NNI 支持在 [Kubeflow](https://github.com/kubeflow/kubeflow)上运行,称为 ## 设计 -![](../img/kubeflow_training_design.png) Kubeflow 训练服务会实例化一个 Kubernetes 客户端来与 Kubernetes 集群的 API 服务器交互。 +![](../../img/kubeflow_training_design.png) Kubeflow 训练平台会实例化一个 Kubernetes 客户端来与 Kubernetes 集群的 API 服务器交互。 -对于每个 Trial,会上传本机 codeDir 路径(在 nni_config.yml 中配置)中的所有文件,包括 parameter.cfg 这样的生成的文件到存储卷中。 当前支持两种存储卷:[nfs](https://en.wikipedia.org/wiki/Network_File_System) 和 [Azure 文件存储](https://azure.microsoft.com/zh-cn/services/storage/files/),需要在 NNI 的 YAML 文件中进行配置。 当文件准备好后,Kubeflow 训练服务会调用 Kubernetes 的 API 来创建 Kubeflow 作业 ([tf-operator](https://github.com/kubeflow/tf-operator) 作业或 [pytorch-operator](https://github.com/kubeflow/pytorch-operator) 作业) ,并将存储卷挂载到作业的 pod 中。 Kubeflow 作业的输出文件,例如 stdout, stderr, trial.log 以及模型文件,也会被复制回存储卷。 NNI 会在网页中显示每个 Trial 的存储卷的 URL,以便浏览日志和输出文件。 +对于每个 Trial,会上传本机 codeDir 路径(在 nni_config.yml 中配置)中的所有文件,包括 parameter.cfg 这样的生成的文件到存储卷中。 当前支持两种存储卷:[nfs](https://en.wikipedia.org/wiki/Network_File_System) 和 [Azure 文件存储](https://azure.microsoft.com/zh-cn/services/storage/files/),需要在 NNI 的 YAML 文件中进行配置。 当文件准备好后,Kubeflow 训练平台会调用 Kubernetes 的 API 来创建 Kubeflow 作业 ([tf-operator](https://github.com/kubeflow/tf-operator) 作业或 [pytorch-operator](https://github.com/kubeflow/pytorch-operator) 作业) ,并将存储卷挂载到作业的 pod 中。 Kubeflow 作业的输出文件,例如 stdout, stderr, trial.log 以及模型文件,也会被复制回存储卷。 NNI 会在网页中显示每个 Trial 的存储卷的 URL,以便浏览日志和输出文件。 ## 支持的操作符(operator) @@ -192,6 +192,8 @@ Kubeflow 模式的配置有下列主键: * image * 必填。 在 kubeflow 模式中,Kubernetes 会安排 Trial 程序在 [Pod](https://kubernetes.io/docs/concepts/workloads/pods/pod/) 中执行。 此键用来指定 Trial 程序的 pod 使用的 Docker 映像。 * [Docker Hub](https://hub.docker.com/) 上有预制的 NNI Docker 映像 [msranni/nni](https://hub.docker.com/r/msranni/nni/)。 它包含了用来启动 NNI Experiment 所依赖的所有 Python 包,Node 模块和 JavaScript。 生成此 Docker 映像的文件在[这里](https://github.com/Microsoft/nni/tree/master/deployment/docker/Dockerfile)。 可以直接使用此映像,或参考它来生成自己的映像。 + * privateRegistryAuthPath + * 可选字段,指定 `config.json` 文件路径。此文件,包含了 Docker 注册的认证令牌,用来从私有 Docker 中拉取映像。 [参考文档](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/)。 * apiVersion * 必填。 Kubeflow 的 API 版本。 * ps (可选)。 此部分用于配置 TensorFlow 的 parameter 服务器角色。 diff --git a/docs/zh_CN/LocalMode.md b/docs/zh_CN/TrainingService/LocalMode.md similarity index 86% rename from docs/zh_CN/LocalMode.md rename to docs/zh_CN/TrainingService/LocalMode.md index 4da11aab9d..3156e3a45c 100644 --- a/docs/zh_CN/LocalMode.md +++ b/docs/zh_CN/TrainingService/LocalMode.md @@ -57,7 +57,7 @@ } -参考 [SearchSpaceSpec.md](./SearchSpaceSpec.md) 进一步了解搜索空间。 +参考 [SearchSpaceSpec.md](../Tutorial/SearchSpaceSpec.md) 进一步了解搜索空间。 > 第三步:定义 Experiment > @@ -85,9 +85,9 @@ python ~/nni/examples/trials/mnist-annotation/mnist.py -上面的命令会写在 YAML 文件中。 参考[这里](Trials.md)来写出自己的 Experiment 代码。 +上面的命令会写在 YAML 文件中。 参考[这里](../TrialExample/Trials.md)来写出自己的 Experiment 代码。 -**准备 Tuner**: NNI 支持多种流行的自动机器学习算法,包括:Random Search(随机搜索),Tree of Parzen Estimators (TPE),Evolution(进化算法)等等。 也可以实现自己的 Tuner(参考[这里](CustomizeTuner.md))。下面使用了 NNI 内置的 Tuner: +**准备 Tuner**: NNI 支持多种流行的自动机器学习算法,包括:Random Search(随机搜索),Tree of Parzen Estimators (TPE),Evolution(进化算法)等等。 也可以实现自己的 Tuner(参考[这里](../Tuner/CustomizeTuner.md))。下面使用了 NNI 内置的 Tuner: tuner: builtinTunerName: TPE @@ -95,7 +95,7 @@ optimize_mode: maximize -*builtinTunerName* 用来指定 NNI 中的 Tuner,*classArgs* 是传入到 Tuner的参数(内置 Tuner 在[这里](BuiltinTuner.md)),*optimization_mode* 表明需要最大化还是最小化 Trial 的结果。 +*builtinTunerName* 用来指定 NNI 中的 Tuner,*classArgs* 是传入到 Tuner的参数(内置 Tuner 在[这里](../Tuner/BuiltinTuner.md)),*optimization_mode* 表明需要最大化还是最小化 Trial 的结果。 **准备配置文件**:实现 Trial 的代码,并选择或实现自定义的 Tuner 后,就要准备 YAML 配置文件了。 NNI 为每个 Trial 样例都提供了演示的配置文件,用命令`cat ~/nni/examples/trials/mnist-annotation/config.yml` 来查看其内容。 大致内容如下: @@ -126,14 +126,14 @@ gpuNum: 0 -因为这个 Trial 代码使用了 NNI Annotation 的方法(参考[这里](AnnotationSpec.md) ),所以*useAnnotation* 为 true。 *command* 是运行 Trial 代码所需要的命令,*codeDir* 是 Trial 代码的相对位置。 命令会在此目录中执行。 同时,也需要提供每个 Trial 进程所需的 GPU 数量。 +因为这个 Trial 代码使用了 NNI Annotation 的方法(参考[这里](../Tutorial/AnnotationSpec.md) ),所以*useAnnotation* 为 true。 *command* 是运行 Trial 代码所需要的命令,*codeDir* 是 Trial 代码的相对位置。 命令会在此目录中执行。 同时,也需要提供每个 Trial 进程所需的 GPU 数量。 完成上述步骤后,可通过下列命令来启动 Experiment: nnictl create --config ~/nni/examples/trials/mnist-annotation/config.yml -参考[这里](Nnictl.md)来了解 *nnictl* 命令行工具的更多用法。 +参考[这里](../Tutorial/Nnictl.md)来了解 *nnictl* 命令行工具的更多用法。 ## 查看 Experiment 结果 diff --git a/docs/zh_CN/PaiMode.md b/docs/zh_CN/TrainingService/PaiMode.md similarity index 73% rename from docs/zh_CN/PaiMode.md rename to docs/zh_CN/TrainingService/PaiMode.md index ac375069d1..47d6b1531a 100644 --- a/docs/zh_CN/PaiMode.md +++ b/docs/zh_CN/TrainingService/PaiMode.md @@ -4,7 +4,7 @@ NNI 支持在 [OpenPAI](https://github.com/Microsoft/pai) (简称 pai)上运 ## 设置环境 -参考[指南](QuickStart.md)安装 NNI。 +参考[指南](../Tutorial/QuickStart.md)安装 NNI。 ## 运行 Experiment @@ -43,7 +43,7 @@ paiConfig: 注意:如果用 pai 模式运行,需要在 YAML 文件中设置 `trainingServicePlatform: pai`。 -与本机模式,以及[远程计算机模式](RemoteMachineMode.md)相比,pai 模式的 Trial 有额外的配置: +与[本机模式](LocalMode.md),以及[远程计算机模式](RemoteMachineMode.md)相比,pai 模式的 Trial 需要额外的配置: * cpuNum * 必填。 Trial 程序的 CPU 需求,必须为正数。 @@ -53,30 +53,34 @@ paiConfig: * 必填。 在 pai 模式中,Trial 程序由 OpenPAI 在 [Docker 容器](https://www.docker.com/)中安排运行。 此键用来指定 Trial 程序的容器使用的 Docker 映像。 * [Docker Hub](https://hub.docker.com/) 上有预制的 NNI Docker 映像 [nnimsra/nni](https://hub.docker.com/r/msranni/nni/)。 它包含了用来启动 NNI Experiment 所依赖的所有 Python 包,Node 模块和 JavaScript。 生成此 Docker 映像的文件在[这里](https://github.com/Microsoft/nni/tree/master/deployment/docker/Dockerfile)。 可以直接使用此映像,或参考它来生成自己的映像。 * virtualCluster - * 可选。 设置 OpenPAI 的 virtualCluster,即虚拟集群。 如果未设置此参数,将使用默认的虚拟集群。 + * 可选。 设置 OpenPAI 的 virtualCluster,即虚拟集群。 如果未设置此参数,将使用默认(default)虚拟集群。 * shmMB * 可选。 设置 OpenPAI 的 shmMB,即 Docker 中的共享内存。 +* authFile + * 可选,设置在使用 OpenPAI 时的私有 Docker 认证文件路径。[参考文档](https://github.com/microsoft/pai/blob/2ea69b45faa018662bc164ed7733f6fdbb4c42b3/docs/faq.md#q-how-to-use-private-docker-registry-job-image-when-submitting-an-openpai-job)。 完成并保存 NNI Experiment 配置文件后(例如可保存为:exp_pai.yml),运行以下命令: nnictl create --config exp_pai.yml -来在 pai 模式下启动 Experiment。 NNI 会为每个 Trial 创建 OpenPAI 作业,作业名称的格式为 `nni_exp_{experiment_id}_trial_{trial_id}`。 可以在 OpenPAI 集群的网站中看到 NNI 创建的作业,例如: ![](../img/nni_pai_joblist.jpg) +来在 pai 模式下启动 Experiment。 NNI 会为每个 Trial 创建 OpenPAI 作业,作业名称的格式为 `nni_exp_{experiment_id}_trial_{trial_id}`。 可以在 OpenPAI 集群的网站中看到 NNI 创建的作业,例如: ![](../../img/nni_pai_joblist.jpg) 注意:pai 模式下,NNIManager 会启动 RESTful 服务,监听端口为 NNI 网页服务器的端口加1。 例如,如果网页端口为`8080`,那么 RESTful 服务器会监听在 `8081`端口,来接收运行在 Kubernetes 中的 Trial 作业的指标。 因此,需要在防火墙中启用端口 `8081` 的 TCP 协议,以允许传入流量。 当一个 Trial 作业完成后,可以在 NNI 网页的概述页面(如:http://localhost:8080/oview)中查看 Trial 的信息。 -在 Trial 列表页面中展开 Trial 信息,点击如下的 logPath: ![](../img/nni_webui_joblist.jpg) +在 Trial 列表页面中展开 Trial 信息,点击如下的 logPath: ![](../../img/nni_webui_joblist.jpg) -接着将会打开 HDFS 的 WEB 界面,并浏览到 Trial 的输出文件: ![](../img/nni_trial_hdfs_output.jpg) +接着将会打开 HDFS 的 WEB 界面,并浏览到 Trial 的输出文件: ![](../../img/nni_trial_hdfs_output.jpg) 在输出目录中可以看到三个文件:stderr, stdout, 以及 trial.log -如果希望将 Trial 的模型数据等其它输出保存到HDFS中,可在 Trial 代码中使用 `NNI_OUTPUT_DIR` 来自己保存输出文件,NNI SDK会从 Trial 的容器中将 `NNI_OUTPUT_DIR` 中的文件复制到 HDFS 中。 +## 数据管理 -如果在使用 pai 模式时遇到任何问题,请到 [NNI Github](https://github.com/Microsoft/nni) 中创建问题。 +如果训练数据集不大,可放在 codeDir中,NNI会将其上传到 HDFS,或者构建 Docker 映像来包含数据。 如果数据集非常大,则不可放在 codeDir 中,可参考此[指南](https://github.com/microsoft/pai/blob/master/docs/user/storage.md)来将数据目录挂载到容器中。 + +如果要将 Trial 的其它输出保存到 HDFS 上,如模型文件等,需要在 Trial 代码中使用 `NNI_OUTPUT_DIR` 来保存输出文件。NNI 的 SDK 会将文件从 Trial 容器的 `NNI_OUTPUT_DIR` 复制到 HDFS 上,目标路径为:`hdfs://host:port/{username}/nni/{experiments}/{experimentId}/trials/{trialId}/nnioutput`。 ## 版本校验 @@ -86,4 +90,4 @@ paiConfig: 2. 从 NNIManager 0.6 开始,与 triakKeeper 的版本必须一致。 例如,如果 NNIManager 是 0.6 版,则 trialKeeper 也必须是 0.6 版。 3. 注意,只有版本的前两位数字才会被检查。例如,NNIManager 0.6.1 可以和 trialKeeper 的 0.6 或 0.6.2 一起使用,但不能与 trialKeeper 的 0.5.1 或 0.7 版本一起使用。 -如果 Experiment 无法运行,而且不能确认是否是因为版本不匹配造成的,可以在 Web 界面检查是否有相关的错误消息。 ![](../img/version_check.png) \ No newline at end of file +如果 Experiment 无法运行,而且不能确认是否是因为版本不匹配造成的,可以在 Web 界面检查是否有相关的错误消息。 ![](../../img/version_check.png) \ No newline at end of file diff --git a/docs/zh_CN/RemoteMachineMode.md b/docs/zh_CN/TrainingService/RemoteMachineMode.md similarity index 96% rename from docs/zh_CN/RemoteMachineMode.md rename to docs/zh_CN/TrainingService/RemoteMachineMode.md index dcd4f7de2e..e0eb71e832 100644 --- a/docs/zh_CN/RemoteMachineMode.md +++ b/docs/zh_CN/TrainingService/RemoteMachineMode.md @@ -12,7 +12,7 @@ NNI 支持通过 SSH 通道在多台计算机上运行 Experiment,称为 `remo ## 设置 NNI 环境 -按照[指南](QuickStart.md)在每台计算机上安装 NNI。 +按照[指南](../Tutorial/QuickStart.md)在每台计算机上安装 NNI。 ## 运行 Experiment diff --git a/docs/zh_CN/Cifar10Examples.md b/docs/zh_CN/TrialExample/Cifar10Examples.md similarity index 97% rename from docs/zh_CN/Cifar10Examples.md rename to docs/zh_CN/TrialExample/Cifar10Examples.md index f6349f6836..f4118f71a9 100644 --- a/docs/zh_CN/Cifar10Examples.md +++ b/docs/zh_CN/TrialExample/Cifar10Examples.md @@ -51,7 +51,7 @@ python3 -m pip install torchvision *实现代码:[main.py](https://github.com/Microsoft/nni/blob/master/examples/trials/cifar10_pytorch/main.py)* -还可直接修改现有的代码来支持 NNI,参考:[如何编写 Trial](Trials.md)。 +还可直接修改现有的代码来支持 Nni,参考:[如何实现 Trial](Trials.md)。 **配置** diff --git a/docs/zh_CN/GbdtExample.md b/docs/zh_CN/TrialExample/GbdtExample.md similarity index 98% rename from docs/zh_CN/GbdtExample.md rename to docs/zh_CN/TrialExample/GbdtExample.md index 035a8d7848..9ea0b80092 100644 --- a/docs/zh_CN/GbdtExample.md +++ b/docs/zh_CN/TrialExample/GbdtExample.md @@ -103,7 +103,7 @@ if __name__ == '__main__': } ``` -参考[这里](SearchSpaceSpec.md),了解更多变量类型。 +参考[这里](../Tutorial/SearchSpaceSpec.md),了解更多变量类型。 ### 3.3 在代码中使用 NNI SDK @@ -153,7 +153,7 @@ if __name__ == '__main__': run(lgb_train, lgb_eval, PARAMS, X_test, y_test) ``` -### 3.4 编写配置文件并运行 +### 3.4 实现配置文件并运行 在配置文件中,可以设置如下内容: diff --git a/docs/zh_CN/MnistExamples.md b/docs/zh_CN/TrialExample/MnistExamples.md similarity index 100% rename from docs/zh_CN/MnistExamples.md rename to docs/zh_CN/TrialExample/MnistExamples.md diff --git a/docs/zh_CN/SklearnExamples.md b/docs/zh_CN/TrialExample/SklearnExamples.md similarity index 97% rename from docs/zh_CN/SklearnExamples.md rename to docs/zh_CN/TrialExample/SklearnExamples.md index 73b102bc57..41244e5438 100644 --- a/docs/zh_CN/SklearnExamples.md +++ b/docs/zh_CN/TrialExample/SklearnExamples.md @@ -6,7 +6,7 @@ NNI 支持多种调优算法来为 scikit-learn 搜索最好的模型和超参 ## 1. 如何运行此样例 -安装 NNI 包,并使用命令行工具 `nnictl` 来启动 Experiment。 有关安装和环境准备的内容,参考[这里](QuickStart.md)。 +安装 NNI 包,并使用命令行工具 `nnictl` 来启动 Experiment。 有关安装和环境准备的内容,参考[这里](../Tutorial/QuickStart.md)。 安装完 NNI 后,进入相应的目录,输入下列命令即可启动 Experiment: @@ -82,7 +82,7 @@ nnictl create --config ./config.yml } ``` - 就可以使用这些变量来编写 scikit-learn 的代码。 + 就可以使用这些变量来实现 scikit-learn 的代码。 * **第三步** diff --git a/docs/zh_CN/SquadEvolutionExamples.md b/docs/zh_CN/TrialExample/SquadEvolutionExamples.md similarity index 99% rename from docs/zh_CN/SquadEvolutionExamples.md rename to docs/zh_CN/TrialExample/SquadEvolutionExamples.md index 85615ce69e..732b639605 100644 --- a/docs/zh_CN/SquadEvolutionExamples.md +++ b/docs/zh_CN/TrialExample/SquadEvolutionExamples.md @@ -14,7 +14,7 @@ 6. ADD-SKIP (在随机层之间一致). 7. REMOVE-SKIP (移除随机跳过). -![](../../examples/trials/ga_squad/ga_squad.png) +![](../../../examples/trials/ga_squad/ga_squad.png) ### 新版本 diff --git a/docs/zh_CN/Trials.md b/docs/zh_CN/TrialExample/Trials.md similarity index 90% rename from docs/zh_CN/Trials.md rename to docs/zh_CN/TrialExample/Trials.md index 720981c323..17285da413 100644 --- a/docs/zh_CN/Trials.md +++ b/docs/zh_CN/TrialExample/Trials.md @@ -21,7 +21,7 @@ } ``` -参考 [SearchSpaceSpec.md](./SearchSpaceSpec.md) 进一步了解搜索空间。 Tuner 会根据搜索空间来生成配置,即从每个超参的范围中选一个值。 +参考 [SearchSpaceSpec.md](../Tutorial/SearchSpaceSpec.md) 进一步了解搜索空间。 Tuner 会根据搜索空间来生成配置,即从每个超参的范围中选一个值。 ### 第二步:更新模型代码 @@ -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](BuiltinAssessors.md)。 通常,`指标`是损失值或精度。 +`指标`可以是任意的 Python 对象。 如果使用了 NNI 内置的 Tuner/Assessor,`指标`只可以是两种类型:1) 数值类型,如 float、int, 2) dict 对象,其中必须由键名为 `default`,值为数值的项目。 `指标`会发送给 [Assessor](../Assessor/BuiltinAssessor.md)。 通常,`指标`是损失值或精度。 * 返回配置的最终性能 @@ -53,7 +53,7 @@ nni.report_intermediate_result(metrics) nni.report_final_result(metrics) ``` -`指标`也可以是任意的 Python 对象。 如果使用了内置的 Tuner/Assessor,`指标`格式和 `report_intermediate_result` 中一样,这个数值表示模型的性能,如精度、损失值等。 `指标`会发送给 [Tuner](BuiltinTuner.md)。 +`指标`也可以是任意的 Python 对象。 如果使用了内置的 Tuner/Assessor,`指标`格式和 `report_intermediate_result` 中一样,这个数值表示模型的性能,如精度、损失值等。 `指标`会发送给 [Tuner](../Tuner/BuiltinTuner.md)。 ### 第三步:启用 NNI API @@ -64,9 +64,9 @@ useAnnotation: false searchSpacePath: /path/to/your/search_space.json ``` -参考 [这里](ExperimentConfig.md) 进一步了解如何配置实验。 +参考[这里](../Tutorial/ExperimentConfig.md)进一步了解如何配置 Experiment。 -* 参考[这里](https://nni.readthedocs.io/en/latest/sdk_reference.html),了解更多 NNI API (例如 `nni.get_sequence_id()`)。 +* 参考[这里](https://nni.readthedocs.io/zh/latest/sdk_reference.html),了解更多 NNI API (例如 `nni.get_sequence_id()`)。 @@ -123,7 +123,7 @@ with tf.Session() as sess: * `@nni.variable` 会对它的下面一行进行修改,左边被赋值变量必须在 `@nni.variable` 的 `name` 参数中指定。 * `@nni.report_intermediate_result`/`@nni.report_final_result` 会将数据发送给 Assessor、Tuner。 -Annotation 的语法和用法等,参考 [Annotation](AnnotationSpec.md)。 +Annotation 的语法和用法等,参考 [Annotation](../Tutorial/AnnotationSpec.md)。 ### 第二步:启用 Annotation @@ -158,7 +158,7 @@ echo $? `date +%s%3N` >/home/user_name/nni/experiments/$experiment_id$/trials/$t 当 Trial 运行在 OpenPAI 这样的远程服务器上时,`NNI_OUTPUT_DIR` 仅会指向 Trial 的输出目录,而 `run.sh` 不会在此目录中。 `trial.log` 文件会被复制回本机的 Trial 目录中。目录的默认位置在 `~/nni/experiments/$experiment_id$/trials/$trial_id$/` 。 -详细信息,可参考[调试指南](HowToDebug.md)。 +详细信息,可参考[调试指南](../Tutorial/HowToDebug.md)。 diff --git a/docs/zh_CN/BatchTuner.md b/docs/zh_CN/Tuner/BatchTuner.md similarity index 75% rename from docs/zh_CN/BatchTuner.md rename to docs/zh_CN/Tuner/BatchTuner.md index 89b361d08a..a7bc7a0fc0 100644 --- a/docs/zh_CN/BatchTuner.md +++ b/docs/zh_CN/Tuner/BatchTuner.md @@ -2,6 +2,6 @@ ## Batch Tuner(批处理 Tuner) -Batch Tuner 能让用户简单的提供几组配置(如,超参选项的组合)。 当所有配置都执行完后,Experiment 即结束。 Batch Tuner 的[搜索空间](SearchSpaceSpec.md)只支持 `choice`。 +Batch Tuner 能让用户简单的提供几组配置(如,超参选项的组合)。 当所有配置都执行完后,Experiment 即结束。 Batch Tuner 的[搜索空间](../Tutorial/SearchSpaceSpec.md)只支持 `choice`。 建议场景:如果 Experiment 配置已确定,可通过 choice 将它们罗列到搜索空间文件中运行即可。 \ No newline at end of file diff --git a/docs/zh_CN/BohbAdvisor.md b/docs/zh_CN/Tuner/BohbAdvisor.md similarity index 98% rename from docs/zh_CN/BohbAdvisor.md rename to docs/zh_CN/Tuner/BohbAdvisor.md index b31ab874ac..46cc69750b 100644 --- a/docs/zh_CN/BohbAdvisor.md +++ b/docs/zh_CN/Tuner/BohbAdvisor.md @@ -12,7 +12,7 @@ BOHB 依赖 HB(Hyperband)来决定每次跑多少组参数和每组参数分 按照 Hyperband 的方式来选择每次跑的参数个数与分配多少资源(budget),并继续使用“连续减半(SuccessiveHalving)”策略,更多有关Hyperband算法的细节,请参考[NNI 中的 Hyperband](HyperbandAdvisor.md) 和 [Hyperband 的参考论文](https://arxiv.org/abs/1603.06560)。 下面的伪代码描述了这个过程。 -![](../img/bohb_1.png) +![](../../img/bohb_1.png) ### BO(贝叶斯优化) @@ -20,11 +20,11 @@ BOHB 的 BO 与 TPE 非常相似, 它们的主要区别是: BOHB 中使用一个 树形超参评估器 (TPE): 使用 KDE (核密度估计) 来对密度进行建模。 -![](../img/bohb_2.png) +![](../../img/bohb_2.png) 为了建模有效的核密度估计(KDE),设置了一个建立模型所需的最小观察点数(Nmin),在 Experiment 中它的默认值为 d+1(d是搜索空间的维度),其中 d 也是一个可以设置的超参数。 因为希望尽早地建立模型,所以当 Nb = |Db|,即当已经观察到的计算资源(budget)为 b 的点数满足 q · Nb ≥ Nmin 时,立即建立模型来指导之后参数的选择。所以,在使用了刚开始Nmin + 2 个随机选择的参数之后,会按照下式将观察到的点进行分类 -![](../img/bohb_3.png) +![](../../img/bohb_3.png) 按照公式将观察到的点分成好与坏两类点,来分别拟合两个不同的密度分布。 @@ -32,13 +32,13 @@ BOHB 的 BO 与 TPE 非常相似, 它们的主要区别是: BOHB 中使用一个 ## 2. 流程 -![](../img/bohb_6.jpg) +![](../../img/bohb_6.jpg) 以上这张图展示了 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模型来指导参数选择的采样规程,用以下伪代码来描述。 -![](../img/bohb_4.png) +![](../../img/bohb_4.png) ## 3. 用法 @@ -50,7 +50,7 @@ nnictl package install --name=SMAC 要使用 BOHB,需要在 Experiment 的 YAML 配置文件进行如下改动: -```yml +```yaml advisor: builtinAdvisorName: BOHB classArgs: @@ -96,6 +96,6 @@ Advisor 有大量的文件、函数和类。 文件内容的简单介绍: 使用BOHB这个调参算法,在CNN模型上跑MNIST数据集。 下面是实验结果: -![](../img/bohb_5.png) +![](../../img/bohb_5.png) 更多的实验结果可以在 [参考论文](https://arxiv.org/abs/1807.01774)中看到,们可以发现BOHB很好的利用了之前的试验结果,且在开发与探索中得到了一个很好的平衡。 \ No newline at end of file diff --git a/docs/zh_CN/BuiltinTuner.md b/docs/zh_CN/Tuner/BuiltinTuner.md similarity index 92% rename from docs/zh_CN/BuiltinTuner.md rename to docs/zh_CN/Tuner/BuiltinTuner.md index d20b26e77b..6fe36f2dd0 100644 --- a/docs/zh_CN/BuiltinTuner.md +++ b/docs/zh_CN/Tuner/BuiltinTuner.md @@ -2,7 +2,7 @@ NNI 提供了先进的调优算法,使用上也很简单。 下面是内置 Tuner 的简单介绍: -注意:点击 **Tuner 的名称**可看到 Tuner 的安装需求,建议的场景以及示例。 算法的详细说明在每个 Tuner 建议场景的最后。 [本文](./CommunitySharings/HpoComparision.md)对比了不同 Tuner 在几个问题下的不同效果。 +注意:点击 **Tuner 的名称**可看到 Tuner 的安装需求,建议的场景以及示例。 算法的详细说明在每个 Tuner 建议场景的最后。 [本文](../CommunitySharings/HpoComparision.md)对比了不同 Tuner 在几个问题下的不同效果。 当前支持的 Tuner: @@ -11,10 +11,10 @@ NNI 提供了先进的调优算法,使用上也很简单。 下面是内置 Tu | [**TPE**](#TPE) | Tree-structured Parzen Estimator (TPE) 是一种 sequential model-based optimization(SMBO,即基于序列模型优化)的方法。 SMBO 方法根据历史指标数据来按顺序构造模型,来估算超参的性能,随后基于此模型来选择新的超参。 [参考论文](https://papers.nips.cc/paper/4443-algorithms-for-hyper-parameter-optimization.pdf) | | [**Random Search(随机搜索)**](#Random) | 在超参优化时,随机搜索算法展示了其惊人的简单和效果。 建议当不清楚超参的先验分布时,采用随机搜索作为基准。 [参考论文](http://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf) | | [**Anneal(退火算法)**](#Anneal) | 这种简单的退火算法从先前的采样开始,会越来越靠近发现的最佳点取样。 此算法是随机搜索的简单变体,利用了反应曲面的平滑性。 退火率不是自适应的。 | -| [**Naive Evolution(进化算法)**](#Evolution) | 朴素进化算法来自于大规模图像分类进化。 它会基于搜索空间随机生成一个种群。 在每一代中,会选择较好的结果,并对其下一代进行一些变异(例如,改动一个超参,增加或减少一层)。 进化算法需要很多次 Trial 才能有效,但它也非常简单,也很容易扩展新功能。 [参考论文](https://arxiv.org/pdf/1703.01041.pdf) | +| [**Naïve Evolution(进化算法)**](#Evolution) | Naïve Evolution(朴素进化算法)来自于 Large-Scale Evolution of Image Classifiers。 它会基于搜索空间随机生成一个种群。 在每一代中,会选择较好的结果,并对其下一代进行一些变异(例如,改动一个超参,增加或减少一层)。 Naïve Evolution 需要很多次 Trial 才能有效,但它也非常简单,也很容易扩展新功能。 [参考论文](https://arxiv.org/pdf/1703.01041.pdf) | | [**SMAC**](#SMAC) | SMAC 基于 Sequential Model-Based Optimization (SMBO,即序列的基于模型优化方法)。 它利用使用过的结果好的模型(高斯随机过程模型),并将随机森林引入到 SMBO 中,来处理分类参数。 SMAC 算法包装了 Github 的 SMAC3。 注意:SMAC 需要通过 `nnictl package` 命令来安装。 [参考论文,](https://www.cs.ubc.ca/~hutter/papers/10-TR-SMAC.pdf) [Github 代码库](https://github.com/automl/SMAC3) | | [**Batch Tuner(批量调参器)**](#Batch) | Batch Tuner 能让用户简单的提供几组配置(如,超参选项的组合)。 当所有配置都执行完后,Experiment 即结束。 Batch Tuner 仅支持 choice 类型。 | -| [**Grid Search(遍历搜索)**](#GridSearch) | Grid Search 会穷举定义在搜索空间文件中的所有超参组合。 网格搜索可以使用的类型有 choice, quniform, qloguniform。 quniform 和 qloguniform 中的数值 q 具有特别的含义(不同于搜索空间文档中的说明)。 它表示了在最高值与最低值之间采样的值的数量。 | +| [**Grid Search(遍历搜索)**](#GridSearch) | Grid Search 会穷举定义在搜索空间文件中的所有超参组合。 遍历搜索可以使用的类型有 choice, quniform, randint。 | | [**Hyperband**](#Hyperband) | Hyperband 试图用有限的资源来探索尽可能多的组合,并发现最好的结果。 它的基本思路是生成大量的配置,并使用少量的资源来找到有可能好的配置,然后继续训练找到其中更好的配置。 [参考论文](https://arxiv.org/pdf/1603.06560.pdf) | | [**Network Morphism**](#NetworkMorphism) | Network Morphism 提供了深度学习模型的自动架构搜索功能。 每个子网络都继承于父网络的知识和形态,并变换网络的不同形态,包括深度,宽度,跨层连接(skip-connection)。 然后使用历史的架构和指标,来估计子网络的值。 然后会选择最有希望的模型进行训练。 [参考论文](https://arxiv.org/abs/1806.10282) | | [**Metis Tuner**](#MetisTuner) | 大多数调参工具仅仅预测最优配置,而 Metis 的优势在于有两个输出:(a) 最优配置的当前预测结果, 以及 (b) 下一次 Trial 的建议。 它不进行随机取样。 大多数工具假设训练集没有噪声数据,但 Metis 会知道是否需要对某个超参重新采样。 [参考论文](https://www.microsoft.com/en-us/research/publication/metis-robustly-tuning-tail-latencies-cloud-systems/) | @@ -41,6 +41,8 @@ TPE 是一种黑盒优化方法,可以使用在各种场景中,通常情况 * **optimize_mode** (*maximize 或 minimize, 可选项, 默认值为 maximize*) - 如果为 'maximize',表示 Tuner 的目标是将指标最大化。 如果为 'minimize',表示 Tuner 的目标是将指标最小化。 +注意:为实现大规模并发 Trial,TPE 的并行性得到了优化。 有关优化原理或开启优化,参考 [TPE 文档](HyperoptTuner.md)。 + **示例** ```yaml @@ -105,13 +107,13 @@ tuner: -![](https://placehold.it/15/1589F0/000000?text=+) `Naive Evolution` +![](https://placehold.it/15/1589F0/000000?text=+) `Naïve Evolution` > 名称:**Evolution** **建议场景** -此算法对计算资源的需求相对较高。 需要非常大的初始种群,以免落入局部最优中。 如果 Trial 时间很短,或使用了 Assessor,就非常合适。 如果 Trial 代码支持权重迁移,即每次 Trial 会从上一轮继承已经收敛的权重,建议使用此算法。 这会大大提高训练速度。 [详细说明](./EvolutionTuner.md) +此算法对计算资源的需求相对较高。 需要非常大的初始种群,以免落入局部最优中。 如果 Trial 时间很短,或者使用了 Assessor,就非常适合此算法。 如果 Trial 代码支持权重迁移,即每次 Trial 会从上一轮继承已经收敛的权重,建议使用此算法。 这会大大提高训练速度。 [详细说明](./EvolutionTuner.md) **示例** @@ -208,7 +210,7 @@ tuner: **建议场景** -注意,搜索空间仅支持 `choice`, `quniform`, `qloguniform`。 `quniform` 和 `qloguniform` 中的 **数字 `q` 有不同的含义(与[搜索空间](./SearchSpaceSpec.md)说明不同)。 这里的意义是在 `low` 和 `high` 之间均匀取值的数量。

    +注意,搜索空间仅支持 `choice`, `quniform`, `randint`。 当搜索空间比较小,能够遍历整个搜索空间。 [详细说明](./GridsearchTuner.md) @@ -260,7 +262,7 @@ advisor: **安装** -必须先安装 [pyTorch](https://pytorch.org/get-started/locally)。 +NetworkMorphism 需要先安装 [PyTorch](https://pytorch.org/get-started/locally) 和 [Keras](https://keras.io/#installation) 才能使用。 对应的 requirements 文件在[这里](https://github.com/microsoft/nni/blob/master/examples/trials/network_morphism/requirements.txt)。 **建议场景** @@ -326,7 +328,7 @@ tuner: **安装** -BOHB Advisor 的使用依赖 [ConfigSpace](https://github.com/automl/ConfigSpace) 包,第一次使用 BOHB 时,在命令行运行以下命令安装 ConfigSpace。 +BOHB Advisor 的使用依赖 [ConfigSpace](https://github.com/automl/ConfigSpace) 包,在第一次使用 BOHB 的时候,在命令行运行以下的指令来安装 ConfigSpace。 ```bash nnictl package install --name=BOHB @@ -353,7 +355,7 @@ nnictl package install --name=BOHB **示例** -```yml +```yaml advisor: builtinAdvisorName: BOHB classArgs: diff --git a/docs/zh_CN/CustomizeAdvisor.md b/docs/zh_CN/Tuner/CustomizeAdvisor.md similarity index 100% rename from docs/zh_CN/CustomizeAdvisor.md rename to docs/zh_CN/Tuner/CustomizeAdvisor.md diff --git a/docs/zh_CN/CustomizeTuner.md b/docs/zh_CN/Tuner/CustomizeTuner.md similarity index 100% rename from docs/zh_CN/CustomizeTuner.md rename to docs/zh_CN/Tuner/CustomizeTuner.md diff --git a/docs/zh_CN/EvolutionTuner.md b/docs/zh_CN/Tuner/EvolutionTuner.md similarity index 86% rename from docs/zh_CN/EvolutionTuner.md rename to docs/zh_CN/Tuner/EvolutionTuner.md index 4b8ab7ef83..3b878c5f08 100644 --- a/docs/zh_CN/EvolutionTuner.md +++ b/docs/zh_CN/Tuner/EvolutionTuner.md @@ -1,5 +1,5 @@ -# Naive Evolution Tuner +# Naïve Evolution Tuner -## Naive Evolution(进化算法) +## Naïve Evolution(进化算法) 进化算法来自于 [Large-Scale Evolution of Image Classifiers](https://arxiv.org/pdf/1703.01041.pdf)。 它会基于搜索空间随机生成一个种群。 在每一代中,会选择较好的结果,并对其下一代进行一些变异(例如,改动一个超参,增加或减少一层)。 进化算法需要很多次 Trial 才能有效,但它也非常简单,也很容易扩展新功能。 \ No newline at end of file diff --git a/docs/zh_CN/GPTuner.md b/docs/zh_CN/Tuner/GPTuner.md similarity index 100% rename from docs/zh_CN/GPTuner.md rename to docs/zh_CN/Tuner/GPTuner.md diff --git a/docs/zh_CN/GridsearchTuner.md b/docs/zh_CN/Tuner/GridsearchTuner.md similarity index 59% rename from docs/zh_CN/GridsearchTuner.md rename to docs/zh_CN/Tuner/GridsearchTuner.md index fd8fbd51c9..a1003d19a5 100644 --- a/docs/zh_CN/GridsearchTuner.md +++ b/docs/zh_CN/Tuner/GridsearchTuner.md @@ -2,4 +2,4 @@ ## Grid Search(遍历搜索) -Grid Search 会穷举定义在搜索空间文件中的所有超参组合。 注意,搜索空间仅支持 `choice`, `quniform`, `qloguniform`。 `quniform` 和 `qloguniform` 中的 **数字 `q` 有不同的含义(与[搜索空间](SearchSpaceSpec.md)说明不同)。 这里的意义是在 `low` 和 `high` 之间均匀取值的数量。

    \ No newline at end of file +Grid Search 会穷举定义在搜索空间文件中的所有超参组合。 注意,搜索空间仅支持 `choice`, `quniform`, `qloguniform`。 `quniform` 和 `qloguniform` 中的 **数字 `q` 有不同的含义(与[搜索空间](../Tutorial/SearchSpaceSpec.md)说明不同)。 这里的意义是在 `low` 和 `high` 之间均匀取值的数量。

    \ No newline at end of file diff --git a/docs/zh_CN/HyperbandAdvisor.md b/docs/zh_CN/Tuner/HyperbandAdvisor.md similarity index 100% rename from docs/zh_CN/HyperbandAdvisor.md rename to docs/zh_CN/Tuner/HyperbandAdvisor.md diff --git a/docs/zh_CN/Tuner/HyperoptTuner.md b/docs/zh_CN/Tuner/HyperoptTuner.md new file mode 100644 index 0000000000..390aecdd37 --- /dev/null +++ b/docs/zh_CN/Tuner/HyperoptTuner.md @@ -0,0 +1,36 @@ +# 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)。 ​ + +### TPE 的并行优化 + +为了利用多个计算节点,TPE 方法是异步运行的,这样能避免浪费时间等待 Trial 评估的完成。 此算法设计的初衷是优化序列。 当在高并发情况下使用 TPE 时,性能会非常差。 通过 Constant Liar 算法优化了这种情况。 关于优化的原理,参考[文档](../CommunitySharings/ParallelizingTpeSearch.md)。 + +### 用法 + +要使用 TPE,需要在 Experiment 的 YAML 配置文件进行如下改动: + +```yaml +tuner: + builtinTunerName: TPE + classArgs: + optimize_mode: maximize + parallel_optimize: True + constant_liar_type: min +``` + +**参数** + +* **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) 中介绍了随机搜索惊人的简单和效果。 建议当不清楚超参的先验分布时,采用随机搜索作为基准。 + +## Anneal(退火算法) + +这种简单的退火算法从先前的采样开始,会越来越靠近发现的最佳点取样。 此算法是随机搜索的简单变体,利用了反应曲面的平滑性。 退火率不是自适应的。 \ No newline at end of file diff --git a/docs/zh_CN/MetisTuner.md b/docs/zh_CN/Tuner/MetisTuner.md similarity index 100% rename from docs/zh_CN/MetisTuner.md rename to docs/zh_CN/Tuner/MetisTuner.md diff --git a/docs/zh_CN/NetworkmorphismTuner.md b/docs/zh_CN/Tuner/NetworkmorphismTuner.md similarity index 100% rename from docs/zh_CN/NetworkmorphismTuner.md rename to docs/zh_CN/Tuner/NetworkmorphismTuner.md diff --git a/docs/zh_CN/SmacTuner.md b/docs/zh_CN/Tuner/SmacTuner.md similarity index 68% rename from docs/zh_CN/SmacTuner.md rename to docs/zh_CN/Tuner/SmacTuner.md index a350717f87..88b06bec37 100644 --- a/docs/zh_CN/SmacTuner.md +++ b/docs/zh_CN/Tuner/SmacTuner.md @@ -4,4 +4,4 @@ [SMAC](https://www.cs.ubc.ca/~hutter/papers/10-TR-SMAC.pdf) 基于 Sequential Model-Based Optimization (SMBO). 它利用使用过的结果好的模型(高斯随机过程模型),并将随机森林引入到 SMBO 中,来处理分类参数。 NNI 的 SMAC 通过包装 [SMAC3](https://github.com/automl/SMAC3) 来支持。 -NNI 中的 SMAC 只支持部分类型的[搜索空间](SearchSpaceSpec.md),包括`choice`, `randint`, `uniform`, `loguniform`, `quniform(q=1)`。 \ No newline at end of file +NNI 中的 SMAC 只支持部分类型的[搜索空间](../Tutorial/SearchSpaceSpec.md),包括`choice`, `randint`, `uniform`, `loguniform`, `quniform(q=1)`。 \ No newline at end of file diff --git a/docs/zh_CN/AnnotationSpec.md b/docs/zh_CN/Tutorial/AnnotationSpec.md similarity index 88% rename from docs/zh_CN/AnnotationSpec.md rename to docs/zh_CN/Tutorial/AnnotationSpec.md index 0f2b701fb9..8f9689cad4 100644 --- a/docs/zh_CN/AnnotationSpec.md +++ b/docs/zh_CN/Tutorial/AnnotationSpec.md @@ -36,9 +36,9 @@ NNI 支持如下 10 种类型来表示搜索空间: - `@nni.variable(nni.choice(option1,option2,...,optionN),name=variable)` 变量值是选项中的一种,这些变量可以是任意的表达式。 - `@nni.variable(nni.randint(lower, upper),name=variable)` 变量值的公式为:round(uniform(low, high))。 目前,值的类型为 float。 如果要使用整数,需要显式转换。 - `@nni.variable(nni.uniform(low, high),name=variable)` 变量值会是 low 和 high 之间均匀分布的某个值。 -- `@nni.variable(nni.quniform(low, high, q),name=variable)` 变量值会是 low 和 high 之间均匀分布的某个值,公式为:round(uniform(low, high) / q) * q +- `@nni.variable(nni.quniform(low, high, q),name=variable)` 变量值为 clip(round(uniform(low, high) / q) * q, low, high),clip 操作用于约束生成值的边界。 - `@nni.variable(nni.loguniform(low, high),name=variable)` 变量值是 exp(uniform(low, high)) 的点,数值以对数均匀分布。 -- `@nni.variable(nni.qloguniform(low, high, q),name=variable)` 变量值会是 low 和 high 之间均匀分布的某个值,公式为:round(exp(uniform(low, high)) / q) * q +- `@nni.variable(nni.qloguniform(low, high, q),name=variable)` 变量值为 clip(round(loguniform(low, high) / q) * q, low, high),clip 操作用于约束生成值的边界。 - `@nni.variable(nni.normal(mu, sigma),name=variable)` 变量值为正态分布的实数值,平均值为 mu,标准方差为 sigma。 - `@nni.variable(nni.qnormal(mu, sigma, q),name=variable)` 变量值分布的公式为: round(normal(mu, sigma) / q) * q - `@nni.variable(nni.lognormal(mu, sigma),name=variable)` 变量值分布的公式为: exp(normal(mu, sigma)) @@ -73,10 +73,10 @@ h_pooling = max_pool(hidden_layer, pool_size) `'''@nni.report_intermediate_result(metrics)'''` -`@nni.report_intermediate_result` 用来返回中间结果,这和 中的 `nni.report_intermediate_result` 用法一样。 +`@nni.report_intermediate_result` 用来返回中间结果,这和[在 NNI 上实现 Trial](../TrialExample/Trials.md) 中 `nni.report_intermediate_result` 的用法一样。 ### 4. 最终结果 `'''@nni.report_final_result(metrics)'''` -`@nni.report_final_result` 用来返回当前 Trial 的最终结果,这和 中的 `nni.report_final_result` 用法一样。 \ No newline at end of file +`@nni.report_final_result` 用来返回当前 Trial 的最终结果,这和[在 NNI 上实现 Trial](../TrialExample/Trials.md) 中的 `nni.report_final_result` 用法一样。 \ No newline at end of file diff --git a/docs/zh_CN/Contributing.md b/docs/zh_CN/Tutorial/Contributing.md similarity index 98% rename from docs/zh_CN/Contributing.md rename to docs/zh_CN/Tutorial/Contributing.md index ca851c3351..9c7ed85a2b 100644 --- a/docs/zh_CN/Contributing.md +++ b/docs/zh_CN/Tutorial/Contributing.md @@ -6,7 +6,7 @@ 不管怎样,如果想要更有效的贡献代码,可以阅读以下内容。 本文档包括了所有在贡献中需要注意的要点,会加快合并代码、解决问题的速度。 -查看[快速入门](./QuickStart.md)来初步了解。 +查看[快速入门](QuickStart.md)来初步了解。 下面是一些简单的贡献指南。 diff --git a/docs/zh_CN/ExperimentConfig.md b/docs/zh_CN/Tutorial/ExperimentConfig.md similarity index 93% rename from docs/zh_CN/ExperimentConfig.md rename to docs/zh_CN/Tutorial/ExperimentConfig.md index 7fb4f38bf5..700f8c00d2 100644 --- a/docs/zh_CN/ExperimentConfig.md +++ b/docs/zh_CN/Tutorial/ExperimentConfig.md @@ -14,32 +14,36 @@ - **简化版(不包含 Annotation(标记)和 Assessor)** ```yaml -authorName: -experimentName: -trialConcurrency: -maxExecDuration: -maxTrialNum: +authorName: +experimentName: +trialConcurrency: +maxExecDuration: +maxTrialNum: #可选项: local, remote, pai, kubeflow -trainingServicePlatform: -searchSpacePath: -#可选项: true, false -useAnnotation: +trainingServicePlatform: +searchSpacePath: +#可选项: true, false, 默认值: false +useAnnotation: +#可选项: true, false, 默认值: false +multiPhase: +#可选项: true, false, 默认值: false +multiThread: tuner: #可选项: TPE, Random, Anneal, Evolution builtinTunerName: classArgs: #可选项: maximize, minimize optimize_mode: - gpuNum: + gpuNum: trial: - command: - codeDir: - gpuNum: + command: + codeDir: + gpuNum: #在本地使用时,machineList 可为空 machineList: - - ip: - port: - username: + - ip: + port: + username: passwd: ``` @@ -54,8 +58,12 @@ maxTrialNum: #可选项: local, remote, pai, kubeflow trainingServicePlatform: searchSpacePath: -#可选项: true, false -useAnnotation: +#可选项: true, false, 默认值: false +useAnnotation: +#可选项: true, false, 默认值: false +multiPhase: +#可选项: true, false, 默认值: false +multiThread: tuner: #可选项: TPE, Random, Anneal, Evolution builtinTunerName: @@ -92,8 +100,12 @@ maxExecDuration: maxTrialNum: #可选项: local, remote, pai, kubeflow trainingServicePlatform: -#可选项: true, false -useAnnotation: +#可选项: true, false, 默认值: false +useAnnotation: +#可选项: true, false, 默认值: false +multiPhase: +#可选项: true, false, 默认值: false +multiThread: tuner: #可选项: TPE, Random, Anneal, Evolution builtinTunerName: @@ -184,9 +196,9 @@ machineList: - **remote** 将任务提交到远程的 Ubuntu 上,必须用 **machineList** 来指定远程的 SSH 连接信息。 - - **pai** 提交任务到微软开源的 [OpenPAI](https://github.com/Microsoft/pai) 上。 更多 OpenPAI 配置,参考 [pai 模式](./PaiMode.md)。 + - **pai** 提交任务到微软开源的 [OpenPAI](https://github.com/Microsoft/pai) 上。 更多 OpenPAI 配置,参考 [pai 模式](../TrainingService/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/)。 详情参考 [Kubeflow 文档](../TrainingService/KubeflowMode.md) - **searchSpacePath** @@ -204,6 +216,18 @@ machineList: 注意: 如果设置了 useAnnotation=True,searchSpacePath 字段必须被删除。 +- **multiPhase** + + - 说明 + + **multiPhase** 启用[多阶段 Experiment](../AdvancedFeature/MultiPhase.md)。 + +- **multiThread** + + - 说明 + + **multiThread** 如果 multiThread 设为 `true`,可启动 Dispatcher 的多线程模式。Dispatcher 会为来自 NNI 管理器的每个命令启动一个线程。 + - **nniManagerIp** - 说明 @@ -266,7 +290,7 @@ machineList: - **gpuNum** - __gpuNum__ 指定了运行 Tuner 进程的 GPU 数量。 此字段的值必须是正整数。 + __gpuNum__ 指定了运行 Tuner 进程的 GPU 数量。 此字段的值必须是正整数。 如果此字段没有设置,NNI不会在脚本中添加 `CUDA_VISIBLE_DEVICES` (也就是说,不会通过 `CUDA_VISIBLE_DEVICES` 来控制 GPU 在 Trial 中是否可见),也不会管理 GPU 资源。 注意: 只能使用一种方法来指定 Tuner,例如:设置 {tunerName, optimizationMode} 或 {tunerCommand, tunerCwd},不能同时设置两者。 @@ -290,7 +314,7 @@ machineList: - **classArgs** - **classArgs** 指定了 Assessor 算法的参数 + **classArgs** 指定了 Assessor 算法的参数。 - **codeDir**, **classFileName**, **className** 和 **classArgs** diff --git a/docs/zh_CN/FAQ.md b/docs/zh_CN/Tutorial/FAQ.md similarity index 100% rename from docs/zh_CN/FAQ.md rename to docs/zh_CN/Tutorial/FAQ.md diff --git a/docs/zh_CN/HowToDebug.md b/docs/zh_CN/Tutorial/HowToDebug.md similarity index 95% rename from docs/zh_CN/HowToDebug.md rename to docs/zh_CN/Tutorial/HowToDebug.md index 8bbaa824de..7a7fa86e96 100644 --- a/docs/zh_CN/HowToDebug.md +++ b/docs/zh_CN/Tutorial/HowToDebug.md @@ -2,14 +2,14 @@ ## 概述 -NNI 中的日志分为三部分。 包括 NNI Manager, Dispatcher 以及 Trial。 这里会简单介绍这些组件。 更多信息可参考[概述](Overview.md)。 +NNI 中的日志分为三部分。 包括 NNI Manager, Dispatcher 以及 Trial。 这里会简单介绍这些组件。 更多信息可参考[概述](../Overview.md)。 - **NNI Controller**:NNI Controller (nnictl) 是命令行工具,用来管理 Experiments(如:启动 Experiment)。 -- **NNI Manager**:这是 NNI 的核心。当 Experiment 出现严重错误时,从它的日志中才能找到原因。(例如,Web 界面无法打开,或者训练服务失败) +- **NNI Manager**:这是 NNI 的核心。当 Experiment 出现严重错误时,从它的日志中才能找到原因。(例如,Web 界面无法打开,或者训练平台失败) - **Dispatcher**: Dispatcher 调用 **Tuner** 和 **Assessor** 的方法。 它的日志与 Tuner 和 Assessor 代码有关。 - **Tuner**: Tuner 是一个自动机器学习算法,会为下一个 Trial 生成新的配置。 新的 Trial 会使用这组配置来运行。 - **Assessor**:Assessor 分析 Trial 的中间结果(例如,测试数据集上定期的精度),来确定 Trial 是否应该被提前终止。 -- **Trial**:Trial 的代码是用户编写的代码,每次 Trial 运行时会尝试一组新的配置(例如,一组新的超参值,或者某个神经网络结构)。 +- **Trial**:Trial 的代码是用户实现的代码,每次 Trial 运行时会尝试一组新的配置(例如,一组新的超参值,或者某个神经网络结构)。 ## 日志的位置 @@ -53,7 +53,7 @@ NNI 中有不同的错误类型。 根据严重程度,可分为三类。 当 N 以后一种情况为例。 某自定义的 Tuner,*\_init*\_ 函数有名为 `optimize_mode` 的参数,但配置文件中没有提供此参数。NNI 就会因为初始化 Tuner 失败而造成 Experiment 失败。 可在 Web 界面看到如下错误: -![](../img/dispatcher_error.jpg) +![](../../img/dispatcher_error.jpg) 可以看到这是一个 Dispatcher 的错误。 因此,检查 Dispatcher 的日志,可找到如下信息: @@ -77,6 +77,6 @@ NNI 中有不同的错误类型。 根据严重程度,可分为三类。 当 N 如,其中常见的一种错误是在运行 MNIST 示例时没有安装 TensorFlow。 因为导入模块的错误(没有安装 Tensorflow,但在 Trial 代码中有 import tensorflow 的语句),每次 Trial 都会运行失败。 -![](../img/trial_error.jpg) +![](../../img/trial_error.jpg) 如图,每个 Trial 都有日志路径,可以从中找到 Trial 的日志和 stderr。 \ No newline at end of file diff --git a/docs/zh_CN/HowToUseDocker.md b/docs/zh_CN/Tutorial/HowToUseDocker.md similarity index 91% rename from docs/zh_CN/HowToUseDocker.md rename to docs/zh_CN/Tutorial/HowToUseDocker.md index 7c8d378b0e..918cf0a25f 100644 --- a/docs/zh_CN/HowToUseDocker.md +++ b/docs/zh_CN/Tutorial/HowToUseDocker.md @@ -51,7 +51,7 @@ ## 在远程平台上运行docker -NNI支持在[远程平台](RemoteMachineMode.md)上启动实验,在远程机器里运行任务。 因为docker可以运行独立的Ubuntu系统和SSH服务,因此docker容器可以作为远程平台来运行NNI. +NNI支持在[远程平台](../TrainingService/RemoteMachineMode.md)上启动实验,在远程机器里运行任务。 因为docker可以运行独立的Ubuntu系统和SSH服务,因此docker容器可以作为远程平台来运行NNI. ### 步骤1:设置docker环境 @@ -82,7 +82,7 @@ SSH容器需要一个端口,你需要把docker的SSH服务端口暴露给NNI ### 步骤三:运行NNI实验 -你可以在你的配置文件中,设置训练平台为远程平台,然后设置`machineList`配置。[参考](RemoteMachineMode.md)。 注意你应该设置正确的`port`,`username`, `passwd`或者`sshKeyPath`。 +你可以在你的配置文件中,设置训练平台为远程平台,然后设置`machineList`配置。[参考](../TrainingService/RemoteMachineMode.md)。 注意你应该设置正确的`port`,`username`, `passwd`或者`sshKeyPath`。 `port`: 主机的端口,映射到docker的SSH端口中。 diff --git a/docs/zh_CN/Installation.md b/docs/zh_CN/Tutorial/Installation.md similarity index 92% rename from docs/zh_CN/Installation.md rename to docs/zh_CN/Tutorial/Installation.md index b81c46acc7..7792bae884 100644 --- a/docs/zh_CN/Installation.md +++ b/docs/zh_CN/Tutorial/Installation.md @@ -88,13 +88,13 @@ ## 更多 -* [概述](Overview.md) +* [概述](../Overview.md) * [使用命令行工具 nnictl](Nnictl.md) * [使用 NNIBoard](WebUI.md) * [定制搜索空间](SearchSpaceSpec.md) * [配置 Experiment](ExperimentConfig.md) -* [如何在本机运行 Experiment (支持多 GPU 卡)?](LocalMode.md) -* [如何在多机上运行 Experiment?](RemoteMachineMode.md) -* [如何在 OpenPAI 上运行 Experiment?](PaiMode.md) -* [如何通过 Kubeflow 在 Kubernetes 上运行 Experiment?](KubeflowMode.md) -* [如何通过 FrameworkController 在 Kubernetes 上运行 Experiment?](FrameworkControllerMode.md) \ No newline at end of file +* [如何在本机运行 Experiment (支持多 GPU 卡)?](../TrainingService/LocalMode.md) +* [如何在多机上运行 Experiment?](../TrainingService/RemoteMachineMode.md) +* [如何在 OpenPAI 上运行 Experiment?](../TrainingService/PaiMode.md) +* [如何通过 Kubeflow 在 Kubernetes 上运行 Experiment?](../TrainingService/KubeflowMode.md) +* [如何通过 FrameworkController 在 Kubernetes 上运行 Experiment?](../TrainingService/FrameworkControllerMode.md) \ No newline at end of file diff --git a/docs/zh_CN/NniOnWindows.md b/docs/zh_CN/Tutorial/NniOnWindows.md similarity index 100% rename from docs/zh_CN/NniOnWindows.md rename to docs/zh_CN/Tutorial/NniOnWindows.md diff --git a/docs/zh_CN/Nnictl.md b/docs/zh_CN/Tutorial/Nnictl.md similarity index 95% rename from docs/zh_CN/Nnictl.md rename to docs/zh_CN/Tutorial/Nnictl.md index 6e4a352228..db4adeea01 100644 --- a/docs/zh_CN/Nnictl.md +++ b/docs/zh_CN/Tutorial/Nnictl.md @@ -112,17 +112,17 @@ nnictl 支持的命令: 使用此命令来停止正在运行的单个或多个 Experiment。 * 用法 - + ```bash - nnictl stop [OPTIONS] + nnictl stop [Options] ``` * 选项 - - | 参数及缩写 | 是否必需 | 默认值 | 说明 | - | ----------- | ----- | --- | -------------------------------- | - | id | 否 | | 要停止的 Experiment 标识 | - | --port, -p | 否 | | 要停止的 Experiment 使用的 RESTful 服务端口 | + + | 参数及缩写 | 是否必需 | 默认值 | 说明 | + | ---------- | ----- | --- | -------------------------------- | + | id | False | | 要停止的 Experiment 标识 | + | --port, -p | False | | 要停止的 Experiment 使用的 RESTful 服务端口 | * 详细信息及样例 @@ -138,13 +138,15 @@ nnictl 支持的命令: ```bash nnictl stop [experiment_id] ``` - - 3. 如果指定了端口,并且有运行中的 Experiment 正在使用该端口,那么这个 Experiment 将会停止。 - + + + 3. 如果指定了端口,并且此端口有正在运行的 Experiment,则会停止此 Experiment。 + ```bash nnictl stop --port 8080 - ```` - + ``` + + 4. 可使用 'nnictl stop all' 来停止所有的 Experiment。 ```bash @@ -386,8 +388,14 @@ nnictl 支持的命令: * 用法 ```bash - nnictl experiment list + nnictl experiment list [OPTIONS] ``` + + * 选项 + + | 参数及缩写 | 是否必需 | 默认值 | 说明 | + | ----- | ----- | --- | --------------- | + | --all | False | | 列出所有 Experiment | * **nnictl experiment delete** @@ -403,9 +411,10 @@ nnictl 支持的命令: * 选项 - | 参数及缩写 | 是否必需 | 默认值 | 说明 | - | ----- | ----- | --- | ------------- | - | id | False | | Experiment ID | + | 参数及缩写 | 是否必需 | 默认值 | 说明 | + | ----- | ----- | --- | --------------- | + | id | False | | Experiment ID | + | --all | False | | 删除所有 Experiment | @@ -474,7 +483,7 @@ nnictl 支持的命令: 当前,以下 Tuner 和 Advisor 支持导入数据: - ```yml + ```yaml 内置 Tuner: TPE, Anneal, GridSearch, MetisTuner 内置 Advisor: BOHB ``` @@ -716,4 +725,4 @@ nnictl 支持的命令: ```bash nnictl --version - ``` + ``` \ No newline at end of file diff --git a/docs/zh_CN/QuickStart.md b/docs/zh_CN/Tutorial/QuickStart.md similarity index 88% rename from docs/zh_CN/QuickStart.md rename to docs/zh_CN/Tutorial/QuickStart.md index 731fdf5361..2c92384b1b 100644 --- a/docs/zh_CN/QuickStart.md +++ b/docs/zh_CN/Tutorial/QuickStart.md @@ -54,18 +54,17 @@ if __name__ == '__main__': NNI 用来帮助超参调优。它的流程如下: -```pseudo -输入: 搜索空间, Trial 代码, 配置文件 -输出: 一组最佳的超参配置 - -1: For t = 0, 1, 2, ..., maxTrialNum, -2: hyperparameter = 从搜索空间选择一组参数 -3: final result = run_trial_and_evaluate(hyperparameter) -4: 返回最终结果给 NNI -5: If 时间达到上限, -6: 停止实验 -7: return 最好的实验结果 -``` + 输入: 搜索空间, Trial 代码, 配置文件 + 输出: 一组最佳的超参配置 + + 1: For t = 0, 1, 2, ..., maxTrialNum, + 2: hyperparameter = 从搜索空间选择一组参数 + 3: final result = run_trial_and_evaluate(hyperparameter) + 4: 返回最终结果给 NNI + 5: If 时间达到上限, + 6: 停止实验 + 7: return 最好的实验结果 + 如果需要使用 NNI 来自动训练模型,找到最佳超参,需要如下三步: @@ -208,28 +207,28 @@ Web 地址为:[IP 地址]:8080 Experiment 相关信息会显示在界面上,配置和搜索空间等。 可通过 **Download** 按钮来`下载信息和参数`。 可以在运行中或结束后,随时下载 Experiment 的结果。 -![](../img/QuickStart1.png) +![](../../img/QuickStart1.png) 前 10 个 Trial 结果也会列在 Overview 页面中,可以在 "Trials Detail" 部分浏览所有的 Trial。 -![](../img/QuickStart2.png) +![](../../img/QuickStart2.png) #### 查看 Trial 详情页面 点击 "Default Metric" 来查看所有 Trial 的点图。 悬停鼠标来查看默认指标和搜索空间信息。 -![](../img/QuickStart3.png) +![](../../img/QuickStart3.png) 点击 "Hyper Parameter" 标签查看图像。 * 可选择百分比查看最好的 Trial。 * 选择两个轴来交换位置。 -![](../img/QuickStart4.png) +![](../../img/QuickStart4.png) 点击 "Trial Duration" 标签来查看柱状图。 -![](../img/QuickStart5.png) +![](../../img/QuickStart5.png) 下面是所有 Trial 的状态。 包括: @@ -238,20 +237,20 @@ Experiment 相关信息会显示在界面上,配置和搜索空间等。 可 * Kill: 可终止正在运行的任务。 * 支持搜索某个特定的 Trial。 -![](../img/QuickStart6.png) +![](../../img/QuickStart6.png) * 中间结果图 -![](../img/QuickStart7.png) +![](../../img/QuickStart7.png) ## 相关主题 -* [尝试不同的 Tuner](BuiltinTuner.md) -* [尝试不同的 Assessor](BuiltinAssessors.md) +* [尝试不同的 Tuner](../Tuner/BuiltinTuner.md) +* [尝试不同的 Assessor](../Assessor/BuiltinAssessor.md) * [使用命令行工具 nnictl](Nnictl.md) -* [如何编写 Trial 代码](Trials.md) -* [如何在本机运行 Experiment (支持多 GPU 卡)?](LocalMode.md) -* [如何在多机上运行 Experiment?](RemoteMachineMode.md) -* [如何在 OpenPAI 上运行 Experiment?](PaiMode.md) -* [如何通过 Kubeflow 在 Kubernetes 上运行 Experiment?](KubeflowMode.md) -* [如何通过 FrameworkController 在 Kubernetes 上运行 Experiment?](FrameworkControllerMode.md) \ No newline at end of file +* [如何实现 Trial 代码](../TrialExample/Trials.md) +* [如何在本机运行 Experiment (支持多 GPU 卡)?](../TrainingService/LocalMode.md) +* [如何在多机上运行 Experiment?](../TrainingService/RemoteMachineMode.md) +* [如何在 OpenPAI 上运行 Experiment?](../TrainingService/PaiMode.md) +* [如何通过 Kubeflow 在 Kubernetes 上运行 Experiment?](../TrainingService/KubeflowMode.md) +* [如何通过 FrameworkController 在 Kubernetes 上运行 Experiment?](../TrainingService/FrameworkControllerMode.md) \ No newline at end of file diff --git a/docs/zh_CN/SearchSpaceSpec.md b/docs/zh_CN/Tutorial/SearchSpaceSpec.md similarity index 81% rename from docs/zh_CN/SearchSpaceSpec.md rename to docs/zh_CN/Tutorial/SearchSpaceSpec.md index c30fb5388c..7e2f6777f5 100644 --- a/docs/zh_CN/SearchSpaceSpec.md +++ b/docs/zh_CN/Tutorial/SearchSpaceSpec.md @@ -47,7 +47,8 @@ * {"_type":"quniform","_value":[low, high, q]} - * 这表示变量值会类似于 round(uniform(low, high) / q) * q + * 变量值为 clip(round(uniform(low, high) / q) * q, low, high),clip 操作用于约束生成值的边界。 例如,_value 为 [0, 10, 2.5],可取的值为 [0, 2.5, 5.0, 7.5, 10.0]; _value 为 [2, 10, 5],可取的值为 [2, 5, 10]。 + * 适用于离散,同时反映了某种"平滑"的数值,但上下限都有限制。 如果需要从范围 [low, high] 中均匀选择整数,可以如下定义 `_value`:`[low, high, 1]`。 * {"_type":"loguniform","_value":[low, high]} @@ -57,7 +58,7 @@ * {"_type":"qloguniform","_value":[low, high, q]} - * 这表示变量值会类似于 round(loguniform(low, high)) / q) * q + * 变量值为 clip(round(loguniform(low, high) / q) * q, low, high),clip 操作用于约束生成值的边界。 * 适用于值是“平滑”的离散变量,但上下限均有限制。 * {"_type":"normal","_value":[mu, sigma]} @@ -78,6 +79,12 @@ * 这表示变量值会类似于 round(exp(normal(mu, sigma)) / q) * q * 适用于值是“平滑”的离散变量,但某一边有界。 +* {"_type":"mutable_layer","_value":{mutable_layer_infomation}} + + * [神经网络架构搜索空间](../AdvancedFeature/GeneralNasInterfaces.md)的类型。 值是字典类型,键值对表示每个 mutable_layer 的名称和搜索空间。 + * 当前,只能通过 Annotation 来使用这种类型的搜索空间。因此不需要为搜索空间定义 JSON 文件,它会通过 Trial 中的 Annotation 自动生成。 + * 具体用法参考[通用 NAS 接口](../AdvancedFeature/GeneralNasInterfaces.md)。 + ## 每种 Tuner 支持的搜索空间类型 | | choice | randint | uniform | quniform | loguniform | qloguniform | normal | qnormal | lognormal | qlognormal | @@ -88,24 +95,16 @@ | Evolution Tuner | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | SMAC Tuner | ✓ | ✓ | ✓ | ✓ | ✓ | | | | | | | Batch Tuner | ✓ | | | | | | | | | | -| Grid Search Tuner | ✓ | | | ✓ | | ✓ | | | | | +| Grid Search Tuner | ✓ | ✓ | | ✓ | | | | | | | | Hyperband Advisor | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | Metis Tuner | ✓ | ✓ | ✓ | ✓ | | | | | | | | GP Tuner | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | | | | 已知的局限: -* 注意,在 Grid Search Tuner 中,为了使用方便 `quniform` 和 `qloguniform` 的定义也有所改变,其中的 q 表示采样值的数量。 详情如下: - - * 类型 'quniform' 接收三个值 [low, high, q], 其中 [low, high] 指定了范围,而 'q' 指定了会被均匀采样的值的数量。 注意 q 至少为 2。 它的第一个采样值为 'low',每个采样值都会比前一个大 (high-low)/q 。 - - * 类型 'qloguniform' 的行为与 'quniform' 类似,不同处在于首先将范围改为 [log(low), log(high)] 采样后,再将数值还原。 - - * 注意 Metis Tuner 当前仅支持在 `choice` 中使用数值。 * 请注意,对于嵌套搜索空间: * 只有 随机搜索/TPE/Anneal/Evolution Tuner 支持嵌套搜索空间 - - * 不支持嵌套搜索空间 "超参" 并行图,对其的改进通过 #1110(https://github.com/microsoft/nni/issues/1110) 来跟踪 。欢迎任何建议和贡献。 \ No newline at end of file + * 不支持嵌套搜索空间 "超参" 的可视化,对其的改进通过 #1110(https://github.com/microsoft/nni/issues/1110) 来跟踪 。欢迎任何建议和贡献。 \ No newline at end of file diff --git a/docs/zh_CN/SetupNniDeveloperEnvironment.md b/docs/zh_CN/Tutorial/SetupNniDeveloperEnvironment.md similarity index 81% rename from docs/zh_CN/SetupNniDeveloperEnvironment.md rename to docs/zh_CN/Tutorial/SetupNniDeveloperEnvironment.md index 3ad07ae443..74225cb25f 100644 --- a/docs/zh_CN/SetupNniDeveloperEnvironment.md +++ b/docs/zh_CN/Tutorial/SetupNniDeveloperEnvironment.md @@ -4,7 +4,7 @@ ## 调试 NNI 源代码的最佳实践 -要调试 NNI 源代码,需要 Ubuntu 16.04 或更高版本系统的开发环境,并需要安装 Python 3.x 以及 pip3,然后遵循以下步骤。 +要调试 NNI 源代码,需要 Ubuntu 16.04 或更高版本系统的开发环境,并需要安装 Python 3 以及 pip 3,然后遵循以下步骤。 **1. 克隆源代码** @@ -57,4 +57,4 @@ Trial 启动 Experiment 来检查环境。 例如,运行命令 * * * -最后,希望一切顺利。 参考[贡献](./Contributing.md)文档,来了解更多创建拉取请求或问题的指南。 \ No newline at end of file +最后,希望一切顺利。 参考[贡献](Contributing.md)文档,来了解更多创建拉取请求或问题的指南。 \ No newline at end of file diff --git a/docs/zh_CN/Tutorial/WebUI.md b/docs/zh_CN/Tutorial/WebUI.md new file mode 100644 index 0000000000..ecf9b3b306 --- /dev/null +++ b/docs/zh_CN/Tutorial/WebUI.md @@ -0,0 +1,100 @@ +# Web 界面 + +## 查看概要页面 + +点击标签 "Overview"。 + +* 查看 Experiment Trial 配置、搜索空间以及结果好的 Trial。 + +![](../../img/webui-img/over1.png) ![](../../img/webui-img/over2.png) + +* 如果 Experiment 包含了较多 Trial,可改变刷新间隔。 + +![](../../img/webui-img/refresh-interval.png) + +* 支持查看并下载 Experiment 结果,以及 NNI Manager、Dispatcher 的日志文件。 + +![](../../img/webui-img/download.png) + +* 如果 Experiment 状态为 ERROR,可点击图标,查看 Experiment 错误日志。 + +![](../../img/webui-img/log-error.png) ![](../../img/webui-img/review-log.png) + +* 点击 "Feedback" 反馈问题。 + +## 查看任务默认指标 + +* 点击 "Default Metric" 来查看所有 Trial 的点图。 悬停鼠标来查看默认指标和搜索空间信息。 + +![](../../img/webui-img/default-metric.png) + +* 点击开关 "optimization curve" 来查看 Experiment 的优化曲线。 + +![](../../img/webui-img/best-curve.png) + +## 查看超参 + +点击 "Hyper Parameter" 标签查看图像。 + +* 可选择百分比查看最好的 Trial。 +* 选择两个轴来交换位置。 + +![](../../img/hyperPara.png) + +## 查看 Trial 运行时间 + +点击 "Trial Duration" 标签来查看柱状图。 + +![](../../img/trial_duration.png) + +## 查看 Trial 中间结果 + +单击 "Intermediate Result" 标签查看折线图。 + +![](../../img/webui-img/trials_intermeidate.png) + +由于训练中可能有非常多的中间结果,因此中间结果图提供了过滤功能。 如果要使用过滤按钮查看部分 Trial,则需要提供数据。 + +第一个输入框应该填入什么? 可能会发现一个 Trial 的中间结果点变得更好或者更差。 换句话说,这可能是非常重要的中间结果点。 只需将其输入第一个输入框中。 + +选择了中间结果序号后,要输入需要了解的该中间结果序号的指标范围。 即其最小值和最大值。 如此图中,中间结果点为 9,指标范围为 60 至 80。 + +Trial 中指标范围在 20 至 60 的 13 个结果就被过滤掉了。 + +![](../../img/webui-img/filter-intermediate.png) + +## 查看 Trial 状态 + +点击 "Trials Detail" 标签查看所有 Trial 的状态。 包括: + +* Trial 详情:Trial 的 id,持续时间,开始时间,结束时间,状态,精度和搜索空间。 + +![](../../img/webui-img/detail-local.png) + +* "Add column" 按钮可选择在表格中显示的列。 如果 Experiment 的最终结果是 dict,则可以在表格中查看其它键。 可选择 "Intermediate count" 列来查看 Trial 进度。 + +![](../../img/webui-img/addColumn.png) + +* 如果要比较某些 Trial,可选择并点击 "Compare" 来查看结果。 + +![](../../img/webui-img/select-trial.png) ![](../../img/webui-img/compare.png) + +* 支持通过 id,状态,Trial 编号, 以及参数来搜索。 + +![](../../img/webui-img/search-trial.png) + +* 可使用 "Copy as python" 按钮来拷贝 Trial 的参数。 + +![](../../img/webui-img/copyParameter.png) + +* 如果在 OpenPAI 或 Kubeflow 平台上运行,还可以看到 hdfsLog。 + +![](../../img/webui-img/detail-pai.png) + +* 中间结果图:可在此图中通过点击 operation 中的按钮来查看默认和其它键值。 + +![](../../img/webui-img/intermediate-btn.png) ![](../../img/webui-img/intermediate.png) + +* Kill: 可终止正在运行的任务。 + +![](../../img/webui-img/kill-running.png) ![](../../img/webui-img/canceled.png) \ No newline at end of file diff --git a/docs/zh_CN/Tutorials.rst b/docs/zh_CN/Tutorials.rst deleted file mode 100644 index fd9f7bd153..0000000000 --- a/docs/zh_CN/Tutorials.rst +++ /dev/null @@ -1,16 +0,0 @@ -###################### -教程 -###################### - -.. toctree:: - :maxdepth: 2 - - 安装 - 实现 Trial - Tuner - Assessor - Web 界面 - 训练平台 - 如何使用 Docker - 高级功能 - 如何调试 \ No newline at end of file diff --git a/docs/zh_CN/WebUI.md b/docs/zh_CN/WebUI.md deleted file mode 100644 index 6f256253f4..0000000000 --- a/docs/zh_CN/WebUI.md +++ /dev/null @@ -1,78 +0,0 @@ -# Web 界面 - -## 查看概要页面 - -点击标签 "Overview"。 - -* 查看 Experiment 的配置和搜索空间内容。 -* 支持下载 Experiment 结果。 -* 支持导出 nni-manager 和 dispatcher 的日志文件。 -* 如果有任何问题,可以点击 “Feedback” 告诉我们。 -* 如果 Experiment 包含了超过 1000 个 Trial,可改变刷新间隔。 - -![](../img/webui-img/over1.png) - -* 查看最好结果的 Trial。 - -![](../img/webui-img/over2.png) - -## 查看任务默认指标 - -点击 "Default Metric" 来查看所有 Trial 的点图。 悬停鼠标来查看默认指标和搜索空间信息。 - -![](../img/accuracy.png) - -## 查看超参 - -点击 "Hyper Parameter" 标签查看图像。 - -* 可选择百分比查看最好的 Trial。 -* 选择两个轴来交换位置。 - -![](../img/hyperPara.png) - -## 查看 Trial 运行时间 - -点击 "Trial Duration" 标签来查看柱状图。 - -![](../img/trial_duration.png) - -## 查看 Trial 中间结果 - -单击 "Intermediate Result" 标签查看折线图。 - -![](../img/webui-img/trials_intermeidate.png) - -该图有筛选功能。 点击筛选按钮, 在第一个输入框中输入关注点的序号, 在第二个输入框中输入中间结果的范围,选出需要的数据。 - -![](../img/webui-img/filter_intermediate.png) - -## 查看 Trial 状态 - -点击 "Trials Detail" 标签查看所有 Trial 的状态。 特别是: - -* Trial 详情:Trial 的 id,持续时间,开始时间,结束时间,状态,精度和搜索空间。 - -![](../img/webui-img/detail-local.png) - -* "Add column" 按钮可选择在表格中显示的列。 如果 Experiment 的最终结果是 dict,则可以在表格中查看其它键。 - -![](../img/webui-img/addColumn.png) - -* 如果要比较某些 Trial,可选择并点击 "Compare" 来查看结果。 - -![](../img/webui-img/compare.png) - -* 可使用 "Copy as python" 按钮来拷贝 Trial 的参数。 - -![](../img/webui-img/copyParameter.png) - -* 如果在 OpenPAI 或 Kubeflow 平台上运行,还可以看到 hdfsLog。 - -![](../img/webui-img/detail-pai.png) - -* Kill: 可终止正在运行的任务。 -* 支持搜索某个特定的 Trial。 -* Intermediate Result Graph: 可看到图中默认和其它的键值。 - -![](../img/webui-img/intermediate.png) \ No newline at end of file diff --git a/docs/zh_CN/advanced.rst b/docs/zh_CN/advanced.rst index 69bf8e0cf4..bd5c8e1112 100644 --- a/docs/zh_CN/advanced.rst +++ b/docs/zh_CN/advanced.rst @@ -2,6 +2,6 @@ ===================== .. toctree:: - 多阶段 - 高级网络架构搜索 - NAS 编程接口 \ No newline at end of file + 多阶段<./AdvancedFeature/MultiPhase> + 高级网络架构搜索<./AdvancedFeature/AdvancedNas> + NAS 编程接口<./AdvancedFeature/GeneralNasInterfaces> \ No newline at end of file diff --git a/docs/zh_CN/assessors.rst b/docs/zh_CN/assessors.rst index 2c2829c8aa..d00daf5eb8 100644 --- a/docs/zh_CN/assessors.rst +++ b/docs/zh_CN/assessors.rst @@ -15,5 +15,5 @@ Assessor 从 Trial 中接收中间结果,并通过指定的算法决定此 Tri .. toctree:: :maxdepth: 2 - 内置 Assessor - 自定义 Assessor + 内置 Assessor + 自定义 Assessor diff --git a/docs/zh_CN/builtin_assessor.rst b/docs/zh_CN/builtin_assessor.rst index ccefc47f00..a2df8f36c0 100644 --- a/docs/zh_CN/builtin_assessor.rst +++ b/docs/zh_CN/builtin_assessor.rst @@ -4,6 +4,6 @@ .. toctree:: :maxdepth: 1 - 介绍 - Medianstop - Curvefitting \ No newline at end of file + 概述<./Assessor/BuiltinAssessor> + Medianstop<./Assessor/MedianstopAssessor> + Curvefitting(曲线拟合)<./Assessor/CurvefittingAssessor> \ No newline at end of file diff --git a/docs/zh_CN/builtin_tuner.rst b/docs/zh_CN/builtin_tuner.rst index b384f82c26..c4055cfd7d 100644 --- a/docs/zh_CN/builtin_tuner.rst +++ b/docs/zh_CN/builtin_tuner.rst @@ -4,15 +4,16 @@ .. toctree:: :maxdepth: 1 - 介绍 - TPE - Random Search - Anneal - Naive Evolution - SMAC - Batch Tuner - Grid Search - Hyperband - Network Morphism - Metis Tuner - BOHB \ No newline at end of file + 概述 + TPE + Random Search(随机搜索) + Anneal(退火) + Naïve Evolution(朴素进化) + SMAC + Metis Tuner + Batch Tuner(批处理) + Grid Search(遍历) + GP Tuner + Network Morphism + Hyperband + BOHB diff --git a/docs/zh_CN/contribution.rst b/docs/zh_CN/contribution.rst index 227aa22c03..32f84f2dce 100644 --- a/docs/zh_CN/contribution.rst +++ b/docs/zh_CN/contribution.rst @@ -3,5 +3,5 @@ ############################### .. toctree:: - 设置开发环境 - 贡献指南 \ No newline at end of file + 设置开发环境<./Tutorial/SetupNniDeveloperEnvironment> + 贡献指南<./Tutorial/Contributing> \ No newline at end of file diff --git a/docs/zh_CN/curvefittingAssessor.md b/docs/zh_CN/curvefittingAssessor.md deleted file mode 100644 index 65a1d1ef9a..0000000000 --- a/docs/zh_CN/curvefittingAssessor.md +++ /dev/null @@ -1,72 +0,0 @@ -# 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 diff --git a/docs/zh_CN/evolutionTuner.md b/docs/zh_CN/evolutionTuner.md deleted file mode 100644 index 4b8ab7ef83..0000000000 --- a/docs/zh_CN/evolutionTuner.md +++ /dev/null @@ -1,5 +0,0 @@ -# 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 diff --git a/docs/zh_CN/examples.rst b/docs/zh_CN/examples.rst index 95437431c1..6958f07e6a 100644 --- a/docs/zh_CN/examples.rst +++ b/docs/zh_CN/examples.rst @@ -5,8 +5,8 @@ .. toctree:: :maxdepth: 2 - MNIST - Cifar10 - Scikit-learn - EvolutionSQuAD - GBDT + MNIST<./TrialExample/MnistExamples> + Cifar10<./TrialExample/Cifar10Examples> + Scikit-learn<./TrialExample/SklearnExamples> + EvolutionSQuAD<./TrialExample/SquadEvolutionExamples> + GBDT<./TrialExample/GbdtExample> diff --git a/docs/zh_CN/gridsearchTuner.md b/docs/zh_CN/gridsearchTuner.md deleted file mode 100644 index fd8fbd51c9..0000000000 --- a/docs/zh_CN/gridsearchTuner.md +++ /dev/null @@ -1,5 +0,0 @@ -# Grid Search - -## Grid Search(遍历搜索) - -Grid Search 会穷举定义在搜索空间文件中的所有超参组合。 注意,搜索空间仅支持 `choice`, `quniform`, `qloguniform`。 `quniform` 和 `qloguniform` 中的 **数字 `q` 有不同的含义(与[搜索空间](SearchSpaceSpec.md)说明不同)。 这里的意义是在 `low` 和 `high` 之间均匀取值的数量。

    \ No newline at end of file diff --git a/docs/zh_CN/hyperbandAdvisor.md b/docs/zh_CN/hyperbandAdvisor.md deleted file mode 100644 index 8fe96752b1..0000000000 --- a/docs/zh_CN/hyperbandAdvisor.md +++ /dev/null @@ -1,56 +0,0 @@ -# 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 能够控制其运行的时间。

    - -对于 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 diff --git a/docs/zh_CN/hyperoptTuner.md b/docs/zh_CN/hyperoptTuner.md deleted file mode 100644 index 8eec53e3b7..0000000000 --- a/docs/zh_CN/hyperoptTuner.md +++ /dev/null @@ -1,13 +0,0 @@ -# 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 diff --git a/docs/zh_CN/index.rst b/docs/zh_CN/index.rst index a8bcca6c60..65e2314a77 100644 --- a/docs/zh_CN/index.rst +++ b/docs/zh_CN/index.rst @@ -12,11 +12,11 @@ Neural Network Intelligence(NNI)文档 :titlesonly: 概述 - 入门 + 入门 教程 示例 参考 - 常见问答 + FAQ 贡献 更改日志 - 社区经验分享 + 社区分享 diff --git a/docs/zh_CN/medianstopAssessor.md b/docs/zh_CN/medianstopAssessor.md deleted file mode 100644 index 86f6f3b48b..0000000000 --- a/docs/zh_CN/medianstopAssessor.md +++ /dev/null @@ -1,5 +0,0 @@ -# Medianstop Assessor - -## Median Stop - -Medianstop 是一种简单的提前终止 Trial 的策略,可参考[论文](https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/46180.pdf)。 如果 Trial X 的在步骤 S 的最好目标值比所有已完成 Trial 的步骤 S 的中位数值明显要低,这个 Trial 就会被提前停止。 \ No newline at end of file diff --git a/docs/zh_CN/nni_practice_sharing.rst b/docs/zh_CN/nni_practice_sharing.rst deleted file mode 100644 index 4ccec032cd..0000000000 --- a/docs/zh_CN/nni_practice_sharing.rst +++ /dev/null @@ -1,10 +0,0 @@ -################# -教程 -################# - -分享使用 NNI 来调优模型和系统的经验 - -.. toctree:: - :maxdepth: 2 - - 在 NNI 上调优 Recommenders 的 SVD \ No newline at end of file diff --git a/docs/zh_CN/reference.rst b/docs/zh_CN/reference.rst index 1a347a1fbd..4ba1ca2e3f 100644 --- a/docs/zh_CN/reference.rst +++ b/docs/zh_CN/reference.rst @@ -4,9 +4,9 @@ .. toctree:: :maxdepth: 3 - 命令行 + 命令行 Python API - Annotation - 配置 - 搜索空间 - 实现训练平台 + Annotation + 配置 + 搜索空间 + 实现训练平台 diff --git a/docs/zh_CN/sdk_reference.rst b/docs/zh_CN/sdk_reference.rst index 0681a30ca8..8147fa598f 100644 --- a/docs/zh_CN/sdk_reference.rst +++ b/docs/zh_CN/sdk_reference.rst @@ -8,6 +8,8 @@ Trial(尝试) .. autofunction:: nni.get_current_parameter .. autofunction:: nni.report_intermediate_result .. autofunction:: nni.report_final_result +.. autofunction:: nni.get_experiment_id +.. autofunction:: nni.get_trial_id .. autofunction:: nni.get_sequence_id diff --git a/docs/zh_CN/smacTuner.md b/docs/zh_CN/smacTuner.md deleted file mode 100644 index a350717f87..0000000000 --- a/docs/zh_CN/smacTuner.md +++ /dev/null @@ -1,7 +0,0 @@ -# SMAC Tuner - -## SMAC - -[SMAC](https://www.cs.ubc.ca/~hutter/papers/10-TR-SMAC.pdf) 基于 Sequential Model-Based Optimization (SMBO). 它利用使用过的结果好的模型(高斯随机过程模型),并将随机森林引入到 SMBO 中,来处理分类参数。 NNI 的 SMAC 通过包装 [SMAC3](https://github.com/automl/SMAC3) 来支持。 - -NNI 中的 SMAC 只支持部分类型的[搜索空间](SearchSpaceSpec.md),包括`choice`, `randint`, `uniform`, `loguniform`, `quniform(q=1)`。 \ No newline at end of file diff --git a/docs/zh_CN/training_services.rst b/docs/zh_CN/training_services.rst index fff6244c7a..9df2adc364 100644 --- a/docs/zh_CN/training_services.rst +++ b/docs/zh_CN/training_services.rst @@ -2,8 +2,8 @@ NNI 支持的训练平台介绍 ===================================== .. toctree:: - 本机 - 远程 - OpenPAI - Kubeflow - FrameworkController \ No newline at end of file + 本机<./TrainingService/LocalMode> + 远程<./TrainingService/RemoteMachineMode> + OpenPAI<./TrainingService/PaiMode> + Kubeflow<./TrainingService/KubeflowMode> + FrameworkController<./TrainingService/FrameworkControllerMode> \ No newline at end of file diff --git a/docs/zh_CN/tuners.rst b/docs/zh_CN/tuners.rst index 1c9d872bc6..a60e70b34d 100644 --- a/docs/zh_CN/tuners.rst +++ b/docs/zh_CN/tuners.rst @@ -13,6 +13,6 @@ Tuner 从 Trial 接收指标结果,来评估一组超参或网络结构的性 .. toctree:: :maxdepth: 2 - 内置 Tuner - 自定义 Tuner - 自定义 Advisor \ No newline at end of file + 内置 Tuner + 自定义 Tuner + 自定义 Advisor diff --git a/docs/zh_CN/tutorials.rst b/docs/zh_CN/tutorials.rst index fd9f7bd153..7e96972c3f 100644 --- a/docs/zh_CN/tutorials.rst +++ b/docs/zh_CN/tutorials.rst @@ -5,12 +5,13 @@ .. toctree:: :maxdepth: 2 - 安装 - 实现 Trial + 安装 + 实现 Trial<./TrialExample/Trials> Tuner Assessor - Web 界面 + Web 界面 训练平台 - 如何使用 Docker + 如何使用 Docker 高级功能 - 如何调试 \ No newline at end of file + 如何调试 + Windows 中使用 NNI \ No newline at end of file diff --git a/examples/trials/auto-feature-engineering/README_zh_CN.md b/examples/trials/auto-feature-engineering/README_zh_CN.md new file mode 100644 index 0000000000..55b50217cd --- /dev/null +++ b/examples/trials/auto-feature-engineering/README_zh_CN.md @@ -0,0 +1,8 @@ +**NNI 中的自动特征工程** +=== + +此[示例](https://github.com/SpongebBob/tabular_automl_NNI)在 NNI 中实现了自动特征工程。 + +代码来自于贡献者。 谢谢可爱的贡献者! + +欢迎越来越多的人加入我们! \ No newline at end of file diff --git a/test/naive_test/README_zh_CN.md b/test/naive_test/README_zh_CN.md index 9fe1e1da8f..58c103ff00 100644 --- a/test/naive_test/README_zh_CN.md +++ b/test/naive_test/README_zh_CN.md @@ -17,4 +17,4 @@ * 使用了私有 API 来检测是否 Tuner 和 Assessor 成功结束。 * RESTful 服务的输出未测试。 -* 远程计算机训练服务没有测试。 \ No newline at end of file +* 远程计算机训练平台没有被测试。 \ No newline at end of file diff --git a/tools/nni_annotation/README_zh_CN.md b/tools/nni_annotation/README_zh_CN.md index a274eafff3..17076724c0 100644 --- a/tools/nni_annotation/README_zh_CN.md +++ b/tools/nni_annotation/README_zh_CN.md @@ -27,7 +27,7 @@ NNI 中,有 4 种类型的 Annotation; **参数** -- **sampling_algo**: 指定搜索空间的采样算法。 可将其换成 NNI 支持的其它采样函数,函数要以 `nni.` 开头。例如,`choice` 或 `uniform`,详见 [SearchSpaceSpec](https://nni.readthedocs.io/zh/latest/SearchSpaceSpec.html)。 +- **sampling_algo**: 指定搜索空间的采样算法。 可将其换成 NNI 支持的其它采样函数,函数要以 `nni.` 开头。例如,`choice` 或 `uniform`,详见 [SearchSpaceSpec](https://nni.readthedocs.io/zh/latest/Tutorial/SearchSpaceSpec.html)。 - **name**: 将被赋值的变量名称。 注意,此参数应该与下面一行等号左边的值相同。 NNI 支持如下 10 种类型来表示搜索空间: @@ -72,10 +72,10 @@ h_pooling = max_pool(hidden_layer, pool_size) `'''@nni.report_intermediate_result(metrics)'''` -`@nni.report_intermediate_result` 用来返回中间结果,这和 [Trials.md](https://nni.readthedocs.io/zh/latest/Trials.html) 中的 `nni.report_intermediate_result` 用法一样。 +`@nni.report_intermediate_result` 用来返回中间结果,这和[在 NNI 上实现 Trial](https://nni.readthedocs.io/zh/latest/TrialExample/Trials.html) 中 `nni.report_intermediate_result` 的用法一样。 ### 4. 最终结果 `'''@nni.report_final_result(metrics)'''` -`@nni.report_final_result` 用来返回当前 Trial 的最终结果,这和 [Trials.md](https://nni.readthedocs.io/zh/latest/Trials.html) 中的 `nni.report_final_result` 用法一样。 \ No newline at end of file +`@nni.report_final_result` 用来返回当前 Trial 的最终结果,这和[在 NNI 上实现 Trial](https://nni.readthedocs.io/zh/latest/TrialExample/Trials.html) 中的 `nni.report_final_result` 用法一样。 \ No newline at end of file
    drawing