Unverified Commit 346721be authored by kvartet's avatar kvartet Committed by GitHub
Browse files

Update Chinese translation (#3413)

parent b122c63d
...@@ -28,7 +28,7 @@ NNI API ...@@ -28,7 +28,7 @@ NNI API
"learning_rate":{"_type":"uniform","_value":[0.0001, 0.1]} "learning_rate":{"_type":"uniform","_value":[0.0001, 0.1]}
} }
参考 `SearchSpaceSpec.md <../Tutorial/SearchSpaceSpec.rst>`__ 进一步了解搜索空间。 Tuner 会根据搜索空间来生成配置,即从每个超参的范围中选一个值。 参考 `SearchSpaceSpec.rst <../Tutorial/SearchSpaceSpec.rst>`__ 进一步了解搜索空间。 Tuner 会根据搜索空间来生成配置,即从每个超参的范围中选一个值。
第二步:更新模型代码 第二步:更新模型代码
^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^
...@@ -80,7 +80,7 @@ NNI API ...@@ -80,7 +80,7 @@ NNI API
参考 `这里 <../Tutorial/ExperimentConfig.rst>`__ 进一步了解如何配置 Experiment。 参考 `这里 <../Tutorial/ExperimentConfig.rst>`__ 进一步了解如何配置 Experiment。
参考 `这里 </sdk_reference.html>`__ ,了解更多 NNI API (例如:``nni.get_sequence_id()``)。 参考 `这里 <../sdk_reference.rst>`__ ,了解更多 NNI API (例如:``nni.get_sequence_id()``)。
:raw-html:`<a name="nni-annotation"></a>` :raw-html:`<a name="nni-annotation"></a>`
...@@ -159,14 +159,15 @@ NNI 支持独立模式,使 Trial 代码无需启动 NNI 实验即可运行。 ...@@ -159,14 +159,15 @@ NNI 支持独立模式,使 Trial 代码无需启动 NNI 实验即可运行。
.. code-block:: python .. code-block:: python
# 注意:请为 Trial 代码中的超参分配默认值 #注意:请为 Trial 代码中的超参分配默认值
nni.report_final_result # 已在 stdout 上打印日志,但不报告 nni.get_next_parameter # 返回 {}
nni.report_intermediate_result # 已在 stdout 上打印日志,但不报告 nni.report_final_result #已在 stdout 上打印日志,但不报告
nni.report_intermediate_result # #已在 stdout 上打印日志,但不报告
nni.get_experiment_id # 返回 "STANDALONE" nni.get_experiment_id # 返回 "STANDALONE"
nni.get_trial_id # 返回 "STANDALONE" nni.get_trial_id # 返回 "STANDALONE"
nni.get_sequence_id # 返回 0 nni.get_sequence_id # 返回 0
可使用 :githublink:`mnist 示例 <examples/trials/mnist-tfv1>` 来尝试独立模式。 只需在代码目录下运行 ``python3 mnist.py``。 Trial 代码会使用默认超参成功运行。 可使用 :githublink:`mnist 示例 <examples/trials/mnist-pytorch>` 来尝试独立模式。 只需在代码目录下运行 ``python3 mnist.py``。 Trial 代码会使用默认超参成功运行。
更多调试的信息,可参考 `How to Debug <../Tutorial/HowToDebug.rst>`__。 更多调试的信息,可参考 `How to Debug <../Tutorial/HowToDebug.rst>`__。
......
...@@ -52,9 +52,11 @@ BOHB 的 BO 与 TPE 非常相似, 它们的主要区别是: BOHB 中使用一个 ...@@ -52,9 +52,11 @@ BOHB 的 BO 与 TPE 非常相似, 它们的主要区别是: BOHB 中使用一个
.. image:: ../../img/bohb_6.jpg .. image:: ../../img/bohb_6.jpg
:target: ../../img/bohb_6.jpg :target: ../../img/bohb_6.jpg
:alt:
以上这张图展示了 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)模型将用于指导下一个循环的参数选择。 以上这张图展示了 BOHB 的工作流程。 将每次训练的最大资源配置(max_budget)设为 9,最小资源配置设为(min_budget)1,逐次减半比例(eta)设为 3,其他的超参数为默认值。 那么在这个例子中,s_max 计算的值为 2, 所以会持续地进行 {s=2, s=1, s=0, s=2, s=1, s=0, ...} 的循环。 在“逐次减半”(SuccessiveHalving)算法的每一个阶段,即图中橙色框,都将选取表现最好的前 1/eta 个参数,并在赋予更多计算资源(budget)的情况下运行。不断重复“逐次减半” (SuccessiveHalving)过程,直到这个循环结束。 同时,收集这些试验的超参数组合,使用了计算资源(budget)和其表现(metrics),使用这些数据来建立一个以使用了多少计算资源(budget)为维度的多维核密度估计(KDE)模型。
这个多维的核密度估计(KDE)模型将用于指导下一个循环的参数选择。
有关如何使用多维的 KDE 模型来指导参数选择的采样规程,用以下伪代码来描述。 有关如何使用多维的 KDE 模型来指导参数选择的采样规程,用以下伪代码来描述。
...@@ -71,7 +73,7 @@ BOHB advisor 需要安装 `ConfigSpace <https://github.com/automl/ConfigSpace>`_ ...@@ -71,7 +73,7 @@ BOHB advisor 需要安装 `ConfigSpace <https://github.com/automl/ConfigSpace>`_
.. code-block:: bash .. code-block:: bash
nnictl package install --name=BOHB pip install nni[BOHB]
要使用 BOHB,需要在 Experiment 的 YAML 配置文件进行如下改动: 要使用 BOHB,需要在 Experiment 的 YAML 配置文件进行如下改动:
...@@ -120,7 +122,7 @@ Advisor 有大量的文件、函数和类。 这里只简单介绍最重要的 ...@@ -120,7 +122,7 @@ Advisor 有大量的文件、函数和类。 这里只简单介绍最重要的
------------- -------------
BOHB 在 MNIST 数据集上的表现 BOHB 在 MNIST 数据集上的表现
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
源码地址: :githublink:`examples/trials/mnist-advisor <examples/trials/>` 源码地址: :githublink:`examples/trials/mnist-advisor <examples/trials/>`
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
* - `Naïve Evolution(朴素进化) <#Evolution>`__ * - `Naïve Evolution(朴素进化) <#Evolution>`__
- Naïve Evolution(朴素进化算法)来自于 Large-Scale Evolution of Image Classifiers。 它会基于搜索空间随机生成一个种群。 在每一代中,会选择较好的结果,并对其下一代进行一些变异(例如,改动一个超参,增加或减少一层)。 朴素进化算法需要很多次的 Trial 才能有效,但它也非常简单,也很容易扩展新功能。 `参考论文 <https://arxiv.org/pdf/1703.01041.pdf>`__ - Naïve Evolution(朴素进化算法)来自于 Large-Scale Evolution of Image Classifiers。 它会基于搜索空间随机生成一个种群。 在每一代中,会选择较好的结果,并对其下一代进行一些变异(例如,改动一个超参,增加或减少一层)。 朴素进化算法需要很多次的 Trial 才能有效,但它也非常简单,也很容易扩展新功能。 `参考论文 <https://arxiv.org/pdf/1703.01041.pdf>`__
* - `SMAC <#SMAC>`__ * - `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>`__ `代码仓库 <https://github.com/automl/SMAC3>`__ - SMAC 基于 Sequential Model-Based Optimization (SMBO,即序列的基于模型优化方法)。 它会利用使用过的突出的模型(高斯随机过程模型),并将随机森林引入到SMBO中,来处理分类参数。 SMAC 算法包装了 Github 的 SMAC3。 注意:SMAC 需要通过 ``pip install nni[SMAC]`` 命令来安装。 `参考论文 <https://www.cs.ubc.ca/~hutter/papers/10-TR-SMAC.pdf>`__ `代码仓库 <https://github.com/automl/SMAC3>`__
* - `Batch tuner(批处理) <#Batch>`__ * - `Batch tuner(批处理) <#Batch>`__
- Batch Tuner 能让用户简单的提供几组配置(如,超参选项的组合)。 当所有配置都完成后,Experiment 即结束。 Batch Tuner 仅支持 choice 类型。 - Batch Tuner 能让用户简单的提供几组配置(如,超参选项的组合)。 当所有配置都完成后,Experiment 即结束。 Batch Tuner 仅支持 choice 类型。
* - `Grid Search(遍历) <#GridSearch>`__ * - `Grid Search(遍历) <#GridSearch>`__
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
要使用 NNI 内置的 Assessor,需要在 ``config.yml`` 文件中添加 **builtinAssessorName** 和 **classArgs**。 本部分中,将介绍每个 Tuner 的用法和建议场景、参数要求,并提供配置示例。 要使用 NNI 内置的 Assessor,需要在 ``config.yml`` 文件中添加 **builtinAssessorName** 和 **classArgs**。 本部分中,将介绍每个 Tuner 的用法和建议场景、参数要求,并提供配置示例。
注意:参考样例中的格式来创建新的 ``config.yml`` 文件。 一些内置 Tuner 还需要通过 ``nnictl package`` 命令先安装,如 SMAC。 注意:参考样例中的格式来创建新的 ``config.yml`` 文件。 一些内置 Tuner 因为依赖问题需要使用 ``pip install nni[<tuner>]`` 来安装,比如使用 ``pip install nni[SMAC]`` 来安装 SMAC。
:raw-html:`<a name="TPE"></a>` :raw-html:`<a name="TPE"></a>`
...@@ -71,7 +71,7 @@ TPE 是一种黑盒优化方法,可以使用在各种场景中,通常情况 ...@@ -71,7 +71,7 @@ TPE 是一种黑盒优化方法,可以使用在各种场景中,通常情况
**classArgs 要求:** **classArgs 要求:**
* **optimize_mode** (*maximize 或 minimize, 可选项, 默认值为 maximize*) - 如果为 'maximize',表示 Tuner 会试着最大化指标。 如果为 'minimize',表示 Tuner 的目标是将指标最小化。 * **optimize_mode** (*maximize 或 minimize, 可选项, 默认值为 maximize*\ ) - 如果为 'maximize',表示 Tuner 会试着最大化指标。 如果为 'minimize',表示 Tuner 的目标是将指标最小化。
注意:为实现大规模并发 Trial,TPE 的并行性得到了优化。 有关优化原理或开启优化,参考 `TPE 文档 <./HyperoptTuner.rst>`__。 注意:为实现大规模并发 Trial,TPE 的并行性得到了优化。 有关优化原理或开启优化,参考 `TPE 文档 <./HyperoptTuner.rst>`__。
...@@ -128,7 +128,7 @@ Anneal(退火算法) ...@@ -128,7 +128,7 @@ Anneal(退火算法)
**classArgs 要求:** **classArgs 要求:**
* **optimize_mode** (*maximize 或 minimize, 可选项, 默认值为 maximize*) - 如果为 'maximize',表示 Tuner 会试着最大化指标。 如果为 'minimize',表示 Tuner 的目标是将指标最小化。 * **optimize_mode** (*maximize 或 minimize, 可选项, 默认值为 maximize*\ ) - 如果为 'maximize',表示 Tuner 会试着最大化指标。 如果为 'minimize',表示 Tuner 的目标是将指标最小化。
**配置示例:** **配置示例:**
...@@ -196,7 +196,7 @@ SMAC 在第一次使用前,必须用下面的命令先安装。 注意:SMAC ...@@ -196,7 +196,7 @@ SMAC 在第一次使用前,必须用下面的命令先安装。 注意:SMAC
.. code-block:: bash .. code-block:: bash
nnictl package install --name=SMAC pip install nni[SMAC]
**建议场景** **建议场景**
...@@ -306,7 +306,7 @@ Hyperband ...@@ -306,7 +306,7 @@ Hyperband
**classArgs 要求:** **classArgs 要求:**
* **optimize_mode** (*maximize 或 minimize, 可选项, 默认值为 maximize*) - 如果为 'maximize',表示 Tuner 会试着最大化指标。 如果为 'minimize',表示 Tuner 的目标是将指标最小化。 * **optimize_mode** (*maximize 或 minimize, 可选项, 默认值为 maximize*\ ) - 如果为 'maximize',表示 Tuner 会试着最大化指标。 如果为 'minimize',表示 Tuner 的目标是将指标最小化。
* **R** (*int, 可选, 默认为 60*),分配给 Trial 的最大资源(可以是 mini-batches 或 epochs 的数值)。 每个 Trial 都需要用 TRIAL_BUDGET 来控制运行的步数。 * **R** (*int, 可选, 默认为 60*),分配给 Trial 的最大资源(可以是 mini-batches 或 epochs 的数值)。 每个 Trial 都需要用 TRIAL_BUDGET 来控制运行的步数。
* **eta** (*int,可选,默认为 3*),``(eta-1)/eta`` 是丢弃 Trial 的比例。 * **eta** (*int,可选,默认为 3*),``(eta-1)/eta`` 是丢弃 Trial 的比例。
* **exec_mode** (*串行或并行,可选默认值是并行*\ ),如果是“并行”, Tuner 会尝试使用可用资源立即启动新的分组。 如果是“串行”, Tuner 只会在当前分组完成后启动新的分组。 * **exec_mode** (*串行或并行,可选默认值是并行*\ ),如果是“并行”, Tuner 会尝试使用可用资源立即启动新的分组。 如果是“串行”, Tuner 只会在当前分组完成后启动新的分组。
...@@ -417,7 +417,7 @@ BOHB advisor 需要安装 `ConfigSpace <https://github.com/automl/ConfigSpace>`_ ...@@ -417,7 +417,7 @@ BOHB advisor 需要安装 `ConfigSpace <https://github.com/automl/ConfigSpace>`_
.. code-block:: bash .. code-block:: bash
nnictl package install --name=BOHB pip install nni[BOHB]
**建议场景** **建议场景**
...@@ -512,7 +512,7 @@ PPO Tuner ...@@ -512,7 +512,7 @@ PPO Tuner
**建议场景** **建议场景**
PPO Tuner 是基于 PPO 算法的强化学习 Tuner。 PPOTuner 可用于使用 NNI NAS 接口进行的神经网络结构搜索。 一般来说,尽管 PPO 算法比其它强化学习算法效率更高,但强化学习算法需要更多的计算资源。 当有大量可用的计算资源时,才建议使用此 Tuner。 以在简单的任务上尝试,如 :githublink:`mnist-nas <examples/trials/mnist-nas>` 示例。 `查看详细信息 <./PPOTuner.rst>`__。 PPO Tuner 是基于 PPO 算法的强化学习 Tuner。 PPOTuner 可用于使用 NNI NAS 接口进行的神经网络结构搜索。 一般来说,尽管 PPO 算法比其它强化学习算法效率更高,但强化学习算法需要更多的计算资源。 当有大量可用的计算资源时,才建议使用此 Tuner。 以在简单的任务上尝试,如 :githublink:`mnist-nas <examples/nas/classic_nas>` 示例。 `查看详细信息 <./PPOTuner.rst>`__。
**classArgs 要求:** **classArgs 要求:**
...@@ -580,6 +580,6 @@ Population Based Training (PBT,基于种群的训练),将并扩展并行搜 ...@@ -580,6 +580,6 @@ Population Based Training (PBT,基于种群的训练),将并扩展并行搜
* 在Github 中 `提交此功能的 Bug <https://github.com/microsoft/nni/issues/new?template=bug-report.rst>`__ * 在Github 中 `提交此功能的 Bug <https://github.com/microsoft/nni/issues/new?template=bug-report.rst>`__
* 在Github 中 `提交新功能或请求改进 <https://github.com/microsoft/nni/issues/new?template=enhancement.rst>`__ * 在Github 中 `提交新功能或请求改进 <https://github.com/microsoft/nni/issues/new?template=enhancement.rst>`__
* 了解 NNI 中 `特征工程的更多信息 <../FeatureEngineering/Overview.rst>`__ * 了解 NNI 中 :githublink:`特征工程的更多信息 <docs/zh_CN/FeatureEngineering/Overview.rst>`
* 了解 NNI 中 `NAS 的更多信息 <../NAS/Overview.rst>`__ * 了解 NNI 中 :githublink:`NAS 的更多信息 <docs/zh_CN/NAS/Overview.rst>`
* 了解 NNI 中 `模型压缩的更多信息 <../Compression/Overview.rst>`__ * 了解 NNI 中 :githublink:`模型压缩的更多信息 <docs/zh_CN/Compression/Overview.rst>`
...@@ -17,7 +17,9 @@ Advisor 用于同时需要 Tuner 和 Assessor 方法的自动机器学习算法 ...@@ -17,7 +17,9 @@ Advisor 用于同时需要 Tuner 和 Assessor 方法的自动机器学习算法
def __init__(self, ...): def __init__(self, ...):
... ...
**2. 实现所有除了 ``handle_request`` 外的,以 ``handle_`` 前缀开始的方法**。 `此文档 </sdk_reference.html#nni.runtime.msg_dispatcher_base.MsgDispatcherBase>`__ 可帮助理解 ``MsgDispatcherBase``。 **2. 实现所有除了 "handle_request" 外的,以 "handle_" 前缀开始的方法**。
关于 ``MsgDispatcherBase`` 可以查询此 `文档 <../autotune_ref.rst#Advisor>`__ 。
**3. 在 Experiment 的 YAML 文件中配置好自定义的 Advisor** 。 **3. 在 Experiment 的 YAML 文件中配置好自定义的 Advisor** 。
......
...@@ -117,12 +117,12 @@ NNI 需要定位到自定义的 Tuner 类,并实例化它,因此需要指定 ...@@ -117,12 +117,12 @@ NNI 需要定位到自定义的 Tuner 类,并实例化它,因此需要指定
.. ..
* :githublink:`evolution-tuner <src/sdk/pynni/nni/evolution_tuner>` * :githublink:`evolution-tuner <nni/algorithms/hpo/evolution_tuner.py>`
* :githublink:`hyperopt-tuner <src/sdk/pynni/nni/hyperopt_tuner>` * :githublink:`hyperopt-tuner <nni/algorithms/hpo/hyperopt_tuner.py>`
* :githublink:`evolution-based-customized-tuner <examples/tuners/ga_customer_tuner>` * :githublink:`evolution-based-customized-tuner <examples/tuners/ga_customer_tuner>`
实现更高级的自动机器学习算法 实现更高级的自动机器学习算法
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
上述内容足够写出通用的 Tuner。 但有时可能需要更多的信息,例如,中间结果, Trial 的状态等等,从而能够实现更强大的自动机器学习算法。 因此,有另一个 ``Advisor`` 类,直接继承于 ``MsgDispatcherBase``,它在 :githublink:`src/sdk/pynni/nni/msg_dispatcher_base.py <src/sdk/pynni/nni/msg_dispatcher_base.py>` 。 参考 `这里 <CustomizeAdvisor.rst>`__ 来了解如何实现自定义的 Advisor。 上述内容足够写出通用的 Tuner。 但有时可能需要更多的信息,例如,中间结果, Trial 的状态等等,从而能够实现更强大的自动机器学习算法。 因此,有另一个 ``Advisor`` 类,直接继承于 ``MsgDispatcherBase``,它在 :githublink:`src/sdk/pynni/nni/msg_dispatcher_base.py <nni/runtime/msg_dispatcher_base.py>` 。 参考 `这里 <CustomizeAdvisor.rst>`__ 来了解如何实现自定义的 Advisor。
如何将自定义的 Tuner 安装为内置 Tuner
==================================================
参考下列步骤将自定义 Tuner: ``nni/examples/tuners/customized_tuner`` 安装为内置 Tuner。
准备安装源和安装包
-----------------------------------------------
有两种方法安装自定义的 Tuner:
方法 1: 从目录安装
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
步骤 1: 在 ``nni/examples/tuners/customized_tuner`` 目录下,运行:
``python setup.py develop``
此命令会将 ``nni/examples/tuners/customized_tuner`` 目录编译为 pip 安装源。
步骤 2: 运行命令
``nnictl package install ./``
方法 2: 从 whl 文件安装
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
步骤 1: 在 ``nni/examples/tuners/customized_tuner`` 目录下,运行:
``python setup.py bdist_wheel``
此命令会从 pip 安装源编译出 whl 文件。
步骤 2: 运行命令
``nnictl package install dist/demo_tuner-0.1-py3-none-any.whl``
检查安装的包
---------------------------
运行命令 ``nnictl package list``,可以看到已安装的 demotuner:
.. code-block:: bash
+-----------------+------------+-----------+--------=-------------+------------------------------------------+
| Name | Type | Installed | Class Name | Module Name |
+-----------------+------------+-----------+----------------------+------------------------------------------+
| demotuner | tuners | Yes | DemoTuner | demo_tuner |
+-----------------+------------+-----------+----------------------+------------------------------------------+
在 Experiment 中使用安装的 Tuner
-------------------------------------
可以像使用其它内置 Tuner 一样,在 Experiment 配置文件中使用 demotuner:
.. code-block:: yaml
tuner:
builtinTunerName: demotuner
classArgs:
#choice: maximize, minimize
optimize_mode: maximize
...@@ -6,7 +6,7 @@ Network Morphism Tuner ...@@ -6,7 +6,7 @@ Network Morphism Tuner
`Autokeras <https://arxiv.org/abs/1806.10282>`__ 是使用 Network Morphism 算法的流行的自动机器学习工具。 Autokeras 的基本理念是使用贝叶斯回归来预测神经网络架构的指标。 每次都会从父网络生成几个子网络。 然后使用朴素贝叶斯回归,从网络的历史训练结果来预测它的指标值。 接下来,会选择预测结果最好的子网络加入训练队列中。 `此代码 <https://github.com/jhfjhfj1/autokeras>`__ 的启发下,我们在 NNI 中实现了 Network Morphism 算法。 `Autokeras <https://arxiv.org/abs/1806.10282>`__ 是使用 Network Morphism 算法的流行的自动机器学习工具。 Autokeras 的基本理念是使用贝叶斯回归来预测神经网络架构的指标。 每次都会从父网络生成几个子网络。 然后使用朴素贝叶斯回归,从网络的历史训练结果来预测它的指标值。 接下来,会选择预测结果最好的子网络加入训练队列中。 `此代码 <https://github.com/jhfjhfj1/autokeras>`__ 的启发下,我们在 NNI 中实现了 Network Morphism 算法。
要了解 Network Morphism Trial 的用法,参考 :githublink:`这里 <examples/trials/network_morphism/README.md>` 要了解 Network Morphism Trial 的用法,参考 :githublink:`Readme <examples/trials/network_morphism/README.rst>`
2. 用法 2. 用法
-------- --------
...@@ -61,7 +61,7 @@ Network Morphism Tuner ...@@ -61,7 +61,7 @@ Network Morphism Tuner
# 1. 使用 NNI API # 1. 使用 NNI API
# WebUI 获得最佳模型 ID # WebUI 获得最佳模型 ID
# or 'nni-experiments/experiment_id/log/model_path/best_model.txt' # or `nni-experiments/experiment_id/log/model_path/best_model.txt'
# 从模型文件中读取 json 字符串,并用 NNI API 加载 # 从模型文件中读取 json 字符串,并用 NNI API 加载
with open("best-model.json") as json_file: with open("best-model.json") as json_file:
...@@ -237,20 +237,27 @@ Tuner 有大量的文件、函数和类。 这里简单介绍最重要的文件 ...@@ -237,20 +237,27 @@ Tuner 有大量的文件、函数和类。 这里简单介绍最重要的文件
* ``adj_list`` 是二维列表,是图的邻接表。 第一维是张量标识。 在每条边的列表中,元素是两元组(张量标识,层标识)。 * ``adj_list`` 是二维列表,是图的邻接表。 第一维是张量标识。 在每条边的列表中,元素是两元组(张量标识,层标识)。
* ``reverse_adj_list`` 是与 adj_list 格式一样的反向邻接列表。 * ``reverse_adj_list`` 是与 adj_list 格式一样的反向邻接列表。
* ``node_list`` 是一个整数列表。 列表的索引是标识。 * ``node_list`` 是一个整数列表。 列表的索引是标识。
* ``layer_list`` 是层的列表。 列表的索引是标识。 *
``layer_list`` 是层的列表。 列表的索引是标识。
* 对于 ``StubConv(StubConv1d, StubConv2d, StubConv3d)``,后面的数字表示节点的输入 id(或 id 列表),节点输出 idinput_channelfilterskernel_sizestride padding *
对于 ``StubConv(StubConv1d, StubConv2d, StubConv3d)``,后面的数字表示节点的输入 id(或 id 列表),节点输出 id,input_channel,filters,kernel_size,stride 和 padding。
* 对于 ``StubDense``,后面的数字表示节点的输入 id (或 id 列表),节点输出 idinput_units units *
对于 ``StubDense``,后面的数字表示节点的输入 id (或 id 列表),节点输出 id,input_units 和 units。
* 对于 ``StubBatchNormalization (StubBatchNormalization1d, StubBatchNormalization2d, StubBatchNormalization3d)``,后面的数字表示节点输入 id(或 id 列表),节点输出 id,和特征数量。 *
对于 ``StubBatchNormalization (StubBatchNormalization1d, StubBatchNormalization2d, StubBatchNormalization3d)``,后面的数字表示节点输入 id(或 id 列表),节点输出 id,和特征数量。
* 对于 ``StubDropout(StubDropout1d, StubDropout2d, StubDropout3d)``,后面的数字表示节点的输入 id (或 id 列表),节点的输出 id dropout 率。 *
对于 ``StubDropout(StubDropout1d, StubDropout2d, StubDropout3d)``,后面的数字表示节点的输入 id (或 id 列表),节点的输出 id 和 dropout 率。
* 对于 ``StubPooling (StubPooling1d, StubPooling2d, StubPooling3d)`` 后面的数字表示节点的输入 id(或 id 列表),节点输出 idkernel_size, stride padding *
对于 ``StubPooling (StubPooling1d, StubPooling2d, StubPooling3d)`` 后面的数字表示节点的输入 id(或 id 列表),节点输出 id,kernel_size, stride 和 padding。
* 对于其它层,后面的数字表示节点的输入 id(或 id 列表)以及节点的输出 id *
对于其它层,后面的数字表示节点的输入 id(或 id 列表)以及节点的输出 id。
5. TODO 5. TODO
------- -------
......
...@@ -52,14 +52,12 @@ ...@@ -52,14 +52,12 @@
-------------------------------- --------------------------------
* NNI 遵循 `PEP8 <https://www.python.org/dev/peps/pep-0008/>`__ 的 Python 代码命名约定。在提交拉取请求时,请尽量遵循此规范。 可通过``flake8`` 或 ``pylint`` 的提示工具来帮助遵循规范。 * NNI 遵循 `PEP8 <https://www.python.org/dev/peps/pep-0008/>`__ 的 Python 代码命名约定。在提交拉取请求时,请尽量遵循此规范。 可通过``flake8`` 或 ``pylint`` 的提示工具来帮助遵循规范。
* NNI 还遵循 `NumPy Docstring 风格 <https://www.sphinx-doc.org/en/master/usage/extensions/example_numpy.html#example-numpy>`__ 的 Python Docstring 命名方案。 Python API 使用了 `sphinx.ext.napoleon <https://www.sphinx-doc.org/en/master/usage/extensions/napoleon.html>`__ 来生成文档。 * NNI 还遵循 `NumPy Docstring 风格 <https://www.sphinx-doc.org/en/master/usage/extensions/example_numpy.html#example-numpy>`__ 的 Python Docstring 命名方案。 Python API 使用了 `sphinx.ext.napoleon <https://www.sphinx-doc.org/en/master/usage/extensions/napoleon.html>`__ 来 `生成文档 <Contributing.rst#documentation>`__
* 有关 docstrings,参考 `numpydoc docstring 指南 <https://numpydoc.readthedocs.io/en/latest/format.html>`__ 和 `pandas docstring 指南 <https://python-sprints.github.io/pandas/guide/pandas_docstring.html>`__ * 有关 docstrings,参考 `numpydoc docstring 指南 <https://numpydoc.readthedocs.io/en/latest/format.html>`__ 和 `pandas docstring 指南 <https://python-sprints.github.io/pandas/guide/pandas_docstring.html>`__
* 函数的 docstring, **description**, **Parameters**, 和 **Returns Yields** 是必需的。 * 函数的 docstring, **description**, **Parameters**, 和 **Returns Yields** 是必需的。
* 类的 docstring, **description**, **Attributes** 是必需的。 * 类的 docstring, **description**, **Attributes** 是必需的。
* 描述 ``dict`` 的 docstring 在超参格式描述中多处用到 * 描述 ``dict`` 的 docstring 在超参格式描述中多处用到,请参考 `写作标准的内部准则 <https://ribokit.github.io/docs/text/>`__ 。
* 参考 `RiboKit 文档写作准则 <https://ribokit.github.io/docs/text/>`__
文档 文档
------------- -------------
...@@ -73,4 +71,4 @@ ...@@ -73,4 +71,4 @@
* 图片需要通过嵌入的 HTML 语法来格式化,则需要使用绝对链接,如 ``https://user-images.githubusercontent.com/44491713/51381727-e3d0f780-1b4f-11e9-96ab-d26b9198ba65.png``。可以通过将图片拖拽到 `Github Issue <https://github.com/Microsoft/nni/issues/new>`__ 框中来生成这样的链接。 * 图片需要通过嵌入的 HTML 语法来格式化,则需要使用绝对链接,如 ``https://user-images.githubusercontent.com/44491713/51381727-e3d0f780-1b4f-11e9-96ab-d26b9198ba65.png``。可以通过将图片拖拽到 `Github Issue <https://github.com/Microsoft/nni/issues/new>`__ 框中来生成这样的链接。
* 如果不能被 sphinx 重新格式化,如源代码等,则需要使用绝对链接。 如果源码连接到本代码库,使用 ``https://github.com/Microsoft/nni/tree/master/`` 作为根目录 (例如 :githublink:`mnist.py <examples/trials/mnist-tfv1/mnist.py>` )。 * 如果不能被 sphinx 重新格式化,如源代码等,则需要使用绝对链接。 如果源码连接到本代码库,使用 ``https://github.com/Microsoft/nni/tree/master/`` 作为根目录 (例如 :githublink:`mnist.py <examples/trials/mnist-pytorch/mnist.py>` )。
...@@ -71,7 +71,7 @@ Experiment(实验)配置参考 ...@@ -71,7 +71,7 @@ Experiment(实验)配置参考
* `gpuIndices <#gpuindices-3>`__ * `gpuIndices <#gpuindices-3>`__
* `maxTrialNumPerGpu <#maxtrialnumpergpu-1>`__ * `maxTrialNumPerGpu <#maxtrialnumpergpu-1>`__
* `useActiveGpu <#useactivegpu-1>`__ * `useActiveGpu <#useactivegpu-1>`__
* `preCommand <#preCommand>`__ * `pythonPath <#pythonPath>`__
* `kubeflowConfig <#kubeflowconfig>`__ * `kubeflowConfig <#kubeflowconfig>`__
...@@ -252,7 +252,7 @@ maxExecDuration ...@@ -252,7 +252,7 @@ maxExecDuration
可选。 字符串。 默认值:999d。 可选。 字符串。 默认值:999d。
**maxExecDuration** 指定实验的最大执行时间。 时间单位为 {**s**\ ,** m**\ ,** h**\ ,** d**\ },其分别表示 {*秒*\ , *分钟*\ , *小时*\ , *天*\ }。 **maxExecDuration** 指定实验的最大执行时间。 时间单位为 {**s**\ , **m**\ , **h**\ , **d**\ },其分别表示 {*秒*\ , *分钟*\ , *小时*\ , *天*\ }。
注意:maxExecDuration 设置的是 Experiment 执行的时间,不是 Trial 的。 如果 Experiment 达到了设置的最大时间,Experiment 不会停止,但不会再启动新的 Trial 作业。 注意:maxExecDuration 设置的是 Experiment 执行的时间,不是 Trial 的。 如果 Experiment 达到了设置的最大时间,Experiment 不会停止,但不会再启动新的 Trial 作业。
...@@ -282,7 +282,7 @@ trainingServicePlatform ...@@ -282,7 +282,7 @@ trainingServicePlatform
必填。 字符串。 必填。 字符串。
指定运行 Experiment 的平台,包括 **local**\ ,** remote**\ ,** pai**\ ,** kubeflow**\ ,** frameworkcontroller**。 指定运行 Experiment 的平台,包括 **local**\ , **remote**\ , **pai**\ , **kubeflow**\ , **frameworkcontroller**。
* *
...@@ -363,7 +363,7 @@ tuner ...@@ -363,7 +363,7 @@ tuner
必填。 必填。
指定了 Experiment 的 Tuner 算法。有两种方法可设置 Tuner。 一种方法是使用 NNI SDK 提供的内置 Tuner,在这种情况下,需要设置 **builtinTunerName** 和 **classArgs**。 另一种方法,是使用用户自定义的 Tuner,需要设置 **codeDirectory**\ ,** classFileName**\ ,** className** 和 **classArgs**。 *必须选择其中的一种方式。* 指定了 Experiment 的 Tuner 算法。有两种方法可设置 Tuner。 一种方法是使用 NNI SDK 提供的内置 Tuner,在这种情况下,需要设置 **builtinTunerName** 和 **classArgs**。 另一种方法,是使用用户自定义的 Tuner,需要设置 **codeDirectory**\ , **classFileName**\ , **className** 和 **classArgs**。 *必须选择其中的一种方式。*
builtinTunerName builtinTunerName
^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^
...@@ -417,7 +417,7 @@ includeIntermediateResults ...@@ -417,7 +417,7 @@ includeIntermediateResults
assessor assessor
^^^^^^^^ ^^^^^^^^
指定 Assessor 算法以运行 Experiment。 与 Tuner 类似,有两种设置 Assessor 的方法。 一种方法是使用 NNI SDK 提供的 Assessor。 必填字段:builtinAssessorName 和 classArgs。 另一种方法,是使用用户自定义的 Assessor,需要设置 **codeDirectory**\ ,** classFileName**\ ,** className** 和 **classArgs**。 *必须选择其中的一种方式。* 指定 Assessor 算法以运行 Experiment。 与 Tuner 类似,有两种设置 Assessor 的方法。 一种方法是使用 NNI SDK 提供的 Assessor。 必填字段:builtinAssessorName 和 classArgs。 另一种方法,是使用用户自定义的 Assessor,需要设置 **codeDirectory**\ , **classFileName**\ , **className** 和 **classArgs**。 *必须选择其中的一种方式。*
默认情况下,未启用任何 Assessor。 默认情况下,未启用任何 Assessor。
...@@ -461,7 +461,7 @@ Advisor ...@@ -461,7 +461,7 @@ Advisor
可选。 可选。
指定 Experiment 中的 Advisor 算法。 与 Tuner 和 Assessor 类似,有两种指定 Advisor 的方法。 一种方法是使用 SDK 提供的 Advisor ,需要设置 **builtinAdvisorName** 和 **classArgs**。 另一种方法,是使用用户自定义的 Advisor ,需要设置 **codeDirectory**\ ,** classFileName**\ ,** className** 和 **classArgs**。 指定 Experiment 中的 Advisor 算法。 与 Tuner 和 Assessor 类似,有两种指定 Advisor 的方法。 一种方法是使用 SDK 提供的 Advisor ,需要设置 **builtinAdvisorName** 和 **classArgs**。 另一种方法,是使用用户自定义的 Advisor ,需要设置 **codeDirectory**\ , **classFileName**\ , **className** 和 **classArgs**。
启用 Advisor 后,将忽略 Tuner 和 Advisor 的设置。 启用 Advisor 后,将忽略 Tuner 和 Advisor 的设置。
...@@ -552,6 +552,8 @@ trial ...@@ -552,6 +552,8 @@ trial
* *
**portList**\ : ``label``\ , ``beginAt``\ , ``portNumber`` 的键值对 list。 参考 `OpenPAI 教程 <https://github.com/microsoft/pai/blob/master/docs/job_tutorial.rst>`__ 。 **portList**\ : ``label``\ , ``beginAt``\ , ``portNumber`` 的键值对 list。 参考 `OpenPAI 教程 <https://github.com/microsoft/pai/blob/master/docs/job_tutorial.rst>`__ 。
.. cannot find `Reference <https://github.com/microsoft/pai/blob/2ea69b45faa018662bc164ed7733f6fdbb4c42b3/docs/faq.rst#q-how-to-use-private-docker-registry-job-image-when-submitting-an-openpai-job>`__ and `job tutorial of PAI <https://github.com/microsoft/pai/blob/master/docs/job_tutorial.rst>`__
在 Kubeflow 模式下,需要以下键。 在 Kubeflow 模式下,需要以下键。
...@@ -700,14 +702,12 @@ useActiveGpu ...@@ -700,14 +702,12 @@ useActiveGpu
用于指定 GPU 上存在其他进程时是否使用此 GPU。 默认情况下,NNI 仅在 GPU 中没有其他活动进程时才使用 GPU。 如果 **useActiveGpu** 设置为 true,则 NNI 无论某 GPU 是否有其它进程,都将使用它。 此字段不适用于 Windows 版的 NNI。 用于指定 GPU 上存在其他进程时是否使用此 GPU。 默认情况下,NNI 仅在 GPU 中没有其他活动进程时才使用 GPU。 如果 **useActiveGpu** 设置为 true,则 NNI 无论某 GPU 是否有其它进程,都将使用它。 此字段不适用于 Windows 版的 NNI。
preCommand pythonPath
^^^^^^^^^^ ^^^^^^^^^^
可选。 字符串。 可选。 字符串。
在远程机器执行其他命令之前,将执行预命令。 用户可以通过设置 **preCommand**,在远程机器上配置实验环境。 如果需要执行多个命令,请使用 ``&&`` 连接它们,例如 ``preCommand: command1 && command2&&…``。 用户可以通过设置 **pythonPath**,在远程机器上配置 Python 环境。
**注意**:因为 ``preCommand`` 每次都会在其他命令之前执行,所以强烈建议不要设置 **preCommand** 来对系统进行更改,即 ``mkdir`` or ``touch``。
remoteConfig remoteConfig
^^^^^^^^^^^^ ^^^^^^^^^^^^
...@@ -755,7 +755,7 @@ keyVault ...@@ -755,7 +755,7 @@ keyVault
如果使用 Azure 存储,则必需。 键值对。 如果使用 Azure 存储,则必需。 键值对。
将 **keyVault** 设置为 Azure 存储帐户的私钥。 参考https://docs.microsoft.com/zh-cn/azure/key-vault/key-vault-manage-with-cli2 。 将 **keyVault** 设置为 Azure 存储帐户的私钥。 参考 `此文档 <https://docs.microsoft.com/zh-cn/azure/key-vault/key-vault-manage-with-cli2>`__
* *
...@@ -823,6 +823,79 @@ reuse ...@@ -823,6 +823,79 @@ reuse
如果为 true,NNI 会重用 OpenPAI 作业,在其中运行尽可能多的 Trial。 这样可以节省创建新作业的时间。 用户需要确保同一作业中的每个 Trial 相互独立,例如,要避免从之前的 Trial 中读取检查点。 如果为 true,NNI 会重用 OpenPAI 作业,在其中运行尽可能多的 Trial。 这样可以节省创建新作业的时间。 用户需要确保同一作业中的每个 Trial 相互独立,例如,要避免从之前的 Trial 中读取检查点。
sharedStorage
^^^^^^^^^^^^^
storageType
^^^^^^^^^^^
必填。 字符串。
存储类型,支持 ``NFS`` 和 ``AzureBlob``。
localMountPoint
^^^^^^^^^^^^^^^
必填。 字符串。
已经或将要在本地挂载存储的绝对路径。
remoteMountPoint
^^^^^^^^^^^^^^^^
必填。 字符串。
远程挂载存储的绝对路径。
localMounted
^^^^^^^^^^^^
必填。 字符串。
``usermount``、``nnimount`` 和 ``nomount`` 其中之一。 ``usermount`` 表示已经在 localMountPoint 上挂载了此存储。 ``nnimount`` 表示 nni 将尝试在 localMountPoint 上挂载此存储。 ``nomount`` 表示存储不会挂载在本地机器上,将在未来支持部分存储。
nfsServer
^^^^^^^^^
可选。 字符串。
如果使用 NFS 存储,则必需。 NFS 服务器的 host。
exportedDirectory
^^^^^^^^^^^^^^^^^
可选。 字符串。
如果使用 NFS 存储,则必需。 NFS 服务器的导出目录。
storageAccountName
^^^^^^^^^^^^^^^^^^
可选。 字符串。
如果使用 AzureBlob 存储,则必需。 Azure 存储账户名。
storageAccountKey
^^^^^^^^^^^^^^^^^
可选。 字符串。
如果使用 AzureBlob 存储且 ``resourceGroupName`` 未设置,则必需。 Azure 存储账户密钥。
resourceGroupName
^^^^^^^^^^^^^^^^^
可选。 字符串。
如果使用 AzureBlob 存储且 ``storageAccountKey`` 未设置,则必需。 AzureBlob 容器所属的资源组。
containerName
^^^^^^^^^^^^^
可选。 字符串。
如果使用 AzureBlob 存储,则必需。 AzureBlob 容器名。
示例 示例
-------- --------
...@@ -959,12 +1032,8 @@ reuse ...@@ -959,12 +1032,8 @@ reuse
username: test username: test
sshKeyPath: /nni/sshkey sshKeyPath: /nni/sshkey
passphrase: qwert passphrase: qwert
# 在远程机器执行其他命令之前,将执行预命令。
# 以下是特定 python 环境的一个示例 # 以下是特定 python 环境的一个示例
# 如果想同时执行多条命令,使用 "&&" 连接他们 pythonPath: ${replace_to_python_environment_path_in_your_remote_machine}
# 预命令: source ${replace_to_absolute_path_recommended_here}/bin/activate
# 预命令: source ${replace_to_conda_path}/bin/activate ${replace_to_conda_env_name}
preCommand: export PATH=${replace_to_python_environment_path_in_your_remote_machine}:$PATH
PAI 模式 PAI 模式
^^^^^^^^ ^^^^^^^^
...@@ -1005,7 +1074,7 @@ PAI 模式 ...@@ -1005,7 +1074,7 @@ PAI 模式
host: 10.10.10.10 host: 10.10.10.10
Kubeflow 模式 Kubeflow 模式
^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^
使用 NFS 存储。 使用 NFS 存储。
......
...@@ -78,7 +78,7 @@ NNI 在 Windows 上的问题 ...@@ -78,7 +78,7 @@ NNI 在 Windows 上的问题
参考 `在 Windows 上 安装 NNI <InstallationWin.rst>`__ 参考 `在 Windows 上 安装 NNI <InstallationWin.rst>`__
更多常见问题解答 更多常见问题解答
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
`标有常见问题标签的 Issue <https://github.com/microsoft/nni/labels/FAQ>`__ `标有常见问题标签的 Issue <https://github.com/microsoft/nni/labels/FAQ>`__
......
...@@ -66,7 +66,7 @@ NNI 中有不同的错误类型。 根据严重程度,可分为三类。 当 N ...@@ -66,7 +66,7 @@ NNI 中有不同的错误类型。 根据严重程度,可分为三类。 当 N
Dispatcher 失败 Dispatcher 失败
^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^
Dispatcher 失败, 这通常是 Tuner 失败的情况。 可检查 Dispatcher 的日志来分析出现了什么问题。 对于内置的 Tuner,常见的错误可能是无效的搜索空间(不支持的搜索空间类型,或配置文件中的 Tuner 参数与 __init__ 函数所要求的不一致)。 Dispatcher 失败, 这通常是 Tuner 失败的情况。 可检查 Dispatcher 的日志来分析出现了什么问题。 对于内置的 Tuner,常见的错误可能是无效的搜索空间(不支持的搜索空间类型,或配置文件中的 Tuner 参数与 ``__init__`` 函数所要求的不一致)。
以后一种情况为例。 某自定义的 Tuner, __init__ 函数有名为 ``optimize_mode`` 的参数,但配置文件中没有提供此参数。NNI 就会因为初始化 Tuner 失败而造成 Experiment 失败。 可在 Web 界面看到如下错误: 以后一种情况为例。 某自定义的 Tuner, __init__ 函数有名为 ``optimize_mode`` 的参数,但配置文件中没有提供此参数。NNI 就会因为初始化 Tuner 失败而造成 Experiment 失败。 可在 Web 界面看到如下错误:
......
如何从 Python 发起实验
===========================================
.. toctree::
:hidden:
启动用法 <python_api_start>
连接用法 <python_api_connect>
概述
--------
从 ``nni v2.0`` 起,我们提供了一种全新方式发起 Experiment 。 在此之前,您需要在 yaml 文件中配置实验,然后使用 ``nnictl`` 命令启动 Experiment 。 现在,您还可以直接在python文件中配置和运行 Experiment 。 如果您熟悉 Python 编程,那么无疑会为您带来很多便利。
运行一个新的 Experiment
----------------------------------------
成功安装 ``nni`` 之后,您可以通过以下3个步骤使用 Python 脚本开始 Experiment 。
..
步骤1 - 初始化 Tuner
.. code-block:: python
from nni.algorithms.hpo.hyperopt_tuner import HyperoptTuner
tuner = HyperoptTuner('tpe')
很简单,您已经成功初始化了一个名为 ``tuner`` 的 ``HyperoptTuner`` 实例。
查看 NNI 所有的 `内置 Tuner <../builtin_tuner.rst>`__。
..
步骤2 - 初始化并配置 Experiment 实例
.. code-block:: python
experiment = Experiment(tuner=tuner, training_service='local')
现在,您已经在上一步中初始化了带有 Tuner 的 ``Experiment`` 实例,由于 ``training_service ='local'`` ,此实验将在本地计算机上运行。
查看 NNI 支持的所有 `训练平台 <../training_services.rst>`__。
.. code-block:: python
experiment.config.experiment_name = 'test'
experiment.config.trial_concurrency = 2
experiment.config.max_trial_number = 5
experiment.config.search_space = search_space
experiment.config.trial_command = 'python3 mnist.py'
experiment.config.trial_code_directory = Path(__file__).parent
experiment.config.training_service.use_active_gpu = True
使用类似 ``experiment.config.foo ='bar'`` 的形式来配置您的 Experiment 。
参阅不同平台所需的 `参数配置 <../reference/experiment_config.rst>`__。
..
步骤3 - 运行
.. code-block:: python
experiment.run(port=8081)
现在,您已经成功启动了 NNI Experiment。 您可以在浏览器中输入``localhost:8081`` 以实时观察实验。
.. Note:: 实验将在前台运行,实验结束后自动退出。 如果要以交互方式运行 Experiment,请在步骤3中使用 ``start()``。
示例
^^^^^^^
以下是这种新的启动方法的示例。 你可以在 :githublink:`mnist-tfv2/launch.py <examples/trials/mnist-tfv2/launch.py>` 找到实验代码。
.. code-block:: python
from pathlib import Path
from nni.experiment import Experiment
from nni.algorithms.hpo.hyperopt_tuner import HyperoptTuner
tuner = HyperoptTuner('tpe')
search_space = {
"dropout_rate": { "_type": "uniform", "_value": [0.5, 0.9] },
"conv_size": { "_type": "choice", "_value": [2, 3, 5, 7] },
"hidden_size": { "_type": "choice", "_value": [124, 512, 1024] },
"batch_size": { "_type": "choice", "_value": [16, 32] },
"learning_rate": { "_type": "choice", "_value": [0.0001, 0.001, 0.01, 0.1] }
}
experiment = Experiment(tuner, 'local')
experiment.config.experiment_name = 'test'
experiment.config.trial_concurrency = 2
experiment.config.max_trial_number = 5
experiment.config.search_space = search_space
experiment.config.trial_command = 'python3 mnist.py'
experiment.config.trial_code_directory = Path(__file__).parent
experiment.config.training_service.use_active_gpu = True
experiment.run(8081)
启动并管理一个新的 Experiment
------------------------------------------------------------------
我们将 ``NNI Client`` 中的 API 迁移到了这个新的启动方法。
通过 ``start()`` 而不是 ``run()`` 启动 Experiment,可以在交互模式下使用这些 API。
请参考 `示例用法 <./python_api_start.rst>`__ 和代码文件 :githublink:`python_api_start.ipynb <examples/trials/sklearn/classification/python_api_start.ipynb>`。
.. Note:: ``run()`` 轮询实验状态,并在实验完成时自动调用 ``stop()``。 ``start()`` 仅仅启动了一个新的 Experiment,所以需要通过调用 ``stop()`` 手动停止。
连接并管理已存在的 Experiment
----------------------------------------------------------------------------
如果您通过 ``nnictl`` 启动 Experiment,并且还想使用这些 API,那么可以使用 ``Experiment.connect()`` 连接到现有实验。
请参考 `示例用法 <./python_api_connect.rst>`__ 和代码文件 :githublink:`python_api_connect.ipynb <examples/trials/sklearn/classification/python_api_connect.ipynb>`。
.. Note:: 连接到现有 Experiment 时,可以使用 ``stop()`` 停止 Experiment。
API
---
.. autoclass:: nni.experiment.Experiment
:members:
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
``-p:`` 端口映射,映射主机端口和容器端口。 ``-p:`` 端口映射,映射主机端口和容器端口。
可以参考 `这里 <https://docs.docker.com/v17.09/edge/engine/reference/run/>`__,获取更多的命令参考。 可以参考 `这里 <https://docs.docker.com/engine/reference/run/>`__,获取更多的 Docker 命令参考。
注意: 注意:
......
如何使用共享存储
=============================
如果您想在使用 NNI 期间使用自己的存储,共享存储可以满足您的需求。
与使用训练平台本机存储不同,共享存储可以为您带来更多便利。
Experiment 生成的所有信息都将存储在共享存储的 ``/nni`` 文件夹下。
Trial 产生的所有输出将位于共享存储中的 ``/nni/{EXPERIMENT_ID}/trials/{TRIAL_ID}/nnioutput`` 文件夹下。
这就避免了在不同地方寻找实验相关信息的麻烦。
Trial 工作目录是 ``/nni/{EXPERIMENT_ID}/trials/{TRIAL_ID}``,因此如果您在共享存储中上载数据,您可以像在 Trial 代码中打开本地文件一样打开它,而不必下载它。
未来我们将开发更多基于共享存储的实用功能。
.. note::
共享存储目前处于实验阶段。 我们建议在 Ubuntu/CentOS/RHEL 下使用 AzureBlob,在 Ubuntu/CentOS/RHEL/Fedora/Debian 下使用 NFS 进行远程访问。
确保您的本地机器可以挂载 NFS 或 fuse AzureBlob,并在远程运行时具有 sudo 权限。 我们目前只支持使用重用模式的训练平台下的共享存储。
示例
-------
如果要使用 AzureBlob,请在配置中添加以下内容。完整的配置文件请参阅 :githublink:`mnist-sharedstorage/config_azureblob.yml <examples/trials/mnist-sharedstorage/config_azureblob.yml>`。
.. code-block:: yaml
sharedStorage:
storageType: AzureBlob
localMountPoint: ${your/local/mount/point}
remoteMountPoint: ${your/remote/mount/point}
storageAccountName: ${replace_to_your_storageAccountName}
storageAccountKey: ${replace_to_your_storageAccountKey}
# 如果未设置 storageAccountKey,则首先需要在 Azure CLI 中使用 `az login` 并设置 resourceGroupName。
# resourceGroupName: ${replace_to_your_resourceGroupName}
containerName: ${replace_to_your_containerName}
# usermount 表示已将此存储挂载在 localMountPoint 上
# nnimount 表示 NNI 将尝试将此存储挂载在 localMountPoint 上
# nomount 表示存储不会挂载在本地机器上,将在未来支持部分存储。
localMounted: nnimount
如果要使用 NFS,请在配置中添加以下内容。完整的配置文件请参阅 :githublink:`mnist-sharedstorage/config_nfs.yml <examples/trials/mnist-sharedstorage/config_nfs.yml>`。
.. code-block:: yaml
sharedStorage:
storageType: NFS
localMountPoint: ${your/local/mount/point}
remoteMountPoint: ${your/remote/mount/point}
nfsServer: ${nfs-server-ip}
exportedDirectory: ${nfs/exported/directory}
# usermount 表示已将此存储挂载在 localMountPoint 上
# nnimount 表示 NNI 将尝试将此存储挂载在 localMountPoint 上
# nomount 表示存储不会挂载在本地机器上,将在未来支持部分存储。
localMounted: nnimount
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
如何将自定义的算法安装为内置的 Tuner,Assessor 和 Advisor 如何将自定义的算法安装为内置的 Tuner,Assessor 和 Advisor
======================================================================================= =======================================================================================
.. contents::
概述 概述
-------- --------
...@@ -72,7 +74,7 @@ NNI 提供了 ``ClassArgsValidator`` 接口,自定义的算法可用它来验 ...@@ -72,7 +74,7 @@ NNI 提供了 ``ClassArgsValidator`` 接口,自定义的算法可用它来验
* 在包目录中运行 ``python setup.py develop``,此命令会在开发者模式下安装包。如果算法正在开发中,推荐使用此命令。 * 在包目录中运行 ``python setup.py develop``,此命令会在开发者模式下安装包。如果算法正在开发中,推荐使用此命令。
* 在包目录中运行 ``python setup.py bdist_wheel`` 命令,会构建 whl 文件。 可通过 ``pip3 install sklearn`` 命令来安装。 * 在包目录中运行 ``python setup.py bdist_wheel`` 命令,会构建 whl 文件。 可通过 ``pip3 install sklearn`` 命令来安装。
4. 准备安装源 4. 准备源文件
^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^
使用以下关键词创建 YAML 文件: 使用以下关键词创建 YAML 文件:
...@@ -92,7 +94,7 @@ YAML 文件示例: ...@@ -92,7 +94,7 @@ YAML 文件示例:
className: demo_tuner.DemoTuner className: demo_tuner.DemoTuner
classArgsValidator: demo_tuner.MyClassArgsValidator classArgsValidator: demo_tuner.MyClassArgsValidator
5. 将自定义算法包安装到 NNI 中 5. 将自定义算法包注册到 NNI 中
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
运行以下命令将自定义算法加入到 NNI 的内置算法中: 运行以下命令将自定义算法加入到 NNI 的内置算法中:
...@@ -103,10 +105,10 @@ YAML 文件示例: ...@@ -103,10 +105,10 @@ YAML 文件示例:
``<path_to_meta_file>`` 是上一节创建的 YAML 文件的路径。 ``<path_to_meta_file>`` 是上一节创建的 YAML 文件的路径。
参考 `这里 <../Tuner/InstallCustomizedTuner.rst>`_ 获取完整示例。 参考 `自定义 Tuner 示例 <#example-register-a-customized-tuner-as-a-builtin-tuner>`_ 获取完整示例。
6. 在 Experiment 中使用安装的算法 在 Experiment 中使用安装的内置算法
----------------------------------------------------- --------------------------------------------------
在自定义算法安装后,可用其它内置 Tuner、Assessor、Advisor 的方法在 Experiment 配置文件中使用,例如: 在自定义算法安装后,可用其它内置 Tuner、Assessor、Advisor 的方法在 Experiment 配置文件中使用,例如:
...@@ -119,7 +121,7 @@ YAML 文件示例: ...@@ -119,7 +121,7 @@ YAML 文件示例:
optimize_mode: maximize optimize_mode: maximize
使用 ``nnictl algo`` 管理内置的算法 使用 ``nnictl algo`` 管理内置的算法
--------------------------------------------------- ----------------------------------------------------------------------------------------------------
列出已安装的包 列出已安装的包
^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^
...@@ -160,3 +162,61 @@ YAML 文件示例: ...@@ -160,3 +162,61 @@ YAML 文件示例:
例如: 例如:
``nnictl algo unregister demotuner`` ``nnictl algo unregister demotuner``
将自定义算法从 v1.x 版本转到 v2.x 版本
----------------------------------------------------------------------------------------------
所有需要修改的就是删除 ``setup.py`` 中的 ``NNI Package :: tuner`` 元数据并添加在 在 4 中提到的元文件。 然后你可以参考 `将自定义的算法安装为内置的 Tuner,Assessor 或 Advisor`__ 注册你的自定义算法。
示例:将自定义 Tuner 注册为内置 Tuner
--------------------------------------------------------------------------------------------------------------
参考下列步骤将 ``nni/examples/tuners/customized_tuner`` 中的自定义 Tuner 注册为内置 Tuner。
将自定义 Tuner 包安装到 Python 环境 中
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
有两种方法可将软件包安装到 python 环境中:
方法 1: 从目录安装
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
在 ``nni/examples/tuners/customized_tuner`` 目录下,运行:
``python setup.py develop``
此命令会将 ``nni/examples/tuners/customized_tuner`` 目录编译为 pip 安装源。
方法 2: 从 whl 文件安装
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
步骤 1: 在 ``nni/examples/tuners/customized_tuner`` 目录下,运行:
``python setup.py bdist_wheel``
此命令会从 pip 安装源编译出 whl 文件。
步骤 2: 运行命令
``pip install dist/demo_tuner-0.1-py3-none-any.whl``
将自定义 Tuner 注册为内置 Tuner
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
运行命令
``nnictl algo register --meta meta_file.yml``
检查已注册的内置算法
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
运行命令 ``nnictl algo list``,可以看到已安装的 demotuner:
.. code-block:: bash
+-----------------+------------+-----------+--------=-------------+------------------------------------------+
| 名称 | 类型 | 来源 | 类名 | 模块名 |
+-----------------+------------+-----------+----------------------+------------------------------------------+
| demotuner | tuners | User | DemoTuner | demo_tuner |
+-----------------+------------+-----------+----------------------+------------------------------------------+
...@@ -20,38 +20,53 @@ ...@@ -20,38 +20,53 @@
如果对某个或最新版本的代码感兴趣,可通过源代码安装 NNI。 如果对某个或最新版本的代码感兴趣,可通过源代码安装 NNI。
先决条件:``python 64-bit >=3.6``\ , ``git``\ , ``wget`` 先决条件:``python 64-bit >=3.6``, ``git``
.. code-block:: bash .. code-block:: bash
git clone -b v1.9 https://github.com/Microsoft/nni.git git clone -b v2.0 https://github.com/Microsoft/nni.git
cd nni cd nni
./install.sh python3 -m pip install --upgrade pip setuptools
python3 setup.py develop
从 NNI 源代码构建 Wheel 包
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
上一节介绍了如何在 `开发模式 <https://setuptools.readthedocs.io/en/latest/userguide/development_mode.html>`__ 下安装NNI。
如果要执行持久安装,建议您构建自己的 wheel 软件包并从wheel 安装。
.. code-block:: bash
git clone -b v2.0 https://github.com/Microsoft/nni.git
cd nni
export NNI_RELEASE=2.0
python3 -m pip install --upgrade pip setuptools wheel
python3 setup.py clean --all
python3 setup.py build_ts
python3 setup.py bdist_wheel -p manylinux1_x86_64
python3 -m pip install dist/nni-2.0-py3-none-manylinux1_x86_64.whl
在 Docker 映像中使用 NNI 在 Docker 映像中使用 NNI
^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^
也可将 NNI 安装到 docker 映像中。 参考 :githublink:`这里 <deployment/docker/README.rst>` 来生成 NNI 的 docker 映像。 也可通过此命令从 Docker Hub 中直接拉取 NNI 的映像 ``docker pull msranni/nni:latest``。 也可将 NNI 安装到 docker 映像中。 参考 `这里 <../Tutorial/HowToUseDocker.rst>`__ 来生成 NNI 的 docker 映像。 也可通过此命令从 Docker Hub 中直接拉取 NNI 的映像 ``docker pull msranni/nni:latest``。
验证安装 验证安装
------------------- -------------------
以下示例基于 TensorFlow 1.x 构建。 确保运行环境中使用的是 **TensorFlow 1.x**。
* *
通过克隆源代码下载示例。 通过克隆源代码下载示例。
.. code-block:: bash .. code-block:: bash
git clone -b v1.9 https://github.com/Microsoft/nni.git git clone -b v2.0 https://github.com/Microsoft/nni.git
* *
运行 MNIST 示例。 运行 MNIST 示例。
.. code-block:: bash .. code-block:: bash
nnictl create --config nni/examples/trials/mnist-tfv1/config.yml nnictl create --config nni/examples/trials/mnist-pytorch/config.yml
* *
在命令行中等待输出 ``INFO: Successfully started experiment!`` 。 此消息表明实验已成功启动。 通过命令行输出的 Web UI url 来访问 Experiment 的界面。 在命令行中等待输出 ``INFO: Successfully started experiment!`` 。 此消息表明实验已成功启动。 通过命令行输出的 Web UI url 来访问 Experiment 的界面。
......
...@@ -40,29 +40,26 @@ ...@@ -40,29 +40,26 @@
.. code-block:: bat .. code-block:: bat
git clone -b v1.9 https://github.com/Microsoft/nni.git git clone -b v2.0 https://github.com/Microsoft/nni.git
cd nni cd nni
powershell -ExecutionPolicy Bypass -file install.ps1 python setup.py develop
验证安装 验证安装
------------------- -------------------
以下示例基于 TensorFlow 1.x 构建。 确保运行环境中使用的是 **TensorFlow 1.x**。
* *
克隆源代码中的示例。 克隆源代码中的示例。
.. code-block:: bat .. code-block:: bat
git clone -b v1.9 https://github.com/Microsoft/nni.git git clone -b v2.0 https://github.com/Microsoft/nni.git
* *
运行 MNIST 示例。 运行 MNIST 示例。
.. code-block:: bat .. code-block:: bat
nnictl create --config nni\examples\trials\mnist-tfv1\config_windows.yml nnictl create --config nni\examples\trials\mnist-pytorch\config_windows.yml
注意:如果熟悉其它框架,可选择 ``examples\trials`` 目录下对应的示例。 需要将示例 YAML 文件中 Trial 命令的 ``python3`` 改为 ``python``,这是因为默认安装的 Python 可执行文件是 ``python.exe``,没有 ``python3.exe``。 注意:如果熟悉其它框架,可选择 ``examples\trials`` 目录下对应的示例。 需要将示例 YAML 文件中 Trial 命令的 ``python3`` 改为 ``python``,这是因为默认安装的 Python 可执行文件是 ``python.exe``,没有 ``python3.exe``。
...@@ -146,7 +143,7 @@ ...@@ -146,7 +143,7 @@
常见问答 常见问答
--- ------------
安装 NNI 时出现 simplejson 错误 安装 NNI 时出现 simplejson 错误
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...@@ -182,7 +179,7 @@ Web 界面上的 Trial 错误 ...@@ -182,7 +179,7 @@ Web 界面上的 Trial 错误
无法在 Windows 上使用 BOHB 无法在 Windows 上使用 BOHB
^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
确保安装了 C ++ 14.0 编译器然后尝试运行 ``nnictl package install --name=BOHB`` 来安装依赖项。 确保安装了 C ++ 14.0 编译器然后尝试运行 ``pip install nni[BOHB]`` 来安装依赖项。
Windows 上不支持的 Tuner Windows 上不支持的 Tuner
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
......
...@@ -29,7 +29,7 @@ nnictl 支持的命令: ...@@ -29,7 +29,7 @@ nnictl 支持的命令:
* `nnictl log <#log>`__ * `nnictl log <#log>`__
* `nnictl webui <#webui>`__ * `nnictl webui <#webui>`__
* `nnictl tensorboard <#tensorboard>`__ * `nnictl tensorboard <#tensorboard>`__
* `nnictl package <#package>`__ * `nnictl algo <#algo>`__
* `nnictl ss_gen <#ss_gen>`__ * `nnictl ss_gen <#ss_gen>`__
* `nnictl --version <#version>`__ * `nnictl --version <#version>`__
...@@ -96,7 +96,7 @@ nnictl create ...@@ -96,7 +96,7 @@ nnictl create
.. code-block:: bash .. code-block:: bash
nnictl create --config nni/examples/trials/mnist-tfv1/config.yml nnictl create --config nni/examples/trials/mnist-pytorch/config.yml
.. ..
...@@ -105,7 +105,7 @@ nnictl create ...@@ -105,7 +105,7 @@ nnictl create
.. code-block:: bash .. code-block:: bash
nnictl create --config nni/examples/trials/mnist-tfv1/config.yml --port 8088 nnictl create --config nni/examples/trials/mnist-pytorch/config.yml --port 8088
.. ..
...@@ -114,7 +114,7 @@ nnictl create ...@@ -114,7 +114,7 @@ nnictl create
.. code-block:: bash .. code-block:: bash
nnictl create --config nni/examples/trials/mnist-tfv1/config.yml --port 8088 --debug nnictl create --config nni/examples/trials/mnist-pytorch/config.yml --port 8088 --debug
注意: 注意:
...@@ -363,11 +363,11 @@ nnictl update ...@@ -363,11 +363,11 @@ nnictl update
* *
示例 示例
``使用 'examples/trials/mnist-tfv1/search_space.json' 来更新 Experiment 的搜索空间`` ``使用 'examples/trials/mnist-pytorch/search_space.json' 来更新 Experiment 的搜索空间``
.. code-block:: bash .. code-block:: bash
nnictl update searchspace [experiment_id] --filename examples/trials/mnist-tfv1/search_space.json nnictl update searchspace [experiment_id] --filename examples/trials/mnist-pytorch/search_space.json
* *
...@@ -1403,82 +1403,79 @@ Manage webui ...@@ -1403,82 +1403,79 @@ Manage webui
- 需要设置的 Experiment 的 id - 需要设置的 Experiment 的 id
:raw-html:`<a name="package"></a>` :raw-html:`<a name="algo"></a>`
管理安装包 管理内置算法
^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^
* *
**nnictl package install** **nnictl algo register**
* *
说明 说明
安装自定义的 TunerAssessorAdvisor(定制或 NNI 提供的算法) 自定义的算法注册为内置的 TunerAssessorAdvisor。
* *
用法 用法
.. code-block:: bash .. code-block:: bash
nnictl package install --name <package name> nnictl algo register --meta <path_to_meta_file>
可通过 ``nnictl package list`` 命令查看可用的 ``<包名称>``。 ``<path_to_meta_file>`` 是 yaml 格式元数据文件的路径,具有以下键:
或者 *
``algoType``: 算法类型,可为 ``tuner``, ``assessor``, ``advisor``
.. code-block:: bash
*
nnictl package install <安装源> ``builtinName``: 在 Experiment 配置文件中使用的内置名称
参考 `安装自定义算法 <InstallCustomizedAlgos.rst>`__ 来准备安装源。 *
``className`` : Tuner 类名,包括模块名,例如:``demo_tuner.DemoTuner``
*
``classArgsValidator``: 类的参数验证类 validator 的类名,包括模块名,如:``demo_tuner.MyClassArgsValidator``
* *
示例 示例
.. ..
安装 SMAC Tuner 在示例中安装自定义 Tuner
.. code-block:: bash
nnictl package install --name SMAC
..
安装自定义 Tuner
.. code-block:: bash .. code-block:: bash
nnictl package install nni/examples/tuners/customized_tuner/dist/demo_tuner-0.1-py3-none-any.whl cd nni/examples/tuners/customized_tuner
python3 setup.py develop
nnictl algo register --meta meta_file.yml
* *
**nnictl package show** **nnictl algo show**
* *
说明 说明
显示包的详情。 显示指定注册算法的详细信息
* *
用法 用法
.. code-block:: bash .. code-block:: bash
nnictl package show <包名称> nnictl algo show <builtinName>
* *
示例 示例
.. code-block:: bash .. code-block:: bash
nnictl package show SMAC nnictl algo show SMAC
* *
**nnictl package list** **nnictl package list**
...@@ -1487,78 +1484,46 @@ Manage webui ...@@ -1487,78 +1484,46 @@ Manage webui
* *
说明 说明
列出已安装的包 / 所有包。 列出已注册的内置算法
* *
用法 用法
.. code-block:: bash .. code-block:: bash
nnictl package list [OPTIONS] nnictl algo list
*
选项
.. list-table::
:header-rows: 1
:widths: auto
* - 参数及缩写
- 是否必需
- 默认值
- 说明
* - --all
- False
-
- 列出所有包
* *
示例 示例
..
列出已安装的包
.. code-block:: bash
nnictl package list
..
列出所有包
.. code-block:: bash .. code-block:: bash
nnictl package list --all nnictl algo list
* *
**nnictl package uninstall** **nnictl algo unregister**
* *
说明 说明
卸载包 注销一个已注册的自定义内置算法。 NNI 提供的内置算法不能被注销
* *
用法 用法
.. code-block:: bash .. code-block:: bash
nnictl package uninstall <包名称> nnictl algo unregister <builtinName>
* *
示例 示例
卸载 SMAC 包
.. code-block:: bash .. code-block:: bash
nnictl package uninstall SMAC nnictl algo unregister demotuner
:raw-html:`<a name="ss_gen"></a>` :raw-html:`<a name="ss_gen"></a>`
......
...@@ -40,39 +40,28 @@ NNI 是一个能进行自动机器学习实验的工具包。 它可以自动进 ...@@ -40,39 +40,28 @@ NNI 是一个能进行自动机器学习实验的工具包。 它可以自动进
.. code-block:: python .. code-block:: python
def run_trial(params): def main(args):
# 输入数据 # 下载数据
mnist = input_data.read_data_sets(params['data_dir'], one_hot=True) train_loader = torch.utils.data.DataLoader(datasets.MNIST(...), batch_size=args['batch_size'], shuffle=True)
# 构建网络 test_loader = torch.tuils.data.DataLoader(datasets.MNIST(...), batch_size=1000, shuffle=True)
mnist_network = MnistNetwork(channel_1_num=params['channel_1_num'], # 构建模型
channel_2_num=params['channel_2_num'], model = Net(hidden_size=args['hidden_size'])
conv_size=params['conv_size'], optimizer = optim.SGD(model.parameters(), lr=args['lr'], momentum=args['momentum'])
hidden_size=params['hidden_size'], # 训练
pool_size=params['pool_size'], for epoch in range(10):
learning_rate=params['learning_rate']) train(args, model, device, train_loader, optimizer, epoch)
mnist_network.build_network() test_acc = test(args, model, device, test_loader)
print(test_acc)
test_acc = 0.0 print('final accuracy:', test_acc)
with tf.Session() as sess:
# 训练网络 if __name__ == '__main__':
mnist_network.train(sess, mnist) params = {
# 评估网络 'batch_size': 32,
test_acc = mnist_network.evaluate(mnist) 'hidden_size': 128,
'lr': 0.001,
if __name__ == '__main__': 'momentum': 0.5
params = {'data_dir': '/tmp/tensorflow/mnist/input_data', }
'dropout_rate': 0.5, main(params)
'channel_1_num': 32,
'channel_2_num': 64,
'conv_size': 5,
'pool_size': 2,
'hidden_size': 1024,
'learning_rate': 1e-4,
'batch_num': 2000,
'batch_size': 32}
run_trial(params)
完整实现请参考 :githublink:`examples/trials/mnist-tfv1/mnist_before.py <examples/trials/mnist-tfv1/mnist_before.py>` 。
上面的代码一次只能尝试一组参数,如果想要调优学习率,需要手工改动超参,并一次次尝试。 上面的代码一次只能尝试一组参数,如果想要调优学习率,需要手工改动超参,并一次次尝试。
...@@ -100,42 +89,44 @@ NNI 用来帮助超参调优。它的流程如下: ...@@ -100,42 +89,44 @@ NNI 用来帮助超参调优。它的流程如下:
.. code-block:: diff .. code-block:: diff
- params = {'data_dir': '/tmp/tensorflow/mnist/input_data', 'dropout_rate': 0.5, 'channel_1_num': 32, 'channel_2_num': 64, - params = {'batch_size': 32, 'hidden_size': 128, 'lr': 0.001, 'momentum': 0.5}
- 'conv_size': 5, 'pool_size': 2, 'hidden_size': 1024, 'learning_rate': 1e-4, 'batch_num': 2000, 'batch_size': 32} + {
+ { + "batch_size": {"_type":"choice", "_value": [16, 32, 64, 128]},
+ "dropout_rate":{"_type":"uniform","_value":[0.5, 0.9]}, + "hidden_size":{"_type":"choice","_value":[128, 256, 512, 1024]},
+ "conv_size":{"_type":"choice","_value":[2,3,5,7]}, + "lr":{"_type":"choice","_value":[0.0001, 0.001, 0.01, 0.1]},
+ "hidden_size":{"_type":"choice","_value":[124, 512, 1024]}, + "momentum":{"_type":"uniform","_value":[0, 1]}
+ "batch_size": {"_type":"choice", "_value": [1, 4, 8, 16, 32]}, + }
+ "learning_rate":{"_type":"choice","_value":[0.0001, 0.001, 0.01, 0.1]}
+ }
*示例:* :githublink:`search_space.json <examples/trials/mnist-tfv1/search_space.json>` *示例:* :githublink:`search_space.json <examples/trials/mnist-pytorch/search_space.json>`
**第二步** :修改 ``Trial`` 代码来从 NNI 获取超参,并返回 NNI 最终结果。 **第二步** :修改 ``Trial`` 代码来从 NNI 获取超参,并返回 NNI 最终结果。
.. code-block:: diff .. code-block:: diff
+ import nni + import nni
def run_trial(params): def main(args):
mnist = input_data.read_data_sets(params['data_dir'], one_hot=True) # 下载数据
train_loader = torch.utils.data.DataLoader(datasets.MNIST(...), batch_size=args['batch_size'], shuffle=True)
mnist_network = MnistNetwork(channel_1_num=params['channel_1_num'], channel_2_num=params['channel_2_num'], conv_size=params['conv_size'], hidden_size=params['hidden_size'], pool_size=params['pool_size'], learning_rate=params['learning_rate']) test_loader = torch.tuils.data.DataLoader(datasets.MNIST(...), batch_size=1000, shuffle=True)
mnist_network.build_network() # 构造模型
model = Net(hidden_size=args['hidden_size'])
with tf.Session() as sess: optimizer = optim.SGD(model.parameters(), lr=args['lr'], momentum=args['momentum'])
mnist_network.train(sess, mnist) # 训练
test_acc = mnist_network.evaluate(mnist) for epoch in range(10):
+ nni.report_final_result(test_acc) train(args, model, device, train_loader, optimizer, epoch)
test_acc = test(args, model, device, test_loader)
if __name__ == '__main__': - print(test_acc)
- params = {'data_dir': '/tmp/tensorflow/mnist/input_data', 'dropout_rate': 0.5, 'channel_1_num': 32, 'channel_2_num': 64, + nni.report_intermeidate_result(test_acc)
- 'conv_size': 5, 'pool_size': 2, 'hidden_size': 1024, 'learning_rate': 1e-4, 'batch_num': 2000, 'batch_size': 32} - print('final accuracy:', test_acc)
+ params = nni.get_next_parameter() + nni.report_final_result(test_acc)
run_trial(params)
if __name__ == '__main__':
*示例:* :githublink:`mnist.py <examples/trials/mnist-tfv1/mnist.py>` - params = {'batch_size': 32, 'hidden_size': 128, 'lr': 0.001, 'momentum': 0.5}
+ params = nni.get_next_parameter()
main(params)
*示例:* :githublink:`mnist.py <examples/trials/mnist-pytorch/mnist.py>`
**第三步**\ : 定义 YAML 格式的 ``配置`` 文件,声明搜索空间和 Trail 文件的 ``路径`` 它还提供其他信息,例如调整算法,最大 Trial 运行次数和最大持续时间的参数。 **第三步**\ : 定义 YAML 格式的 ``配置`` 文件,声明搜索空间和 Trail 文件的 ``路径`` 它还提供其他信息,例如调整算法,最大 Trial 运行次数和最大持续时间的参数。
...@@ -160,9 +151,9 @@ NNI 用来帮助超参调优。它的流程如下: ...@@ -160,9 +151,9 @@ NNI 用来帮助超参调优。它的流程如下:
.. Note:: 如果要使用远程计算机或集群作为 :doc:`训练平台 <../TrainingService/Overview>`,为了避免产生过大的网络压力,NNI 限制了文件的最大数量为 2000,大小为 300 MB 如果 codeDir 中包含了过多的文件,可添加 ``.nniignore`` 文件来排除部分,与 ``.gitignore`` 文件用法类似。 参考 `git documentation <https://git-scm.com/docs/gitignore#_pattern_format>`__ ,了解更多如何编写此文件的详细信息 _ .. Note:: 如果要使用远程计算机或集群作为 :doc:`训练平台 <../TrainingService/Overview>`,为了避免产生过大的网络压力,NNI 限制了文件的最大数量为 2000,大小为 300 MB 如果 codeDir 中包含了过多的文件,可添加 ``.nniignore`` 文件来排除部分,与 ``.gitignore`` 文件用法类似。 参考 `git documentation <https://git-scm.com/docs/gitignore#_pattern_format>`__ ,了解更多如何编写此文件的详细信息 _
*示例* :githublink:`config.yml <examples/trials/mnist-tfv1/config.yml>` :githublink:`.nniignore <examples/trials/mnist-tfv1/.nniignore>` *示例:* :githublink:`config.yml <examples/trials/mnist-pytorch/config.yml>` :githublink:`.nniignore <examples/trials/mnist-pytorch/.nniignore>`
上面的代码都已准备好,并保存在 :githublink:`examples/trials/mnist-tfv1/ <examples/trials/mnist-tfv1>`. 上面的代码都已准备好,并保存在 :githublink:`examples/trials/mnist-pytorch/ <examples/trials/mnist-pytorch>`
Linux macOS Linux macOS
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
...@@ -171,7 +162,7 @@ Linux 和 macOS ...@@ -171,7 +162,7 @@ Linux 和 macOS
.. code-block:: bash .. code-block:: bash
nnictl create --config nni/examples/trials/mnist-tfv1/config.yml nnictl create --config nni/examples/trials/mnist-pytorch/config.yml
Windows Windows
^^^^^^^ ^^^^^^^
...@@ -180,7 +171,7 @@ Windows ...@@ -180,7 +171,7 @@ Windows
.. code-block:: bash .. code-block:: bash
nnictl create --config nni\examples\trials\mnist-tfv1\config_windows.yml nnictl create --config nni\examples\trials\mnist-pytorch\config_windows.yml
.. Note:: 如果使用 Windows,则需要在 config.yml 文件中,将 ``python3`` 改为 ``python``,或者使用 config_windows.yml 来开始 Experiment .. Note:: 如果使用 Windows,则需要在 config.yml 文件中,将 ``python3`` 改为 ``python``,或者使用 config_windows.yml 来开始 Experiment
...@@ -228,79 +219,42 @@ Web 界面 ...@@ -228,79 +219,42 @@ Web 界面
在浏览器中打开 ``Web 界面地址`` (即:`` [IP 地址]:8080`` ),就可以看到 Experiment 的详细信息,以及所有的 Trial 任务。 如果无法打开终端中的 Web 界面链接,可以参考 `常见问题 <FAQ.rst>`__ 在浏览器中打开 ``Web 界面地址`` (即:`` [IP 地址]:8080`` ),就可以看到 Experiment 的详细信息,以及所有的 Trial 任务。 如果无法打开终端中的 Web 界面链接,可以参考 `常见问题 <FAQ.rst>`__
查看概要页面 查看概要页面
^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^
点击 "Overview" 标签。
Experiment 相关信息会显示在界面上,配置和搜索空间等。 可通过 **Download** 按钮来下载信息和参数。 可以在 Experiment 运行时随时下载结果,也可以等到执行结束。
Experiment 相关信息会显示在界面上,配置和搜索空间等。 NNI 还支持通过 **Experiment summary** 按钮下载这些信息和参数。
.. image:: ../../img/QuickStart1.png
:target: ../../img/QuickStart1.png
:alt:
.. image:: ../../img/webui-img/full-oview.png
:target: ../../img/webui-img/full-oview.png
:alt: overview
前 10 个 Trial 将列在 Overview 页上。 可以在 "Trials Detail" 页面上浏览所有 Trial。
.. image:: ../../img/QuickStart2.png
:target: ../../img/QuickStart2.png
:alt:
查看 Trial 详情页面 查看 Trial 详情页面
^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^
点击 "Default Metric" 来查看所有 Trial 的点图。 悬停鼠标来查看默认指标和搜索空间信息。 可以在此页面中看到最佳的试用指标和超参数图。 当您单击按钮 ``Add/Remove columns`` 时,表格内容包括更多列。
.. image:: ../../img/QuickStart3.png
:target: ../../img/QuickStart3.png
:alt:
点击 "Hyper Parameter" 标签查看图像。
* 可选择百分比查看最好的 Trial。
* 选择两个轴来交换位置。
.. image:: ../../img/QuickStart4.png
:target: ../../img/QuickStart4.png
:alt:
点击 "Trial Duration" 标签来查看柱状图。
.. image:: ../../img/QuickStart5.png
:target: ../../img/QuickStart5.png
:alt:
下面是所有 Trial 的状态。 特别是:
* Trial 详情:Trial 的 id,持续时间,开始时间,结束时间,状态,精度和搜索空间文件。 .. image:: ../../img/webui-img/full-detail.png
* 如果在 OpenPAI 平台上运行,还可以看到 hdfsLog。 :target: ../../img/webui-img/full-detail.png
* Kill: 可结束在 ``Running`` 状态的任务。 :alt: detail
* Support: 用于搜索某个指定的 Trial。
.. image:: ../../img/QuickStart6.png
:target: ../../img/QuickStart6.png
:alt:
查看 Experiment 管理页面
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
``All experiments`` 页面可以查看计算机上的所有实验。
* 中间结果图 .. image:: ../../img/webui-img/managerExperimentList/expList.png
:target: ../../img/webui-img/managerExperimentList/expList.png
:alt: Experiments list
.. image:: ../../img/QuickStart7.png
:target: ../../img/QuickStart7.png
:alt:
更多信息可参考 `此文档 <./WebUI.rst>`__
相关主题 相关主题
------------- -------------
......
...@@ -6,8 +6,6 @@ NNI 开发环境支持安装 Python 3 64 位的 Ubuntu 1604 (及以上)和 W ...@@ -6,8 +6,6 @@ NNI 开发环境支持安装 Python 3 64 位的 Ubuntu 1604 (及以上)和 W
安装 安装
------------ ------------
安装步骤与从源代码安装类似。 但是安装过程会链接到代码目录,以便代码改动能更方便的直接使用。
1. 克隆源代码 1. 克隆源代码
^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^
...@@ -20,19 +18,13 @@ NNI 开发环境支持安装 Python 3 64 位的 Ubuntu 1604 (及以上)和 W ...@@ -20,19 +18,13 @@ NNI 开发环境支持安装 Python 3 64 位的 Ubuntu 1604 (及以上)和 W
2. 从源代码安装 2. 从源代码安装
^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
Ubuntu
^^^^^^
.. code-block:: bash .. code-block:: bash
make dev-easy-install python3 -m pip install --upgrade pip setuptools
python3 setup.py develop
Windows
^^^^^^^
.. code-block:: bat 这是在 `开发模式 <https://setuptools.readthedocs.io/en/latest/userguide/development_mode.html>`__ 下安装NNI,
所以你不需要在编辑之后重新安装。
powershell -ExecutionPolicy Bypass -file install.ps1 -Development
3. 检查环境是否正确 3. 检查环境是否正确
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...@@ -42,7 +34,7 @@ Windows ...@@ -42,7 +34,7 @@ Windows
.. code-block:: bash .. code-block:: bash
nnictl create --config examples/trials/mnist-tfv1/config.yml nnictl create --config examples/trials/mnist-pytorch/config.yml
并打开网页界面查看 并打开网页界面查看
...@@ -54,13 +46,17 @@ Python ...@@ -54,13 +46,17 @@ Python
无需操作,代码已连接到包的安装位置。 无需操作,代码已连接到包的安装位置。
TypeScript TypeScript (Linux 和 macOS)
^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
* 如果改动了 ``tc/nni_manager``,在此目录下运行 ``yarn watch`` 可持续编译改动。 它将持续的监视并编译代码。 可能需要重新启动 ``nnictl`` 来重新加载 NNI 管理器。
* 如果改动了 ``tx/webui`` ,运行 ``yarn dev``, 该命令将同时运行一个 模拟 API 服务器和一个 webpack 开发服务器。 使用环境变量 ``EXPERIMENT`` (例如 ``mnist-tfv1-running``\ ) 来指定要用到的模拟数据。 内置的模拟实验列在 ``src/webui/mock``。 完整示例:``EXPERIMENT=mnist-tfv1-running yarn dev``。
* 如果改动了 ``ts/nasui``,在相应目录下运行 ``yarn start``。 Web 界面会在代码修改后自动刷新。 还有一个在开发时有用的模拟 API 服务器, 可以通过 ``node server.js`` 来启动。
TypeScript (Windows)
^^^^^^^^^^^^^^^^^^^^
* 如果改动了 ``src/nni_manager``,在此目录下运行 ``yarn watch`` 可持续编译改动。 它将持续的监视并编译代码。 可能需要重新启动 ``nnictl`` 来重新加载 NNI 管理器。 目前,您必须在编辑后使用 `python3 setup.py build_ts` 重建 TypeScript 模块。
* 如果改动了 ``src/webui`` ,运行 ``yarn dev``, 该命令将同时运行一个 模拟 API 服务器和一个 webpack 开发服务器。 使用环境变量 ``EXPERIMENT`` (例如 ``mnist-tfv1-running``\ ) 来指定要用到的模拟数据。 内置的模拟实验列在 ``src/webui/mock``。 完整示例:``EXPERIMENT=mnist-tfv1-running yarn dev``。
* 如果改动了 ``src/nasui``,在相应目录下运行 ``yarn start``。 Web 界面会在代码修改后自动刷新。 还有一个在开发时有用的模拟 API 服务器, 可以通过 ``node server.js`` 来启动。
5. 提交拉取请求 5. 提交拉取请求
^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment