Unverified Commit 403195f0 authored by Yuge Zhang's avatar Yuge Zhang Committed by GitHub
Browse files

Merge branch 'master' into nn-meter

parents 99aa8226 a7278d2d
...@@ -149,6 +149,9 @@ NNI 用来帮助超参调优。它的流程如下: ...@@ -149,6 +149,9 @@ NNI 用来帮助超参调优。它的流程如下:
codeDir: . codeDir: .
gpuNum: 0 gpuNum: 0
.. _nniignore:
.. 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-pytorch/config.yml>` :githublink:`.nniignore <examples/trials/mnist-pytorch/.nniignore>` *示例:* :githublink:`config.yml <examples/trials/mnist-pytorch/config.yml>` :githublink:`.nniignore <examples/trials/mnist-pytorch/.nniignore>`
...@@ -234,7 +237,7 @@ Experiment 相关信息会显示在界面上,配置和搜索空间等。 NNI ...@@ -234,7 +237,7 @@ Experiment 相关信息会显示在界面上,配置和搜索空间等。 NNI
查看 Trial 详情页面 查看 Trial 详情页面
^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^
可以在此页面中看到最佳的试用指标和超参数图。 当您单击按钮 ``Add/Remove columns`` 时,表格内容包括更多列。 可以在此页面中看到最佳的试用指标和超参数图。 当您单击按钮 ``Add/Remove columns`` 时,表格内容包括更多列。 当您单击按钮 ``Add/Remove columns`` 时,表格内容包括更多列。
.. image:: ../../img/webui-img/full-detail.png .. image:: ../../img/webui-img/full-detail.png
...@@ -260,11 +263,12 @@ Experiment 相关信息会显示在界面上,配置和搜索空间等。 NNI ...@@ -260,11 +263,12 @@ Experiment 相关信息会显示在界面上,配置和搜索空间等。 NNI
------------- -------------
* ` Web 界面中启动 TensorBoard <Tensorboard.rst>`__
* `尝试不同的 Tuner <../Tuner/BuiltinTuner.rst>`__ * `尝试不同的 Tuner <../Tuner/BuiltinTuner.rst>`__
* `尝试不同的 Assessor <../Assessor/BuiltinAssessor.rst>`__ * `尝试不同的 Assessor <../Assessor/BuiltinAssessor.rst>`__
* `如何使用命令行工具 nnictl <Nnictl.rst>`__ * `如何使用命令行工具 nnictl <Nnictl.rst>`__
* `如何实现 Trial 代码 <../TrialExample/Trials.rst>`__ * `如何实现 Trial 代码 <../TrialExample/Trials.rst>`__
* `如何在本机运行 Experiment (支持多 GPU ) <../TrainingService/LocalMode.rst>`__ * `如何在本机运行 Experiment (支持多 GPU ) <../TrainingService/LocalMode.rst>`__ <../TrainingService/LocalMode.rst>`__
* `如何在多机上运行 Experiment <../TrainingService/RemoteMachineMode.rst>`__ * `如何在多机上运行 Experiment <../TrainingService/RemoteMachineMode.rst>`__
* `如何在 OpenPAI 上运行 Experiment <../TrainingService/PaiMode.rst>`__ * `如何在 OpenPAI 上运行 Experiment <../TrainingService/PaiMode.rst>`__
* `如何通过 Kubeflow Kubernetes 上运行 Experiment <../TrainingService/KubeflowMode.rst>`__ * `如何通过 Kubeflow Kubernetes 上运行 Experiment <../TrainingService/KubeflowMode.rst>`__
......
...@@ -243,13 +243,25 @@ ...@@ -243,13 +243,25 @@
- -
- -
- -
* - DNGO Tuner
- :raw-html:`&#10003;`
-
- :raw-html:`&#10003;`
- :raw-html:`&#10003;`
- :raw-html:`&#10003;`
- :raw-html:`&#10003;`
- :raw-html:`&#10003;`
-
-
-
-
已知的局限: 已知的局限:
* *
GP TunerMetis Tuner 的搜索空间只支持 **数值**,(**choice** 类型在其它 Tuner 中可以使用非数值, 如:字符串等)。 GP Tuner 和 Metis Tuner 都使用了高斯过程的回归(Gaussian Process Regressor, GPR)。 GPR 基于计算不同点距离的和函数来进行预测,其无法计算非数值值的距离。 GP TunerMetis Tuner 和 DNGO Tuner 的搜索空间只支持 **数值**,(**choice** 类型在其它 Tuner 中可以使用非数值, 如:字符串等)。 GP Tuner 和 Metis Tuner 都使用了高斯过程的回归(Gaussian Process Regressor, GPR)。 GPR 基于计算不同点距离的和函数来进行预测,其无法计算非数值值的距离。
* *
请注意,对于嵌套搜索空间: 请注意,对于嵌套搜索空间:
......
如何在 Web 界面中使用 TensorBoard
====================================================
从 NNI v2.2 开始,您可以在 Web 界面中跨一个或多个 Trial 启动 TensorBoard 进程。 该功能目前支持本地训练平台和共享存储的重用模式下的训练平台,并将在未来的 NNI 版本中支持更多场景。
准备
-----------
确保在您的环境中安装了 TensorBoard。 如果您从未使用过 TensorBoard,这里有入门教程供您参考:`在 TensorFlow 下使用 TensorBoard <https://www.tensorflow.org/tensorboard/get_started>`__, `在 PyTorch 下使用 TensorBoard <https://pytorch.org/tutorials/recipes/recipes/tensorboard_with_pytorch.html>`__。
使用 Web 界面启动 TensorBoard
--------------------------------------------------------
1. 保存日志
^^^^^^^^^^^^
NNI 将自动获取 Trial 输出文件夹下的 ``tensorboard`` 子文件夹作为 tensorboard logdir。 所以在 Trial 的源代码中,你需要将 TensorBoard 日志保存在 ``NNI_OUTPUT_DIR/tensorboard`` 下。 此日志路径可以连接为:
.. code-block:: python
log_dir = os.path.join(os.environ["NNI_OUTPUT_DIR"], 'tensorboard')
2. 启动 TensorBoard
^^^^^^^^^^^^^^^^^^^^^
像比较一样,首先选择要组合的 Trial 来启动 TensorBoard,然后单击 ``Tensorboard`` 按钮。
.. image:: ../../img/Tensorboard_1.png
:target: ../../img/Tensorboard_1.png
:alt:
点击弹出框中的 "OK "按钮后,你将跳转到 TensorBoard 门户。
.. image:: ../../img/Tensorboard_2.png
:target: ../../img/Tensorboard_2.png
:alt:
你可以在 TensorBoard 门户上看到 ``SequenceID-TrialID``。
.. image:: ../../img/Tensorboard_3.png
:target: ../../img/Tensorboard_3.png
:alt:
3. 全部停用
^^^^^^^^^^^^
如果你想打开已经启动的门户,请点击 tensorboard id。 如果你不再需要 TensorBoard,点击 ``Stop all tensorboard`` 按钮。
.. image:: ../../img/Tensorboard_4.png
:target: ../../img/Tensorboard_4.png
:alt:
Web 界面 Web 界面
=============== ==================
Experiment 管理 Experiment 管理
----------------------- -----------------------
...@@ -144,7 +144,7 @@ Experiment 管理 ...@@ -144,7 +144,7 @@ Experiment 管理
查看超参 查看超参
-------------------- --------------------
击 ``Hyper Parameter`` 标签查看图 击 ``Intermediate Result`` 标签查看折线图。
* 可以 ``添加/删除`` 轴,或者拖动以交换图表上的轴。 * 可以 ``添加/删除`` 轴,或者拖动以交换图表上的轴。
...@@ -195,7 +195,7 @@ Trial 可能在训练过程中有大量中间结果。 为了更清楚的理解 ...@@ -195,7 +195,7 @@ Trial 可能在训练过程中有大量中间结果。 为了更清楚的理解
查看 Trial 状态 查看 Trial 状态
------------------ ------------------
点击 ``Trials Detail`` 标签查看所有 Trial 的状态。 特别是: 点击 ``Trials Detail`` 标签查看所有 Trial 的状态。 特别是: 特别是:
* Trial 详情:Trial 的 id,持续时间,开始时间,结束时间,状态,精度和搜索空间文件。 * Trial 详情:Trial 的 id,持续时间,开始时间,结束时间,状态,精度和搜索空间文件。
...@@ -207,7 +207,44 @@ Trial 可能在训练过程中有大量中间结果。 为了更清楚的理解 ...@@ -207,7 +207,44 @@ Trial 可能在训练过程中有大量中间结果。 为了更清楚的理解
* ``Add column`` 按钮可选择在表格中显示的列。 如果 Experiment 的最终结果是 dict,则可以在表格中查看其它键。 可选择 ``Intermediate count`` 列来查看 Trial 进度。 * 支持通过 id,状态,Trial 编号, 以及参数来搜索。
1. Trial id:
.. image:: ../../img/webui-img/search-trial.png
:target: ../../img/webui-img/search-trial.png
:alt: searchTrial
2. Trial No.:
.. image:: ../../img/webui-img/detail/searchNo.png
:target: ../../img/webui-img/detail/searchNo.png
:alt: searchTrialNo.
3. Trial 状态:
.. image:: ../../img/webui-img/detail/searchStatus.png
:target: ../../img/webui-img/detail/searchStatus.png
:alt: searchStatus
4. Trial 参数:
(1) 类型为 choice 的参数:
.. image:: ../../img/webui-img/detail/searchParameterChoice.png
:target: ../../img/webui-img/detail/searchParameterChoice.png
:alt: searchParameterChoice
(2) 类型不是 choice 的参数:
.. image:: ../../img/webui-img/detail/searchParameterRange.png
:target: ../../img/webui-img/detail/searchParameterRange.png
:alt: searchParameterRange
* ``Add column`` 按钮可选择在表格中显示的列。 如果 Experiment 的最终结果是 dict,则可以在表格中查看其它键。 * ``Add column`` 按钮可选择在表格中显示的列。 如果 Experiment 的最终结果是 dict,则可以在表格中查看其它键。 可选择 ``Intermediate count`` 列来查看 Trial 进度。
.. image:: ../../img/webui-img/addColumn.png .. image:: ../../img/webui-img/addColumn.png
...@@ -229,13 +266,7 @@ Trial 可能在训练过程中有大量中间结果。 为了更清楚的理解 ...@@ -229,13 +266,7 @@ Trial 可能在训练过程中有大量中间结果。 为了更清楚的理解
:alt: compareTrialsGraph :alt: compareTrialsGraph
* ``Tensorboard`` 请参考 `此文档 <Tensorboard.rst>`__。
* 支持通过 id,状态,Trial 编号, 以及参数来搜索。
.. image:: ../../img/webui-img/search-trial.png
:target: ../../img/webui-img/search-trial.png
:alt: searchTrial
...@@ -248,15 +279,22 @@ Trial 可能在训练过程中有大量中间结果。 为了更清楚的理解 ...@@ -248,15 +279,22 @@ Trial 可能在训练过程中有大量中间结果。 为了更清楚的理解
* 如果在 OpenPAI 或 Kubeflow 平台上运行,还可以看到 hdfsLog。 * 您可以在 ``Log`` 选项卡上看到 Trial 日志。 在本地模式下有 ``View trial log``, ``View trial error`` 和 ``View trial stdout`` 三个按钮。 * 如果在 OpenPAI 或 Kubeflow 平台上运行,还可以看到 hdfsLog。
1. 本机模式
.. image:: ../../img/webui-img/detail/log-local.png
:target: ../../img/webui-img/detail/log-local.png
:alt: logOnLocal
2. OpenPAI、Kubeflow 等模式:
.. image:: ../../img/webui-img/detail-pai.png .. image:: ../../img/webui-img/detail-pai.png
:target: ../../img/webui-img/detail-pai.png :target: ../../img/webui-img/detail-pai.png
:alt: detailPai :alt: detailPai
* 中间结果图:可在此图中通过点击 intermediate 按钮来查看默认指标。 * 中间结果图:可在此图中通过点击 intermediate 按钮来查看默认指标。
...@@ -273,3 +311,16 @@ Trial 可能在训练过程中有大量中间结果。 为了更清楚的理解 ...@@ -273,3 +311,16 @@ Trial 可能在训练过程中有大量中间结果。 为了更清楚的理解
:target: ../../img/webui-img/kill-running.png :target: ../../img/webui-img/kill-running.png
:alt: killTrial :alt: killTrial
* 自定义 Trial:您可以更改此 Trial 参数,然后将其提交给 Experiment。 如果您想重新运行失败的 Trial ,您可以向 Experiment 提交相同的参数。
.. image:: ../../img/webui-img/detail/customizedTrialButton.png
:target: ../../img/webui-img/detail/customizedTrialButton.png
:alt: customizedTrialButton
.. image:: ../../img/webui-img/detail/customizedTrial.png
:target: ../../img/webui-img/detail/customizedTrial.png
:alt: customizedTrial
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"[2021-02-25 07:50:38] Tuner not set, wait for connect...\n",
"[2021-02-25 07:50:38] Connect to port 8080 success, experiment id is IF0JnfLE, status is RUNNING.\n" "[2021-02-25 07:50:38] Connect to port 8080 success, experiment id is IF0JnfLE, status is RUNNING.\n"
] ]
} }
...@@ -55,7 +54,7 @@ ...@@ -55,7 +54,7 @@
"text/plain": [ "text/plain": [
"{'id': 'IF0JnfLE',\n", "{'id': 'IF0JnfLE',\n",
" 'revision': 6,\n", " 'revision': 6,\n",
" 'execDuration': 28,\n", " 'maxTrialNum': 10,\n",
" 'logDir': '/home/ningshang/nni-experiments/IF0JnfLE',\n", " 'logDir': '/home/ningshang/nni-experiments/IF0JnfLE',\n",
" 'nextSequenceId': 2,\n", " 'nextSequenceId': 2,\n",
" 'params': {'authorName': 'default',\n", " 'params': {'authorName': 'default',\n",
...@@ -90,7 +89,15 @@ ...@@ -90,7 +89,15 @@
"execution_count": 3, "execution_count": 3,
"id": "printable-bookmark", "id": "printable-bookmark",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2021-03-05 12:18:32] (root) Successfully update maxTrialNum.\n"
]
}
],
"source": [ "source": [
"experiment.update_max_trial_number(10)" "experiment.update_max_trial_number(10)"
] ]
...@@ -106,14 +113,14 @@ ...@@ -106,14 +113,14 @@
"text/plain": [ "text/plain": [
"{'id': 'IF0JnfLE',\n", "{'id': 'IF0JnfLE',\n",
" 'revision': 8,\n", " 'revision': 8,\n",
" 'execDuration': 32,\n", " 'execDuration': 28,\n",
" 'logDir': '/home/ningshang/nni-experiments/IF0JnfLE',\n", " 'logDir': '/home/ningshang/nni-experiments/IF0JnfLE',\n",
" 'nextSequenceId': 2,\n", " 'nextSequenceId': 2,\n",
" 'params': {'authorName': 'default',\n", " 'params': {'authorName': 'default',\n",
" 'experimentName': 'example_sklearn-classification',\n", " 'experimentName': 'example_sklearn-classification',\n",
" 'trialConcurrency': 1,\n", " 'trialConcurrency': 1,\n",
" 'maxExecDuration': 3600,\n", " 'maxExecDuration': 3600,\n",
" 'maxTrialNum': 10,\n", " 'maxTrialNum': 200,\n",
" 'searchSpace': '{\"C\": {\"_type\": \"uniform\", \"_value\": [0.1, 1]}, \"kernel\": {\"_type\": \"choice\", \"_value\": [\"linear\", \"rbf\", \"poly\", \"sigmoid\"]}, \"degree\": {\"_type\": \"choice\", \"_value\": [1, 2, 3, 4]}, \"gamma\": {\"_type\": \"uniform\", \"_value\": [0.01, 0.1]}, \"coef0\": {\"_type\": \"uniform\", \"_value\": [0.01, 0.1]}}',\n", " 'searchSpace': '{\"C\": {\"_type\": \"uniform\", \"_value\": [0.1, 1]}, \"kernel\": {\"_type\": \"choice\", \"_value\": [\"linear\", \"rbf\", \"poly\", \"sigmoid\"]}, \"degree\": {\"_type\": \"choice\", \"_value\": [1, 2, 3, 4]}, \"gamma\": {\"_type\": \"uniform\", \"_value\": [0.01, 0.1]}, \"coef0\": {\"_type\": \"uniform\", \"_value\": [0.01, 0.1]}}',\n",
" 'trainingServicePlatform': 'local',\n", " 'trainingServicePlatform': 'local',\n",
" 'tuner': {'builtinTunerName': 'TPE',\n", " 'tuner': {'builtinTunerName': 'TPE',\n",
......
...@@ -8,36 +8,17 @@ ...@@ -8,36 +8,17 @@
"## 启动并管理一个新的 Experiment" "## 启动并管理一个新的 Experiment"
] ]
}, },
{
"cell_type": "markdown",
"id": "immediate-daily",
"metadata": {},
"source": [
"### 1. 初始化 Tuner"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "formed-grounds",
"metadata": {},
"outputs": [],
"source": [
"from nni.algorithms.hpo.gridsearch_tuner import GridSearchTuner\n",
"tuner = GridSearchTuner()"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"id": "reported-somerset", "id": "reported-somerset",
"metadata": {}, "metadata": {},
"source": [ "source": [
"### 2. 定义搜索空间" "### 1. 定义搜索空间"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 2, "execution_count": 1,
"id": "potential-williams", "id": "potential-williams",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
...@@ -56,24 +37,27 @@ ...@@ -56,24 +37,27 @@
"id": "greek-archive", "id": "greek-archive",
"metadata": {}, "metadata": {},
"source": [ "source": [
"### 3. 配置 Experiment " "### 2. 配置 Experiment "
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 3, "execution_count": 2,
"id": "fiscal-expansion", "id": "fiscal-expansion",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"from nni.experiment import Experiment\n", "from nni.experiment import Experiment\n",
"experiment = Experiment(tuner, 'local')\n", "experiment = Experiment('local')\n",
"experiment.config.experiment_name = 'test'\n", "experiment.config.experiment_name = 'Example'\n",
"experiment.config.trial_concurrency = 2\n", "experiment.config.trial_concurrency = 2\n",
"experiment.config.max_trial_number = 5\n", "experiment.config.max_trial_number = 10\n",
"experiment.config.search_space = search_space\n", "experiment.config.search_space = search_space\n",
"experiment.config.trial_command = 'python3 main.py'\n", "experiment.config.trial_command = 'python3 main.py'\n",
"experiment.config.trial_code_directory = './'" "experiment.config.trial_code_directory = './'\n",
"experiment.config.tuner.name = 'TPE'\n",
"experiment.config.tuner.class_args['optimize_mode'] = 'maximize'\n",
"experiment.config.training_service.use_active_gpu = True"
] ]
}, },
{ {
...@@ -81,12 +65,12 @@ ...@@ -81,12 +65,12 @@
"id": "received-tattoo", "id": "received-tattoo",
"metadata": {}, "metadata": {},
"source": [ "source": [
"### 4. 启动 Experiment" "### 3. 启动 Experiment"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 4, "execution_count": 3,
"id": "pleasant-patent", "id": "pleasant-patent",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
...@@ -94,17 +78,15 @@ ...@@ -94,17 +78,15 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"[2021-02-22 12:27:11] Creating experiment, Experiment ID: bj025qo4\n", "[2021-03-05 12:12:19] Creating experiment, Experiment ID: wdt0le3v\n",
"[2021-02-22 12:27:11] Connecting IPC pipe...\n", "[2021-03-05 12:12:19] Starting web server...\n",
"[2021-02-22 12:27:15] Statring web server...\n", "[2021-03-05 12:12:20] Setting up...\n",
"[2021-02-22 12:27:16] Setting up...\n", "[2021-03-05 12:12:20] Web UI URLs: http://127.0.0.1:8080 http://10.0.1.5:8080 http://172.17.0.1:8080\n"
"[2021-02-22 12:27:16] Dispatcher started\n",
"[2021-02-22 12:27:16] Web UI URLs: http://127.0.0.1:8081 http://10.0.1.5:8081 http://172.17.0.1:8081\n"
] ]
} }
], ],
"source": [ "source": [
"experiment.start(8081)" "experiment.start(8080)"
] ]
}, },
{ {
...@@ -112,12 +94,12 @@ ...@@ -112,12 +94,12 @@
"id": "miniature-prison", "id": "miniature-prison",
"metadata": {}, "metadata": {},
"source": [ "source": [
"### 5. Experiment 查看和管理" "### 4. Experiment 查看和管理"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 5, "execution_count": 4,
"id": "animated-english", "id": "animated-english",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
...@@ -127,7 +109,7 @@ ...@@ -127,7 +109,7 @@
"'RUNNING'" "'RUNNING'"
] ]
}, },
"execution_count": 5, "execution_count": 4,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
} }
...@@ -138,18 +120,18 @@ ...@@ -138,18 +120,18 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 6, "execution_count": 5,
"id": "alpha-ottawa", "id": "alpha-ottawa",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"[TrialResult(parameter={'coef0': 0.01, 'gamma': 0.01, 'degree': 1, 'kernel': 'linear', 'C': 0.1}, value=0.9866666666666667, trialJobId='B55mT'),\n", "[TrialResult(parameter={'C': 0.30000000000000004, 'kernel': 'linear', 'degree': 3, 'gamma': 0.03, 'coef0': 0.07}, value=0.9888888888888889, trialJobId='VLqU9'),\n",
" TrialResult(parameter={'coef0': 0.02, 'gamma': 0.01, 'degree': 1, 'kernel': 'linear', 'C': 0.1}, value=0.9866666666666667, trialJobId='QkhD0')]" " TrialResult(parameter={'C': 0.5, 'kernel': 'sigmoid', 'degree': 1, 'gamma': 0.03, 'coef0': 0.07}, value=0.8888888888888888, trialJobId='DLo6r')]"
] ]
}, },
"execution_count": 6, "execution_count": 5,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
} }
...@@ -160,18 +142,18 @@ ...@@ -160,18 +142,18 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 7, "execution_count": 6,
"id": "unique-rendering", "id": "unique-rendering",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"{'B55mT': [TrialMetricData(timestamp=1613996853005, trialJobId='B55mT', parameterId='0', type='FINAL', sequence=0, data=0.9866666666666667)],\n", "{'DLo6r': [TrialMetricData(timestamp=1614946351592, trialJobId='DLo6r', parameterId='1', type='FINAL', sequence=0, data=0.8888888888888888)],\n",
" 'QkhD0': [TrialMetricData(timestamp=1613996853843, trialJobId='QkhD0', parameterId='1', type='FINAL', sequence=0, data=0.9866666666666667)]}" " 'VLqU9': [TrialMetricData(timestamp=1614946351607, trialJobId='VLqU9', parameterId='0', type='FINAL', sequence=0, data=0.9888888888888889)]}"
] ]
}, },
"execution_count": 7, "execution_count": 6,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
} }
...@@ -185,12 +167,12 @@ ...@@ -185,12 +167,12 @@
"id": "welsh-difference", "id": "welsh-difference",
"metadata": {}, "metadata": {},
"source": [ "source": [
"### 6. 停止 Experiment" "### 5. 停止 Experiment"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 8, "execution_count": 7,
"id": "technological-cleanup", "id": "technological-cleanup",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
...@@ -198,10 +180,8 @@ ...@@ -198,10 +180,8 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"[2021-02-22 12:28:16] Stopping experiment, please wait...\n", "[2021-03-05 12:12:40] Stopping experiment, please wait...\n",
"[2021-02-22 12:28:16] Dispatcher exiting...\n", "[2021-03-05 12:12:42] Experiment stopped\n"
"[2021-02-22 12:28:17] Experiment stopped\n",
"[2021-02-22 12:28:19] Dispatcher terminiated\n"
] ]
} }
], ],
...@@ -231,4 +211,4 @@ ...@@ -231,4 +211,4 @@
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 5 "nbformat_minor": 5
} }
\ No newline at end of file
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
{% block document %} {% block document %}
<div> <div>
<div class="chinese"><a href="https://nni.readthedocs.io/en/latest/">English</a></div> <div class="chinese"><a href="https://nni.readthedocs.io/zh/stable/">English</a></div>
<b>NNI (Neural Network Intelligence)</b> 是一个轻量但强大的工具包,帮助用户<b>自动</b>的进行 <b>NNI (Neural Network Intelligence)</b> 是一个轻量但强大的工具包,帮助用户<b>自动</b>的进行
<a href="{{ pathto('FeatureEngineering/Overview') }}">特征工程</a><a href="{{ pathto('NAS/Overview') }}">神经网络架构搜索</a><a href="{{ pathto('Tuner/BuiltinTuner') }}">超参调优</a>以及<a href="{{ pathto('Compression/Overview') }}">模型压缩</a> <a href="{{ pathto('FeatureEngineering/Overview') }}">特征工程</a><a href="{{ pathto('NAS/Overview') }}">神经网络架构搜索</a><a href="{{ pathto('Tuner/BuiltinTuner') }}">超参调优</a>以及<a href="{{ pathto('Compression/Overview') }}">模型压缩</a>
</div> </div>
...@@ -99,13 +99,14 @@ ...@@ -99,13 +99,14 @@
<ul class="circle"> <ul class="circle">
<li><a href="https://github.com/microsoft/nni/tree/master/examples/trials/mnist-pytorch">MNIST-pytorch</li> <li><a href="https://github.com/microsoft/nni/tree/master/examples/trials/mnist-pytorch">MNIST-pytorch</li>
</a> </a>
<li><a href="https://github.com/microsoft/nni/tree/master/examples/trials/mnist-tfv1">MNIST-tensorflow</li> <li><a href="https://github.com/microsoft/nni/tree/master/examples/trials/mnist-tfv2">MNIST-tensorflow</li>
</a> </a>
<li><a href="https://github.com/microsoft/nni/tree/master/examples/trials/mnist-keras">MNIST-keras</li></a> <li><a href="https://github.com/microsoft/nni/tree/master/examples/trials/mnist-keras">MNIST-keras</li></a>
<li><a href="{{ pathto('TrialExample/GbdtExample') }}">Auto-gbdt</a></li> <li><a href="{{ pathto('TrialExample/GbdtExample') }}">Auto-gbdt</a></li>
<li><a href="{{ pathto('TrialExample/Cifar10Examples') }}">Cifar10-pytorch</li></a> <li><a href="{{ pathto('TrialExample/Cifar10Examples') }}">Cifar10-pytorch</li></a>
<li><a href="{{ pathto('TrialExample/SklearnExamples') }}">Scikit-learn</a></li> <li><a href="{{ pathto('TrialExample/SklearnExamples') }}">Scikit-learn</a></li>
<li><a href="{{ pathto('TrialExample/EfficientNet') }}">EfficientNet</a></li> <li><a href="{{ pathto('TrialExample/EfficientNet') }}">EfficientNet</a></li>
<li><a href="{{ pathto('TrialExample/OpEvoExamples') }}">GPU Kernel 调优</li></a>
<a href="{{ pathto('SupportedFramework_Library') }}">更多...</a><br /> <a href="{{ pathto('SupportedFramework_Library') }}">更多...</a><br />
</ul> </ul>
</ul> </ul>
...@@ -115,27 +116,25 @@ ...@@ -115,27 +116,25 @@
<ul class="firstUl"> <ul class="firstUl">
<div><b>穷举搜索</b></div> <div><b>穷举搜索</b></div>
<ul class="circle"> <ul class="circle">
<li><a href="{{ pathto('Tuner/BuiltinTuner') }}">Random Search(随机搜索)</a></li> <li><a href="{{ pathto('Tuner/BuiltinTuner') }}#Random">Random Search(随机搜索)</a></li>
<li><a href="{{ pathto('Tuner/BuiltinTuner') }}">Grid Search(遍历搜索)</a></li> <li><a href="{{ pathto('Tuner/BuiltinTuner') }}#GridSearch">Grid Search(遍历搜索)</a></li>
<li><a href="{{ pathto('Tuner/BuiltinTuner') }}">Batch(批处理)</a></li> <li><a href="{{ pathto('Tuner/BuiltinTuner') }}#Batch">Batch(批处理)</a></li>
</ul> </ul>
<div><b>启发式搜索</b></div> <div><b>启发式搜索</b></div>
<ul class="circle"> <ul class="circle">
<li><a href="{{ pathto('Tuner/BuiltinTuner') }}">Naïve Evolution(朴素进化)</a></li> <li><a href="{{ pathto('Tuner/BuiltinTuner') }}#Evolution">Naïve Evolution(朴素进化)</a></li>
<li><a href="{{ pathto('Tuner/BuiltinTuner') }}">Anneal(退火算法)</a></li> <li><a href="{{ pathto('Tuner/BuiltinTuner') }}#Anneal">Anneal(退火算法)</a></li>
<li><a href="{{ pathto('Tuner/BuiltinTuner') }}">Hyperband</a></li> <li><a href="{{ pathto('Tuner/BuiltinTuner') }}#Hyperband">Hyperband</a></li>
<li><a href="{{ pathto('Tuner/BuiltinTuner') }}#PBTTuner">P-DARTS</a></li>
</ul> </ul>
<div><b>贝叶斯优化</b></div> <div><b>贝叶斯优化</b></div>
<ul class="circle"> <ul class="circle">
<li><a href="{{ pathto('Tuner/BuiltinTuner') }}">BOHB</a></li> <li><a href="{{ pathto('Tuner/BuiltinTuner') }}#BOHB">BOHB</a></li>
<li><a href="{{ pathto('Tuner/BuiltinTuner') }}">TPE</a></li> <li><a href="{{ pathto('Tuner/BuiltinTuner') }}#TPE">TPE</a></li>
<li><a href="{{ pathto('Tuner/BuiltinTuner') }}">SMAC</a></li> <li><a href="{{ pathto('Tuner/BuiltinTuner') }}#SMAC">SMAC</a></li>
<li><a href="{{ pathto('Tuner/BuiltinTuner') }}">Metis Tuner</a></li> <li><a href="{{ pathto('Tuner/BuiltinTuner') }}#MetisTuner">Metis Tuner</a></li>
<li><a href="{{ pathto('Tuner/BuiltinTuner') }}">GP Tuner</a> </li> <li><a href="{{ pathto('Tuner/BuiltinTuner') }}#GPTuner">GP Tuner</a> </li>
</ul> <li><a href="{{ pathto('Tuner/BuiltinTuner') }}#DNGOTuner">PPO Tuner</a></li>
<div><b>基于强化学习</b></div>
<ul class="circle">
<li><a href="{{ pathto('Tuner/BuiltinTuner') }}">PPO Tuner</a> </li>
</ul> </ul>
</ul> </ul>
<a href="{{ pathto('NAS/Overview') }}">神经网络架构搜索</a> <a href="{{ pathto('NAS/Overview') }}">神经网络架构搜索</a>
...@@ -143,26 +142,32 @@ ...@@ -143,26 +142,32 @@
<ul class="circle"> <ul class="circle">
<li><a href="{{ pathto('NAS/ENAS') }}">ENAS</a></li> <li><a href="{{ pathto('NAS/ENAS') }}">ENAS</a></li>
<li><a href="{{ pathto('NAS/DARTS') }}">DARTS</a></li> <li><a href="{{ pathto('NAS/DARTS') }}">DARTS</a></li>
<li><a href="{{ pathto('NAS/PDARTS') }}">P-DARTS</a></li>
<li><a href="{{ pathto('NAS/CDARTS') }}">CDARTS</a></li>
<li><a href="{{ pathto('NAS/SPOS') }}">SPOS</a></li> <li><a href="{{ pathto('NAS/SPOS') }}">SPOS</a></li>
<li><a href="{{ pathto('NAS/Proxylessnas') }}">ProxylessNAS</a></li> <li><a href="{{ pathto('NAS/Proxylessnas') }}">ProxylessNAS</a></li>
<li><a href="{{ pathto('Tuner/NetworkmorphismTuner') }}">Network Morphism</a> </li> <li><a href="{{ pathto('NAS/FBNet') }}">微信</a></li>
<li><a href="{{ pathto('NAS/TextNAS') }}">TextNAS</a> </li> <li><a href="{{ pathto('NAS/ExplorationStrategies') }}">基于强化学习</a></li>
<li><a href="{{ pathto('NAS/ExplorationStrategies') }}">Network Morphism</a></li>
<li><a href="{{ pathto('NAS/Overview') }}">TextNAS</a></li>
</ul> </ul>
</ul> </ul>
<a href="{{ pathto('Compression/Overview') }}">模型压缩</a> <a href="{{ pathto('Compression/Overview') }}">模型压缩</a>
<ul class="firstUl"> <ul class="firstUl">
<div><b>剪枝</b></div> <div><b>剪枝</b></div>
<ul class="circle"> <ul class="circle">
<li><a href="{{ pathto('Compression/Pruner') }}">AGP Pruner</a></li> <li><a href="{{ pathto('Compression/Pruner') }}#agp-pruner">AGP Pruner</a></li>
<li><a href="{{ pathto('Compression/Pruner') }}">Slim Pruner</a></li> <li><a href="{{ pathto('Compression/Pruner') }}#slim-pruner">Slim Pruner</a></li>
<li><a href="{{ pathto('Compression/Pruner') }}">FPGM Pruner</a></li> <li><a href="{{ pathto('Compression/Pruner') }}#fpgm-pruner">FPGM Pruner</a></li>
<li><a href="{{ pathto('Compression/Pruner') }}#netadapt-pruner">NetAdapt Pruner</a></li>
<li><a href="{{ pathto('Compression/Pruner') }}#simulatedannealing-pruner">SimulatedAnnealing Pruner</a></li>
<li><a href="{{ pathto('Compression/Pruner') }}#admm-pruner">ADMM Pruner</a></li>
<li><a href="{{ pathto('Compression/Pruner') }}#autocompress-pruner">AutoCompress Pruner</a></li>
<li><a href="{{ pathto('Compression/Overview') }}">更多...</a></li>
</ul> </ul>
<div><b>量化</b></div> <div><b>量化</b></div>
<ul class="circle"> <ul class="circle">
<li><a href="{{ pathto('Compression/Quantizer') }}">QAT Quantizer</a></li> <li><a href="{{ pathto('Compression/Quantizer') }}#qat-quantize">QAT Quantizer</a></li>
<li><a href="{{ pathto('Compression/Quantizer') }}">DoReFa Quantizer</a></li> <li><a href="{{ pathto('Compression/Quantizer') }}#dorefa-quantizer">DoReFa Quantizer</a></li>
<li><a href="{{ pathto('Compression/Quantizer') }}#bnn-quantizer">BNN Quantizer</a></li>
</ul> </ul>
</ul> </ul>
<a href="{{ pathto('FeatureEngineering/Overview') }}">特征工程(测试版)</a> <a href="{{ pathto('FeatureEngineering/Overview') }}">特征工程(测试版)</a>
...@@ -172,22 +177,23 @@ ...@@ -172,22 +177,23 @@
</ul> </ul>
<a href="{{ pathto('Assessor/BuiltinAssessor') }}">提前终止算法</a> <a href="{{ pathto('Assessor/BuiltinAssessor') }}">提前终止算法</a>
<ul class="circle"> <ul class="circle">
<li><a href="{{ pathto('Assessor/BuiltinAssessor') }}">Median Stop(中位数终止)</a></li> <li><a href="{{ pathto('Assessor/BuiltinAssessor') }}#MedianStop">Median Stop(中位数终止)</a></li>
<li><a href="{{ pathto('Assessor/BuiltinAssessor') }}">Curve Fitting(曲线拟合)</a></li> <li><a href="{{ pathto('Assessor/BuiltinAssessor') }}#Curvefitting">Curve Fitting(曲线拟合)</a></li>
</ul> </ul>
</td> </td>
<td> <td>
<ul class="firstUl"> <ul class="firstUl">
<li><a href="{{ pathto('TrainingService/LocalMode') }}">本机</a></li> <li><a href="{{ pathto('TrainingService/LocalMode') }}">本机</a></li>
<li><a href="{{ pathto('TrainingService/RemoteMachineMode') }}">远程计算机</a></li> <li><a href="{{ pathto('TrainingService/RemoteMachineMode') }}">远程计算机</a></li>
<li><a href="{{ pathto('TrainingService/HybridMode') }}">混合模式</a></li>
<li><a href="{{ pathto('TrainingService/AMLMode') }}">AML(Azure Machine Learning)</a></li>
<li><b>基于 Kubernetes 的平台</b></li> <li><b>基于 Kubernetes 的平台</b></li>
<ul class="circle"> <ul>
<li><a href="{{ pathto('TrainingService/PaiMode') }}">OpenPAI</a></li> <li><a href="{{ pathto('TrainingService/PaiMode') }}">OpenPAI</a></li>
<li><a href="{{ pathto('TrainingService/KubeflowMode') }}">Kubeflow</a></li> <li><a href="{{ pathto('TrainingService/KubeflowMode') }}">Kubeflow</a></li>
<li><a href="{{ pathto('TrainingService/FrameworkControllerMode') }}">基于 K8S 的 FrameworkController (如 AKS 等)</a> <li><a href="{{ pathto('TrainingService/FrameworkControllerMode') }}">基于 K8S 的 FrameworkController (如 AKS 等)</a></li>
</li>
<li><a href="{{ pathto('TrainingService/DLTSMode') }}">DLWorkspace (又称 DLTS)</a></li> <li><a href="{{ pathto('TrainingService/DLTSMode') }}">DLWorkspace (又称 DLTS)</a></li>
<li><a href="{{ pathto('TrainingService/AMLMode') }}">AML (Azure Machine Learning)</a></li> <li><a href="{{ pathto('TrainingService/AdaptDLMode') }}">AML (Azure Machine Learning)</a></li>
</ul> </ul>
</ul> </ul>
</td> </td>
...@@ -196,9 +202,9 @@ ...@@ -196,9 +202,9 @@
<td class="verticalMiddle"><b>参考</b></td> <td class="verticalMiddle"><b>参考</b></td>
<td> <td>
<ul class="firstUl"> <ul class="firstUl">
<li><a href="https://nni.readthedocs.io/zh/latest/autotune_ref.html#trial">Python API</a></li> <li><a href="{{ pathto('Tutorial/HowToLaunchFromPython') }}">Python API</a></li>
<li><a href="{{ pathto('Tutorial/AnnotationSpec') }}">NNI Annotation</a></li> <li><a href="{{ pathto('Tutorial/AnnotationSpec') }}">NNI Annotation</a></li>
<li><a href="https://nni.readthedocs.io/zh/latest/installation.html">支持的操作系统</a></li> <li><a href="{{ pathto('installation') }}">支持的操作系统</a></li>
</ul> </ul>
</td> </td>
<td> <td>
...@@ -206,6 +212,8 @@ ...@@ -206,6 +212,8 @@
<li><a href="{{ pathto('Tuner/CustomizeTuner') }}">自定义 Tuner</a></li> <li><a href="{{ pathto('Tuner/CustomizeTuner') }}">自定义 Tuner</a></li>
<li><a href="{{ pathto('Assessor/CustomizeAssessor') }}">自定义 Assessor</a></li> <li><a href="{{ pathto('Assessor/CustomizeAssessor') }}">自定义 Assessor</a></li>
<li><a href="{{ pathto('Tutorial/InstallCustomizedAlgos') }}">安装自定义的 Tuner,Assessor,Advisor</a></li> <li><a href="{{ pathto('Tutorial/InstallCustomizedAlgos') }}">安装自定义的 Tuner,Assessor,Advisor</a></li>
<li><a href="{{ pathto('NAS/QuickStart') }}">定义 NAS 模型空间</a></li>
<li><a href="{{ pathto('NAS/ApiReference') }}">NAS/Retiarii APIs</a></li>
</ul> </ul>
</td> </td>
<td> <td>
...@@ -224,7 +232,7 @@ ...@@ -224,7 +232,7 @@
<div> <div>
<h2 class="second-title">安装</h2> <h2 class="second-title">安装</h2>
<p> <p>
NNI 支持并在 Ubuntu >= 16.04, macOS >= 10.14.1, 和 Windows 10 >= 1809 通过了测试。 在 `python 64 >= 3.6` 的环境中,只需要运行 `pip install` 即可完成安装。 NNI 支持并在 Ubuntu >= 16.04, macOS >= 10.14.1, 和 Windows 10 >= 1809 通过了测试。 在 <code>python 64-bit >= 3.6</code> 的环境中,只需要运行 <code>pip install</code> 即可完成安装。
</p> </p>
<div class="command-intro">Linux 或 macOS</div> <div class="command-intro">Linux 或 macOS</div>
<div class="command">python3 -m pip install --upgrade nni</div> <div class="command">python3 -m pip install --upgrade nni</div>
...@@ -241,7 +249,7 @@ ...@@ -241,7 +249,7 @@
<li>如果遇到任何权限问题,可添加 --user 在用户目录中安装 NNI。</li> <li>如果遇到任何权限问题,可添加 --user 在用户目录中安装 NNI。</li>
<li>目前,Windows 上的 NNI 支持本机,远程和 OpenPAI 模式。 强烈推荐使用 Anaconda 或 Miniconda <a href="{{ pathto('Tutorial/InstallationWin') }}">在 Windows 上安装 NNI</a></li> <li>目前,Windows 上的 NNI 支持本机,远程和 OpenPAI 模式。 强烈推荐使用 Anaconda 或 Miniconda <a href="{{ pathto('Tutorial/InstallationWin') }}">在 Windows 上安装 NNI</a></li>
<li>如果遇到如 Segmentation fault 这样的任何错误请参考 <a <li>如果遇到如 Segmentation fault 这样的任何错误请参考 <a
href="{{ pathto('installation') }}">常见问题</a>。 Windows 上的常见问题,参考在 <a href="{{ pathto('Tutorial/InstallationWin') }}">Windows 上使用 NNI</a></li> href="{{ pathto('installation') }}">常见问题</a>。 Windows 上的常见问题,参考在 <a href="{{ pathto('Tutorial/InstallationWin') }}">Windows 上使用 NNI</a>。 Windows 上的常见问题,参考在 <a href="{{ pathto('Tutorial/InstallationWin') }}">Windows 上使用 NNI</a></li>
</ul> </ul>
</div> </div>
<div> <div>
...@@ -296,10 +304,7 @@ You can use these commands to get more information about the experiment ...@@ -296,10 +304,7 @@ You can use these commands to get more information about the experiment
</li> </li>
<li> <li>
在浏览器中打开 Web UI 地址,可看到下图的 Experiment 详细信息,以及所有的 Trial 任务。 查看<a href="{{ pathto('Tutorial/WebUI') }}">这里的</a>更多页面示例。 在浏览器中打开 Web UI 地址,可看到下图的 Experiment 详细信息,以及所有的 Trial 任务。 查看<a href="{{ pathto('Tutorial/WebUI') }}">这里的</a>更多页面示例。
<div class="ui-img"> <img src="_static/img/webui.gif" width="100%"/>
<img src="_images/webui_overview_page.png">
<img src="_images/webui_trialdetail_page.png">
</div>
</div> </div>
</li> </li>
</ul> </ul>
...@@ -360,8 +365,7 @@ You can use these commands to get more information about the experiment ...@@ -360,8 +365,7 @@ You can use these commands to get more information about the experiment
<h2>外部代码库</h2> <h2>外部代码库</h2>
<li>在 NNI 中运行 <a href="{{ pathto('NAS/ENAS') }}">ENAS</a></li> <li>在 NNI 中运行 <a href="{{ pathto('NAS/ENAS') }}">ENAS</a></li>
<li> <li>
<a https://github.com/microsoft/nni/blob/master/examples/feature_engineering/auto-feature-engineering/README_zh_CN.md
href="https://github.com/microsoft/nni/blob/master/examples/feature_engineering/auto-feature-engineering/README_zh_CN.md">NNI 中的自动特征工程</a>
</li> </li>
<li>使用 NNI 的 <a <li>使用 NNI 的 <a
href="https://github.com/microsoft/recommenders/blob/master/examples/04_model_select_and_optimize/nni_surprise_svd.ipynb">矩阵分解超参调优</a></li> href="https://github.com/microsoft/recommenders/blob/master/examples/04_model_select_and_optimize/nni_surprise_svd.ipynb">矩阵分解超参调优</a></li>
......
...@@ -10,9 +10,7 @@ Tuner 从 Trial 接收指标结果,来评估一组超参或网络结构的性 ...@@ -10,9 +10,7 @@ Tuner 从 Trial 接收指标结果,来评估一组超参或网络结构的性
:maxdepth: 1 :maxdepth: 1
概述<Tuner/BuiltinTuner> 概述<Tuner/BuiltinTuner>
TPE<Tuner/HyperoptTuner>
Random Search(随机搜索)<Tuner/HyperoptTuner> Random Search(随机搜索)<Tuner/HyperoptTuner>
Anneal(退火)<Tuner/HyperoptTuner>
Naïve Evolution(朴素进化)<Tuner/EvolutionTuner> Naïve Evolution(朴素进化)<Tuner/EvolutionTuner>
SMAC<Tuner/SmacTuner> SMAC<Tuner/SmacTuner>
Metis Tuner<Tuner/MetisTuner> Metis Tuner<Tuner/MetisTuner>
...@@ -22,5 +20,4 @@ Tuner 从 Trial 接收指标结果,来评估一组超参或网络结构的性 ...@@ -22,5 +20,4 @@ Tuner 从 Trial 接收指标结果,来评估一组超参或网络结构的性
Network Morphism<Tuner/NetworkmorphismTuner> Network Morphism<Tuner/NetworkmorphismTuner>
Hyperband<Tuner/HyperbandAdvisor> Hyperband<Tuner/HyperbandAdvisor>
BOHB<Tuner/BohbAdvisor> BOHB<Tuner/BohbAdvisor>
PPO Tuner <Tuner/PPOTuner>
PBT Tuner <Tuner/PBTTuner> PBT Tuner <Tuner/PBTTuner>
...@@ -27,7 +27,7 @@ author = 'Microsoft' ...@@ -27,7 +27,7 @@ author = 'Microsoft'
# The short X.Y version # The short X.Y version
version = '' version = ''
# The full version, including alpha/beta/rc tags # The full version, including alpha/beta/rc tags
release = 'v2.0' release = 'v2.3'
# -- General configuration --------------------------------------------------- # -- General configuration ---------------------------------------------------
...@@ -51,7 +51,7 @@ extensions = [ ...@@ -51,7 +51,7 @@ extensions = [
] ]
# 添加示例模块 # 添加示例模块
autodoc_mock_imports = ['apex', 'nni_node'] autodoc_mock_imports = ['apex', 'nni_node', 'tensorrt', 'pycuda']
# Add any paths that contain templates here, relative to this directory. # Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates'] templates_path = ['_templates']
...@@ -201,4 +201,4 @@ extlinks = { ...@@ -201,4 +201,4 @@ extlinks = {
# -- Extension configuration ------------------------------------------------- # -- Extension configuration -------------------------------------------------
def setup(app): def setup(app):
app.add_stylesheet('css/custom.css') app.add_css_file('css/custom.css')
Tuner 基准测试
====================
我们提供了一个基准测试工具来比较 NNI 提供的 Tuner(和用户自定义的 Tuner)在不同任务上的性能。 该工具的实现基于 automlbenchmark 存储库(https://github.com/openml/automlbenchmark),该存储库提供针对由多个 *tasks* 组成的不同 *benchmarks* 运行不同 *frameworks* 的服务。 该工具位于 ``examples/trials/benchmarking/automlbenchmark``。 本文件简要介绍了该工具及其使用方法。
术语
^^^^^^^^^^^
* **task**\ : 一个任务可以被认为是(数据集,评估器)。 它给出了一个包含(训练、验证、测试)的数据集,评估器根据收到的预测结果评估一个给定的指标(例如,回归的 mse,分类的f1)。
* **benchmark**\ : 基准测试是一组任务,以及其他外部约束,例如时间和资源。
* **framework**\ : 给定一个任务,一个框架构思出对所提出的回归或分类问题的答案并产生预测。 请注意,automlbenchmark 框架对框架的假设空间没有任何限制。 在我们在这个文件夹中的实现中,每个框架都是一个元组(tuner,architecture),其中架构提供了假设空间(和 Tuner 的搜索空间),tuner 决定了超参数优化的策略。
* **tuner**\ : hpo 文件夹中定义的 Tuner 或 Advisor,或用户提供的自定义 Tuner。
* **architecture**\ : 架构是解决任务的特定方法,以及一组要优化的超参数(即搜索空间)。 在我们的实现中,该架构多次调用 Tuner 以获得可能的超参数配置,并为任务生成最终预测。在我们的实现中,该架构多次调用 Tuner 以获得可能的超参数配置,并为任务生成最终预测。 查看 ``./nni/extensions/NNI/architectures`` 获取示例。
注意:目前,唯一支持的架构是随机森林。 架构实现和搜索空间定义可以在 ``./nni/extensions/NNI/architectures/run_random_forest.py`` 中找到。 基准测试 “nnivalid” 和 “nnismall” 中的任务适合用随机森林解决。
设置
^^^^^
由于 automlbenchmark 和 python 3.8 之间存在一些不兼容,建议使用 python 3.7 运行此文件夹中包含的实验。 首先,运行以下 shell 脚本来克隆 automlbenchmark 存储库。 注意:建议在单独的虚拟环境中执行以下步骤,因为安装代码可能会安装多个包。
.. code-block:: bash
./setup.sh
在现有 Tuner 上运行预定义的基准测试
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: bash
./runbenchmark_nni.sh [tuner-names]
该脚本运行基准 “nnivalid”,它由一个回归任务、一个二元分类任务和一个多类分类任务组成。 脚本完成后,您可以在文件夹 results_[time]/reports/ 中找到结果摘要。 要在其他预定义基准上运行,请更改 ``runbenchmark_nni.sh`` 中的 ``benchmark`` 变量。 一些基准在 ``/examples/trials/benchmarking/automlbenchmark/nni/benchmarks``\ 中定义,其他基准测试在 ``/examples/trials/benchmarking/automlbenchmark/automlbenchmark/resources/benchmarks/`` 中定义。 大型基准的一个例子是 "nnismall",它包括8个回归任务、8个二元分类任务和8个多类分类任务。
默认情况下,该脚本在NNI的所有嵌入式 Tuner 上运行该基准测试。 如果在 [tuner-names] 中提供了一个 Tuner 的列表,它只运行列表中的 Tuner。 目前,支持以下 Tuner:"TPE", "Random", "Anneal", "Evolution", "SMAC", "GPTuner", "MetisTuner", "DNGOTuner", "Hyperband", "BOHB"。 也可以评估定制 Tuner。 可参考下一章节。
默认情况下,该脚本针对指定的基准逐一运行指定的 Tuner。 为了在后台同时运行所有的实验,在 ``runbenchmark_nni.sh`` 中设置 "serialize" 标志为 false。
注意:SMAC Tuner 、DNGO Tuner 和 BOHB Advisor 必须在运行任何实验之前手动安装。 关于安装SMAC和BOHB的更多细节,请参考 `本页面 <https://nni.readthedocs.io/zh/stable/Tuner/BuiltinTuner.html?highlight=nni>`_ 。
在自定义 Tuner 上运行预定义的基准测试
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
要运行自定义的基准,在 ``./nni/benchmarks`` 文件夹中添加 benchmark_name.yaml 文件,并在 ``runbenchmark_nni.sh`` 中改变 ``benchmark`` 变量。 参见 ``./automlbenchmark/resources/benchmarks/``,了解一些定义自定义基准的例子。
在自定义 Tuner 上运行基准测试
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
要使用自定义 Tuner,首先要确保 Tuner 继承自 ``nni.tuner.Tuner`` 并正确实现所需的API。 关于实现自定义调谐器的更多信息,请参考 `这里 <https://nni.readthedocs.io/zh/stable/Tuner/CustomizeTuner.html>`_ 。 接下来,执行以下步骤:
#. 用 ``nnictl algo register`` 命令安装自定义 Tuner。 详情请查看 `本文档 <https://nni.readthedocs.io/zh/stable/Tutorial/Nnictl.html>`_ 。
#. 在 ``./nni/frameworks.yaml``\ 中,添加一个扩展基础框架 NNI 的新框架。 确保参数 ``tuner_type`` 对应于在步骤 1 中安装 Tuner 的 “builtinName”。
#. 运行命令
.. code-block:: bash
./runbenchmark_nni.sh new-tuner-builtinName
基准测试示例
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
例如,我们在以下8个 Tuner 上运行 “nnismall” 基准: "TPE", "Random", "Anneal", "Evolution", "SMAC", "GPTuner", "MetisTuner", "DNGOTuner". 由于一些任务包含相当数量的训练数据,在一个 Tuner 上使用单个 CPU 核心运行整个基准测试大约需要2天。 关于任务的详细描述,请查看 ``/examples/trials/benchmarking/automlbenchmark/nni/benchmarks/nnismall_description.txt`` 。 对于二类和多类分类任务,使用了 "AUC "和 "logloss" 指标进行评估,而对于回归,则使用了 "r2" 和 "rmse" 指标。
脚本完成后,每个 Tuner 的最终得分被总结在文件中 ``results[time]/reports/performances.txt``。 由于该文件很大,我们只显示以下屏幕截图并总结其他重要统计数据。
.. image:: ../img/hpo_benchmark/performances.png
:target: ../img/hpo_benchmark/performances.png
:alt:
此外,在对结果进行解析时,根据最终的性能对 Tuner 进行排名。 ``results[time]/reports/rankings.txt`` 显示了在每个指标(logloss, rmse, auc)下,Tuner 的平均排名。 在这里,我们介绍了前三个表中的数据。 此外,对于每个 Tuner,我们总结了对每种类型度量的性能(相同数据的另一视图)。 我们在第四个表格中介绍了这一统计数据。
指标 rmse 的平均排名:
.. list-table::
:header-rows: 1
* - Tuner 名字
- 平均排名
* - Anneal
- 3.75
* - Random
- 4.00
* - Evolution
- 4.44
* - DNGOTuner
- 4.44
* - SMAC
- 4.56
* - TPE
- 4.94
* - GPTuner
- 4.94
* - MetisTuner
- 4.94
指标 auc 的平均排名:
.. list-table::
:header-rows: 1
* - Tuner 名字
- 平均排名
* - SMAC
- 3.67
* - GPTuner
- 4.00
* - Evolution
- 4.22
* - Anneal
- 4.39
* - MetisTuner
- 4.39
* - TPE
- 4.67
* - Random
- 5.33
* - DNGOTuner
- 5.33
指标 logloss 的平均排名:
.. list-table::
:header-rows: 1
* - Tuner 名字
- 平均排名
* - Random
- 3.36
* - DNGOTuner
- 3.50
* - SMAC
- 3.93
* - GPTuner
- 4.64
* - TPE
- 4.71
* - Anneal
- 4.93
* - Evolution
- 5.00
* - MetisTuner
- 5.93
Tuner 的平均排名:
.. list-table::
:header-rows: 1
* - Tuner 名字
- rmse
- auc
- logloss
* - TPE
- 4.94
- 4.67
- 4.71
* - Random
- 4.00
- 5.33
- 3.36
* - Anneal
- 3.75
- 4.39
- 4.93
* - Evolution
- 4.44
- 4.22
- 5.00
* - GPTuner
- 4.94
- 4.00
- 4.64
* - MetisTuner
- 4.94
- 4.39
- 5.93
* - SMAC
- 4.56
- 3.67
- 3.93
* - DNGOTuner
- 4.44
- 5.33
- 3.50
除了这些报告,我们的脚本还为每个任务的每个文件夹生成两个图表。 第一个图表显示了每个 Tuner 在第 x 个 Trial 之前的最佳分数,第二图表显示了 Trial x 中每个 Tuner 的分数。 这两张图可以提供一些关于 Tuner 如何 "收敛" 的信息。 我们发现,对于 "nnismall",随机森林模型上的 Tuner,其搜索空间定义在 ``/examples/trials/benchmarking/automlbenchmark/nni/extensions/NNI/architectures/run_random_forest.py`` ,一般在40到60次试验后收敛到最终解决方案。 由于图表太多,无法包含在一份报告中(共96张图表),我们在此只介绍10张图表。
.. image:: ../img/hpo_benchmark/car_fold1_1.jpg
:target: ../img/hpo_benchmark/car_fold1_1.jpg
:alt:
.. image:: ../img/hpo_benchmark/car_fold1_2.jpg
:target: ../img/hpo_benchmark/car_fold1_2.jpg
:alt:
例如,前面两个图是为任务 "汽车" 的文件夹1生成的。 在第一张图中,我们可以观察到,大多数 Tuner 在40次 Trial 中找到了一个相对较好的解决方案。 在这个实验中,在所有的 Tuner 中,DNGOTuner 最快收敛到最佳解决方案(在10次 Trial 内)。 它的分数在整个实验中提高了三次。 在第二张图中,我们观察到大多数 Tuner 的分数在整个实验期间都在0.8和1之间波动。 然而,似乎 Anneal 调谐器(绿线)更不稳定(有更多的波动),而 GPTune r有一个更稳定的模式。 无论如何,虽然这种模式可以在某种程度上被解释为 Tuner 对探索开采权衡的位置,但它不能用于综合评估 Tuner 的效率。
.. image:: ../img/hpo_benchmark/christine_fold0_1.jpg
:target: ../img/hpo_benchmark/christine_fold0_1.jpg
:alt:
.. image:: ../img/hpo_benchmark/christine_fold0_2.jpg
:target: ../img/hpo_benchmark/christine_fold0_2.jpg
:alt:
.. image:: ../img/hpo_benchmark/cnae-9_fold0_1.jpg
:target: ../img/hpo_benchmark/cnae-9_fold0_1.jpg
:alt:
.. image:: ../img/hpo_benchmark/cnae-9_fold0_2.jpg
:target: ../img/hpo_benchmark/cnae-9_fold0_2.jpg
:alt:
.. image:: ../img/hpo_benchmark/credit-g_fold1_1.jpg
:target: ../img/hpo_benchmark/credit-g_fold1_1.jpg
:alt:
.. image:: ../img/hpo_benchmark/credit-g_fold1_2.jpg
:target: ../img/hpo_benchmark/credit-g_fold1_2.jpg
:alt:
.. image:: ../img/hpo_benchmark/titanic_2_fold1_1.jpg
:target: ../img/hpo_benchmark/titanic_2_fold1_1.jpg
:alt:
.. image:: ../img/hpo_benchmark/titanic_2_fold1_2.jpg
:target: ../img/hpo_benchmark/titanic_2_fold1_2.jpg
:alt:
...@@ -24,4 +24,5 @@ NNI 具有高扩展性,高级用户可以定制自己的 Tuner、 Assessor, ...@@ -24,4 +24,5 @@ NNI 具有高扩展性,高级用户可以定制自己的 Tuner、 Assessor,
示例 <examples> 示例 <examples>
Web 界面 <Tutorial/WebUI> Web 界面 <Tutorial/WebUI>
如何调试 <Tutorial/HowToDebug> 如何调试 <Tutorial/HowToDebug>
高级 <hpo_advanced> 高级 <hpo_advanced>
\ No newline at end of file Tuner 基准测试 <hpo_benchmark>
...@@ -10,20 +10,24 @@ ...@@ -10,20 +10,24 @@
为了促进 NAS 创新 (如, 设计实现新的 NAS 模型,比较不同的 NAS 模型), 为了促进 NAS 创新 (如, 设计实现新的 NAS 模型,比较不同的 NAS 模型),
易于使用且灵活的编程接口非常重要。 易于使用且灵活的编程接口非常重要。
因此,我们为 NAS 提供了统一的接口, 因此,NNI 设计了 `Retiarii <https://www.usenix.org/system/files/osdi20-zhang_quanlu.pdf>`__, 它是一个深度学习框架,支持在神经网络模型空间,而不是单个神经网络模型上进行探索性训练。
来加速 NAS 创新,并更快的将最先进的算法用于现实世界的问题上。 Retiarii 的探索性训练允许用户以高度灵活的方式表达 *神经网络架构搜索* 和 *超参数调整* 的各种搜索空间。
详细信息,参考以下教程:
本文档中的一些常用术语:
* *Model search space(模型搜索空间)* :它意味着一组模型,用于从中探索/搜索出最佳模型。 有时我们简称为 *search space(搜索空间)* 或 *model space(模型空间)* 。
* *Exploration strategy(探索策略)*:用于探索模型搜索空间的算法。
* *Model evaluator(模型评估器)*:用于训练模型并评估模型的性能。
按照以下说明开始您的 Retiarii 之旅。
.. toctree:: .. toctree::
:maxdepth: 2 :maxdepth: 2
概述 <NAS/Overview> 概述 <NAS/Overview>
编写搜索空间 <NAS/WriteSearchSpace> 快速入门 <NAS/QuickStart>
经典 NAS <NAS/ClassicNas> 构建模型空间 <NAS/construct_space>
Multi-trial NAS <NAS/multi_trial_nas>
One-Shot NAS <NAS/one_shot_nas> One-Shot NAS <NAS/one_shot_nas>
Retiarii NAS(实验性) <NAS/retiarii/retiarii_index>
自定义 NAS 算法 <NAS/Advanced>
NAS 可视化 <NAS/Visualization>
搜索空间集合 <NAS/SearchSpaceZoo>
NAS 基准测试 <NAS/Benchmarks> NAS 基准测试 <NAS/Benchmarks>
API 参考 <NAS/NasReference> NAS API 参考 <NAS/ApiReference>
...@@ -5,11 +5,12 @@ ...@@ -5,11 +5,12 @@
:maxdepth: 2 :maxdepth: 2
nnictl 命令 <Tutorial/Nnictl> nnictl 命令 <Tutorial/Nnictl>
Experiment 配置 <Tutorial/ExperimentConfig> Experiment 配置 <reference/experiment_config>
Experiment 配置第二版 <reference/experiment_config> Experiment 配置(遗产) <Tutorial/ExperimentConfig>
搜索空间<Tutorial/SearchSpaceSpec> 搜索空间<Tutorial/SearchSpaceSpec>
NNI Annotation<Tutorial/AnnotationSpec> NNI Annotation<Tutorial/AnnotationSpec>
SDK API 参考 <sdk_reference> SDK API 参考 <sdk_reference>
支持的框架和库 <SupportedFramework_Library> 支持的框架和库 <SupportedFramework_Library>
从 Python 发起实验 <Tutorial/HowToLaunchFromPython> 从 Python 发起实验 <Tutorial/HowToLaunchFromPython>
共享存储 <Tutorial/HowToUseSharedStorage> 共享存储 <Tutorial/HowToUseSharedStorage>
Tensorboard <Tutorial/Tensorboard>
=========================== ===========================
Experiment(实验)配置参考 Experiment 配置
=========================== ===========================
注意 创建 Experiment 所需要的配置文件。 本文介绍了配置文件的内容,并提供了一些示例。
=====
.. Note::
1. 此文档的字段使用 ``camelCase`` 法命名。 对于 Python 库 ``nni.experiment``,需要转换成 ``snake_case`` 形式。
1. 此文档的字段使用 ``camelCase`` 法命名。 2. 在此文档中,字段类型被格式化为 `Python 类型提示 <https://docs.python.org/3.10/library/typing.html>`__。 因此,JSON 对象被称为 `dict`,数组被称为 `list`。
对于 Python 库 ``nni.experiment``,需要转换成 ``snake_case`` 形式。
2. 在此文档中,字段类型被格式化为 `Python 类型提示 <https://docs.python.org/3.10/library/typing.html>`__。 .. _path:
因此,JSON 对象被称为 `dict`,数组被称为 `list`。
.. _路径: 3. 一些字段采用文件或目录的路径, 除特别说明,均支持绝对路径和相对路径,``~`` 将扩展到 home 目录。
3. 一些字段采用文件或目录的路径, - 在写入 YAML 文件时,相对路径是相对于包含该文件目录的路径。
除特别说明,均支持绝对路径和相对路径,``~`` 将扩展到 home 目录。 - 在 Python 代码中赋值时,相对路径是相对于当前工作目录的路径。
- 在将 YAML 文件加载到 Python 类,以及将 Python 类保存到 YAML 文件时,所有相对路径都转换为绝对路径。
- 在写入 YAML 文件时,相对路径是相对于包含该文件目录的路径。 4. 将字段设置为 ``None`` 或 ``null`` 时相当于不设置该字段。
- 在 Python 代码中赋值时,相对路径是相对于当前工作目录的路径。
- 在将 YAML 文件加载到 Python 类,以及将 Python 类保存到 YAML 文件时,所有相对路径都转换为绝对路径。
4. 将字段设置为 ``None`` 或 ``null`` 时相当于不设置该字段。 .. contents:: Contents
:local:
:depth: 3
示例 示例
======== ========
...@@ -35,6 +38,7 @@ Experiment(实验)配置参考 ...@@ -35,6 +38,7 @@ Experiment(实验)配置参考
trialCommand: python mnist.py trialCommand: python mnist.py
trialCodeDirectory: . trialCodeDirectory: .
trialGpuNumber: 1 trialGpuNumber: 1
trialConcurrency: 2
maxExperimentDuration: 24h maxExperimentDuration: 24h
maxTrialNumber: 100 maxTrialNumber: 100
tuner: tuner:
...@@ -59,6 +63,7 @@ Experiment(实验)配置参考 ...@@ -59,6 +63,7 @@ Experiment(实验)配置参考
_value: [0.0001, 0.1] _value: [0.0001, 0.1]
trialCommand: python mnist.py trialCommand: python mnist.py
trialGpuNumber: 1 trialGpuNumber: 1
trialConcurrency: 2
tuner: tuner:
name: TPE name: TPE
classArgs: classArgs:
...@@ -77,6 +82,7 @@ Experiment(实验)配置参考 ...@@ -77,6 +82,7 @@ Experiment(实验)配置参考
trialCommand: python mnist.py trialCommand: python mnist.py
trialCodeDirectory: . trialCodeDirectory: .
trialGpuNumber: 1 trialGpuNumber: 1
trialConcurrency: 2
maxExperimentDuration: 24h maxExperimentDuration: 24h
maxTrialNumber: 100 maxTrialNumber: 100
tuner: tuner:
...@@ -96,8 +102,8 @@ Experiment(实验)配置参考 ...@@ -96,8 +102,8 @@ Experiment(实验)配置参考
参考 参考
========= =========
Experiment 配置 Experiment(实验)配置参考
^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
experimentName experimentName
-------------- --------------
...@@ -110,11 +116,11 @@ Experiment 的助记名称, 这将显示在 WebUI 和 nnictl 中。 ...@@ -110,11 +116,11 @@ Experiment 的助记名称, 这将显示在 WebUI 和 nnictl 中。
searchSpaceFile searchSpaceFile
--------------- ---------------
包含搜索空间 JSON 文件的\ 路径_ 包含搜索空间 JSON 文件的路径(path_)
类型:``Optional[str]`` 类型:``Optional[str]``
搜索空间格式由 Tuner 决定, 内置 Tuner 的通用格式在 `这里 <../Tutorial/SearchSpaceSpec.rst>`__。 搜索空间格式由 Tuner 决定, 内置 Tuner 的通用格式在 `这里 <../Tutorial/SearchSpaceSpec.rst>`__。 内置 Tuner 的通用格式在 `这里 <../Tutorial/SearchSpaceSpec.rst>`__。
与 `searchSpace`_ 互斥。 与 `searchSpace`_ 互斥。
...@@ -126,7 +132,7 @@ searchSpace ...@@ -126,7 +132,7 @@ searchSpace
类型:``Optional[JSON]`` 类型:``Optional[JSON]``
格式由 Tuner 决定, 内置 Tuner 的通用格式在 `这里 <../Tutorial/SearchSpaceSpec.rst>`__。 格式由 Tuner 决定, 内置 Tuner 的通用格式在 `这里 <../Tutorial/SearchSpaceSpec.rst>`__。 内置 Tuner 的通用格式在 `这里 <../Tutorial/SearchSpaceSpec.rst>`__。
注意,``None`` 意味着“没有这样的字段”,所以空的搜索空间应该写成 ``{}``。 注意,``None`` 意味着“没有这样的字段”,所以空的搜索空间应该写成 ``{}``。
...@@ -142,11 +148,13 @@ trialCommand ...@@ -142,11 +148,13 @@ trialCommand
该命令将在 Linux 和 macOS 上的 bash 中执行,在 Windows 上的 PowerShell 中执行。 该命令将在 Linux 和 macOS 上的 bash 中执行,在 Windows 上的 PowerShell 中执行。
注意在 Linux 和 macOS 中使用``python3``,在 Windows 中使用 ``python``。
trialCodeDirectory trialCodeDirectory
------------------ ------------------
到 Trial 源文件的目录的 路径_ 到 Trial 源文件的目录的路径(path_)
类型:``str`` 类型:``str``
...@@ -175,7 +183,7 @@ trialGpuNumber ...@@ -175,7 +183,7 @@ trialGpuNumber
对于各种训练平台,这个字段的含义可能略有不同, 对于各种训练平台,这个字段的含义可能略有不同,
尤其是设置为 ``0`` 或者 ``None`` 时, 尤其是设置为 ``0`` 或者 ``None`` 时,
详情请参阅训练平台文件 指定 `训练平台 <../TrainingService/Overview.rst>`__
在本地模式下,将该字段设置为零将阻止 Trial 获取 GPU(通过置空 ``CUDA_VISIBLE_DEVICES`` )。 在本地模式下,将该字段设置为零将阻止 Trial 获取 GPU(通过置空 ``CUDA_VISIBLE_DEVICES`` )。
当设置为 ``None`` 时,Trial 将被创建和调度,就像它们不使用 GPU 一样, 当设置为 ``None`` 时,Trial 将被创建和调度,就像它们不使用 GPU 一样,
...@@ -209,13 +217,13 @@ maxTrialNumber ...@@ -209,13 +217,13 @@ maxTrialNumber
nniManagerIp nniManagerIp
------------ ------------
当前机器的 IP,用于训练机器访问 NNI 管理器。 本机模式下不可选。 当前机器的 IP,用于训练机器访问 NNI 管理器。 本机模式下不可选。 本机模式下不可选。
类型:``Optional[str]`` 类型:``Optional[str]``
如果未指定,将使用 ``eth0`` 的 IPv4 地址。 如果未指定,将使用 ``eth0`` 的 IPv4 地址。
必须在 Windows 和使用可预测网络接口名称的系统上设置,本地模式除外 除本地模式外,强烈建议手动设置此字段
useAnnotation useAnnotation
...@@ -223,7 +231,7 @@ useAnnotation ...@@ -223,7 +231,7 @@ useAnnotation
启动 `annotation <../Tutorial/AnnotationSpec.rst>`__。 启动 `annotation <../Tutorial/AnnotationSpec.rst>`__。
类型:``bool`` 类型:``Optional[bool]``
默认值:``false`` 默认值:``false``
...@@ -235,7 +243,7 @@ debug ...@@ -235,7 +243,7 @@ debug
启动调试模式 启动调试模式
类型:``bool`` 类型:``str``
默认值:``false`` 默认值:``false``
...@@ -251,7 +259,7 @@ logLevel ...@@ -251,7 +259,7 @@ logLevel
候选项:``"trace"``, ``"debug"``, ``"info"``, ``"warning"``, ``"error"``, ``"fatal"`` 候选项:``"trace"``, ``"debug"``, ``"info"``, ``"warning"``, ``"error"``, ``"fatal"``
默认为 "info" 或 "debug",取决于 `debug`_ 选项。 默认为 "info" 或 "debug",取决于 `debug`_ 选项。 启用调试模式时,LogLevel 设置为 “debug”,否则,LogLevel 设置为 “Info”。
NNI 的大多数模块都会受到此值的影响,包括 NNI 管理器、Tuner、训练平台等。 NNI 的大多数模块都会受到此值的影响,包括 NNI 管理器、Tuner、训练平台等。
...@@ -277,7 +285,7 @@ tunerGpuIndices ...@@ -277,7 +285,7 @@ tunerGpuIndices
设定对 Tuner、Assessor 和 Advisor 可见的 GPU。 设定对 Tuner、Assessor 和 Advisor 可见的 GPU。
类型:``Optional[list[int] | str]`` 类型: ``Optional[list[int] | str | int]``
这将是 Tuner 进程的 ``CUDA_VISIBLE_DEVICES`` 环境变量, 这将是 Tuner 进程的 ``CUDA_VISIBLE_DEVICES`` 环境变量,
...@@ -287,35 +295,49 @@ tunerGpuIndices ...@@ -287,35 +295,49 @@ tunerGpuIndices
tuner tuner
----- -----
指定 Tuner。 指定 Tuner。
类型:Optional `AlgorithmConfig`_ 类型:Optional `AlgorithmConfig`_
内置的 Tuner 可以在 `这里 <../builtin_tuner.rst>`__ 找到,你可以按照 `此教程 <../Tuner/CustomizeTuner.rst>`__ 来定制一个新的 Tuner。
assessor assessor
-------- --------
指定 Assessor。 指定 Assessor。
类型:Optional `AlgorithmConfig`_ 类型:Optional `AlgorithmConfig`_
内置的 Assessor 可以在 `这里 <../builtin_assessor.rst>`__ 找到,你可以按照 `此教程 <../Assessor/CustomizeAssessor.rst>`__ 来定制一个新的 Assessor。
advisor advisor
------- -------
指定 Advisor。 指定 Advisor。
类型:Optional `AlgorithmConfig`_ 类型:Optional `AlgorithmConfig`_
NNI 提供了两个内置的 Advisor:`BOHB <../Tuner/BohbAdvisor.rst>`__ 和 `Hyperband <../Tuner/HyperbandAdvisor.rst>`__,你可以按照 `此教程 <../Tuner/CustomizeAdvisor.rst>`__ 来定制一个新的 Advisor。
trainingService trainingService
--------------- ---------------
指定 `训练平台 <../TrainingService/Overview.rst>`__。 详情查看 `这里 <../TrainingService/LocalMode.rst>`__。
类型:`TrainingServiceConfig`_ 类型:`TrainingServiceConfig`_
sharedStorage
-------------
配置共享存储,详细的用法可以在 `这里 <../Tutorial/HowToUseSharedStorage.rst>`__ 找到。
类型:Optional `SharedStorageConfig`_
AlgorithmConfig AlgorithmConfig
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
...@@ -323,7 +345,7 @@ AlgorithmConfig ...@@ -323,7 +345,7 @@ AlgorithmConfig
对于自定义算法,有两种方法来描述它们: 对于自定义算法,有两种方法来描述它们:
1. `注册算法 <../Tuner/InstallCustomizedTuner.rst>`__ ,像内置算法一样使用。 (首选) 1. `注册算法 <../Tuner/InstallCustomizedTuner.rst>`__ ,像内置算法一样使用。 (首选) (首选)
2. 指定代码目录和类名。 2. 指定代码目录和类名。
...@@ -333,7 +355,7 @@ name ...@@ -333,7 +355,7 @@ name
内置或注册算法的名称。 内置或注册算法的名称。
类型:对于内置和注册算法使用 ``str``,其他自定义算法使用 ``None`` 类型:对于内置和注册算法使用 ``None``,其他自定义算法使用 ``str``
className className
...@@ -349,9 +371,9 @@ className ...@@ -349,9 +371,9 @@ className
codeDirectory codeDirectory
------------- -------------
到自定义算法类的目录的 路径_ 到自定义算法类的目录的路径(path_)
类型:对于内置和注册算法使用 ``None``,其他自定义算法使用 ``str`` 类型:对于内置和注册算法使用 ``str``,其他自定义算法使用 ``None``
classArgs classArgs
...@@ -371,37 +393,47 @@ TrainingServiceConfig ...@@ -371,37 +393,47 @@ TrainingServiceConfig
- `LocalConfig`_ - `LocalConfig`_
- `RemoteConfig`_ - `RemoteConfig`_
- `OpenpaiConfig <openpai-class>`_ - :ref:`OpenpaiConfig <openpai-class>`
- `AmlConfig`_ - `AmlConfig`_
- `HybridConfig`_
对于其他训练平台,目前 NNI 建议使用 `v1 配置模式 <../Tutorial/ExperimentConfig.rst>`_ 。 对于 `Kubeflow <../TrainingService/KubeflowMode.rst>`_, `FrameworkController <../TrainingService/FrameworkControllerMode.rst>`_, 和 `AdaptDL <../TrainingService/AdaptDLMode.rst>`_ 训练平台,目前 NNI 建议使用 `v1 配置模式 <../Tutorial/ExperimentConfig.rst>`_ 。
LocalConfig LocalConfig
^^^^^^^^^^^ -----------
详情查看 `这里 <../TrainingService/LocalMode.rst>`__。 详情查看 `这里 <../TrainingService/AMLMode.rst>`__。
platform platform
-------- """"""""
字符串常量 ``"local"``。 字符串常量 ``"local"``。
useActiveGpu useActiveGpu
------------ """"""""""""
指定 NNI 是否应向被其他任务占用的 GPU 提交 Trial。 指定 NNI 是否应向被其他任务占用的 GPU 提交 Trial。
类型:``Optional[bool]`` 类型:``Optional[str]``
必须在 ``trialgpunmber`` 大于零时设置。 必须在 ``trialgpunmber`` 大于零时设置。
如果您使用带有 GUI 的桌面系统,请将其设置为 ``True``。 以下过程可以使GPU "active" 起来:
- 非 NNI 的 CUDA 程序
- 图形化桌面
- 其他 NNI 实例提交的 Trial,如果您在同一时间运行了多个 NNI Experiment
- 其他用户的 CUDA 程序,如果你使用共享服务器
如果你使用的是图形操作系统,如 Windows 10 或 Ubuntu 桌面,请将此字段设置为 ``True``,否则,图形用户界面将阻止 NNI 启动任何 Trial。
当你创建多个 NNI Experiment 并且将 ``useActiveGpu`` 设置为 ``True`` 时,它们将同时提交多个 Trial 到同一个 GPU。
maxTrialNumberPerGpu maxTrialNumberPerGpu
--------------------- """"""""""""""""""""
指定可以共享一个 GPU 的 Trial 数目。 指定可以共享一个 GPU 的 Trial 数目。
...@@ -411,11 +443,11 @@ maxTrialNumberPerGpu ...@@ -411,11 +443,11 @@ maxTrialNumberPerGpu
gpuIndices gpuIndices
---------- """"""""""
设定对 Trial 进程可见的 GPU。 设定对 Trial 进程可见的 GPU。
类型:``Optional[list[int] | str]`` 类型: ``Optional[list[int] | str | int]``
如果 `trialGpuNumber`_ 小于此值的长度,那么每个 Trial 只能看到一个子集。 如果 `trialGpuNumber`_ 小于此值的长度,那么每个 Trial 只能看到一个子集。
...@@ -423,18 +455,18 @@ gpuIndices ...@@ -423,18 +455,18 @@ gpuIndices
RemoteConfig RemoteConfig
^^^^^^^^^^^^ ------------
详情查看 `这里 <../TrainingService/RemoteMachineMode.rst>`__。 详情查看 `这里 <../TrainingService/RemoteMachineMode.rst>`__。
platform platform
-------- """"""""
字符串常量 ``"remote"``。 字符串常量 ``"remote"``。
machineList machineList
----------- """""""""""
训练机器列表 训练机器列表
...@@ -442,18 +474,18 @@ machineList ...@@ -442,18 +474,18 @@ machineList
reuseMode reuseMode
--------- """""""""
启动 `重用模式 <../Tutorial/ExperimentConfig.rst#reuse>`__。 启动 `重用模式 <../Tutorial/ExperimentConfig.rst#reuse>`__。
类型:``bool`` 类型:``str``
RemoteMachineConfig RemoteMachineConfig
^^^^^^^^^^^^^^^^^^^ """""""""""""""""""
host host
---- ****
机器的 IP 或主机名(域名)。 机器的 IP 或主机名(域名)。
...@@ -461,7 +493,7 @@ host ...@@ -461,7 +493,7 @@ host
port port
---- ****
SSH 服务端口。 SSH 服务端口。
...@@ -471,7 +503,7 @@ SSH 服务端口。 ...@@ -471,7 +503,7 @@ SSH 服务端口。
user user
---- ****
登录用户名。 登录用户名。
...@@ -479,7 +511,7 @@ user ...@@ -479,7 +511,7 @@ user
password password
-------- ********
登录密码。 登录密码。
...@@ -489,9 +521,9 @@ password ...@@ -489,9 +521,9 @@ password
sshKeyFile sshKeyFile
---------- **********
到 sshKeyFile的 路径_ 到 sshKeyFile的路径(path_)
类型:``Optional[str]`` 类型:``Optional[str]``
...@@ -499,7 +531,7 @@ sshKeyFile ...@@ -499,7 +531,7 @@ sshKeyFile
sshPassphrase sshPassphrase
------------- *************
SSH 标识文件的密码。 SSH 标识文件的密码。
...@@ -507,17 +539,30 @@ SSH 标识文件的密码。 ...@@ -507,17 +539,30 @@ SSH 标识文件的密码。
useActiveGpu useActiveGpu
------------ ************
指定 NNI 是否应向被其他任务占用的 GPU 提交 Trial。 指定 NNI 是否应向被其他任务占用的 GPU 提交 Trial。
类型:``bool`` 类型:``str``
默认值:``false`` 默认值:``false``
必须在 ``trialgpunmber`` 大于零时设置。
以下过程可以使GPU "active" 起来:
- 非 NNI 的 CUDA 程序
- 图形化桌面
- 其他 NNI 实例提交的 Trial,如果您在同一时间运行了多个 NNI Experiment
- 其他用户的 CUDA 程序,如果你使用共享服务器
如果你使用的是图形操作系统,如 Ubuntu 桌面,请将此字段设置为 ``True``,否则,图形用户界面将阻止 NNI 启动任何 Trial。
当你创建多个 NNI Experiment 并且将 ``useActiveGpu`` 设置为 ``True`` 时,它们将同时提交多个 Trial 到同一个 GPU。
maxTrialNumberPerGpu maxTrialNumberPerGpu
-------------------- ********************
指定可以共享一个 GPU 的 Trial 数目。 指定可以共享一个 GPU 的 Trial 数目。
...@@ -527,41 +572,51 @@ maxTrialNumberPerGpu ...@@ -527,41 +572,51 @@ maxTrialNumberPerGpu
gpuIndices gpuIndices
---------- **********
设定对 Trial 进程可见的 GPU。 设定对 Trial 进程可见的 GPU。
类型:``Optional[list[int] | str]`` 类型: ``Optional[list[int] | str | int]``
如果 `trialGpuNumber`_ 小于此值的长度,那么每个 Trial 只能看到一个子集。 如果 `trialGpuNumber`_ 小于此值的长度,那么每个 Trial 只能看到一个子集。
这用作环境变量 ``CUDA_VISIBLE_DEVICES``。 这用作环境变量 ``CUDA_VISIBLE_DEVICES``。
trialPrepareCommand pythonPath
------------------- **********
启动 Trial 之前运行的命令 指定 Python 环境
类型:``Optional[str]`` 类型:``Optional[list[int] | str]``
这个路径将被插入到 PATH 的前面。 以下之一:
- (linux) pythonPath: ``/opt/python3.7/bin``
- (windows) pythonPath: ``C:/Python37``
如果你是在 Anaconda 上工作,那就有所不同。 在Windows上,你还必须添加 ``.../script`` 和 ``.../Library/bin``,并用 ``;`` 分隔。 示例如下:
- (linux anaconda) pythonPath: ``/home/yourname/anaconda3/envs/myenv/bin/``
- (windows anaconda) pythonPath: ``C:/Users/yourname/.conda/envs/myenv;C:/Users/yourname/.conda/envs/myenv/Scripts;C:/Users/yourname/.conda/envs/myenv/Library/bin``
如果不同机器的准备步骤不同,这将非常有用。 如果不同机器的准备步骤不同,这将非常有用。
.. _openpai-class: .. _openpai-class:
OpenpaiConfig OpenpaiConfig
^^^^^^^^^^^^^ -------------
详情查看 `这里 <../TrainingService/PaiMode.rst>`__。 详情查看 `这里 <../TrainingService/PaiMode.rst>`__。
platform platform
-------- """"""""
字符串常量 ``"openpai"``。 字符串常量 ``"openpai"``。
host host
---- """"
OpenPAI 平台的主机名。 OpenPAI 平台的主机名。
...@@ -573,7 +628,7 @@ OpenPAI 平台的主机名。 ...@@ -573,7 +628,7 @@ OpenPAI 平台的主机名。
username username
-------- """"""""
OpenPAI 用户名。 OpenPAI 用户名。
...@@ -581,7 +636,7 @@ OpenPAI 用户名。 ...@@ -581,7 +636,7 @@ OpenPAI 用户名。
token token
----- """""
OpenPAI 用户令牌。 OpenPAI 用户令牌。
...@@ -590,8 +645,36 @@ OpenPAI 用户令牌。 ...@@ -590,8 +645,36 @@ OpenPAI 用户令牌。
这可以在 OpenPAI 用户设置页面中找到。 这可以在 OpenPAI 用户设置页面中找到。
trialCpuNumber
""""""""""""""
指定每个 Trial 在 OpenPAI 容器中使用的 CPU 数。
类型:``bool``
trialMemorySize
"""""""""""""""
指定每个 Trial 在 OpenPAI 容器中的内存限制。
类型:``str``
格式:``数字 + tb|gb|mb|kb``
示例:``"8gb"``, ``"8192mb"``
storageConfigName
"""""""""""""""""
设置 OpenPAI 中使用的存储名称。
类型:``str``
dockerImage dockerImage
----------- """""""""""
运行 Trial 的 Docker 镜像的名称和标签。 运行 Trial 的 Docker 镜像的名称和标签。
...@@ -600,8 +683,8 @@ dockerImage ...@@ -600,8 +683,8 @@ dockerImage
默认:``"msranni/nni:latest"`` 默认:``"msranni/nni:latest"``
nniManagerStorageMountPoint localStorageMountPoint
--------------------------- """"""""""""""""""""""
当前机器中存储服务(通常是NFS)的挂载点路径。 当前机器中存储服务(通常是NFS)的挂载点路径。
...@@ -609,27 +692,27 @@ nniManagerStorageMountPoint ...@@ -609,27 +692,27 @@ nniManagerStorageMountPoint
containerStorageMountPoint containerStorageMountPoint
-------------------------- """"""""""""""""""""""""""
Docker 容器中存储服务(通常是NFS)的挂载点。 Docker 容器中存储服务(通常是NFS)的挂载点。
类型:``str`` 类型:``Optional[str]``
这必须是绝对路径。 这必须是绝对路径。
reuseMode reuseMode
--------- """""""""
启动 `重用模式 <../Tutorial/ExperimentConfig.rst#reuse>`__。 启动 `重用模式 <../Tutorial/ExperimentConfig.rst#reuse>`__。
类型:``bool`` 类型:``str``
默认值:``false`` 默认值:``false``
openpaiConfig openpaiConfig
------------- """""""""""""
嵌入的 OpenPAI 配置文件。 嵌入的 OpenPAI 配置文件。
...@@ -637,39 +720,39 @@ openpaiConfig ...@@ -637,39 +720,39 @@ openpaiConfig
openpaiConfigFile openpaiConfigFile
----------------- """""""""""""""""
到 OpenPAI 配置文件的 `路径`_ 到 OpenPAI 配置文件的路径(path_)
类型:``Optional[str]`` 类型:``Optional[list[int] | str]``
示例在 `这里 <https://github.com/microsoft/pai/blob/master/docs/manual/cluster-user/examples/hello-world-job.yaml>`__。 示例在 `这里 <https://github.com/microsoft/pai/blob/master/docs/manual/cluster-user/examples/hello-world-job.yaml>`__。
AmlConfig AmlConfig
^^^^^^^^^ ---------
情查看 `这里 <../TrainingService/AMLMode.rst>`__。 细用法参考 `这里 <../TrainingService/AMLMode.rst>`__。
platform platform
-------- """"""""
字符串常量 ``"aml"``。 字符串常量 ``"aml"``。
dockerImage dockerImage
----------- """""""""""
运行 Trial 的 Docker 镜像的名称和标签。 运行 Trial 的 Docker 镜像的名称和标签。
类型:``str`` 类型:``Optional[list[int] | str]``
默认:``"msranni/nni:latest"`` 默认:``"msranni/nni:latest"``
subscriptionId subscriptionId
-------------- """"""""""""""
Azure 订阅 ID。 Azure 订阅 ID。
...@@ -677,7 +760,7 @@ Azure 订阅 ID。 ...@@ -677,7 +760,7 @@ Azure 订阅 ID。
resourceGroup resourceGroup
------------- """""""""""""
Azure 资源组名称。 Azure 资源组名称。
...@@ -685,7 +768,7 @@ Azure 资源组名称。 ...@@ -685,7 +768,7 @@ Azure 资源组名称。
workspaceName workspaceName
------------- """""""""""""
Azure 工作区名称。 Azure 工作区名称。
...@@ -693,8 +776,157 @@ Azure 工作区名称。 ...@@ -693,8 +776,157 @@ Azure 工作区名称。
computeTarget computeTarget
------------- """""""""""""
AML 计算集群名称。 AML 计算集群名称。
类型:``str`` 类型:``str``
HybridConfig
------------
目前仅支持 `LocalConfig`_, `RemoteConfig`_, :ref:`OpenpaiConfig <openpai-class>` 和 `AmlConfig`_ 配置。 详细用法参考 `这里 <../TrainingService/HybridMode.rst>`__。
类型:`TrainingServiceConfig`_ 列表
SharedStorageConfig
^^^^^^^^^^^^^^^^^^^
详细用法参考 `这里 <../Tutorial/HowToUseSharedStorage.rst>`__。
nfsConfig
---------
storageType
"""""""""""
字符串常量 ``"NFS"``
localMountPoint
"""""""""""""""
已经或将要在本地挂载存储的路径。
类型:``str``
如果路径不存在,则会自动创建。 推荐使用绝对路径,即 ``/tmp/nni-shared-storage``
remoteMountPoint
""""""""""""""""
远程挂载存储的路径。
类型:``str``
如果路径不存在,则会自动创建。 推荐使用相对路径。 即, ``./nni-shared-storage``
localMounted
""""""""""""
指定挂载共享存储的对象和状态。
类型:``str``
候选项:``"usermount"``, ``"nnimount"``, ``"nomount"``
``usermount`` 表示已经在 localMountPoint 上挂载了此存储。 ``nnimount`` 表示 NNI 将尝试在 localMountPoint 上挂载此存储。 ``nomount`` 表示存储不会挂载在本地机器上,将在未来支持部分存储。
nfsServer
"""""""""
NFS 服务器主机
类型:``str``
exportedDirectory
"""""""""""""""""
NFS 服务器导出目录,详情参考 `这里 <https://www.ibm.com/docs/en/aix/7.2?topic=system-nfs-exporting-mounting>`_ 。
类型:``str``
azureBlobConfig
---------------
storageType
"""""""""""
字符串常量 ``"AzureBlob"``
localMountPoint
"""""""""""""""
已经或将要在本地挂载存储的路径。
类型:``str``
如果路径不存在,则会自动创建。 推荐使用绝对路径,即 ``/tmp/nni-shared-storage``
remoteMountPoint
""""""""""""""""
远程挂载存储的路径。
类型:``str``
如果路径不存在,它将被自动创建。 建议使用相对路径。 即, ``./nni-shared-storage``
注意:使用 AzureBlob 时,此目录必须是空的。
localMounted
""""""""""""
指定挂载共享存储的对象和状态。
类型:``str``
候选值:``"usermount"``, ``"nnimount"``, ``"nomount"``
``usermount`` 表示已经在 localMountPoint 上挂载了此存储。 ``nnimount`` 表示 NNI 将尝试在 localMountPoint 上挂载此存储。 ``nomount`` 表示存储不会挂载在本地机器上,将在未来支持部分存储。
storageAccountName
""""""""""""""""""
Azure 存储账户名称。
类型:``str``
storageAccountKey
"""""""""""""""""
Azure 存储账户密钥。
类型:``Optional[str]``
如果未设置 storageAccountKey,则首先需要在 Azure CLI 中使用 ``az login`` 并设置 `resourceGroupName`_ 。
resourceGroupName
"""""""""""""""""
AzureBlob 容器所属的资源组。
类型:``Optional[str]``
如果 ``storageAccountKey`` 没有设置则必必需。
containerName
"""""""""""""
AzureBlob 容器名。
类型:``str``
...@@ -7,5 +7,5 @@ Python API 参考 ...@@ -7,5 +7,5 @@ Python API 参考
:maxdepth: 1 :maxdepth: 1
自动调优 <autotune_ref> 自动调优 <autotune_ref>
NAS <NAS/NasReference> NAS <NAS/ApiReference>
模型压缩 <Compression/CompressionReference> 模型压缩 <Compression/CompressionReference>
\ No newline at end of file
...@@ -143,7 +143,7 @@ def get_model_optimizer_scheduler(args, device, train_loader, test_loader, crite ...@@ -143,7 +143,7 @@ def get_model_optimizer_scheduler(args, device, train_loader, test_loader, crite
model.load_state_dict(torch.load(args.pretrained_model_dir)) model.load_state_dict(torch.load(args.pretrained_model_dir))
best_acc = test(args, model, device, criterion, test_loader) best_acc = test(args, model, device, criterion, test_loader)
# setup new opotimizer for fine-tuning # setup new opotimizer for pruning
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=5e-4) optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=5e-4)
scheduler = MultiStepLR(optimizer, milestones=[int(args.pretrain_epochs * 0.5), int(args.pretrain_epochs * 0.75)], gamma=0.1) scheduler = MultiStepLR(optimizer, milestones=[int(args.pretrain_epochs * 0.5), int(args.pretrain_epochs * 0.75)], gamma=0.1)
...@@ -192,10 +192,10 @@ def main(args): ...@@ -192,10 +192,10 @@ def main(args):
# prepare model and data # prepare model and data
train_loader, test_loader, criterion = get_data(args.dataset, args.data_dir, args.batch_size, args.test_batch_size) train_loader, test_loader, criterion = get_data(args.dataset, args.data_dir, args.batch_size, args.test_batch_size)
model, optimizer, scheduler = get_model_optimizer_scheduler(args, device, train_loader, test_loader, criterion) model, optimizer, _ = get_model_optimizer_scheduler(args, device, train_loader, test_loader, criterion)
dummy_input = get_dummy_input(args, device) dummy_input = get_dummy_input(args, device)
flops, params, results = count_flops_params(model, dummy_input) flops, params, _ = count_flops_params(model, dummy_input)
print(f"FLOPs: {flops}, params: {params}") print(f"FLOPs: {flops}, params: {params}")
print(f'start {args.pruner} pruning...') print(f'start {args.pruner} pruning...')
...@@ -243,6 +243,7 @@ def main(args): ...@@ -243,6 +243,7 @@ def main(args):
# Reproduced result in paper 'PRUNING FILTERS FOR EFFICIENT CONVNETS', # Reproduced result in paper 'PRUNING FILTERS FOR EFFICIENT CONVNETS',
# Conv_1, Conv_8, Conv_9, Conv_10, Conv_11, Conv_12 are pruned with 50% sparsity, as 'VGG-16-pruned-A' # Conv_1, Conv_8, Conv_9, Conv_10, Conv_11, Conv_12 are pruned with 50% sparsity, as 'VGG-16-pruned-A'
# If you want to skip some layer, you can use 'exclude' like follow.
if args.pruner == 'slim': if args.pruner == 'slim':
config_list = [{ config_list = [{
'sparsity': args.sparsity, 'sparsity': args.sparsity,
...@@ -252,7 +253,10 @@ def main(args): ...@@ -252,7 +253,10 @@ def main(args):
config_list = [{ config_list = [{
'sparsity': args.sparsity, 'sparsity': args.sparsity,
'op_types': ['Conv2d'], 'op_types': ['Conv2d'],
'op_names': ['feature.0', 'feature.24', 'feature.27', 'feature.30', 'feature.34', 'feature.37'] 'op_names': ['feature.0', 'feature.10', 'feature.24', 'feature.27', 'feature.30', 'feature.34', 'feature.37']
}, {
'exclude': True,
'op_names': ['feature.10']
}] }]
pruner = pruner_cls(model, config_list, **kw_args) pruner = pruner_cls(model, config_list, **kw_args)
...@@ -273,11 +277,16 @@ def main(args): ...@@ -273,11 +277,16 @@ def main(args):
if args.speed_up: if args.speed_up:
# Unwrap all modules to normal state # Unwrap all modules to normal state
pruner._unwrap_model() pruner._unwrap_model()
m_speedup = ModelSpeedup(model, dummy_input, mask_path, device) m_speedup = ModelSpeedup(model, dummy_input, mask_path, device)
m_speedup.speedup_model() m_speedup.speedup_model()
print('start finetuning...') print('start finetuning...')
# Optimizer used in the pruner might be patched, so recommend to new an optimizer for fine-tuning stage.
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=5e-4)
scheduler = MultiStepLR(optimizer, milestones=[int(args.pretrain_epochs * 0.5), int(args.pretrain_epochs * 0.75)], gamma=0.1)
best_top1 = 0 best_top1 = 0
save_path = os.path.join(args.experiment_data_dir, f'finetuned.pth') save_path = os.path.join(args.experiment_data_dir, f'finetuned.pth')
for epoch in range(args.fine_tune_epochs): for epoch in range(args.fine_tune_epochs):
......
...@@ -7,7 +7,7 @@ import torch.nn.functional as F ...@@ -7,7 +7,7 @@ import torch.nn.functional as F
from torchvision import datasets, transforms from torchvision import datasets, transforms
import sys import sys
sys.path.append('../models') sys.path.append('../../models')
from cifar10.vgg import VGG from cifar10.vgg import VGG
from mnist.lenet import LeNet from mnist.lenet import LeNet
......
import torch
from torchvision.models import mobilenet_v2
from nni.compression.pytorch import ModelSpeedup
from nni.algorithms.compression.pytorch.pruning import L1FilterPruner
model = mobilenet_v2(pretrained=True)
dummy_input = torch.rand(8, 3, 416, 416)
cfg_list = [{'op_types':['Conv2d'], 'sparsity':0.5}]
pruner = L1FilterPruner(model, cfg_list)
pruner.compress()
pruner.export_model('./model', './mask')
# need call _unwrap_model if you want run the speedup on the same model
pruner._unwrap_model()
# Speedup the nanodet
ms = ModelSpeedup(model, dummy_input, './mask')
ms.speedup_model()
model(dummy_input)
\ No newline at end of file
import torch
from nanodet.model.arch import build_model
from nanodet.util import cfg, load_config
from nni.compression.pytorch import ModelSpeedup
from nni.algorithms.compression.pytorch.pruning import L1FilterPruner
"""
NanoDet model can be installed from https://github.com/RangiLyu/nanodet.git
"""
cfg_path = r"nanodet/config/nanodet-RepVGG-A0_416.yml"
load_config(cfg, cfg_path)
model = build_model(cfg.model)
dummy_input = torch.rand(8, 3, 416, 416)
op_names = []
# these three conv layers are followed by reshape-like functions
# that cannot be replaced, so we skip these three conv layers,
# you can also get such layers by `not_safe_to_prune` function
excludes = ['head.gfl_cls.0', 'head.gfl_cls.1', 'head.gfl_cls.2']
for name, module in model.named_modules():
if isinstance(module, torch.nn.Conv2d):
if name not in excludes:
op_names.append(name)
cfg_list = [{'op_types':['Conv2d'], 'sparsity':0.5, 'op_names':op_names}]
pruner = L1FilterPruner(model, cfg_list)
pruner.compress()
pruner.export_model('./model', './mask')
# need call _unwrap_model if you want run the speedup on the same model
pruner._unwrap_model()
# Speedup the nanodet
ms = ModelSpeedup(model, dummy_input, './mask')
ms.speedup_model()
model(dummy_input)
\ No newline at end of file
import torch
from pytorchyolo import models
from nni.compression.pytorch import ModelSpeedup
from nni.algorithms.compression.pytorch.pruning import L1FilterPruner, LevelPruner
from nni.compression.pytorch.utils import not_safe_to_prune
# The Yolo can be downloaded at https://github.com/eriklindernoren/PyTorch-YOLOv3.git
prefix = '/home/user/PyTorch-YOLOv3' # replace this path with yours
# Load the YOLO model
model = models.load_model(
"%s/config/yolov3.cfg" % prefix,
"%s/yolov3.weights" % prefix)
model.eval()
dummy_input = torch.rand(8, 3, 320, 320)
model(dummy_input)
# Generate the config list for pruner
# Filter the layers that may not be able to prune
not_safe = not_safe_to_prune(model, dummy_input)
cfg_list = []
for name, module in model.named_modules():
if name in not_safe:
continue
if isinstance(module, torch.nn.Conv2d):
cfg_list.append({'op_types':['Conv2d'], 'sparsity':0.6, 'op_names':[name]})
# Prune the model
pruner = L1FilterPruner(model, cfg_list)
pruner.compress()
pruner.export_model('./model', './mask')
pruner._unwrap_model()
# Speedup the model
ms = ModelSpeedup(model, dummy_input, './mask')
ms.speedup_model()
model(dummy_input)
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