Unverified Commit c5ac923a authored by Chi Song's avatar Chi Song Committed by GitHub
Browse files

Chinese translation (#2458)

parent 93f96d4f
# 更改日志
## 发布 1.6 - 5/26/2020
### 主要功能
#### 新功能和改进
* 将 IPC 限制提高至 100W
* 修改非本机训练平台中,将上传代码到存储的逻辑
* SDK 版本支持 `__version__`
* 支持 Windows 下开发模式安装
#### Web 界面
* 显示 Trial 的错误消息
* 完善主页布局
* 重构概述页面的最佳 Trial 模块
* 从 Web 界面中去掉多阶段支持
* 在概述页面为 Trial 并发添加工具提示。
* 在超参图中显示最好的 Trial
#### 超参优化更新
* 改进 PBT 的错误处理,并支持恢复 Experiment
#### NAS 更新
* NAS 支持 TensorFlow 2.0 (预览版) [TF2.0 NAS 示例](https://github.com/microsoft/nni/tree/master/examples/nas/naive-tf)
* LayerChoice 使用 OrderedDict
* 优化导出格式
* 应用固定架构后,将 LayerChoice 替换成选择的模块
#### 模型压缩改进
* 模型压缩支持 PyTorch 1.4
#### 训练平台改进
* 改进 OpenPAI YAML 的合并逻辑
* 支持将 Windows 作为[远程模式](https://github.com/microsoft/nni/blob/master/docs/zh_CN/TrainingService/RemoteMachineMode.md#windows)中的计算节点
### 修复的 Bug
* 修复开发模式安装
* 当检查点没有 state_dict 时,SPOS 示例会崩溃
* 修复失败 Trial 造成的表格排序问题
* 支持多 Python 环境(如 conda,pyenv 等)
## 发布 1.5 - 4/13/2020
### 新功能和文档
......@@ -69,7 +116,7 @@
#### 其它
* 支持[在前台运行 NNI Experiment](https://github.com/microsoft/nni/blob/v1.4/docs/zh_CN/Tutorial/Nnictl.md#manage-an-experiment),即,`nnictl create/resume/view``--foreground` 参数
* 支持[在前台运行 NNI Experiment](https://github.com/microsoft/nni/blob/v1.4/docs/zh_CN/Tutorial/Nnictl#manage-an-experiment),即,`nnictl create/resume/view``--foreground` 参数
* 支持取消 UNKNOWN 状态的 Trial。
* 支持最大 50MB 的搜索空间文件 (感谢外部贡献者 @Sundrops)
......@@ -83,7 +130,7 @@
### 修复的 Bug
* 修复在指标数据和 JSON 格式中对 NaN 的支持
* 修复在指标数据和 JSON 格式中对 NaN 的支持
* 修复搜索空间 `randint` 类型的 out-of-range Bug
* 修复模型压缩中导出 ONNX 模型时的错误张量设备的 Bug
* 修复新 OpenPAI 模式(又称,paiK8S)下,错误处理 nnimanagerIP 的 Bug
......@@ -140,7 +187,7 @@
- NAS 算法: [ENAS](https://github.com/microsoft/nni/blob/v1.2/docs/zh_CN/NAS/Overview.md#enas), [DARTS](https://github.com/microsoft/nni/blob/v1.2/docs/zh_CN/NAS/Overview.md#darts), [P-DARTS](https://github.com/microsoft/nni/blob/v1.2/docs/zh_CN/NAS/Overview.md#p-darts) (PyTorch)
- 经典模式下的 NAS(每次 Trial 独立运行)
- 模型压缩
- [新增模型剪枝算法](https://github.com/microsoft/nni/blob/v1.2/docs/zh_CN/Compressor/Overview.md): lottery ticket 剪, L1Filter Pruner, Slim Pruner, FPGM Pruner
- [新增模型剪枝算法](https://github.com/microsoft/nni/blob/v1.2/docs/zh_CN/Compressor/Overview.md): lottery ticket 剪枝方法, L1Filter Pruner, Slim Pruner, FPGM Pruner
- [新增模型量化算法](https://github.com/microsoft/nni/blob/v1.2/docs/zh_CN/Compressor/Overview.md): QAT Quantizer, DoReFa Quantizer
- 支持导出压缩后模型的 API。
- 训练平台
......@@ -177,7 +224,7 @@
- 更多示例
- [EfficientNet PyTorch 示例](https://github.com/ultmaster/EfficientNet-PyTorch)
- [Cifar10 NAS 示例](https://github.com/microsoft/nni/blob/v1.1/examples/trials/nas_cifar10/README_zh_CN.md)
- [模型压缩工具包 - Alpha 发布](https://github.com/microsoft/nni/blob/v1.1/docs/zh_CN/Compressor/Overview.md):我们很高兴的宣布 NNI 的模型压缩工具包发布了。它还处于试验阶段,会根据使用反馈来改进。 诚挚邀请您使用、反馈,或更多贡献
- [模型压缩工具包 - Alpha 发布](https://github.com/microsoft/nni/blob/v1.1/docs/zh_CN/Compressor/Overview.md):我们很高兴的宣布 NNI 的模型压缩工具包发布了。它还处于试验阶段,会根据使用反馈来改进。 诚挚邀请您使用、反馈,或更多贡献
### 修复的 Bug
......@@ -231,7 +278,7 @@
* (Bug 修复)自动完成脚本
* (Bug 修复) 修复管道中仅检查脚本中最后一个命令退出代码的问题。 -PR #1417
* (Bug 修复) Tuner 的 quniform -Issue #1377
* (Bug fix) 'quniform' 在 GridSearch 和其它 Tuner 之间的含义不同。 -Issue #1335
* (Bug 修复) 'quniform' 在 GridSearch 和其它 Tuner 之间的含义不同。 -Issue #1335
* (Bug 修复)"nnictl experiment list" 将 "RUNNING" 状态的 Experiment 显示为了 "INITIALIZED" -PR #1388
* (Bug 修复) 在 NNI dev 安装模式下无法安装 SMAC。 -Issue #1376
* (Bug 修复) 无法点击中间结果的过滤按钮 -Issue #1263
......@@ -316,7 +363,7 @@
* NNI 可在 Windows 上使用本机模式
* [支持新的 Advisor: BOHB](Tuner/BohbAdvisor.md)
* 支持新的 BOHB Advisor,这是一个健壮而有效的超参调优算法,囊括了贝叶斯优化和 Hyperband 的优点
* [支持通过 nnictl 来导入导出 Experiment 数据](Tutorial/Nnictl.md#experiment)
* [支持通过 nnictl 来导入导出 Experiment 数据](Tutorial/Nnictl.md)
* 在 Experiment 执行完后,可生成分析结果报告
* 支持将先前的调优数据导入到 Tuner 和 Advisor 中
* [可为 NNI Trial 任务指定 GPU](Tutorial/ExperimentConfig.md#localConfig)
......@@ -342,7 +389,7 @@
* [版本检查](TrainingService/PaiMode.md)
* 检查 nniManager 和 trialKeeper 的版本是否一致
* [提前终止的任务也可返回最终指标](https://github.com/microsoft/nni/issues/776)
* 如果 includeIntermediateResults 为 true,最后一个 Assessor 的中间结果会被发送给 Tuner 作为最终结果。 includeIntermediateResults 的默认值为 false。
* 如果 includeIntermediateResults 为 true,最后一个 Assessor 的中间结果会被发送给 Tuner 作为最终结果。 includeIntermediateResults 的默认值为 false。
* [分离 Tuner/Assessor](https://github.com/microsoft/nni/issues/841)
* 增加两个管道来分离 Tuner 和 Assessor 的消息
* 使日志集合功能可配置
......@@ -401,7 +448,7 @@
#### 支持新的 Tuner 和 Assessor
* 支持新的 [Metis Tuner](Tuner/MetisTuner.md)**在线**超参调优的场景,Metis 算法已经被证明非常有效。
* 支持新的 [Metis Tuner](Tuner/MetisTuner.md)对于**在线**超参调优的场景,Metis 算法已经被证明非常有效。
* 支持 [ENAS customized tuner](https://github.com/countif/enas_nni)。由 GitHub 社区用户所贡献。它是神经网络的搜索算法,能够通过强化学习来学习神经网络架构,比 NAS 的性能更好。
* 支持 [Curve fitting (曲线拟合)Assessor](Assessor/CurvefittingAssessor.md),通过曲线拟合的策略来实现提前终止 Trial。
* [权重共享的](https://github.com/microsoft/nni/blob/v0.5/docs/AdvancedNAS.md)高级支持:为 NAS Tuner 提供权重共享,当前支持 NFS。
......@@ -521,7 +568,7 @@
### 新示例
*的 NNI Docker 映像:
*的 NNI Docker 映像:
```bash
docker pull msranni/nni:latest
......
**在 Azure Machine Learning 上运行 Experiment**
===
NNI 支持在 [AML](https://azure.microsoft.com/zh-cn/services/machine-learning/) 上运行 Experiment,称为 aml 模式。
## 设置环境
步骤 1. 参考[指南](../Tutorial/QuickStart.md)安装 NNI。
步骤 2. 按照[文档](https://docs.microsoft.com/zh-cn/azure/machine-learning/how-to-manage-workspace-cli),创建 AML 账户。
步骤 3. 获取账户信息。 ![](../../img/aml_account.png)
步骤 4. 安装 AML 包环境。
```
python3 -m pip install azureml --user
python3 -m pip install azureml-sdk --user
```
## 运行 Experiment
`examples/trials/mnist-tfv1` 为例。 NNI 的 YAML 配置文件如下:
```yaml
authorName: default
experimentName: example_mnist
trialConcurrency: 1
maxExecDuration: 1h
maxTrialNum: 10
trainingServicePlatform: aml
searchSpacePath: search_space.json
#可选项: true, false
useAnnotation: false
tuner:
#可选项: TPE, Random, Anneal, Evolution, BatchTuner, MetisTuner, GPTuner
#SMAC (SMAC should be installed through nnictl)
builtinTunerName: TPE
classArgs:
#可选项: maximize, minimize
optimize_mode: maximize
trial:
command: python3 mnist.py
codeDir: .
computeTarget: ${replace_to_your_computeTarget}
image: msranni/nni
amlConfig:
subscriptionId: ${replace_to_your_subscriptionId}
resourceGroup: ${replace_to_your_resourceGroup}
workspaceName: ${replace_to_your_workspaceName}
```
注意:如果用 aml 模式运行,需要在 YAML 文件中设置 `trainingServicePlatform: aml`
[本机模式](LocalMode.md)的 Trial 配置相比,aml 模式下的键值还有:
* computeTarget
* 必填。 要在 AML 工作区中使用的计算机集群名称。
* image
* 必填。 作业中使用的 Docker 映像名称。
amlConfig:
* subscriptionId
* Azure 订阅的 Id
* resourceGroup
* 账户的资源组
* workspaceName
* 账户的工作区名称
\ No newline at end of file
# **实现 NNI TrainingService**
# NNI 中如何实现训练平台
## 概述
......
# 训练平台
## 什么是训练平台?
NNI 训练平台让用户专注于 AutoML 任务,不需要关心 Trial 实际运行的计算基础架构平台。 当从一个集群迁移到另一个集群时 (如,从本机迁移到 Kubeflow),用户只需要调整几项配置,能很容易的扩展计算资源。
NNI 提供的训练平台包括:[本机](./LocalMode.md), [远程计算机](./RemoteMachineMode.md), 以及集群类的 [OpenPAI](./PaiMode.md)[Kubeflow](./KubeflowMode.md)[FrameworkController](./FrameworkControllerMode.md)。 这些都是*内置的训练平台*
如果需要在计算资源上使用 NNI,可以根据相关接口,轻松构建对其它训练平台的支持。 参考 "[如何实现训练平台](./HowToImplementTrainingService)" 了解详情。
## 如何使用训练平台?
在 Experiment 的 YAML 配置文件中选择并配置好训练平台。 参考相应训练平台的文档来了解如何配置。 同时,[Experiment 文档](../Tutorial/ExperimentConfig)提供了更多详细信息。
然后,需要准备代码目录,将路径填入配置文件的 `codeDir` 字段。 注意,非本机模式下,代码目录会在 Experiment 运行前上传到远程或集群中。 因此,NNI 将文件数量限制到 2000,总大小限制为 300 MB。 如果代码目录中文件太多,可添加 `.nniignore` 文件来排除一部分文件,其用法与 `.gitignore` 类似。 具体用法可参考 [git 文档](https://git-scm.com/docs/gitignore#_pattern_format)
如果用户需要在 Experiment 使用大文件(如,大规模的数据集),并且不想使用本机模式,可以:1) 在 Trial command 字段中添加命令,每次 Trial 运行前下载数据;或 2) 使用工作节点可访问的共享存储。 通常情况下,训练平台都会有共享存储。 参考每个训练平台的文档,了解详情。
## 内置训练平台
| 训练平台 | 简介 |
| --------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [__本机__](./LocalMode.html) | NNI 支持在本机运行实验,称为 local 模式。 local 模式表示 NNI 会在运行 NNI Manager 进程计算机上运行 Trial 任务,支持 GPU 调度功能。 |
| [__远程计算机__](./RemoteMachineMode.html) | NNI 支持通过 SSH 通道在多台计算机上运行 Experiment,称为 remote 模式。 NNI 需要这些计算机的访问权限,并假定已配置好了深度学习训练环境。 NNI 将在远程计算机上中提交 Trial 任务,并根据 GPU 资源调度 Trial 任务。 |
| [__OpenPAI__](./PaiMode.html) | NNI 支持在 [OpenPAI](https://github.com/Microsoft/pai) 上运行 Experiment,即 pai 模式。 在使用 NNI 的 pai 模式前, 需要有 [OpenPAI](https://github.com/Microsoft/pai) 群集的账户。 如果没有 OpenPAI,参考[这里](https://github.com/Microsoft/pai#how-to-deploy)来进行部署。 在 pai 模式中,会在 Docker 创建的容器中运行 Trial 程序。 |
| [__Kubeflow__](./KubeflowMode.html) | NNI 支持在 [Kubeflow](https://github.com/kubeflow/kubeflow)上运行,称为 kubeflow 模式。 在开始使用 NNI 的 Kubeflow 模式前,需要有一个 Kubernetes 集群,可以是私有部署的,或者是 [Azure Kubernetes Service(AKS)](https://azure.microsoft.com/zh-cn/services/kubernetes-service/),并需要一台配置好 [kubeconfig](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/) 的 Ubuntu 计算机连接到此 Kubernetes 集群。 如果不熟悉 Kubernetes,可先浏览[这里](https://kubernetes.io/docs/tutorials/kubernetes-basics/)。 在 kubeflow 模式下,每个 Trial 程序会在 Kubernetes 集群中作为一个 Kubeflow 作业来运行。 |
| [__FrameworkController__](./FrameworkControllerMode.html) | NNI 支持使用 [FrameworkController](https://github.com/Microsoft/frameworkcontroller),来运行 Experiment,称之为 frameworkcontroller 模式。 FrameworkController 构建于 Kubernetes 上,用于编排各种应用。这样,可以不用为某个深度学习框架安装 Kubeflow 的 tf-operator 或 pytorch-operator 等。 而直接用 FrameworkController 作为 NNI Experiment 的训练平台。 |
| [__DLTS__](./DLTSMode.html) | NNI 支持在 [DLTS](https://github.com/microsoft/DLWorkspace.git) 上运行 Experiment,这是一个由微软开源的工具包。 |
## 训练平台做了什么?
<p align="center">
<img src="https://user-images.githubusercontent.com/23273522/51816536-ed055580-2301-11e9-8ad8-605a79ee1b9a.png" alt="drawing" width="700"/>
</p>
根据[概述](../Overview)中展示的架构,训练平台会做三件事:1) 启动 Trial; 2) 收集指标,并与 NNI 核心(NNI 管理器)通信;3) 监控 Trial 任务状态。 为了展示训练平台的详细工作原理,下面介绍了训练平台从最开始到第一个 Trial 运行成功的过程。
步骤 1. **验证配置,并准备训练平台。** 训练平台会首先检查用户配置是否正确(例如,身份验证是否有错)。 然后,训练平台会为 Experiment 做准备,创建训练平台可访问的代码目录(`codeDir`)。
```eval_rst
.. Note:: 不同的训练平台会有不同的方法来处理 ``codeDir``。 例如,本机训练平台会直接在 ``codeDir`` 中运行 Trial。 远程训练平台会将 ``codeDir`` 打包成 zip 文件,并上传到每台机器中。 基于 Kubernetes 的训练平台会将 ``codeDir`` 复制到共享存储上,此存储可以由训练平台提供,或者用户在配置文件中指定。
```
步骤 2. **提交第一个 Trial。** 要初始化 Trial,通常(在不重用环境的情况下),NNI 会复制一些文件(包括参数配置,启动脚本等)到训练平台中。 然后,NNI 会通过子进程、SSH、RESTful API 等方式启动 Trial。
```eval_rst
.. Warning:: Trial 当前目录的内容与 ``codeDir`` 会完全一样,但可能是完全不同的路径(甚至不同的计算机)。本机模式是唯一一个所有 Trial 都使用同一个 ``codeDir`` 的训练平台。 其它训练平台,会将步骤 1 中准备好的 ``codeDir``,从共享目录复制到每个 Trial 自己独立的工作目录下。 强烈建议不要依赖于本机模式下的共享行为,这会让 Experiment 很难扩展到其它训练平台上。
```
步骤 3. **收集指标。** NNI 会监控 Trial 的状态,更新状态(如,从 `WAITING``RUNNING``RUNNING``SUCCEEDED`,并收集指标。 当前,大部分训练平台都实现为 "主动" 模式,即,训练平台会调用 NNI 管理器上的 RESTful API 来更新指标。 注意,这也需要运行 NNI 管理器的计算机能被工作节点访问到。
# **在 OpenPAI 上运行 Experiment**
NNI 支持在 [OpenPAI](https://github.com/Microsoft/pai) (简称 pai)上运行 Experiment,即 pai 模式。 在使用 NNI 的 pai 模式前, 需要有 [OpenPAI](https://github.com/Microsoft/pai) 群集的账户。 如果没有 OpenPAI 账户,参考[这里](https://github.com/Microsoft/pai#how-to-deploy)来进行部署。 在 pai 模式中,会在 Docker 创建的容器中运行 Trial 程序。
NNI 支持在 [OpenPAI](https://github.com/Microsoft/pai) 上运行 Experiment,即 pai 模式。 在使用 NNI 的 pai 模式前, 需要有 [OpenPAI](https://github.com/Microsoft/pai) 群集的账户。 如果没有 OpenPAI 账户,参考[这里](https://github.com/Microsoft/pai#how-to-deploy)来进行部署。 在 pai 模式中,会在 Docker 创建的容器中运行 Trial 程序。
## 设置环境
步骤 1. 参考[指南](../Tutorial/QuickStart.md)安装 NNI。
步骤 2. 获取 OpenPAI 的令牌。
点击 OpenPAI 界面右上方的 `My profile` 按钮。 ![](../../img/pai_token_button.jpg) 找到 token management,复制当前账号的令牌。 ![](../../img/pai_token_profile.jpg)
步骤 2. 获得令牌(token)。
步骤 3. 将 NFS 存储挂载到本机。
点击 OpenPAI 网站的 `Submit job` 按钮。 ![](../../img/pai_job_submission_page.jpg)
在作业提交页面找到数据管理区域。 ![](../../img/pai_data_management_page.jpg)
`DEFAULT_STORAGE` 字段是在作业运行起来后,OpenPAI 容器中挂载的路径。 `Preview container paths` 是 API 提供的 NFS 主机和路径,需要将对应的位置挂载到本机,然后 NNI 才能使用 NFS 存储。
打开 OpenPAI 的 Web 界面,并点击右上方的 `My profile` 按钮。 ![](../../img/pai_profile.jpg)
点击页面中的 `copy` 按钮来复制 jwt 令牌。 ![](../../img/pai_token.jpg)
步骤 3. 将 NFS 存储挂在到本地计算机。
点击 Web 界面中的 `Submit job` 按钮。 ![](../../img/pai_job_submission_page.jpg)
找到作业提交页面中的数据管理部分。 ![](../../img/pai_data_management_page.jpg)
`Preview container paths` 是 API 提供的 NFS 主机和路径,需要将对应的位置挂载到本机,然后 NNI 才能使用 NFS 存储。
例如,使用下列命令:
sudo mount nfs://gcr-openpai-infra02:/pai/data /local/mnt
```bash
sudo mount -t nfs4 gcr-openpai-infra02:/pai/data /local/mnt
```
然后容器中的 `/data` 路径会被挂载到本机的 `/local/mnt` 文件夹
然后在 NNI 的配置文件中如下配置:
nniManagerNFSMountPath: /local/mnt
containerNFSMountPath: /data
```yaml
nniManagerNFSMountPath: /local/mnt
```
步骤 4. 获 OpenPAI 存储插件名称。 联系 OpenPAI 管理员,获得 NFS 存储插件的名称。 默认存储的名称是 `teamwise_storage`,NNI 配置文件中的配置如下:
步骤 4. 获 OpenPAI 存储的配置名称和 nniManagerMountPath
paiStoragePlugin: teamwise_storage
`Team share storage` 字段是在 OpenPAI 中指定存储配置的值。 可以在 `Team share storage` 中找到 `paiStorageConfigName``containerNFSMountPath` 字段,如:
```yaml
paiStorageConfigName: confignfs-data
containerNFSMountPath: /mnt/confignfs-data
```
## 运行 Experiment
......@@ -63,50 +74,91 @@ trial:
virtualCluster: default
nniManagerNFSMountPath: /home/user/mnt
containerNFSMountPath: /mnt/data/user
paiStoragePlugin: team_wise
paiStorageConfigName: confignfs-data
# 配置要访问的 OpenPAI 集群
paiConfig:
userName: your_pai_nni_user
token: your_pai_token
host: 10.1.1.1
# 可选,测试版功能。
reuse: true
```
注意:如果用 pai 模式运行,需要在 YAML 文件中设置 `trainingServicePlatform: pai`
[本机模式](LocalMode.md),以及[远程计算机模式](RemoteMachineMode.md)相比,pai 模式的 Trial 需要额外的配置:
* cpuNum
* 可选。 Trial 程序的 CPU 需求,必须为正数。 如果没在 Trial 配置中设置,则需要在 `paiConfigPath` 指定的配置文件中设置。
* memoryMB
* 可选。 Trial 程序的内存需求,必须为正数。 如果没在 Trial 配置中设置,则需要在 `paiConfigPath` 指定的配置文件中设置。
* image
* 可选。 在 pai 模式中,Trial 程序由 OpenPAI 在 [Docker 容器](https://www.docker.com/)中安排运行。 此键用来指定 Trial 程序的容器使用的 Docker 映像。
* [Docker Hub](https://hub.docker.com/) 上有预制的 NNI Docker 映像 [nnimsra/nni](https://hub.docker.com/r/msranni/nni/)。 它包含了用来启动 NNI Experiment 所依赖的所有 Python 包,Node 模块和 JavaScript。 生成此 Docker 映像的文件在[这里](https://github.com/Microsoft/nni/tree/master/deployment/docker/Dockerfile)。 可以直接使用此映像,或参考它来生成自己的映像。 如果没在 Trial 配置中设置,则需要在 `paiConfigPath` 指定的配置文件中设置。
* virtualCluster
* 可选。 设置 OpenPAI 的 virtualCluster,即虚拟集群。 如果未设置此参数,将使用默认(default)虚拟集群。
* nniManagerNFSMountPath
* 必填。 在 nniManager 计算机上设置挂载的路径。
* containerNFSMountPath
* 必填。 在 OpenPAI 的容器中设置挂载路径。
* paiStoragePlugin
* 可选。 设置 PAI 中使用的存储插件的名称。 如果没在 Trial 配置中设置,则需要在 `paiConfigPath` 指定的配置文件中设置。
* command
* 可选。 设置 OpenPAI 容器中使用的命令。
* paiConfigPath
* 可选。 设置 OpenPAI 作业配置文件路径,文件为 YAML 格式。 如果在 NNI 配置文件中设置了 `paiConfigPath`,则不需在 `trial` 配置中设置 `command`, `paiStoragePlugin`, `virtualCluster`, `image`, `memoryMB`, `cpuNum`, `gpuNum`。 这些字段将使用 `paiConfigPath` 指定的配置文件中的值。
注意:
1. OpenPAI 配置文件中的作业名称会由 NNI 指定,格式为:nni_exp_${this.experimentId}_trial_${trialJobId}。
2. 如果在 OpenPAI 配置文件中有多个 taskRoles,NNI 会将这些 taksRoles 作为一个 Trial 任务,用户需要确保只有一个 taskRole 会将指标上传到 NNI 中,否则可能会产生错误。
### Trial 配置
完成并保存 NNI Experiment 配置文件后(例如可保存为:exp_pai.yml),运行以下命令:
[本机模式](LocalMode.md),以及[远程计算机模式](RemoteMachineMode.md)相比,pai 模式的 `trial` 需要额外的配置:
* cpuNum
可选。 Trial 程序的 CPU 需求,必须为正数。 如果没在 Trial 配置中设置,则需要在 `paiConfigPath` 指定的配置文件中设置。
* memoryMB
可选。 Trial 程序的内存需求,必须为正数。 如果没在 Trial 配置中设置,则需要在 `paiConfigPath` 指定的配置文件中设置。
nnictl create --config exp_pai.yml
* image
可选。 在 pai 模式中,Trial 程序由 OpenPAI 在 [Docker 容器](https://www.docker.com/)中安排运行。 此字段用来指定 Trial 程序的容器使用的 Docker 映像。
[Docker Hub](https://hub.docker.com/) 上有预制的 NNI Docker 映像 [nnimsra/nni](https://hub.docker.com/r/msranni/nni/)。 它包含了用来启动 NNI Experiment 所依赖的所有 Python 包,Node 模块和 JavaScript。 生成此 Docker 映像的文件在[这里](https://github.com/Microsoft/nni/tree/master/deployment/docker/Dockerfile)。 可以直接使用此映像,或参考它来生成自己的映像。 如果没在 Trial 配置中设置,则需要在 `paiConfigPath` 指定的配置文件中设置。
* virtualCluster
可选。 设置 OpenPAI 的 virtualCluster,即虚拟集群。 如果未设置此参数,将使用默认(default)虚拟集群。
* nniManagerNFSMountPath
必填。 在 nniManager 计算机上设置挂载的路径。
* containerNFSMountPath
必填。 在 OpenPAI 的容器中设置挂载路径。
* paiStorageConfigName:
可选。 设置 OpenPAI 中使用的存储名称。 如果没在 Trial 配置中设置,则需要在 `paiConfigPath` 指定的配置文件中设置。
* command
可选。 设置 OpenPAI 容器中使用的命令。
* paiConfigPath 可选。 设置 OpenPAI 作业配置文件路径,文件为 YAML 格式。
如果在 NNI 配置文件中设置了 `paiConfigPath`,则不需在 `trial` 配置中设置 `command`, `paiStorageConfigName`, `virtualCluster`, `image`, `memoryMB`, `cpuNum`, `gpuNum`。 这些字段将使用 `paiConfigPath` 指定的配置文件中的值。
注意:
1. OpenPAI 配置文件中的作业名称会由 NNI 指定,格式为:nni_exp_${this.experimentId}*trial*${trialJobId}。
2. 如果在 OpenPAI 配置文件中有多个 taskRoles,NNI 会将这些 taksRoles 作为一个 Trial 任务,用户需要确保只有一个 taskRole 会将指标上传到 NNI 中,否则可能会产生错误。
### OpenPAI 配置
`paiConfig` 包括了 OpenPAI 的专门配置,
* userName
必填。 OpenPAI 平台的用户名。
* token
必填。 OpenPAI 平台的身份验证密钥。
* host
必填。 OpenPAI 平台的主机。 OpenPAI 作业提交页面的地址,例如:`10.10.5.1`,NNI 中默认协议是 `http`,如果 OpenPAI 集群启用了 https,则需要使用 `https://10.10.5.1` 的格式。
* reuse (测试版功能)
可选,默认为 false。 如果为 true,NNI 会重用 OpenPAI 作业,在其中运行尽可能多的 Trial。 这样可以节省创建新作业的时间。 用户需要确保同一作业中的每个 Trial 相互独立,例如,要避免从之前的 Trial 中读取检查点。
完成并保存 NNI Experiment 配置文件后(例如可保存为:exp_pai.yml),运行以下命令:
```bash
nnictl create --config exp_pai.yml
```
来在 pai 模式下启动 Experiment。 NNI 会为每个 Trial 创建 OpenPAI 作业,作业名称的格式为 `nni_exp_{experiment_id}_trial_{trial_id}`。 可以在 OpenPAI 集群的网站中看到 NNI 创建的作业,例如: ![](../../img/nni_pai_joblist.jpg)
......@@ -122,7 +174,7 @@ paiConfig:
## 数据管理
使用 NNI 启动 Experiment 前,应在 nniManager 计算机中设置相应的挂载数据的路径。 OpenPAI 有自己的存储(NFS、AzureBlob ...),在 PAI 中使用的存储将在启动作业时挂载到容器中。 应通过 `paiStoragePlugin` 字段选择 OpenPAI 中的存储类型。 然后,应将存储挂载到 nniManager 计算机上,并在配置文件中设置 `nniManagerNFSMountPath`,NNI会生成 bash 文件并将 `codeDir` 中的数据拷贝到 `nniManagerNFSMountPath` 文件夹中,然后启动 Trial 任务。 `nniManagerNFSMountPath` 中的数据会同步到 OpenPAI 存储中,并挂载到 OpenPAI 的容器中。 容器中的数据路径在 `containerNFSMountPath` 设置,NNI 将进入该文件夹,运行脚本启动 Trial 任务。
使用 NNI 启动 Experiment 前,应在 nniManager 计算机中设置相应的挂载数据的路径。 OpenPAI 有自己的存储(NFS、AzureBlob ...),在 OpenPAI 中使用的存储将在启动作业时挂载到容器中。 应通过 `paiStorageConfigName` 字段选择 OpenPAI 中的存储类型。 然后,应将存储挂载到 nniManager 计算机上,并在配置文件中设置 `nniManagerNFSMountPath`,NNI会生成 bash 文件并将 `codeDir` 中的数据拷贝到 `nniManagerNFSMountPath` 文件夹中,然后启动 Trial 任务。 `nniManagerNFSMountPath` 中的数据会同步到 OpenPAI 存储中,并挂载到 OpenPAI 的容器中。 容器中的数据路径在 `containerNFSMountPath` 设置,NNI 将进入该文件夹,运行脚本启动 Trial 任务。
## 版本校验
......
......@@ -2,18 +2,54 @@
NNI 可以通过 SSH 在多个远程计算机上运行同一个 Experiment,称为 `remote` 模式。 这就像一个轻量级的训练平台。 在此模式下,可以从计算机启动 NNI,并将 Trial 并行调度到远程计算机。
## 远程计算机的要求
远程计算机操作系统支持 `Linux`, `Windows 10`, 和 `Windows Server 2019`
* 仅支持 Linux 作为远程计算机,其[配置需求](../Tutorial/InstallationLinux.md)与 NNI 本机模式相同。
## 必需组件
* 根据[安装文章](../Tutorial/InstallationLinux.md),在每台计算机上安装 NNI。
* 确保远程计算机满足 Trial 代码的环境要求。 如果默认环境不符合要求,可以将设置脚本添加到 NNI 配置的 `command` 字段。
* 确保远程计算机的默认环境符合 Trial 代码的需求。 如果默认环境不符合要求,可以将设置脚本添加到 NNI 配置的 `command` 字段。
* 确保远程计算机能被运行 `nnictl` 命令的计算机通过 SSH 访问。 同时支持 SSH 的密码和密钥验证方法。 有关高级用法,参考[配置](../Tutorial/ExperimentConfig.md)的 machineList 部分。
* 确保每台计算机上的 NNI 版本一致。
* 如果要同时使用远程 Linux 和 Windows,请确保 Trial 的命令与远程操作系统兼容。 例如,Python 3.x 的执行文件在 Linux 下是 `python3`,在 Windows 下是 `python`
### Linux
* 根据[安装说明](../Tutorial/InstallationLinux.md),在远程计算机上安装 NNI。
### Windows
* 根据[安装说明](../Tutorial/InstallationWin.md),在远程计算机上安装 NNI。
* 安装并启动 `OpenSSH Server`
1. 打开 Windows 中的`设置`应用。
2. 点击`应用程序`,然后点击`可选功能`
3. 点击`添加功能`,搜索并选择 `OpenSSH Server`,然后点击`安装`
4. 安装后,运行下列命令来启动服务并设为自动启动。
```bat
sc config sshd start=auto
net start sshd
```
* 确保远程账户为管理员权限,以便可以停止运行中的 Trial。
* 确保除了默认消息外,没有别的欢迎消息,否则会导致 NodeJS 中的 ssh2 出错。 例如,如果在 Azure 中使用了 Data Science VM,需要删除 `C:\dsvm\tools\setup\welcome.bat` 中的 echo 命令。
打开新命令窗口,如果输入如下,则表示正常。
```text
Microsoft Windows [Version 10.0.17763.1192]
(c) 2018 Microsoft Corporation. All rights reserved.
(py37_default) C:\Users\AzureUser>
```
## 运行 Experiment
例如,有三台机器,可使用用户名和密码登录。
......
# NNI 上调优张量算子
## 概述
深度神经网络(DNN)的大量应用,催生了对从云服务器到嵌入式设备等不同硬件平台上的训练和推理的需求。 此外,还有深度神经网络上的计算图优化问题,如张量算子融合会引入新的张量算子。 然而,人工通过特定硬件库来优化张量算子,不能很好的支持新硬件平台和新算子,存在一定的局限性。因此,在大规模部署和深度学习技术的实际场景中,不同平台上的自动化的张量算子优化变得非常重要。
张量算子优化的本质,是一个组合优化问题。 目标函数是张量算子在某个硬件平台上的性能,通过调整超参(如,如何切片矩阵,展开循环)实现该平台上的最佳性能。 此示例展示了如何使用 NNI 来自动调优张量算子。 其提供了 OpEvo, G-BFS 和 N-A2C 三种调优算法。 参考论文 [OpEvo: An Evolutionary Method for Tensor Operator Optimization](https://arxiv.org/abs/2006.05664) 来了解算法。
## 配置环境
此示例准备了 Dockerfile 作为 Experiment 的环境。 开始前,确保 Docker 守护进程已启动,GPU 加速驱动已正确安装。 进入示例目录 `examples/trials/systems/opevo` 并运行下列命令,从 Dockerfile 构建并实例化 Docker 映像。
```bash
# 如果使用 Nvidia GPU
make cuda-env
# 如果使用 AMD GPU
make rocm-env
```
## 运行 Experiment
这里从 BERT 和 AlexNet 中选择了三种有代表性的张量算子:**矩阵乘法****批处理的矩阵乘法**,以及**二维卷积**,并使用 NNI 进行调优。 所有张量算子的 `Trial` 代码都是 `/root/compiler_auto_tune_stable.py`,每个调优算法的`搜索空间``配置`文件都在按张量算子分类的 `/root/experiments/` 目录中。 这里的 `/root` 表示容器中的 root 目录。
`/root` 中运行以下命令来调优矩阵乘法:
```bash
# (N, K) x (K, M) 表示形状为 (N, K) 的矩阵乘以形状为 (K, M) 的矩阵
# (512, 1024) x (1024, 1024)
# 用 opevo 调优
nnictl create --config experiments/mm/N512K1024M1024/config_opevo.yml
# 用 g-bfs 调优
nnictl create --config experiments/mm/N512K1024M1024/config_gbfs.yml
# 用 n-a2c 调优
nnictl create --config experiments/mm/N512K1024M1024/config_na2c.yml
# (512, 1024) x (1024, 4096)
# 用 opevo 调优
nnictl create --config experiments/mm/N512K1024M4096/config_opevo.yml
# 用 g-bfs 调优
nnictl create --config experiments/mm/N512K1024M4096/config_gbfs.yml
# 用 n-a2c 调优
nnictl create --config experiments/mm/N512K1024M4096/config_na2c.yml
# (512, 4096) x (4096, 1024)
# 用 opevo 调优
nnictl create --config experiments/mm/N512K1024M4096/config_opevo.yml
# 用 g-bfs 调优
nnictl create --config experiments/mm/N512K1024M4096/config_gbfs.yml
# 用 n-a2c 调优
nnictl create --config experiments/mm/N512K1024M4096/config_na2c.yml
```
`/root` 中运行以下命令来调优批处理矩阵乘法:
```bash
# 批处理大小为 960,形状为 (128, 128) 的矩阵,乘以批处理大小为 960,形状为 (128, 64) 的矩阵
nnictl create --config experiments/bmm/B960N128K128M64PNN/config_opevo.yml
# 批处理大小为 960,形状为 (128, 128) 的矩阵,先转置,然后乘以批处理大小为 960,形状为 (128, 64) 的矩阵
nnictl create --config experiments/bmm/B960N128K128M64PTN/config_opevo.yml
# 批处理大小为 960,形状为 (128, 128) 的矩阵,先转置,然后右乘批处理大小为 960,形状为 (128, 64) 的矩阵
nnictl create --config experiments/bmm/B960N128K64M128PNT/config_opevo.yml
```
`/root` 中运行以下命令来调优二维卷积:
```bash
# 图片张量形状为 $(512, 3, 227, 227)$ 与形状为 $(64, 3, 11, 11)$ 的核进行卷积,stride 为 4、padding 为 0
nnictl create --config experiments/conv/N512C3HW227F64K11ST4PD0/config_opevo.yml
# 图片张量形状为 $(512, 64, 27, 27)$ 与形状为 $(192, 64, 5, 5)$ 的核进行卷积,stride 为 1、padding 为 2
nnictl create --config experiments/conv/N512C64HW27F192K5ST1PD2/config_opevo.yml
```
注意,G-BFS 和 N-A2C 算法不能用于调优批处理矩阵乘法和二维卷积,因为这些算子的搜索空间中有不支持的参数。
## 引用 OpEvo
如果在研究中使用了 OpEvo,请考虑如下引用论文:
```
@misc{gao2020opevo,
title={OpEvo: An Evolutionary Method for Tensor Operator Optimization},
author={Xiaotian Gao and Cui Wei and Lintao Zhang and Mao Yang},
year={2020},
eprint={2006.05664},
archivePrefix={arXiv},
primaryClass={cs.LG}
}
```
......@@ -31,7 +31,7 @@ NNI 提供了先进的调优算法,使用上也很简单。 下面是内置 Tu
<a name="TPE"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `TPE`
### TPE
> 名称:**TPE**
......@@ -59,7 +59,7 @@ tuner:
<a name="Random"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `Random Search`
### Random Search(随机搜索)
> 名称:**Random**
......@@ -79,7 +79,7 @@ tuner:
<a name="Anneal"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `Anneal`
### Anneal(退火算法)
> 名称:**Anneal**
......@@ -105,13 +105,13 @@ tuner:
<a name="Evolution"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `Naïve Evolution`
### Naïve Evolution(朴素进化)
> 名称:**Evolution**
**建议场景**
其计算资源要求相对较高。 特别是,它需要非常大的初始种群,以免落入局部最优中。 如果 Trial 时间很短,或使用了 Assessor,就非常适合此算法。 如果 Trial 代码支持权重迁移,即每次 Trial 会从上一轮继承已经收敛的权重,建议使用此算法。 这会大大提高训练速度。 [详细说明](./EvolutionTuner.md)
其计算资源要求相对较高。 特别是,它需要非常大的初始种群,以免落入局部最优中。 如果 Trial 时间很短,或使用了 Assessor,就非常适。 如果 Trial 代码支持权重迁移,即每次 Trial 会从上一轮继承已经收敛的权重,建议使用此算法。 这会大大提高训练速度。 [详细说明](./EvolutionTuner.md)
**classArgs 要求:**
......@@ -134,7 +134,7 @@ tuner:
<a name="SMAC"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `SMAC`
### SMAC
> 名称:**SMAC**
......@@ -171,7 +171,7 @@ tuner:
<a name="Batch"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `Batch Tuner`
### Batch Tuner(批处理 Tuner)
> 名称:BatchTuner
......@@ -210,7 +210,7 @@ tuner:
<a name="GridSearch"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `Grid Search`
### Grid Search(遍历搜索)
> 名称:**Grid Search**
......@@ -232,7 +232,7 @@ tuner:
<a name="Hyperband"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `Hyperband`
### Hyperband
> 名称:**Hyperband**
......@@ -262,7 +262,7 @@ advisor:
<a name="NetworkMorphism"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `Network Morphism`
### Network Morphism
> 名称:**NetworkMorphism**
......@@ -300,7 +300,7 @@ tuner:
<a name="MetisTuner"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `Metis Tuner`
### Metis Tuner
> 名称:**MetisTuner**
......@@ -328,7 +328,7 @@ tuner:
<a name="BOHB"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `BOHB Adivisor`
### BOHB Advisor
> 名称:**BOHB**
......@@ -373,7 +373,7 @@ advisor:
<a name="GPTuner"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `GP Tuner`
### GP Tuner
> 名称:**GPTuner**
......@@ -415,11 +415,11 @@ tuner:
<a name="PPOTuner"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `PPO Tuner`
### PPO Tuner
> 内置 Tuner 名称:**PPOTuner**
搜索空间类型仅支持 `mutable_layer``optional_input_size` 只能是 0, 1, 或 [0, 1]
注意,搜索空间仅接受 `layer_choice``input_choice` 类型。 `input_choice`, `n_chosen` 只能是 0, 1, 或 [0, 1]。 注意,NAS 的搜索空间文件通常通过 [`nnictl ss_gen`](../Tutorial/Nnictl.md) 命令自动生成
**建议场景**
......@@ -451,7 +451,7 @@ tuner:
<a name="PBTTuner"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `PBT Tuner`
### PBT Tuner
> 内置 Tuner 名称:**PBTTuner**
......
......@@ -7,7 +7,7 @@ NNI 在内置的 Tuner 中提供了最新的调优算法。 NNI 同时也支持
通过自定义 Tuner,可实现自己的调优算法。主要有三步:
1. 继承 Tuner 基类
2. 实现 receive_trial_result generate_parameter 函数
2. 实现 receive_trial_result, generate_parameter 和 update_search_space 函数
3. 在 Experiment 的 YAML 文件中配置好自定义的 Tuner
示例如下:
......@@ -22,7 +22,7 @@ class CustomizedTuner(Tuner):
...
```
**2. 实现 receive_trial_result generate_parameter 函数**
**2. 实现 receive_trial_result, generate_parameter 和 update_search_space 函数**
```python
from nni.tuner import Tuner
......@@ -32,22 +32,32 @@ class CustomizedTuner(Tuner):
...
def receive_trial_result(self, parameter_id, parameters, value, **kwargs):
'''
接收 Trial 的最终结果。
parameter_id: int
parameters: 'generate_parameters()' 创建的对象
value: Trial 的最终指标结果
'''
# 实现代码
'''
接收 Trial 的最终结果。
parameter_id: int
parameters: 'generate_parameters()' 创建的对象
value: Trial 的最终指标,包括 default 指标
'''
# 代码实现位置
...
def generate_parameters(self, parameter_id, **kwargs):
'''
返回 Trial 的超参组合的序列化对象
parameter_id: int
'''
# 代码实现位置
return your_parameters
'''
返回 Trial 的超参组合的序列化对象
parameter_id: int
'''
# 代码实现位置
return your_parameters
...
def update_search_space(self, search_space):
'''
在运行时,需要更新搜索空间的 Tuner 可实现此函数。
如果 Tuner 只在生成第一个超参前设置搜索空间,
需要将其行为写到文档里。
search_space: 定义 Experiment 时创建的 JSON 对象
'''
# 代码实现位置
...
```
......
# 如何将自定义的 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:
```
+-----------------+------------+-----------+--------=-------------+------------------------------------------+
| Name | Type | Installed | Class Name | Module Name |
+-----------------+------------+-----------+----------------------+------------------------------------------+
| demotuner | tuners | Yes | DemoTuner | demo_tuner |
+-----------------+------------+-----------+----------------------+------------------------------------------+
```
## 在 Experiment 中使用安装的 Tuner
可以像使用其它内置 Tuner 一样,在 Experiment 配置文件中使用 demotuner:
```yaml
tuner:
builtinTunerName: demotuner
classArgs:
#可选项: maximize, minimize
optimize_mode: maximize
```
......@@ -11,7 +11,7 @@ PBTTuner 使用多个 Trial 来初始化种群 (即,`population_size`)。 上
### 提供检查点目录
为了让 Trial 读取其它 Trial 的检查点,需要提供能够被所有 Trial 访问到的目录 (即, `all_checkpoint_dir`)。 本机模式下非常容易,直接使用默认目录,或指定本机的任意目录均可。 对于其他训练平台,需要根据[训练平台文档](../TrainingService/SupportTrainingService.md)来提供能共享的目录,如 NFS, Azure 存储。
为了让 Trial 读取其它 Trial 的检查点,需要提供能够被所有 Trial 访问到的目录 (即, `all_checkpoint_dir`)。 本机模式下非常容易,直接使用默认目录,或指定本机的任意目录均可。 对于其他训练平台,需要根据[训练平台文档](../TrainingService/Overview.md)来提供能共享的目录,如 NFS, Azure 存储。
### 修改 Trial 代码
......@@ -46,7 +46,3 @@ tuner:
all_checkpoint_dir: /the/path/to/store/checkpoints
population_size: 10
```
### 局限性
尚未支持导入数据。
\ No newline at end of file
......@@ -68,6 +68,7 @@
- [password](#password)
- [token](#token)
- [host](#host)
- [reuse](#reuse)
- [示例](#examples)
- [本机模式](#local-mode)
- [远程模式](#remote-mode)
......@@ -228,7 +229,7 @@ machineList:
### versionCheck
可选。 布尔。 默认值:false。
可选。 布尔。 默认值:true。
NNI 会校验 remote, pai 和 Kubernetes 模式下 NNIManager 与 trialKeeper 进程的版本。 如果需要禁用版本校验,versionCheck 应设置为 false。
......@@ -530,9 +531,9 @@ NNI 会校验 remote, pai 和 Kubernetes 模式下 NNIManager 与 trialKeeper
#### ip
必填。 可从当前计算机访问的 IP 地址。
必填。 可从当前计算机访问的 IP 地址或主机名
远程计算机的 IP 地址。
远程计算机的 IP 地址或主机名
#### port
......@@ -658,6 +659,12 @@ OpenPAI 帐户的密码。
OpenPAI 的 IP 地址。
#### reuse
可选。 布尔。 默认值:`false`。 这是试用中的功能。
如果为 true,NNI 会重用 OpenPAI 作业,在其中运行尽可能多的 Trial。 这样可以节省创建新作业的时间。 用户需要确保同一作业中的每个 Trial 相互独立,例如,要避免从之前的 Trial 中读取检查点。
## 示例
### 本机模式
......@@ -685,7 +692,7 @@ OpenPAI 的 IP 地址。
gpuNum: 0
增加 Assessor 配置
增加 Assessor 配置
authorName: test
experimentName: test_experiment
......
......@@ -81,4 +81,4 @@ NNI 中有不同的错误类型。 根据严重程度,可分为三类。 当 N
如图,每个 Trial 都有日志路径,可以从中找到 Trial 的日志和 stderr。
除了 Experiment 级调试之外,NNI 还提供调试单个 Trial 的功能,而无需启动整个 Experiment。 有关调试单个 Trial 代码的更多信息,请参考[独立运行模式](../TrialExample/Trials.md#用于调试的独立模式)
\ No newline at end of file
除了 Experiment 级调试之外,NNI 还提供调试单个 Trial 的功能,而无需启动整个 Experiment。 有关调试单个 Trial 代码的更多信息,请参考[独立运行模式](../TrialExample/Trials#用于调试的独立模式)
\ No newline at end of file
**如何将自定义的算法安装为内置的 Tuner,Assessor 和 Advisor**
===
## 概述
NNI 提供了大量可用于超参优化的[内置 Tuner](../Tuner/BuiltinTuner.md), [Advisor](../Tuner/HyperbandAdvisor.md) 以及 [Assessor](../Assessor/BuiltinAssessor.md),其它算法可在 NNI 安装后,通过 `nnictl package install --name <name>` 安装。 可通过 `nnictl package list` 命令查看其它算法。
NNI 中,还可以创建自定义的 Tuner,Advisor 和 Assessor。 并根据 Experiment 配置文件的说明来使用这些自定义的算法,可参考 [自定义 Tuner](../Tuner/CustomizeTuner.md)/[Advisor](../Tuner/CustomizeAdvisor.md)/[Assessor](../Assessor/CustomizeAssessor.md)
用户可将自定义的算法作为内置算法安装,以便像其它内置 Tuner、Advisor、Assessor 一样使用。 更重要的是,这样更容易向其他人分享或发布自己实现的算法。 自定义的 Tuner、Advisor、Assessor 可作为内置算法安装到 NNI 中,安装完成后,可在 Experiment 配置文件中像内置算法一样使用。 例如,将自定义的算法 `mytuner` 安装到 NNI 后,可在配置文件中直接使用:
```yaml
tuner:
builtinTunerName: mytuner
```
## 将自定义的算法安装为内置的 Tuner,Assessor 或 Advisor
可参考下列步骤来构建自定义的 Tuner、Assessor、Advisor,并作为内置算法安装。
### 1. 创建自定义的 Tuner、Assessor、Advisor
参考下列说明来创建:
* [自定义 Tuner](../Tuner/CustomizeTuner.md)
* [自定义 Assessor](../Assessor/CustomizeAssessor.md)
* [自定义 Advisor](../Tuner/CustomizeAdvisor.md)
### 2. (可选) 创建 Validator 来验证 classArgs
NNI 提供了 `ClassArgsValidator` 接口,自定义的算法可用它来验证 Experiment 配置文件中传给构造函数的 classArgs 参数。 `ClassArgsValidator` 接口如下:
```python
class ClassArgsValidator(object):
def validate_class_args(self, **kwargs):
"""
Experiment 配置中的 classArgs 字段会作为 dict
传入到 kwargs。
"""
pass
```
例如,可将 Validator 如下实现:
```python
from schema import Schema, Optional
from nni import ClassArgsValidator
class MedianstopClassArgsValidator(ClassArgsValidator):
def validate_class_args(self, **kwargs):
Schema({
Optional('optimize_mode'): self.choices('optimize_mode', 'maximize', 'minimize'),
Optional('start_step'): self.range('start_step', int, 0, 9999),
}).validate(kwargs)
```
在 Experiment 启动时,会调用 Validator,检查 classArgs 字段是否正确。
### 3. 准备安装源
要作为内置 Tuner,Assessor,Advisor 安装,自定义算法需要用 `pip` 命令能识别的方法来打包,NNI 会调用 `pip` 命令来安装包。 除了能作为公共的 pip 源,包需要在 `classifiers` 字段中提供元信息。 classifiers 字段格式如下:
```
NNI Package :: <type> :: <builtin name> :: <full class name of tuner> :: <full class name of class args validator>
```
* `type`: 算法类型,可为 `tuner`, `assessor`, `advisor`
* `builtin name`: 在 Experiment 配置文件中使用的内置名称
* `full class name of tuner`: Tuner 类名,包括模块名,如:`demo_tuner.DemoTuner`
* `full class name of class args validator`: 类的参数验证类 validator 的类名,包括模块名,如:`demo_tuner.MyClassArgsValidator`
安装包 `setup.py` 中的 classfiers 示例如下:
```python
classifiers = [
'Programming Language :: Python :: 3',
'License :: OSI Approved :: MIT License',
'Operating System :: ',
'NNI Package :: tuner :: demotuner :: demo_tuner.DemoTuner :: demo_tuner.MyClassArgsValidator'
],
```
`setup.py` 中加入元信息后,可构建 pip 安装源:
* 在包目录中运行 `python setup.py develop` 命令,此命令会将目录作为 pip 安装源。
* 在包目录中运行 `python setup.py bdist_wheel` 命令,会构建 whl 文件。
在通过 `nnictl package install <source>` 命令安装时,NNI 会查找 `NNI Package` 开头的 classifier,获取包的元信息。
参考[自定义 Tuner 的完整示例](https://github.com/microsoft/nni/blob/master/examples/tuners/customized_tuner/README.md)
### 4. 将自定义算法包安装到 NNI 中
如果安装源是通过 `python setup.py develop` 准备的源代码目录,可通过下列命令安装:
`nnictl package install <安装源目录>`
例如:
`nnictl package install nni/examples/tuners/customized_tuner/`
如果安装源是通过 `python setup.py bdist_wheel` 准备的 whl 文件,可通过下列命令安装:
`nnictl package install <whl 文件路径>`
例如:
`nnictl package install nni/examples/tuners/customized_tuner/dist/demo_tuner-0.1-py3-none-any.whl`
## 5. 在 Experiment 中使用安装的算法
在自定义算法安装后,可用其它内置 Tuner、Assessor、Advisor 的方法在 Experiment 配置文件中使用,例如:
```yaml
tuner:
builtinTunerName: demotuner
classArgs:
#可选项: maximize, minimize
optimize_mode: maximize
```
## 用 `nnictl package` 命令管理包
### 列出已安装的包
运行以下命令列出已安装的包:
```
nnictl package list
+-----------------+------------+-----------+--------=-------------+------------------------------------------+
| Name | Type | Installed | Class Name | Module Name |
+-----------------+------------+-----------+----------------------+------------------------------------------+
| demotuner | tuners | Yes | DemoTuner | demo_tuner |
| SMAC | tuners | No | SMACTuner | nni.smac_tuner.smac_tuner |
| PPOTuner | tuners | No | PPOTuner | nni.ppo_tuner.ppo_tuner |
| BOHB | advisors | Yes | BOHB | nni.bohb_advisor.bohb_advisor |
+-----------------+------------+-----------+----------------------+------------------------------------------+
```
运行以下命令列出包括不能卸载的所有包。
```
nnictl package list --all
+-----------------+------------+-----------+--------=-------------+------------------------------------------+
| Name | Type | Installed | Class Name | Module Name |
+-----------------+------------+-----------+----------------------+------------------------------------------+
| TPE | tuners | Yes | HyperoptTuner | nni.hyperopt_tuner.hyperopt_tuner |
| Random | tuners | Yes | HyperoptTuner | nni.hyperopt_tuner.hyperopt_tuner |
| Anneal | tuners | Yes | HyperoptTuner | nni.hyperopt_tuner.hyperopt_tuner |
| Evolution | tuners | Yes | EvolutionTuner | nni.evolution_tuner.evolution_tuner |
| BatchTuner | tuners | Yes | BatchTuner | nni.batch_tuner.batch_tuner |
| GridSearch | tuners | Yes | GridSearchTuner | nni.gridsearch_tuner.gridsearch_tuner |
| NetworkMorphism | tuners | Yes | NetworkMorphismTuner | nni.networkmorphism_tuner.networkmo... |
| MetisTuner | tuners | Yes | MetisTuner | nni.metis_tuner.metis_tuner |
| GPTuner | tuners | Yes | GPTuner | nni.gp_tuner.gp_tuner |
| PBTTuner | tuners | Yes | PBTTuner | nni.pbt_tuner.pbt_tuner |
| SMAC | tuners | No | SMACTuner | nni.smac_tuner.smac_tuner |
| PPOTuner | tuners | No | PPOTuner | nni.ppo_tuner.ppo_tuner |
| Medianstop | assessors | Yes | MedianstopAssessor | nni.medianstop_assessor.medianstop_... |
| Curvefitting | assessors | Yes | CurvefittingAssessor | nni.curvefitting_assessor.curvefitt... |
| Hyperband | advisors | Yes | Hyperband | nni.hyperband_advisor.hyperband_adv... |
| BOHB | advisors | Yes | BOHB | nni.bohb_advisor.bohb_advisor |
+-----------------+------------+-----------+----------------------+------------------------------------------+
```
### 卸载包
运行以下命令卸载已安装的包:
`nnictl package uninstall <包名称>`
例如:
`nnictl package uninstall demotuner`
......@@ -18,7 +18,7 @@
先决条件:`python 64-bit >=3.5`, `git`, `wget`
bash
git clone -b v1.5 https://github.com/Microsoft/nni.git
git clone -b v1.6 https://github.com/Microsoft/nni.git
cd nni
./install.sh
......@@ -33,7 +33,7 @@
* 通过克隆源代码下载示例。
```bash
git clone -b v1.5 https://github.com/Microsoft/nni.git
git clone -b v1.6 https://github.com/Microsoft/nni.git
```
* 运行 MNIST 示例。
......
# 在 Windows 上安装
## 安装
## 先决条件
强烈建议使用 Anaconda 或 Miniconda 来管理多个 Python 环境。
* Python 3.5(或以上)64 位。 在 Windows 上推荐使用 [Anaconda](https://www.anaconda.com/products/individual)[Miniconda](https://docs.conda.io/en/latest/miniconda.html) 来管理多个 Python 环境。
### 通过 pip 命令安装 NNI
* 如果是新安装的 Python 环境,需要安装 [Microsoft C++ Build Tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/) 来支持 NNI 的依赖项,如 `scikit-learn`
先决条件:`python 64-bit >= 3.5`
```bat
pip install cython wheel
```
```bash
python -m pip install --upgrade nni
```
* 安装 git 用于验证安装。
### 通过源代码安装 NNI
## 安装 NNI
如果对某个或最新版本的代码感兴趣,可通过源代码安装 NNI
大多数情况下,可以从 pip 包安装和升级 NNI。 这样既方便又快捷
先决条件:`python 64-bit >=3.5`, `git`, `PowerShell`
如果对某个或最新版本的代码感兴趣,可通过源代码安装 NNI。
```bash
git clone -b v1.5 https://github.com/Microsoft/nni.git
cd nni
powershell -ExecutionPolicy Bypass -file install.ps1
```
如果要为 NNI 贡献代码,参考[设置开发环境](SetupNniDeveloperEnvironment.md)
* 从 pip 包安装
```bat
python -m pip install --upgrade nni
```
* 从源代码安装
```bat
git clone -b v1.6 https://github.com/Microsoft/nni.git
cd nni
powershell -ExecutionPolicy Bypass -file install.ps1
```
## 验证安装
以下示例基于 TensorFlow 1.x 。确保运行环境中使用的的是 **TensorFlow 1.x**
* 通过克隆源代码下载示例。
* 克隆源代码中的示例。
```bash
git clone -b v1.5 https://github.com/Microsoft/nni.git
```
```bat
git clone -b v1.6 https://github.com/Microsoft/nni.git
```
* 运行 MNIST 示例。
```bash
nnictl create --config nni\examples\trials\mnist-tfv1\config_windows.yml
```
```bat
nnictl create --config nni\examples\trials\mnist-tfv1\config_windows.yml
```
注意:在其它示例中,如果 Python3 是通过 `python` 命令启动,需要将每个示例 YAML 文件 Trial 命令`python3` 改为 `python`
注意:如果熟悉其它框架,可选择 `examples\trials` 目录下对应的示例。 需要将示例 YAML 文件 Trial 命令的 `python3` 改为 `python`,这是因为默认安装的 Python 可执行文件是 `python.exe`,没有 `python3.exe`
* 在命令行中等待输出 `INFO: Successfully started experiment!`。 此消息表明 Experiment 已成功启动。 通过命令行输出的 `Web UI url` 来访问 Experiment 的界面。
......@@ -70,7 +80,7 @@ You can use these commands to get more information about the experiment
-----------------------------------------------------------------------
```
* 在浏览器中打开 `Web UI url`,可看到下图的实验详细信息,以及所有的尝试任务。 查看[这里](../Tutorial/WebUI.md)的更多页面。
* 在浏览器中打开 `Web UI url`,可看到下图的 Experiment 详细信息,以及所有的 Trial 任务。 查看[这里](../Tutorial/WebUI.md)的更多页面。
![概述](../../img/webui_overview_page.png)
......@@ -112,18 +122,20 @@ You can use these commands to get more information about the experiment
* 忘记安装 Experiment 的依赖,如 TensorFlow,Keras 等。
### 无法在 Windows 上使用 BOHB
确保安装了 C ++ 14.0 编译器然后尝试运行 `nnictl package install --name=BOHB` 来安装依赖项。
### Windows 上不支持的 Tuner
当前不支持 SMAC,原因可参考[此问题](https://github.com/automl/SMAC3/issues/483)
### 将 Windows 服务器用作远程服务器
目前不支持。
### 用 Windows 作为远程节点
注意:
参考[远程模式](../TrainingService/RemoteMachineMode.md).
* 如果遇到 `Segmentation fault` 的错误,请参阅[常见问题](FAQ.md)
### 安装时出现 Segmentation Fault (core dumped)
参考[常见问题](FAQ.md)
## 更多
......
......@@ -28,7 +28,8 @@ nnictl 支持的命令:
### 管理 Experiment
<a name="create"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `nnictl create`
### nnictl create
* 说明
......@@ -79,7 +80,7 @@ nnictl 支持的命令:
<a name="resume"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `nnictl resume`
### nnictl resume
* 说明
......@@ -110,7 +111,7 @@ nnictl 支持的命令:
<a name="view"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `nnictl view`
### nnictl view
* 说明
......@@ -138,7 +139,8 @@ nnictl 支持的命令:
```
<a name="stop"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `nnictl stop`
### nnictl stop
* 说明
......@@ -195,7 +197,7 @@ nnictl 支持的命令:
<a name="update"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `nnictl update`
### nnictl update
* **nnictl update searchspace**
......@@ -306,7 +308,8 @@ nnictl 支持的命令:
```
<a name="trial"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `nnictl trial`
### nnictl trial
* **nnictl trial ls**
......@@ -355,7 +358,7 @@ nnictl 支持的命令:
<a name="top"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `nnictl top`
### nnictl top
* 说明
......@@ -375,7 +378,8 @@ nnictl 支持的命令:
| --time, -t | False | | 刷新 Experiment 状态的时间间隔,单位为秒,默认值为 3 秒。 |
<a name="experiment"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `管理 Experiment 的信息`
### 管理 Experiment 信息
* **nnictl experiment show**
......@@ -539,7 +543,8 @@ nnictl 支持的命令:
```
<a name="platform"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `管理平台的信息`
### 管理平台信息
* **nnictl platform clean**
......@@ -564,7 +569,8 @@ nnictl 支持的命令:
| --config | True | | 创建 Experiment 时的 YAML 配置文件路径。 |
<a name="config"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `nnictl config show`
### nnictl config show
* 说明
......@@ -578,7 +584,7 @@ nnictl 支持的命令:
<a name="log"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `管理日志`
### 管理日志
* **nnictl log stdout**
......@@ -650,12 +656,14 @@ nnictl 支持的命令:
| --trial_id, -T | False | | 所需要找日志路径的 Trial 的 ID,当 id 不为空时,此值也为必需。 |
<a name="webui"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `管理 Web 界面`
### 管理 Web 界面
* **nnictl webui url**
<a name="tensorboard"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `管理 TensorBoard`
### 管理 TensorBoard
* **nnictl tensorboard start**
......@@ -705,49 +713,115 @@ nnictl 支持的命令:
<a name="package"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `管理包`
### 管理安装包
* **nnictl package install**
* 说明
安装 NNI 实验所需要的包
安装自定义的 Tuner,Assessor,Advisor(定制或 NNI 提供的算法)
* 用法
```bash
nnictl package install [OPTIONS]
nnictl package install --name <包名称>
```
可通过 `nnictl package list` 命令查看可用的`<包名称>`
或者
```bash
nnictl package install <安装源>
```
参考[安装自定义算法](InstallCustomizedAlgos.md),来准备安装源。
* 示例
> 安装 SMAC Tuner
```bash
nnictl package install --name SMAC
```
> 安装自定义 Tuner
```bash
nnictl package install nni/examples/tuners/customized_tuner/dist/demo_tuner-0.1-py3-none-any.whl
```
* **nnictl package show**
* 说明
显示包的详情。
* 用法
```bash
nnictl package show <包名称>
```
* 示例
```bash
nnictl package show SMAC
```
* **nnictl package list**
* 说明
列出安装的、所有包。
* 用法
```bash
nnictl package list [OPTIONS]
```
* 选项
| 参数及缩写 | 是否必需 | 默认值 | 说明 |
| ------ | ---- | --- | ------- |
| --name | True | | 要安装的包名称 |
| 参数及缩写 | 是否必需 | 默认值 | 说明 |
| ----- | ----- | --- | ----- |
| --all | False | | 列出所有包 |
* 示例
> 安装 SMAC Tuner 所需要的包
> 列出已安装的包
```bash
nnictl package list
```
> 列出所有包
```bash
nnictl package install --name=SMAC
nnictl package list --all
```
* **nnictl package show**
* **nnictl package uninstall**
* 说明
列出支持的安装包
卸载包。
* 用法
```bash
nnictl package show
nnictl package uninstall <包名称>
```
* 示例 卸载 SMAC 包
```bash
nnictl package uninstall SMAC
```
<a name="ss_gen"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `生成搜索空间`
### 生成搜索空间
* **nnictl ss_gen**
......@@ -779,7 +853,7 @@ nnictl 支持的命令:
<a name="version"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `检查 NNI 版本`
### NNI 版本校验
* **nnictl --version**
......
......@@ -4,23 +4,29 @@
目前支持 Linux、macOS 和 Windows。 Ubuntu 16.04 或更高版本、macOS 10.14.1 和 Windows 10.1809 均经过测试并支持。 在 `python >= 3.5` 的环境中,只需要运行 `pip install` 即可完成安装。
**Linux 和 macOS**
### Linux 和 macOS
```bash
python3 -m pip install --upgrade nni
python3 -m pip install --upgrade nni
```
**Windows**
### Windows
```bash
python -m pip install --upgrade nni
python -m pip install --upgrade nni
```
注意:
```eval_rst
.. Note:: 在 Linux 和 macOS 上,如果要将 NNI 安装到当前用户的 home 目录中,可使用 ``--user``;这不需要特殊权限。
```
* 在 Linux 和 macOS 上,如果要将 NNI 安装到当前用户的 home 目录中,可使用 `--user`,则不需要特殊权限。
* 如果遇到 `Segmentation fault` 这样的错误,参考[常见问答](FAQ.md)
* 有关 NNI 的`系统要求`,参考[在 Linux 和 macOS 上安装](InstallationLinux.md)[Windows](InstallationWin.md)
```eval_rst
.. Note:: 如果出现 ``Segmentation fault`` 这样的错误,参考 :doc:`常见问题 <FAQ>`。
```
```eval_rst
.. Note:: NNI 的系统需求,参考 :doc:`Linux 和 Mac <InstallationLinux>` 或 :doc:`Windows <InstallationWin>` 的安装教程。
```
## MNIST 上的 "Hello World"
......@@ -33,7 +39,12 @@ def run_trial(params):
# 输入数据
mnist = input_data.read_data_sets(params['data_dir'], one_hot=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'])
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'])
mnist_network.build_network()
test_acc = 0.0
......@@ -44,11 +55,20 @@ def run_trial(params):
test_acc = mnist_network.evaluate(mnist)
if __name__ == '__main__':
params = {'data_dir': '/tmp/tensorflow/mnist/input_data', 'dropout_rate': 0.5, '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}
params = {'data_dir': '/tmp/tensorflow/mnist/input_data',
'dropout_rate': 0.5,
'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)
```
注意:完整实现请参考 [examples/trials/mnist-tfv1/mnist_before.py](https://github.com/Microsoft/nni/tree/master/examples/trials/mnist-tfv1/mnist_before.py)
完整实现请参考 [examples/trials/mnist-tfv1/mnist_before.py](https://github.com/Microsoft/nni/tree/master/examples/trials/mnist-tfv1/mnist_before.py)
上面的代码一次只能尝试一组参数,如果想要调优学习率,需要手工改动超参,并一次次尝试。
......@@ -56,7 +76,7 @@ NNI 用来帮助超参调优。它的流程如下:
```text
输入: 搜索空间, Trial 代码, 配置文件
输出: 一组最佳的超参配置
输出: 一组最优的参数配置
1: For t = 0, 1, 2, ..., maxTrialNum,
2: hyperparameter = 从搜索空间选择一组参数
......@@ -64,14 +84,14 @@ NNI 用来帮助超参调优。它的流程如下:
4: 返回最终结果给 NNI
5: If 时间达到上限,
6: 停止实验
7: return 最好的实验结果
7: 返回最好的实验结果
```
如果需要使用 NNI 来自动训练模型,找到最佳超参,需要根据代码,进行如下三步改动:
**启动 Experiment 的三个步骤**
### 启动 Experiment 的三个步骤
**第一步**定义 JSON 格式的`搜索空间`文件,包括所有需要搜索的超参的`名称``分布`(离散和连续值均可)。
**第一步**编写 JSON 格式的`搜索空间`文件,包括所有需要搜索的超参的`名称``分布`(离散和连续值均可)。
```diff
- params = {'data_dir': '/tmp/tensorflow/mnist/input_data', 'dropout_rate': 0.5, 'channel_1_num': 32, 'channel_2_num': 64,
......@@ -85,7 +105,7 @@ NNI 用来帮助超参调优。它的流程如下:
+ }
```
*实现代码:[search_space.json](https://github.com/Microsoft/nni/tree/master/examples/trials/mnist-tfv1/search_space.json)*
*示例:[search_space.json](https://github.com/Microsoft/nni/tree/master/examples/trials/mnist-tfv1/search_space.json)*
**第二步**:修改 `Trial` 代码来从 NNI 获取超参,并返回 NNI 最终结果。
......@@ -112,7 +132,7 @@ NNI 用来帮助超参调优。它的流程如下:
run_trial(params)
```
*实现代码:[mnist.py](https://github.com/Microsoft/nni/tree/master/examples/trials/mnist-tfv1/mnist.py)*
*示例:[mnist.py](https://github.com/Microsoft/nni/tree/master/examples/trials/mnist-tfv1/mnist.py)*
**第三步**:定义 YAML 格式的`配置`文件,其中声明了搜索空间和 Trial 文件的`路径`。 它还提供其他信息,例如调整算法,最大 Trial 运行次数和最大持续时间的参数。
......@@ -135,31 +155,37 @@ trial:
gpuNum: 0
```
注意:**在 Windows 上,需要将 Trial 命令的 `python3` 改为 `python`**
```eval_rst
.. Note:: 如果要使用远程计算机或集群作为 :doc:`训练平台 <../TrainingService/Overview>`,为了避免产生过大的网络压力,NNI 限制了文件的最大数量为 2000,大小为 300 MB。 如果 codeDir 中包含了过多的文件,可添加 ``.nniignore`` 文件来排除部分,与 ``.gitignore`` 文件用法类似。 参考 `git documentation <https://git-scm.com/docs/gitignore#_pattern_format>` ,了解更多如何编写此文件的详细信息 _。
```
*实现代码:[config.yml](https://github.com/Microsoft/nni/tree/master/examples/trials/mnist-tfv1/config.yml)*
*示例: [config.yml](https://github.com/Microsoft/nni/tree/master/examples/trials/mnist-tfv1/config.yml) [.nniignore](https://github.com/Microsoft/nni/tree/master/examples/trials/mnist-tfv1/.nniignore)*
上面的代码都已准备好,并保存在 [examples/trials/mnist-tfv1/](https://github.com/Microsoft/nni/tree/master/examples/trials/mnist-tfv1)
**Linux 和 macOS**
#### Linux 和 macOS
从命令行使用 **config.yml** 文件启动 MNIST Experiment 。
```bash
nnictl create --config nni/examples/trials/mnist-tfv1/config.yml
nnictl create --config nni/examples/trials/mnist-tfv1/config.yml
```
**Windows**
#### Windows
从命令行使用 **config_windows.yml** 文件启动 MNIST Experiment 。
注意:如果使用 Windows,则需要在 config.yml 文件中,将 `python3` 改为 `python`,或者使用 config_windows.yml 来开始 Experiment。
```bash
nnictl create --config nni\examples\trials\mnist-tfv1\config_windows.yml
nnictl create --config nni\examples\trials\mnist-tfv1\config_windows.yml
```
```eval_rst
.. Note:: 如果使用 Windows,则需要在 config.yml 文件中,将 ``python3`` 改为 ``python``,或者使用 config_windows.yml 来开始 Experiment。
```
注意:`nnictl` 是一个命令行工具,用来控制 NNI Experiment,如启动、停止、继续 Experiment,启动、停止 NNIBoard 等等。 查看[这里](Nnictl.md),了解 `nnictl` 更多用法。
```eval_rst
.. Note:: ``nnictl`` 是一个命令行工具,用来控制 NNI Experiment,如启动、停止、继续 Experiment,启动、停止 NNIBoard 等等。 点击 :doc:`这里 <Nnictl>` 查看 ``nnictl`` 的更多用法。
```
在命令行中等待输出 `INFO: Successfully started experiment!`。 此消息表明 Experiment 已成功启动。 期望的输出如下:
......
**设置 NNI 开发环境**
# 设置 NNI 开发环境
===
NNI 开发环境支持安装 Python 3 64 位的 Ubuntu 1604 (及以上)和 Windows 10。
## 调试 NNI 源代码的最佳实践
## 安装
要调试 NNI 源代码,需要 Ubuntu 16.04 或更高版本系统的开发环境,并需要安装 Python 3 以及 pip 3,然后遵循以下步骤
安装步骤与从源代码安装类似。 但是安装过程会链接到代码目录,以便代码改动能更方便的直接使用
### 1. 克隆源代码
运行命令
```bash
git clone https://github.com/Microsoft/nni.git
```
git clone https://github.com/Microsoft/nni.git
注意,如果要贡献代码,需要 Fork 自己的 NNI 代码库并克隆。
来克隆源代码
### 2. 从源代码安装
### 2. 准备调试环境并安装依赖项
#### Ubuntu
将目录切换到源码目录,然后运行命令
```bash
make dev-easy-install
```
make install-dependencies
#### Windows
来安装环境的依赖项工具
```bat
powershell -ExecutionPolicy Bypass -file install.ps1 -Development
```
### 3. 生成源代码
### 3. 检查环境是否正确
运行命令
可通过运行 Experiment,来检查环境。 例如,运行以下命令
make build
```bash
nnictl create --config examples/trials/mnist-tfv1/config.yml
```
来生成源代码
并打开 Web 界面查看
### 4. 将 NNI 安装到开发环境中
运行命令
make dev-install
来安装分发内容到开发环境,并创建 cli 脚本
### 5. 检查环境是否正确
Trial 启动 Experiment 来检查环境。 例如,运行命令
nnictl create --config ~/nni/examples/trials/mnist-tfv1/config.yml
并打开网页界面查看
### 6. 重新部署
代码更改后,可能需要重新部署。 这取决于更改了哪种代码。
### 4. 重新加载改动
#### Python
不需要重新部署,但可能需要重新启动 nnictl
无需操作,代码已连接到包的安装位置
#### TypeScript
*果要更改 `src/nni_manager`,运行 `yarn watch` 可持续编译改动。 它将实时重建代码。 可能需要重新启动 nnictl 来重新加载 NNI 管理器。
*改动了 `src/nni_manager`在此目录下运行 `yarn watch` 可持续编译改动。 它将持续的监视并编译代码。 可能需要重`nnictl` 来重新加载 NNI 管理器。
* 如果改动了 `src/webui``src/nasui`,在相应目录下运行 `yarn start`。 Web 界面会在代码修改后自动刷新。
* * *
### 5. 提交拉取请求
所有改动都需要从自己 Fork 的代码库合并到 master 分支上。 拉取请求的描述必须有意义且有用。
我们会尽快审查更改。 审查通过后,我们会将代码合并到主分支。
最后,希望一切顺利。 参考[贡献](Contributing.md)文档,来了解更多创建拉取请求或问题的指南。
\ No newline at end of file
有关更多贡献指南和编码风格,查看[贡献文档](Contributing.md)
\ No newline at end of file
This diff is collapsed.
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