Unverified Commit 9fb25ccc authored by SparkSnail's avatar SparkSnail Committed by GitHub
Browse files

Merge pull request #189 from microsoft/master

merge master
parents 1500458a 7c4bc33b
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
## 文档 ## 文档
文档使用了 [sphinx](http://sphinx-doc.org/) 来生成,支持 [Markdown](https://guides.github.com/features/mastering-markdown/)[reStructuredText](http://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html) 格式。 所有文档都在 <docs> 目录下。 文档使用了 [sphinx](http://sphinx-doc.org/) 来生成,支持 [Markdown](https://guides.github.com/features/mastering-markdown/)[reStructuredText](http://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html) 格式。 所有文档都在 [docs/zh_CN](docs) 目录下。
* 在提交文档改动前,请先**在本地生成文档**`cd docs/zh_CN && make html`,然后,可以在 `docs/zh_CN/_build/html` 目录下找到所有生成的网页。 请认真分析生成日志中的**每个 WARNING**,这非常有可能是或**空连接**或其它问题。 * 在提交文档改动前,请先**在本地生成文档**`cd docs/zh_CN && make html`,然后,可以在 `docs/zh_CN/_build/html` 目录下找到所有生成的网页。 请认真分析生成日志中的**每个 WARNING**,这非常有可能是或**空连接**或其它问题。
......
...@@ -31,7 +31,7 @@ class CustomizedTuner(Tuner): ...@@ -31,7 +31,7 @@ class CustomizedTuner(Tuner):
def __init__(self, ...): def __init__(self, ...):
... ...
def receive_trial_result(self, parameter_id, parameters, value): def receive_trial_result(self, parameter_id, parameters, value, **kwargs):
''' '''
接收 Trial 的最终结果。 接收 Trial 的最终结果。
parameter_id: int parameter_id: int
...@@ -41,7 +41,7 @@ class CustomizedTuner(Tuner): ...@@ -41,7 +41,7 @@ class CustomizedTuner(Tuner):
# 实现代码 # 实现代码
... ...
def generate_parameters(self, parameter_id): def generate_parameters(self, parameter_id, **kwargs):
''' '''
返回 Trial 的超参组合的序列化对象 返回 Trial 的超参组合的序列化对象
parameter_id: int parameter_id: int
...@@ -51,14 +51,14 @@ class CustomizedTuner(Tuner): ...@@ -51,14 +51,14 @@ class CustomizedTuner(Tuner):
... ...
``` ```
`receive_trial_result` 从输入中会接收 `parameter_id, parameters, value` 参数。 Tuner 会收到 Trial 进程发送的完全一样的 `value` 值。 `receive_trial_result` 从输入中会接收 `parameter_id, parameters, value` 参数。 Tuner 会收到 Trial 进程发送的完全一样的 `value` 值。 如果在 Experiment 配置文件里 `multiPhase``true`, 会有一个附加的 `trial_job_id``**kwargs` 参数中返回给 `receive_trial_result``generate_parameters`
`generate_parameters` 函数返回的 `your_parameters`,会被 NNI SDK 打包为 json。 然后 SDK 会将 json 对象解包给 Trial 进程。因此,Trial 进程会收到来自 Tuner 的完全相同的 `your_parameters` `generate_parameters` 函数返回的 `your_parameters`,会被 NNI SDK 打包为 json。 然后 SDK 会将 json 对象解包给 Trial 进程。因此,Trial 进程会收到来自 Tuner 的完全相同的 `your_parameters`
例如: 如下实现了 `generate_parameters` 例如: 如下实现了 `generate_parameters`
```python ```python
def generate_parameters(self, parameter_id): def generate_parameters(self, parameter_id, **kwargs):
''' '''
返回 Trial 的超参组合的序列化对象 返回 Trial 的超参组合的序列化对象
parameter_id: int parameter_id: int
......
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
创建 Experiment 时,需要给 nnictl 命令提供配置文件的路径。 配置文件是 YAML 格式,需要保证其格式正确。 本文介绍了配置文件的内容,并提供了一些示例和模板。 创建 Experiment 时,需要给 nnictl 命令提供配置文件的路径。 配置文件是 YAML 格式,需要保证其格式正确。 本文介绍了配置文件的内容,并提供了一些示例和模板。
- [Experiment(实验)配置参考](#experiment-config-reference) - [Experiment(实验)配置参考](#Experiment-config-reference)
- [模板](#template) - [模板](#Template)
- [说明](#configuration-spec) - [说明](#Configuration-spec)
- [样例](#examples) - [样例](#Examples)
<a name="Template"></a> <a name="Template"></a>
...@@ -128,14 +128,17 @@ machineList: ...@@ -128,14 +128,17 @@ machineList:
- 说明 - 说明
**authorName** 是创建 Experiment 的作者。 待定: 增加默认值 **authorName** 是创建 Experiment 的作者。
待定: 增加默认值
- **experimentName** - **experimentName**
- 说明 - 说明
**experimentName** 是 Experiment 的名称。 **experimentName** 是创建的 Experiment 的名称。
待实现:增加默认值
待定: 增加默认值
- **trialConcurrency** - **trialConcurrency**
...@@ -153,11 +156,17 @@ machineList: ...@@ -153,11 +156,17 @@ machineList:
注意:maxExecDuration 设置的是 Experiment 执行的时间,不是 Trial 的。 如果 Experiment 达到了设置的最大时间,Experiment 不会停止,但不会再启动新的 Trial 作业。 注意:maxExecDuration 设置的是 Experiment 执行的时间,不是 Trial 的。 如果 Experiment 达到了设置的最大时间,Experiment 不会停止,但不会再启动新的 Trial 作业。
- **versionCheck**
- 说明
NNI 会校验 remote, pai 和 Kubernetes 模式下 NNIManager 与 trialKeeper 进程的版本。 如果需要禁用版本校验,versionCheck 应设置为 false。
- **debug** - **debug**
- 说明 - 说明
NNI 会校验 remote, pai 和 Kubernetes 模式下 NNIManager 与 trialKeeper 进程的版本。 如果需要禁用版本校验,debug 应设置为 true 调试模式会将 versionCheck 设置为 False,并将 logLevel 设置为 'debug'
- **maxTrialNum** - **maxTrialNum**
...@@ -171,7 +180,7 @@ machineList: ...@@ -171,7 +180,7 @@ machineList:
**trainingServicePlatform** 定义运行 Experiment 的平台,包括:{**local**, **remote**, **pai**, **kubeflow**}. **trainingServicePlatform** 定义运行 Experiment 的平台,包括:{**local**, **remote**, **pai**, **kubeflow**}.
- **local** 在本机的 ubuntu 上运行 Experiment。 - **local** 在本机的 Ubuntu 上运行 Experiment。
- **remote** 将任务提交到远程的 Ubuntu 上,必须用 **machineList** 来指定远程的 SSH 连接信息。 - **remote** 将任务提交到远程的 Ubuntu 上,必须用 **machineList** 来指定远程的 SSH 连接信息。
...@@ -259,7 +268,7 @@ machineList: ...@@ -259,7 +268,7 @@ machineList:
__gpuNum__ 指定了运行 Tuner 进程的 GPU 数量。 此字段的值必须是正整数。 __gpuNum__ 指定了运行 Tuner 进程的 GPU 数量。 此字段的值必须是正整数。
注意: 只能使用一种方法来指定 Tuner,例如:设置{tunerName, optimizationMode} 或 {tunerCommand, tunerCwd},不能同时设置。 注意: 只能使用一种方法来指定 Tuner,例如:设置 {tunerName, optimizationMode} 或 {tunerCommand, tunerCwd},不能同时设置两者
- **includeIntermediateResults** - **includeIntermediateResults**
...@@ -281,7 +290,7 @@ machineList: ...@@ -281,7 +290,7 @@ machineList:
- **classArgs** - **classArgs**
**classArgs** 指定了 Assessor 算法的参数 **classArgs** 指定了 Assessor 算法的参数
- **codeDir**, **classFileName**, **className****classArgs** - **codeDir**, **classFileName**, **className****classArgs**
...@@ -495,7 +504,7 @@ machineList: ...@@ -495,7 +504,7 @@ machineList:
- **keyVault** - **keyVault**
如果用户使用 Azure Kubernetes Service,需要设置 keyVault 来使用 Azure 存储账户的私钥。 参考: https://docs.microsoft.com/en-us/azure/key-vault/key-vault-manage-with-cli2 如果用户使用 Azure Kubernetes Service,需要设置 keyVault 来使用 Azure 存储账户的私钥。 参考: https://docs.microsoft.com/zh-cn/azure/key-vault/key-vault-manage-with-cli2
- **vaultName** - **vaultName**
......
# **在 FrameworkController 上运行 Experiment** # 在 FrameworkController 上运行 Experiment
NNI 支持使用 [FrameworkController](https://github.com/Microsoft/frameworkcontroller),来运行 Experiment,称之为 frameworkcontroller 模式。 FrameworkController 构建于 Kubernetes 上,用于编排各种应用。这样,可以不用为某个深度学习框架安装 Kubeflow 的 tf-operator 的 pytorch-operator 等。 而直接用 FrameworkController 作为 NNI Experiment 的训练服务。 === NNI 支持使用 [FrameworkController](https://github.com/Microsoft/frameworkcontroller),来运行 Experiment,称之为 frameworkcontroller 模式。 FrameworkController 构建于 Kubernetes 上,用于编排各种应用。这样,可以不用为某个深度学习框架安装 Kubeflow 的 tf-operator 的 pytorch-operator 等。 而直接用 FrameworkController 作为 NNI Experiment 的训练服务。
## 私有部署的 Kubernetes 的准备工作 ## 私有部署的 Kubernetes 的准备工作
...@@ -8,101 +8,108 @@ NNI 支持使用 [FrameworkController](https://github.com/Microsoft/frameworkcon ...@@ -8,101 +8,108 @@ NNI 支持使用 [FrameworkController](https://github.com/Microsoft/frameworkcon
2. 配置 **kubeconfig** 文件,NNI 将使用此配置与 Kubernetes API 服务交互。 默认情况下,NNI 管理器会使用 $(HOME)/.kube/config 作为 kubeconfig 文件的路径。 也可以通过环境变量 **KUBECONFIG** 来指定其它 kubeconfig 文件。 根据[指南](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig)了解更多 kubeconfig 的信息。 2. 配置 **kubeconfig** 文件,NNI 将使用此配置与 Kubernetes API 服务交互。 默认情况下,NNI 管理器会使用 $(HOME)/.kube/config 作为 kubeconfig 文件的路径。 也可以通过环境变量 **KUBECONFIG** 来指定其它 kubeconfig 文件。 根据[指南](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig)了解更多 kubeconfig 的信息。
3. 如果 NNI Trial 作业需要 GPU 资源,需按照[指南](https://github.com/NVIDIA/k8s-device-plugin)来配置 **Kubernetes 下的 Nvidia 插件** 3. 如果 NNI Trial 作业需要 GPU 资源,需按照[指南](https://github.com/NVIDIA/k8s-device-plugin)来配置 **Kubernetes 下的 Nvidia 插件**
4. 准备 **NFS 服务器** 并导出通用的装载 (mount),推荐将 NFS 服务器路径映射到 `root_squash 选项`,否则可能会在 NNI 复制文件到 NFS 时出现权限问题。 参考[页面](https://linux.die.net/man/5/exports),来了解关于 root_squash 选项,或 **Azure File Storage** 4. 准备 **NFS 服务器** 并导出通用的装载 (mount),推荐将 NFS 服务器路径映射到 `root_squash 选项`,否则可能会在 NNI 复制文件到 NFS 时出现权限问题。 参考[页面](https://linux.die.net/man/5/exports),来了解关于 root_squash 选项,或 **Azure File Storage**
5. 在安装 NNI 并运行 nnictl 的计算机上安装 **NFS 客户端**。 运行此命令安装 NFSv4 客户端: ```apt-get install nfs-common``` 5. 在安装 NNI 并运行 nnictl 的计算机上安装 **NFS 客户端**。 运行此命令安装 NFSv4 客户端:
```bash
apt-get install nfs-common
```
6. 参考[指南](QuickStart.md)安装 **NNI** 6. 参考[指南](QuickStart.md)安装 **NNI**
## Azure 部署的 Kubernetes 的准备工作 ## Azure 部署的 Kubernetes 的准备工作
1. NNI 支持基于 Azure Kubernetes Service 的 Kubeflow,参考[指南](https://azure.microsoft.com/en-us/services/kubernetes-service/)来设置 Azure Kubernetes Service。 1. NNI 支持基于 Azure Kubernetes Service 的 Kubeflow,参考[指南](https://azure.microsoft.com/zh-cn/services/kubernetes-service/)来设置 Azure Kubernetes Service。
2. 安装 [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest)**kubectl**。 使用 `az login` 命令来设置 Azure 账户吗,并将 kubectl 客户端连接到 AKS,参考此[指南](https://docs.microsoft.com/en-us/azure/aks/kubernetes-walkthrough#connect-to-the-cluster) 2. 安装 [Azure CLI](https://docs.microsoft.com/zh-cn/cli/azure/install-azure-cli?view=azure-cli-latest)**kubectl**。 使用 `az login` 命令来设置 Azure 账户吗,并将 kubectl 客户端连接到 AKS,参考此[指南](https://docs.microsoft.com/zh-cn/azure/aks/kubernetes-walkthrough#connect-to-the-cluster)
3. 参考此[指南](https://docs.microsoft.com/en-us/azure/storage/common/storage-quickstart-create-account?tabs=portal)来创建 Azure 文件存储账户。 NNI 需要 Azure Storage Service 来存取代码和输出文件。 3. 参考此[指南](https://docs.microsoft.com/zh-cn/azure/storage/common/storage-quickstart-create-account?tabs=portal)来创建 Azure 文件存储账户。 NNI 需要 Azure Storage Service 来存取代码和输出文件。
4. NNI 需要访问密钥来连接 Azure 存储服务,NNI 使用 [Azure Key Vault](https://azure.microsoft.com/en-us/services/key-vault/) 服务来保护私钥。 设置 Azure Key Vault 服务,并添加密钥到 Key Vault 中来存取 Azure 存储账户。 参考[指南](https://docs.microsoft.com/en-us/azure/key-vault/quick-create-cli)来存储访问密钥。 4. NNI 需要访问密钥来连接 Azure 存储服务,NNI 使用 [Azure Key Vault](https://azure.microsoft.com/zh-cn/services/key-vault/) 服务来保护私钥。 设置 Azure Key Vault 服务,并添加密钥到 Key Vault 中来存取 Azure 存储账户。 参考[指南](https://docs.microsoft.com/zh-cn/azure/key-vault/quick-create-cli)来存储访问密钥。
## 安装 FrameworkController ## 安装 FrameworkController
参考[指南](https://github.com/Microsoft/frameworkcontroller/tree/master/example/run)来在 Kubernetes 集群中配置 Frameworkcontroller。NNI 通过 statefulset 模式来 支持 Frameworkcontroller。 参考[指南](https://github.com/Microsoft/frameworkcontroller/tree/master/example/run)来在 Kubernetes 集群中配置 FrameworkController。NNI 通过 statefulset 模式来 支持 FrameworkController。
## 设计 ## 设计
参考[Kubeflow 训练服务](./KubeflowMode.md),Frameworkcontroller 服务管道非常类似。 参考[Kubeflow 训练服务](./KubeflowMode.md),FrameworkController 服务管道非常类似。
## 样例 ## 样例
Frameworkcontroller 配置文件的格式如下: FrameworkController 配置文件的格式如下:
authorName: default ```yaml
experimentName: example_mnist authorName: default
trialConcurrency: 1 experimentName: example_mnist
maxExecDuration: 10h trialConcurrency: 1
maxTrialNum: 100 maxExecDuration: 10h
#可选项: local, remote, pai, kubeflow, frameworkcontroller maxTrialNum: 100
trainingServicePlatform: frameworkcontroller #可选项: local, remote, pai, kubeflow, frameworkcontroller
searchSpacePath: ~/nni/examples/trials/mnist/search_space.json trainingServicePlatform: frameworkcontroller
#可选项: true, false searchSpacePath: ~/nni/examples/trials/mnist/search_space.json
useAnnotation: false #可选项: true, false
tuner: useAnnotation: false
#可选项: TPE, Random, Anneal, Evolution tuner:
builtinTunerName: TPE #可选项: TPE, Random, Anneal, Evolution
classArgs: builtinTunerName: TPE
#可选项: maximize, minimize classArgs:
optimize_mode: maximize #可选项: maximize, minimize
assessor: optimize_mode: maximize
builtinAssessorName: Medianstop assessor:
classArgs: builtinAssessorName: Medianstop
optimize_mode: maximize classArgs:
gpuNum: 0 optimize_mode: maximize
trial: gpuNum: 0
codeDir: ~/nni/examples/trials/mnist trial:
taskRoles: codeDir: ~/nni/examples/trials/mnist
taskRoles:
- name: worker - name: worker
taskNum: 1 taskNum: 1
command: python3 mnist.py command: python3 mnist.py
gpuNum: 1 gpuNum: 1
cpuNum: 1 cpuNum: 1
memoryMB: 8192 memoryMB: 8192
image: msranni/nni:latest image: msranni/nni:latest
frameworkAttemptCompletionPolicy: frameworkAttemptCompletionPolicy:
minFailedTaskCount: 1 minFailedTaskCount: 1
minSucceededTaskCount: 1 minSucceededTaskCount: 1
frameworkcontrollerConfig: frameworkcontrollerConfig:
storage: nfs storage: nfs
nfs: nfs:
server: {your_nfs_server} server: {your_nfs_server}
path: {your_nfs_server_exported_path} path: {your_nfs_server_exported_path}
```
如果使用了 Azure Kubernetes Service,需要在 YAML 文件中如下设置 `frameworkcontrollerConfig` 如果使用了 Azure Kubernetes Service,需要在 YAML 文件中如下设置 `frameworkcontrollerConfig`
frameworkcontrollerConfig: ```yaml
storage: azureStorage frameworkcontrollerConfig:
keyVault: storage: azureStorage
vaultName: {your_vault_name} keyVault:
name: {your_secert_name} vaultName: {your_vault_name}
azureStorage: name: {your_secert_name}
accountName: {your_storage_account_name} azureStorage:
azureShare: {your_azure_share_name} accountName: {your_storage_account_name}
azureShare: {your_azure_share_name}
```
注意:如果用 FrameworkController 模式运行,需要在 YAML 文件中显式设置 `trainingServicePlatform: frameworkcontroller` 注意:如果用 FrameworkController 模式运行,需要在 YAML 文件中显式设置 `trainingServicePlatform: frameworkcontroller`
FrameworkController 模式的 Trial 配置格式,是 FrameworkController 官方配置的简化版。参考 [frameworkcontroller 的 tensorflow 样例](https://github.com/Microsoft/frameworkcontroller/blob/master/example/framework/scenario/tensorflow/cpu/tensorflowdistributedtrainingwithcpu.yaml) 了解详情。 FrameworkController 模式的 Trial 配置格式,是 FrameworkController 官方配置的简化版。参考 [frameworkcontroller 的 tensorflow 样例](https://github.com/Microsoft/frameworkcontroller/blob/master/example/framework/scenario/tensorflow/cpu/tensorflowdistributedtrainingwithcpu.yaml) 了解详情。
frameworkcontroller 模式中的 Trial 配置使用以下主键: frameworkcontroller 模式中的 Trial 配置使用以下主键:
* taskRoles: 配置文件中可以设置多个任务角色,每个任务角色都是在 Kubernetes 集群中的基本执行单元。 * taskRoles: 配置文件中可以设置多个任务角色,每个任务角色都是在 Kubernetes 集群中的基本执行单元。
* name: 任务角色的名字,例如,"worker", "ps", "master"。 * name: 任务角色的名字,例如,"worker", "ps", "master"。
* taskNum: 任务角色的实例数量。 * taskNum: 任务角色的实例数量。
* command: 在容器中要执行的用户命令。 * command: 在容器中要执行的用户命令。
* gpuNum: 容器要使用的 GPU 数量。 * gpuNum: 容器要使用的 GPU 数量。
* cpuNum: 容器中要使用的 CPU 数量。 * cpuNum: 容器中要使用的 CPU 数量。
* memoryMB: 容器的内存限制。 * memoryMB: 容器的内存限制。
* image: 用来创建 pod,并运行程序的 Docker 映像。 * image: 用来创建 pod,并运行程序的 Docker 映像。
* frameworkAttemptCompletionPolicy: 运行框架的策略,参考[用户手册](https://github.com/Microsoft/frameworkcontroller/blob/master/doc/user-manual.md#frameworkattemptcompletionpolicy)了解更多信息。 这些策略可以用来控制 pod,例如,如果 worker 任务停止了,但 ps 没有停止,CompletionPolicy 策略可以停止 ps。 * frameworkAttemptCompletionPolicy: 运行框架的策略,参考[用户手册](https://github.com/Microsoft/frameworkcontroller/blob/master/doc/user-manual.md#frameworkattemptcompletionpolicy)了解更多信息。 这些策略可以用来控制 pod,例如,如果 worker 任务停止了,但 ps 还在运行,要通过完成策略来停止 ps。
## 如何运行示例 ## 如何运行示例
准备好配置文件后,通过运行 nnictl 来启动 Experiment。 在 Frameworkcontroller 上开始 Experiment 的方法与 Kubeflow 类似,可参考[指南](./KubeflowMode.md)了解更多信息。 准备好配置文件后,通过运行 nnictl 来启动 Experiment。 在 FrameworkController 上开始 Experiment 的方法与 Kubeflow 类似,可参考[指南](./KubeflowMode.md)了解更多信息。
## 版本校验 ## 版本校验
......
# NNI 中的 GP Tuner
## GP Tuner
贝叶斯优化会构建一个能最好的描述优化目标的后验分布函数(使用高斯过程)。 随着观测值的增加,后验分布会得到改善,会在参数空间中确定哪些范围值得进一步探索,哪一些不值得。
GP Tuner 被设计为通过最大化或最小化步数来找到最接近最优结果的参数组合。 GP Tuner 使用了代理优化问题(找到采集函数的最大值)。虽然这仍然是个难题,但成本更低(从计算的角度来看),并且有通用的工具。 因此,贝叶斯优化适合于采样函数的成本非常高时来使用。
优化方法在 [Algorithms for Hyper-Parameter Optimization](https://papers.nips.cc/paper/4443-algorithms-for-hyper-parameter-optimization.pdf) 的第三章有详细描述。
\ No newline at end of file
...@@ -8,8 +8,9 @@ TrainingService 是与平台管理、任务调度相关的模块。 TrainingServ ...@@ -8,8 +8,9 @@ TrainingService 是与平台管理、任务调度相关的模块。 TrainingServ
![](../img/NNIDesign.jpg) ![](../img/NNIDesign.jpg)
NNI 的架构如图所示。 NNIManager 是系统的核心管理模块,负责调用 TrainingService 来管理 Trial,并负责不同模块之间的通信。 Dispatcher 是消息处理中心。 TrainingService 是管理任务的模块,它和 NNIManager 通信,并且根据平台的特点有不同的实现。 当前,NNI 支持本地平台、[远程平台](RemoteMachineMode.md)[OpenPAI 平台](PaiMode.md)[Kubeflow 平台](KubeflowMode.md)[FrameworkController 平台](FrameworkController.md) NNI 的架构如图所示。 NNIManager 是系统的核心管理模块,负责调用 TrainingService 来管理 Trial,并负责不同模块之间的通信。 Dispatcher 是消息处理中心。 TrainingService 是管理任务的模块,它和 NNIManager 通信,并且根据平台的特点有不同的实现。 当前,NNI 支持本机,[远程平台](RemoteMachineMode.md)[OpenPAI 平台](PaiMode.md)[Kubeflow 平台](KubeflowMode.md) 以及 [FrameworkController 平台](FrameworkController.md)
在这个文档中,会简要介绍 TrainingService 的设计。 如果要添加新的 TrainingService,只需要继承 TrainingServcie 类并实现相应的方法,不需要理解NNIManager、Dispatcher 等其它模块的细节。
本文中,会介绍 TrainingService 的简要设计。 如果要添加新的 TrainingService,只需要继承 TrainingServcie 类并实现相应的方法,不需要理解NNIManager、Dispatcher 等其它模块的细节。
## 代码文件夹结构 ## 代码文件夹结构
...@@ -66,8 +67,9 @@ NNI 的文件夹结构如下: ...@@ -66,8 +67,9 @@ NNI 的文件夹结构如下:
TrainingService 父类有一些抽象方法,用户需要继承并实现这些抽象方法。 TrainingService 父类有一些抽象方法,用户需要继承并实现这些抽象方法。
**setClusterMetadata(key: string, value: string)** **setClusterMetadata(key: string, value: string)**
ClusterMetadata 是与平台数据有关的方法,例如,在远程平台上的 ClusterMetadata 定义是:
ClusterMetadata 是与平台细节相关的数据,例如,ClusterMetadata 在远程服务器的定义是:
export class RemoteMachineMeta { export class RemoteMachineMeta {
public readonly ip : string; public readonly ip : string;
...@@ -80,7 +82,7 @@ ClusterMetadata 是与平台数据有关的方法,例如,在远程平台上 ...@@ -80,7 +82,7 @@ ClusterMetadata 是与平台数据有关的方法,例如,在远程平台上
/* GPU Reservation info, the key is GPU index, the value is the job id which reserves this GPU*/ /* GPU Reservation info, the key is GPU index, the value is the job id which reserves this GPU*/
public gpuReservation : Map<number, string>; public gpuReservation : Map<number, string>;
constructor(ip : string, port : number, username : string, passwd : string, constructor(ip : string, port : number, username : string, passwd : string,
sshKeyPath : string, passphrase : string) { sshKeyPath : string, passphrase : string) {
this.ip = ip; this.ip = ip;
this.port = port; this.port = port;
...@@ -95,11 +97,13 @@ ClusterMetadata 是与平台数据有关的方法,例如,在远程平台上 ...@@ -95,11 +97,13 @@ ClusterMetadata 是与平台数据有关的方法,例如,在远程平台上
Metadata 中包括了主机地址,用户名和其它平台相关配置。 用户需要定义自己的 Metadata 格式,并在这个方法中相应实现。 这个方法在 Experiment 启动之前调用。 Metadata 中包括了主机地址,用户名和其它平台相关配置。 用户需要定义自己的 Metadata 格式,并在这个方法中相应实现。 这个方法在 Experiment 启动之前调用。
**getClusterMetadata(key: string)** **getClusterMetadata(key: string)**
这个方法返回 metadata 的内容,如果不需要使用这个方法,可将方法内容留空。
此函数将返回相应值的元数据值,如果不需要使用,可留空。
**submitTrialJob(form: JobApplicationForm)**
**submitTrialJob(form: JobApplicationForm)** SubmitTrialJob 是用来提交新 Trial 任务的函数,需要生成一个 TrialJobDetail 类型的任务实例。 TrialJobDetail 定义如下:
SubmitTrialJob 是用来提交 Trial 任务的方法,用户需要在这个方法中生成 TrialJobDetail 类型的实例。 TrialJobDetail 定义如下:
interface TrialJobDetail { interface TrialJobDetail {
readonly id: string; readonly id: string;
...@@ -118,37 +122,50 @@ SubmitTrialJob 是用来提交 Trial 任务的方法,用户需要在这个方 ...@@ -118,37 +122,50 @@ SubmitTrialJob 是用来提交 Trial 任务的方法,用户需要在这个方
根据不同的实现,用户可能需要把 Trial 任务放入队列中,并不断地从队里中取出任务进行提交。 或者也可以直接在这个方法中完成作业提交过程。 根据不同的实现,用户可能需要把 Trial 任务放入队列中,并不断地从队里中取出任务进行提交。 或者也可以直接在这个方法中完成作业提交过程。
**cancelTrialJob(trialJobId: string, isEarlyStopped?: boolean)** **cancelTrialJob(trialJobId: string, isEarlyStopped?: boolean)**
如果这个方法被调用, Trial 应该被取消执行。 不同的平台有不同的取消作业的方式,这个方法应该根据不同平台的特点,实现相应的细节。
如果此函数被调用,应取消平台启动的 Trial。 不同的平台有不同的取消作业的方式,这个方法应该根据不同平台的特点,实现相应的细节。
**updateTrialJob(trialJobId: string, form: JobApplicationForm)**
调用此函数可更新 Trial 的任务状态,Trial 任务状态根据不同的平台来检测,并需要更新为 `RUNNING`, `SUCCEED`, `FAILED` 等状态。
**getTrialJob(trialJobId: string)**
**updateTrialJob(trialJobId: string, form: JobApplicationForm)** 此函数根据 trialJobId 返回 trialJob 的实例。
这个方法用来更新 Trial 的状态,不同平台有不同的检测作业状态的方法,并把状态更新为`RUNNING`, `SUCCEED`, `FAILED` 等。
**getTrialJob(trialJobId: string)** **listTrialJobs()**
这个方法用来根据 Trial Id 来返回相应的 Trial 实例。
**listTrialJobs()** 用户需要将所有 Trial 任务详情存入列表并返回。
用户需要在这个方法中把所有的 Trial 实例放入一个列表中,并返回。
**addTrialJobMetricListener(listener: (metric: TrialJobMetric) => void)** **addTrialJobMetricListener(listener: (metric: TrialJobMetric) => void)**
NNI 会启动一个 EventEmitter 来处理作业的指标数据,如果有检测到有新的数据,EventEmitter就会被触发,来执行相应的事件。 用户需要在这个方法中开始 EventEmitter。
**removeTrialJobMetricListener(listener: (metric: TrialJobMetric) => void)** NNI 会启动一个 EventEmitter 来处理任务的指标数据,如果有检测到有新的数据,EventEmitter就会被触发,来执行相应的事件。 用户需要在这个方法中开始 EventEmitter。
移除 EventEmitter。
**removeTrialJobMetricListener(listener: (metric: TrialJobMetric) => void)**
关闭 EventEmitter。
**run()**
**run()**
Run() 函数是 TrainingService 的主循环,用户可以在这个函数中循环执行他们的代码逻辑,这个函数在实验结束前会一直循环执行。 Run() 函数是 TrainingService 的主循环,用户可以在这个函数中循环执行他们的代码逻辑,这个函数在实验结束前会一直循环执行。
**cleanUp()** **cleanUp()**
当实验结束后,这个方法用来清除实验环境。 用户需要在这个方法中实现与平台相关的清除操作。
当实验结束后,此方法用来清除实验环境。 用户需要在这个方法中实现与平台相关的清除操作。
## TrialKeeper 工具 ## TrialKeeper 工具
NNI 提供了 TrialKeeper 工具,用来帮助维护 Trial 任务。 可以在 `nni/tools/nni_trial_tool` 文件夹中找到 TrialKeeper 的源代码。 如果想要运行在云平台上,这是维护任务的好工具。 TrialKeeper 的架构如下: NNI 提供了 TrialKeeper 工具,用来帮助维护 Trial 任务。 可以在 `nni/tools/nni_trial_tool` 文件夹中找到 TrialKeeper 的源代码。 如果想要运行在云平台上,这是维护任务的好工具。
![](../img/trialkeeper.jpg)
当用户需要在远程云平台上运行作业,要把作业启动的命令行传入 TrailKeeper 中,并在远程云平台上启动 TriakKeeper 进程。 注意,TrialKeeper 在远程平台中使用 RESTful 服务来和 TrainingService 进行通信,用户需要在本地机器启动一个 RESTful 服务来接受 TrialKeeper 的请求。 关于 RESTful 服务的源代码可以在 `nni/src/nni_manager/training_service/common/clusterJobRestServer.ts` 文件夹中找到. TrialKeeper 的架构如下:
![](../img/trialkeeper.jpg)
当用户需要在远程云平台上运行作业,要把作业启动的命令行传入 TrailKeeper 中,并在远程云平台上启动 TrailKeeper 进程。 注意,TrialKeeper 在远程平台中使用 RESTful 服务来和 TrainingService 进行通信,用户需要在本地机器启动一个 RESTful 服务来接受 TrialKeeper 的请求。 关于 RESTful 服务的源代码可以在 `nni/src/nni_manager/training_service/common/clusterJobRestServer.ts` 文件夹中找到.
## 参考 ## 参考
更多关于如何调试的信息,请[参考这里](HowToDebug.md) 有关调试的进一步信息,可参考[这里](HowToDebug.md)
关于如何贡献代码,请[参考这里](Contributing.md)
\ No newline at end of file 如何参与贡献的指南,请参考[这里](Contributing.md)
\ No newline at end of file
...@@ -28,12 +28,6 @@ ...@@ -28,12 +28,6 @@
## **在 Windows 上安装** ## **在 Windows 上安装**
在第一次使用 PowerShell 运行脚本时,需要用**使用管理员权限**运行如下命令:
```powershell
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
```
推荐使用 Anaconda 或 Miniconda。 推荐使用 Anaconda 或 Miniconda。
* **通过 pip 命令安装 NNI** * **通过 pip 命令安装 NNI**
...@@ -48,12 +42,10 @@ Set-ExecutionPolicy -ExecutionPolicy Unrestricted ...@@ -48,12 +42,10 @@ Set-ExecutionPolicy -ExecutionPolicy Unrestricted
先决条件:`python >=3.5`, `git`, `PowerShell` 先决条件:`python >=3.5`, `git`, `PowerShell`
然后可以使用管理员或当前用户安装 NNI:
```bash ```bash
git clone -b v0.8 https://github.com/Microsoft/nni.git git clone -b v0.8 https://github.com/Microsoft/nni.git
cd nni cd nni
powershell .\install.ps1 powershell -ExecutionPolicy Bypass -file install.ps1
``` ```
## **系统需求** ## **系统需求**
......
# **在 Kubeflow 上运行 Experiment** # 在 Kubeflow 上运行 Experiment
NNI 支持在 [Kubeflow](https://github.com/kubeflow/kubeflow)上运行,称为 kubeflow 模式。 在开始使用 NNI 的 kubeflow 模式前,需要有一个 kubernetes 集群,可以是私有部署的,或者是 [Azure Kubernetes Service(AKS)](https://azure.microsoft.com/en-us/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 作业来运行。 ===
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 作业来运行。
## 私有部署的 Kubernetes 的准备工作 ## 私有部署的 Kubernetes 的准备工作
1. 采用 Kubernetes 1.8 或更高版本。 根据[指南](https://kubernetes.io/docs/setup/)来安装 Kubernetes。 1. 采用 Kubernetes 1.8 或更高版本。 根据[指南](https://kubernetes.io/docs/setup/)来安装 Kubernetes。
2. 在 Kubernetes 集群中下载、安装、部署 **Kubelow**。 根据[指南](https://www.kubeflow.org/docs/started/getting-started/)安装 Kubeflow。 2. 在 Kubernetes 集群中下载、安装、部署 **Kubeflow**。 根据[指南](https://www.kubeflow.org/docs/started/getting-started/)安装 Kubeflow。
3. 配置 **kubeconfig** 文件,NNI 将使用此配置与 Kubernetes API 服务交互。 默认情况下,NNI 管理器会使用 $(HOME)/.kube/config 作为 kubeconfig 文件的路径。 也可以通过环境变量 **KUBECONFIG** 来指定其它 kubeconfig 文件。 根据[指南](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig)了解更多 kubeconfig 的信息。 3. 配置 **kubeconfig** 文件,NNI 将使用此配置与 Kubernetes API 服务交互。 默认情况下,NNI 管理器会使用 $(HOME)/.kube/config 作为 kubeconfig 文件的路径。 也可以通过环境变量 **KUBECONFIG** 来指定其它 kubeconfig 文件。 根据[指南](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig)了解更多 kubeconfig 的信息。
4. 如果 NNI Trial 作业需要 GPU 资源,需按照[指南](https://github.com/NVIDIA/k8s-device-plugin)来配置 **Kubernetes 下的 Nvidia 插件** 4. 如果 NNI Trial 作业需要 GPU 资源,需按照[指南](https://github.com/NVIDIA/k8s-device-plugin)来配置 **Kubernetes 下的 Nvidia 插件**
5. 准备 **NFS 服务器** 并导出通用的装载 (mount),推荐将 NFS 服务器路径映射到 `root_squash 选项`,否则可能会在 NNI 复制文件到 NFS 时出现权限问题。 参考[页面](https://linux.die.net/man/5/exports),来了解关于 root_squash 选项,或 **Azure File Storage** 5. 准备 **NFS 服务器** 并导出通用的装载 (mount),推荐将 NFS 服务器路径映射到 `root_squash 选项`,否则可能会在 NNI 复制文件到 NFS 时出现权限问题。 参考[页面](https://linux.die.net/man/5/exports),来了解关于 root_squash 选项,或 **Azure File Storage**
6. 在安装 NNI 并运行 nnictl 的计算机上安装 **NFS 客户端**。 运行此命令安装 NFSv4 客户端: 6. 在安装 NNI 并运行 nnictl 的计算机上安装 **NFS 客户端**。 运行此命令安装 NFSv4 客户端: ```apt-get install nfs-common```
apt-get install nfs-common
7. 参考[指南](QuickStart.md)安装 **NNI** 7. 参考[指南](QuickStart.md)安装 **NNI**
## Azure 部署的 Kubernetes 的准备工作 ## Azure 部署的 Kubernetes 的准备工作
1. NNI 支持基于 Azure Kubernetes Service 的 Kubeflow,参考[指南](https://azure.microsoft.com/en-us/services/kubernetes-service/)来设置 Azure Kubernetes Service。 1. NNI 支持基于 Azure Kubernetes Service 的 Kubeflow,参考[指南](https://azure.microsoft.com/zh-cn/services/kubernetes-service/)来设置 Azure Kubernetes Service。
2. 安装 [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest)**kubectl**。 使用 `az login` 命令来设置 Azure 账户吗,并将 kubectl 客户端连接到 AKS,参考此[指南](https://docs.microsoft.com/en-us/azure/aks/kubernetes-walkthrough#connect-to-the-cluster) 2. 安装 [Azure CLI](https://docs.microsoft.com/zh-cn/cli/azure/install-azure-cli?view=azure-cli-latest)**kubectl**。 使用 `az login` 命令来设置 Azure 账户吗,并将 kubectl 客户端连接到 AKS,参考此[指南](https://docs.microsoft.com/zh-cn/azure/aks/kubernetes-walkthrough#connect-to-the-cluster)
3. 在 Azure Kubernetes Service 上部署 Kubeflow,参考此[指南](https://www.kubeflow.org/docs/started/getting-started/) 3. 在 Azure Kubernetes Service 上部署 Kubeflow,参考此[指南](https://www.kubeflow.org/docs/started/getting-started/)
4. 参考此[指南](https://docs.microsoft.com/en-us/azure/storage/common/storage-quickstart-create-account?tabs=portal)来创建 Azure 文件存储账户。 NNI 需要 Azure Storage Service 来存取代码和输出文件。 4. 参考此[指南](https://docs.microsoft.com/zh-cn/azure/storage/common/storage-quickstart-create-account?tabs=portal)来创建 Azure 文件存储账户。 NNI 需要 Azure Storage Service 来存取代码和输出文件。
5. NNI 需要访问密钥来连接 Azure 存储服务,NNI 使用 [Azure Key Vault](https://azure.microsoft.com/en-us/services/key-vault/) 服务来保护私钥。 设置 Azure Key Vault 服务,并添加密钥到 Key Vault 中来存取 Azure 存储账户。 参考[指南](https://docs.microsoft.com/en-us/azure/key-vault/quick-create-cli)来存储访问密钥。 5. NNI 需要访问密钥来连接 Azure 存储服务,NNI 使用 [Azure Key Vault](https://azure.microsoft.com/zh-cn/services/key-vault/) 服务来保护私钥。 设置 Azure Key Vault 服务,并添加密钥到 Key Vault 中来存取 Azure 存储账户。 参考[指南](https://docs.microsoft.com/zh-cn/azure/key-vault/quick-create-cli)来存储访问密钥。
## 设计 ## 设计
![](../img/kubeflow_training_design.png) Kubeflow 训练服务会实例化一个 kubernetes 客户端来与 Kubernetes 集群的 API 服务器交互。 ![](../img/kubeflow_training_design.png) Kubeflow 训练服务会实例化一个 Kubernetes 客户端来与 Kubernetes 集群的 API 服务器交互。
对于每个 Trial,会上传本机 codeDir 路径(在 nni_config.yml 中配置)中的所有文件,包括 parameter.cfg 这样的生成的文件到存储卷中。 当前支持两种存储卷:[nfs](https://en.wikipedia.org/wiki/Network_File_System)[Azure 文件存储](https://azure.microsoft.com/en-us/services/storage/files/),需要在 NNI 的 YAML 文件中进行配置。 当文件准备好后,Kubeflow 训练服务会调用 Kubernetes 的 API 来创建 Kubeflow 作业 ([tf-operator](https://github.com/kubeflow/tf-operator) 作业或 [pytorch-operator](https://github.com/kubeflow/pytorch-operator) 作业) ,并将存储卷挂载到作业的 pod 中。 Kubeflow 作业的输出文件,例如 stdout, stderr, trial.log 以及模型文件,也会被复制回存储卷。 NNI 会在网页中显示每个 Trial 的存储卷的 URL,以便浏览日志和输出文件。 对于每个 Trial,会上传本机 codeDir 路径(在 nni_config.yml 中配置)中的所有文件,包括 parameter.cfg 这样的生成的文件到存储卷中。 当前支持两种存储卷:[nfs](https://en.wikipedia.org/wiki/Network_File_System)[Azure 文件存储](https://azure.microsoft.com/zh-cn/services/storage/files/),需要在 NNI 的 YAML 文件中进行配置。 当文件准备好后,Kubeflow 训练服务会调用 Kubernetes 的 API 来创建 Kubeflow 作业 ([tf-operator](https://github.com/kubeflow/tf-operator) 作业或 [pytorch-operator](https://github.com/kubeflow/pytorch-operator) 作业) ,并将存储卷挂载到作业的 pod 中。 Kubeflow 作业的输出文件,例如 stdout, stderr, trial.log 以及模型文件,也会被复制回存储卷。 NNI 会在网页中显示每个 Trial 的存储卷的 URL,以便浏览日志和输出文件。
## 支持的操作符(operator) ## 支持的操作符(operator)
NNI 仅支持 kubeflow 的 tf-operator 和 pytorch-operator,其它操作符未经测试。 可以在配置文件中设置操作符类型。 这是 tf-operator 的设置: NNI 仅支持 Kubeflow 的 tf-operator 和 pytorch-operator,其它操作符未经测试。 可以在配置文件中设置操作符类型。 这是 tf-operator 的设置:
kubeflowConfig: ```yaml
operator: tf-operator kubeflowConfig:
operator: tf-operator
```
这是 pytorch-operator 的设置: 这是 pytorch-operator 的设置:
kubeflowConfig: ```yaml
operator: pytorch-operator kubeflowConfig:
operator: pytorch-operator
```
如果要使用 tf-operator,需要在 Trial 配置中设置 `ps``worker`。如果要使用 pytorch-operator,需要在 Trial 配置中设置 `master``worker` 如果要使用 tf-operator,需要在 Trial 配置中设置 `ps``worker`。如果要使用 pytorch-operator,需要在 Trial 配置中设置 `master``worker`
## 支持的存储类型 ## 支持的存储类型
NNI 支持使用 NFS 和 Azure 存储来存储代码和输出文件,可在配置文件进行相应的配置。 NNI 支持使用 NFS 和 Azure 存储来存储代码和输出文件,可在配置文件进行相应的配置。
NFS 存储配置如下: NFS 存储配置如下:
kubeflowConfig: ```yaml
storage: nfs kubeflowConfig:
nfs: storage: nfs
# NFS 服务器 IP, 如 10.10.10.10 nfs:
server: {your_nfs_server_ip} # NFS 服务器 IP, 如 10.10.10.10
# NFS 服务器的导出路径,如 /var/nfs/nni server: {your_nfs_server_ip}
path: {your_nfs_server_export_path} # NFS 服务器的导出路径,如 /var/nfs/nni
path: {your_nfs_server_export_path}
```
如果使用了 Azure 存储,需要在 YAML 文件中如下设置 `kubeflowConfig` 如果使用了 Azure 存储,需要在 YAML 文件中如下设置 `kubeflowConfig`
kubeflowConfig: ```yaml
storage: azureStorage kubeflowConfig:
keyVault: storage: azureStorage
vaultName: {your_vault_name} keyVault:
name: {your_secert_name} vaultName: {your_vault_name}
azureStorage: name: {your_secert_name}
accountName: {your_storage_account_name} azureStorage:
azureShare: {your_azure_share_name} accountName: {your_storage_account_name}
azureShare: {your_azure_share_name}
```
## 运行 Experiment ## 运行 Experiment
`examples/trials/mnist` 为例。 这是一个 TensorFlow 作业,使用了 Kubeflow 的 tf-operator。 NNI 的 YAML 配置文件如下: `examples/trials/mnist` 为例。 这是一个 TensorFlow 作业,使用了 Kubeflow 的 tf-operator。 NNI 的 YAML 配置文件如下:
authorName: default ```yaml
experimentName: example_mnist authorName: default
trialConcurrency: 2 experimentName: example_mnist
maxExecDuration: 1h trialConcurrency: 2
maxTrialNum: 20 maxExecDuration: 1h
#可选项: local, remote, pai, kubeflow maxTrialNum: 20
trainingServicePlatform: kubeflow #可选项: local, remote, pai, kubeflow
searchSpacePath: search_space.json trainingServicePlatform: kubeflow
#可选项: true, false searchSpacePath: search_space.json
useAnnotation: false #可选项: true, false
tuner: useAnnotation: false
#可选项: TPE, Random, Anneal, Evolution tuner:
builtinTunerName: TPE #可选项: TPE, Random, Anneal, Evolution
classArgs: builtinTunerName: TPE
#可选项: maximize, minimize classArgs:
optimize_mode: maximize #可选项: maximize, minimize
assessor: optimize_mode: maximize
builtinAssessorName: Medianstop assessor:
classArgs: builtinAssessorName: Medianstop
optimize_mode: maximize classArgs:
gpuNum: 0 optimize_mode: maximize
trial: gpuNum: 0
codeDir: . trial:
worker: codeDir: .
replicas: 2 worker:
command: python3 dist_mnist.py replicas: 2
gpuNum: 1 command: python3 dist_mnist.py
cpuNum: 1 gpuNum: 1
memoryMB: 8196 cpuNum: 1
image: msranni/nni:latest memoryMB: 8196
ps: image: msranni/nni:latest
replicas: 1 ps:
command: python3 dist_mnist.py replicas: 1
gpuNum: 0 command: python3 dist_mnist.py
cpuNum: 1 gpuNum: 0
memoryMB: 8196 cpuNum: 1
image: msranni/nni:latest memoryMB: 8196
kubeflowConfig: image: msranni/nni:latest
operator: tf-operator kubeflowConfig:
apiVersion: v1alpha2 operator: tf-operator
storage: nfs apiVersion: v1alpha2
nfs: storage: nfs
# NFS 服务器 IP,如 10.10.10.10 nfs:
server: {your_nfs_server_ip} # NFS 服务器 IP,如 10.10.10.10
# NFS 服务器的导出路径,如 /var/nfs/nni server: {your_nfs_server_ip}
path: {your_nfs_server_export_path} # NFS 服务器的导出路径,如 /var/nfs/nni
path: {your_nfs_server_export_path}
```
注意:如果用 Kubeflow 模式运行,需要在 YAML 文件中显式设置 `trainingServicePlatform: kubeflow` 注意:如果用 Kubeflow 模式运行,需要在 YAML 文件中显式设置 `trainingServicePlatform: kubeflow`
如果要运行 Pytorch 作业,需要如下配置: 如果要运行 Pytorch 作业,需要如下配置:
authorName: default ```yaml
experimentName: example_mnist_distributed_pytorch authorName: default
trialConcurrency: 1 experimentName: example_mnist_distributed_pytorch
maxExecDuration: 1h trialConcurrency: 1
maxTrialNum: 10 maxExecDuration: 1h
#可选项: local, remote, pai, kubeflow maxTrialNum: 10
trainingServicePlatform: kubeflow #可选项: local, remote, pai, kubeflow
searchSpacePath: search_space.json trainingServicePlatform: kubeflow
#可选项: true, false searchSpacePath: search_space.json
useAnnotation: false #可选项: true, false
tuner: useAnnotation: false
#可选项: TPE, Random, Anneal, Evolution tuner:
builtinTunerName: TPE #可选项: TPE, Random, Anneal, Evolution
classArgs: builtinTunerName: TPE
#可选项: maximize, minimize classArgs:
optimize_mode: minimize #可选项: maximize, minimize
trial: optimize_mode: minimize
codeDir: . trial:
master: codeDir: .
replicas: 1 master:
command: python3 dist_mnist.py replicas: 1
gpuNum: 1 command: python3 dist_mnist.py
cpuNum: 1 gpuNum: 1
memoryMB: 2048 cpuNum: 1
image: msranni/nni:latest memoryMB: 2048
worker: image: msranni/nni:latest
replicas: 1 worker:
command: python3 dist_mnist.py replicas: 1
gpuNum: 0 command: python3 dist_mnist.py
cpuNum: 1 gpuNum: 0
memoryMB: 2048 cpuNum: 1
image: msranni/nni:latest memoryMB: 2048
kubeflowConfig: image: msranni/nni:latest
operator: pytorch-operator kubeflowConfig:
apiVersion: v1alpha2 operator: pytorch-operator
nfs: apiVersion: v1alpha2
# NFS 服务器 IP,如 10.10.10.10 nfs:
server: {your_nfs_server_ip} # NFS 服务器 IP,如 10.10.10.10
# NFS 服务器导出路径,如 /var/nfs/nni server: {your_nfs_server_ip}
path: {your_nfs_server_export_path} # NFS 服务器导出路径,如 /var/nfs/nni
path: {your_nfs_server_export_path}
```
Kubeflow 模式的配置有下列主键: Kubeflow 模式的配置有下列主键:
* codeDir * codeDir
* 代码目录,存放训练代码和配置文件 * 代码目录,存放训练代码和配置文件
* worker (必填)。 此部分用于配置 TensorFlow 的 worker 角色 * worker (必填)。 此部分用于配置 TensorFlow 的 worker 角色
* replicas * replicas
* 必填。 需要运行的 TensorFlow woker 角色的数量,必须为正数。 * 必填。 需要运行的 TensorFlow woker 角色的数量,必须为正数。
* command * command
* 必填。 用来运行 Trial 作业的命令,例如: ```python mnist.py``` * 必填。 用来运行 Trial 作业的命令,例如: ```python mnist.py```
* memoryMB * memoryMB
* 必填。 Trial 程序的内存需求,必须为正数。 * 必填。 Trial 程序的内存需求,必须为正数。
* cpuNum * cpuNum
* gpuNum * gpuNum
* image * image
* 必填。 在 kubeflow 模式中,Kubernetes 会安排 Trial 程序在 [Pod](https://kubernetes.io/docs/concepts/workloads/pods/pod/) 中执行。 此键用来指定 Trial 程序的 pod 使用的 Docker 映像。 * 必填。 在 kubeflow 模式中,Kubernetes 会安排 Trial 程序在 [Pod](https://kubernetes.io/docs/concepts/workloads/pods/pod/) 中执行。 此键用来指定 Trial 程序的 pod 使用的 Docker 映像。
* [Docker Hub](https://hub.docker.com/) 上有预制的 NNI Docker 映像 [msranni/nni](https://hub.docker.com/r/msranni/nni/)。 它包含了用来启动 NNI Experiment 所依赖的所有 Python 包,Node 模块和 JavaScript。 生成此 Docker 映像的文件在[这里](https://github.com/Microsoft/nni/tree/master/deployment/docker/Dockerfile)。 可以直接使用此映像,或参考它来生成自己的映像。 * [Docker Hub](https://hub.docker.com/) 上有预制的 NNI Docker 映像 [msranni/nni](https://hub.docker.com/r/msranni/nni/)。 它包含了用来启动 NNI Experiment 所依赖的所有 Python 包,Node 模块和 JavaScript。 生成此 Docker 映像的文件在[这里](https://github.com/Microsoft/nni/tree/master/deployment/docker/Dockerfile)。 可以直接使用此映像,或参考它来生成自己的映像。
* apiVersion * apiVersion
* 必填。 Kubeflow 的 API 版本。 * 必填。 Kubeflow 的 API 版本。
* ps (可选)。 此部分用于配置 TensorFlow 的 parameter 服务器角色。 * ps (可选)。 此部分用于配置 TensorFlow 的 parameter 服务器角色。
* master (可选)。 此部分用于配置 PyTorch 的 parameter 服务器角色。 * master (可选)。 此部分用于配置 PyTorch 的 parameter 服务器角色。
完成并保存 NNI Experiment 配置文件后(例如可保存为:exp_kubeflow.yml),运行以下命令: 完成并保存 NNI Experiment 配置文件后(例如可保存为:exp_kubeflow.yml),运行以下命令:
nnictl create --config exp_kubeflow.yml ```bash
nnictl create --config exp_kubeflow.yml
```
来在 Kubeflow 模式下启动 Experiment。 NNI 会为每个 Trial 创建 Kubeflow tfjob 或 pytorchjob,作业名称的格式为 `nni_exp_{experiment_id}_trial_{trial_id}`。 可以在 Kubernetes 面板中看到创建的 Kubeflow tfjob。 来在 Kubeflow 模式下启动 Experiment。 NNI 会为每个 Trial 创建 Kubeflow tfjob 或 pytorchjob,作业名称的格式为 `nni_exp_{experiment_id}_trial_{trial_id}`。 可以在 Kubernetes 面板中看到创建的 Kubeflow tfjob。
......
...@@ -18,22 +18,22 @@ ...@@ -18,22 +18,22 @@
RECEIVED_PARAMS = nni.get_next_parameter() RECEIVED_PARAMS = nni.get_next_parameter()
来获得 Tuner 分配的超参值。 `RECEIVED_PARAMS` 是一个对象,例如: 来获得 Tuner 分配的超参值。 `RECEIVED_PARAMS` 是一个对象,例如:
{"conv_size": 2, "hidden_size": 124, "learning_rate": 0.0307, "dropout_rate": 0.2029} {"conv_size": 2, "hidden_size": 124, "learning_rate": 0.0307, "dropout_rate": 0.2029}
1.3 返回结果 1.3 返回结果
使用 API: 使用 API:
`nni.report_intermediate_result(accuracy)` `nni.report_intermediate_result(accuracy)`
返回 `accuracy` 的值给 Assessor。 返回 `accuracy` 的值给 Assessor。
使用 API: 使用 API:
`nni.report_final_result(accuracy)` `nni.report_final_result(accuracy)`
返回 `accuracy` 的值给 Tuner。 返回 `accuracy` 的值给 Tuner。
将改动保存到 `mnist.py` 文件中。 将改动保存到 `mnist.py` 文件中。
...@@ -111,10 +111,10 @@ ...@@ -111,10 +111,10 @@
# 可为空,即数量不限 # 可为空,即数量不限
maxTrialNum: 100 maxTrialNum: 100
# 可选值为: local, remote # 可选值为: local, remote
trainingServicePlatform: local trainingServicePlatform: local
# 可选值为: true, false # 可选值为: true, false
useAnnotation: true useAnnotation: true
tuner: tuner:
builtinTunerName: TPE builtinTunerName: TPE
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
## Metis Tuner ## Metis Tuner
大多数调参工具仅仅预测最优配置,而 [Metis](https://www.microsoft.com/en-us/research/publication/metis-robustly-tuning-tail-latencies-cloud-systems/) 的优势在于有两个输出:(a) 最优配置的当前预测结果, 以及 (b) 下一次 Trial 的建议。 不再需要随机猜测! 大多数调参工具仅仅预测最优配置,而 [Metis](https://www.microsoft.com/zh-cn/research/publication/metis-robustly-tuning-tail-latencies-cloud-systems/) 的优势在于有两个输出:(a) 最优配置的当前预测结果, 以及 (b) 下一次 Trial 的建议。 不再需要随机猜测!
大多数工具假设训练集没有噪声数据,但 Metis 会知道是否需要对某个超参重新采样。 大多数工具假设训练集没有噪声数据,但 Metis 会知道是否需要对某个超参重新采样。
......
...@@ -39,7 +39,16 @@ Trial 代码中使用多阶段非常容易,样例如下: ...@@ -39,7 +39,16 @@ Trial 代码中使用多阶段非常容易,样例如下:
### 编写使用多阶段的 Tuner: ### 编写使用多阶段的 Tuner:
强烈建议首先阅读[自定义 Tuner](https://nni.readthedocs.io/en/latest/Customize_Tuner.html),再开始编写多阶段 Tuner。 与普通 Tuner 不同的是,必须继承于 `MultiPhaseTuner`(在 nni.multi_phase_tuner 中)。 `Tuner``MultiPhaseTuner` 之间最大的不同是,MultiPhaseTuner 多了一些信息,即 `trial_job_id`。 有了这个信息, Tuner 能够知道哪个 Trial 在请求配置信息, 返回的结果是哪个 Trial 的。 通过此信息,Tuner 能够灵活的为不同的 Trial 及其阶段实现功能。 例如,可在 generate_parameters 方法中使用 trial_job_id 来为特定的 Trial 任务生成超参。 强烈建议首先阅读[自定义 Tuner](https://nni.readthedocs.io/en/latest/Customize_Tuner.html),再开始编写多阶段 Tuner。 与普通 Tuner 一样,需要从 `Tuner` 类继承。 当通过配置启用多阶段时(将 `multiPhase` 设为 true),Tuner 会通过下列方法得到一个新的参数 `trial_job_id`
generate_parameters
generate_multiple_parameters
receive_trial_result
receive_customized_trial_result
trial_end
有了这个信息, Tuner 能够知道哪个 Trial 在请求配置信息, 返回的结果是哪个 Trial 的。 通过此信息,Tuner 能够灵活的为不同的 Trial 及其阶段实现功能。 例如,可在 generate_parameters 方法中使用 trial_job_id 来为特定的 Trial 任务生成超参。
当然,要使用自定义的多阶段 Tuner ,也需要**在 Experiment 的 YAML 配置文件中增加`multiPhase: true`** 当然,要使用自定义的多阶段 Tuner ,也需要**在 Experiment 的 YAML 配置文件中增加`multiPhase: true`**
......
...@@ -56,7 +56,7 @@ nni.report_final_result(best_acc) ...@@ -56,7 +56,7 @@ nni.report_final_result(best_acc)
```python ```python
# 1. 使用 NNI API # 1. 使用 NNI API
## 从 Web 界面获取最佳模型的 ID ## 从 Web 界面获取最佳模型的 ID
## 或查看 `nni/experiments/experiment_id/log/model_path/best_model.txt' 文件 ## 或查看 `nni/experiments/experiment_id/log/model_path/best_model.txt' 文件
## 从 JSON 文件中读取,并使用 NNI API 来加载 ## 从 JSON 文件中读取,并使用 NNI API 来加载
...@@ -64,7 +64,7 @@ with open("best-model.json") as json_file: ...@@ -64,7 +64,7 @@ with open("best-model.json") as json_file:
json_of_model = json_file.read() json_of_model = json_file.read()
model = build_graph_from_json(json_of_model) model = build_graph_from_json(json_of_model)
# 2. 使用框架的 API (与具体框架相关) # 2. 使用框架的 API (与具体框架相关)
## 2.1 Keras API ## 2.1 Keras API
## 在 Trial 代码中使用 Keras API 保存 ## 在 Trial 代码中使用 Keras API 保存
...@@ -107,7 +107,7 @@ Tuner 有大量的文件、函数和类。 这里只简单介绍最重要的文 ...@@ -107,7 +107,7 @@ Tuner 有大量的文件、函数和类。 这里只简单介绍最重要的文
- `bayesian.py` 是用来基于已经搜索道德模型来预测未知模型指标的贝叶斯算法。 - `bayesian.py` 是用来基于已经搜索道德模型来预测未知模型指标的贝叶斯算法。
- `graph.py` 是元图数据结构。 类 Graph 表示了模型的神经网络图。 - `graph.py` 是元图数据结构。 类 Graph 表示了模型的神经网络图。
- Graph 从模型中抽取神经网络。 - Graph 从模型中抽取神经网络。
- 图中的每个节点都是层之间的中间张量。 - 图中的每个节点都是层之间的中间张量。
- 在图中,边表示层。 - 在图中,边表示层。
- 注意,多条边可能会表示同一层。 - 注意,多条边可能会表示同一层。
......
...@@ -22,16 +22,6 @@ nnictl create --config nni\examples\trials\mnist\config_windows.yml ...@@ -22,16 +22,6 @@ nnictl create --config nni\examples\trials\mnist\config_windows.yml
> building 'simplejson._speedups' extension error: [WinError 3] The system cannot find the path specified > building 'simplejson._speedups' extension error: [WinError 3] The system cannot find the path specified
### 从源代码安装 NNI 时,遇到 PowerShell 错误
如果第一次运行 PowerShell 脚本,且没有设置过执行脚本的策略,会遇到下列错误。 需要以管理员身份运行此命令:
```bash
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
```
> ...cannot be loaded because running scripts is disabled on this system.
### 在命令行或 PowerShell 中,Trial 因为缺少 DLL 而失败 ### 在命令行或 PowerShell 中,Trial 因为缺少 DLL 而失败
此错误因为缺少 LIBIFCOREMD.DLL 和 LIBMMD.DLL 文件,且 SciPy 安装失败。 使用 Anaconda 或 Miniconda 和 Python(64位)可解决。 此错误因为缺少 LIBIFCOREMD.DLL 和 LIBMMD.DLL 文件,且 SciPy 安装失败。 使用 Anaconda 或 Miniconda 和 Python(64位)可解决。
...@@ -40,11 +30,7 @@ Set-ExecutionPolicy -ExecutionPolicy Unrestricted ...@@ -40,11 +30,7 @@ Set-ExecutionPolicy -ExecutionPolicy Unrestricted
### Web 界面上的 Trial 错误 ### Web 界面上的 Trial 错误
检查 Trial 日志文件来了解详情。 如果没有日志文件,且 NNI 是通过 pip 安装的,则需要在管理员权限下先运行以下命令: 检查 Trial 日志文件来了解详情。
```bash
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
```
如果存在 stderr 文件,也需要查看其内容。 可能的错误情况包括: 如果存在 stderr 文件,也需要查看其内容。 可能的错误情况包括:
......
...@@ -15,6 +15,7 @@ nnictl 支持的命令: ...@@ -15,6 +15,7 @@ nnictl 支持的命令:
* [nnictl trial](#trial) * [nnictl trial](#trial)
* [nnictl top](#top) * [nnictl top](#top)
* [nnictl experiment](#experiment) * [nnictl experiment](#experiment)
* [nnictl platform](#platform)
* [nnictl config](#config) * [nnictl config](#config)
* [nnictl log](#log) * [nnictl log](#log)
* [nnictl webui](#webui) * [nnictl webui](#webui)
...@@ -376,6 +377,24 @@ nnictl 支持的命令: ...@@ -376,6 +377,24 @@ nnictl 支持的命令:
nnictl experiment list nnictl experiment list
``` ```
* **nnictl experiment delete**
* 说明
删除一个或所有 Experiment,包括日志、结果、环境信息和缓存。 用于删除无用的 Experiment 结果,或节省磁盘空间。
* 用法
```bash
nnictl experiment delete [OPTIONS]
```
* 选项
| 参数及缩写 | 是否必需 | 默认值 | 说明 |
| ----- | ----- | --- | ------------- |
| id | False | | Experiment ID |
<a name="export"></a> <a name="export"></a>
* **nnictl experiment export** * **nnictl experiment export**
...@@ -464,6 +483,31 @@ nnictl 支持的命令: ...@@ -464,6 +483,31 @@ nnictl 支持的命令:
nnictl experiment import [experiment_id] -f experiment_data.json nnictl experiment import [experiment_id] -f experiment_data.json
``` ```
<a name="platform"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `管理平台的信息`
* **nnictl platform clean**
* 说明
用于清理目标平台上的磁盘空间。 所提供的 YAML 文件包括了目标平台的信息,与 NNI 配置文件的格式相同。
* 注意
如果目标平台正在被别人使用,可能会造成他人的意外错误。
* 用法
```bash
nnictl platform clean [OPTIONS]
```
* 选项
| 参数及缩写 | 是否必需 | 默认值 | 说明 |
| -------- | ---- | --- | ----------------------------- |
| --config | True | | 创建 Experiment 时的 YAML 配置文件路径。 |
<a name="config"></a> <a name="config"></a>
![](https://placehold.it/15/1589F0/000000?text=+) `nnictl config show` ![](https://placehold.it/15/1589F0/000000?text=+) `nnictl config show`
...@@ -497,12 +541,12 @@ nnictl 支持的命令: ...@@ -497,12 +541,12 @@ nnictl 支持的命令:
| 参数及缩写 | 是否必需 | 默认值 | 说明 | | 参数及缩写 | 是否必需 | 默认值 | 说明 |
| ---------- | ----- | --- | --------------------- | | ---------- | ----- | --- | --------------------- |
| id | False | | 需要设置的 Experiment 的 id | | id | False | | 需要设置的 Experiment 的 ID |
| --head, -h | False | | 显示 stdout 开始的若干行 | | --head, -h | False | | 显示 stdout 开始的若干行 |
| --tail, -t | False | | 显示 stdout 结尾的若干行 | | --tail, -t | False | | 显示 stdout 结尾的若干行 |
| --path, -p | False | | 显示 stdout 文件的路径 | | --path, -p | False | | 显示 stdout 文件的路径 |
* *
> 显示 stdout 结尾的若干行 > 显示 stdout 结尾的若干行
...@@ -526,7 +570,7 @@ nnictl 支持的命令: ...@@ -526,7 +570,7 @@ nnictl 支持的命令:
| 参数及缩写 | 是否必需 | 默认值 | 说明 | | 参数及缩写 | 是否必需 | 默认值 | 说明 |
| ---------- | ----- | --- | --------------------- | | ---------- | ----- | --- | --------------------- |
| id | False | | 需要设置的 Experiment 的 id | | id | False | | 需要设置的 Experiment 的 ID |
| --head, -h | False | | 显示 stderr 开始的若干行 | | --head, -h | False | | 显示 stderr 开始的若干行 |
| --tail, -t | False | | 显示 stderr 结尾的若干行 | | --tail, -t | False | | 显示 stderr 结尾的若干行 |
| --path, -p | False | | 显示 stderr 文件的路径 | | --path, -p | False | | 显示 stderr 文件的路径 |
...@@ -574,23 +618,23 @@ nnictl 支持的命令: ...@@ -574,23 +618,23 @@ nnictl 支持的命令:
| 参数及缩写 | 是否必需 | 默认值 | 说明 | | 参数及缩写 | 是否必需 | 默认值 | 说明 |
| -------------- | ----- | ---- | --------------------- | | -------------- | ----- | ---- | --------------------- |
| id | False | | 需要设置的 Experiment 的 ID | | id | False | | 需要设置的 Experiment 的 id |
| --trial_id, -T | False | | Trial 的 id | | --trial_id, -T | False | | Trial 的 id |
| --port | False | 6006 | Tensorboard 进程的端口 | | --port | False | 6006 | Tensorboard 进程的端口 |
* 详细说明 * 详细说明
1. NNICTL 当前仅支持本机和远程平台的 tensorboard,其它平台暂不支持。 1. NNICTL 当前仅支持本机和远程平台的 Tensorboard,其它平台暂不支持。
2. 如果要使用 tensorboard,需要将 tensorboard 日志输出到环境变量 [NNI_OUTPUT_DIR] 路径下。 2. 如果要使用 Tensorboard,需要将 Tensorboard 日志输出到环境变量 [NNI_OUTPUT_DIR] 路径下。
3. 在 local 模式中,nnictl 会直接设置 --logdir=[NNI_OUTPUT_DIR] 并启动 tensorboard 进程。 3. 在 local 模式中,nnictl 会直接设置 --logdir=[NNI_OUTPUT_DIR] 并启动 Tensorboard 进程。
4. 在 remote 模式中,nnictl 会创建一个 ssh 客户端来将日志数据从远程计算机复制到本机临时目录中,然后在本机开始 tensorboard 进程。 需要注意的是,nnictl 只在使用此命令时复制日志数据,如果要查看最新的 tensorboard 结果,需要再次执行 nnictl tensorboard 命令。 4. 在 remote 模式中,nnictl 会创建一个 SSH 客户端来将日志数据从远程计算机复制到本机临时目录中,然后在本机开始 Tensorboard 进程。 需要注意的是,nnictl 只在使用此命令时复制日志数据,如果要查看最新的 tensorboard 结果,需要再次执行 nnictl tensorboard 命令。
5. 如果只有一个 Trial 任务,不需要设置 Trial ID。 如果有多个运行的 Trial 作业,需要设置 Trial ID,或使用 [nnictl tensorboard start --trial_id all] 来将 --logdir 映射到所有 Trial 的路径。 5. 如果只有一个 Trial 任务,不需要设置 Trial ID。 如果有多个运行的 Trial 任务,需要设置 Trial ID,或使用 [nnictl tensorboard start --trial_id all] 来将 --logdir 映射到所有 Trial 的路径。
* **nnictl tensorboard stop** * **nnictl tensorboard stop**
* 说明 * 说明
停止所有 tensorboard 进程。 停止所有 Tensorboard 进程。
* 用法 * 用法
...@@ -602,7 +646,7 @@ nnictl 支持的命令: ...@@ -602,7 +646,7 @@ nnictl 支持的命令:
| 参数及缩写 | 是否必需 | 默认值 | 说明 | | 参数及缩写 | 是否必需 | 默认值 | 说明 |
| ----- | ----- | --- | --------------------- | | ----- | ----- | --- | --------------------- |
| id | False | | 需要设置的 Experiment 的 id | | id | False | | 需要设置的 Experiment 的 ID |
<a name="package"></a> <a name="package"></a>
...@@ -626,7 +670,7 @@ nnictl 支持的命令: ...@@ -626,7 +670,7 @@ nnictl 支持的命令:
| ------ | ---- | --- | ------- | | ------ | ---- | --- | ------- |
| --name | True | | 要安装的包名称 | | --name | True | | 要安装的包名称 |
* *
> 安装 SMAC Tuner 所需要的包 > 安装 SMAC Tuner 所需要的包
......
...@@ -21,7 +21,7 @@ maxExecDuration: 3h ...@@ -21,7 +21,7 @@ maxExecDuration: 3h
maxTrialNum: 100 maxTrialNum: 100
# 可选项: local, remote, pai # 可选项: local, remote, pai
trainingServicePlatform: pai trainingServicePlatform: pai
# 可选项: true, false # 可选项: true, false
useAnnotation: true useAnnotation: true
tuner: tuner:
builtinTunerName: TPE builtinTunerName: TPE
...@@ -86,12 +86,10 @@ paiConfig: ...@@ -86,12 +86,10 @@ paiConfig:
## 版本校验 ## 版本校验
从 0.6 开始,NNI 支持版本校验。确保 NNIManager 与 trialKeeper 的版本一致,避免兼容性错误。 从 0.6 开始,NNI 支持版本校验。确保 NNIManager 与 trialKeeper 的版本一致,避免兼容性错误。 检查策略:
检查策略:
1. 0.6 以前的 NNIManager 可与任何版本的 trialKeeper 一起运行,trialKeeper 支持向后兼容。 1. 0.6 以前的 NNIManager 可与任何版本的 trialKeeper 一起运行,trialKeeper 支持向后兼容。
2. 从 NNIManager 0.6 开始,与 triakKeeper 的版本必须一致。 例如,如果 NNIManager 是 0.6 版,则 trialKeeper 也必须是 0.6 版。 2. 从 NNIManager 0.6 开始,与 triakKeeper 的版本必须一致。 例如,如果 NNIManager 是 0.6 版,则 trialKeeper 也必须是 0.6 版。
3. 注意,只有版本的前两位数字才会被检查。例如,NNIManager 0.6.1 可以和 trialKeeper 的 0.6 或 0.6.2 一起使用,但不能与 trialKeeper 的 0.5.1 或 0.7 版本一起使用。 3. 注意,只有版本的前两位数字才会被检查。例如,NNIManager 0.6.1 可以和 trialKeeper 的 0.6 或 0.6.2 一起使用,但不能与 trialKeeper 的 0.5.1 或 0.7 版本一起使用。
如果 Experiment 无法运行,而且不能确认是否是因为版本不匹配造成的,可以在 Web 界面检查是否有相关的错误消息。 如果 Experiment 无法运行,而且不能确认是否是因为版本不匹配造成的,可以在 Web 界面检查是否有相关的错误消息。 ![](../img/version_check.png)
![](../img/version_check.png) \ No newline at end of file
\ No newline at end of file
...@@ -12,14 +12,6 @@ ...@@ -12,14 +12,6 @@
#### Windows #### Windows
如果在 Windows 上使用 NNI,首次使用 PowerShell 时,需要以管理员身份运行下列命令。
```bash
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
```
然后通过 pip 安装 NNI:
```bash ```bash
python -m pip install --upgrade nni python -m pip install --upgrade nni
``` ```
...@@ -34,7 +26,7 @@ ...@@ -34,7 +26,7 @@
NNI 是一个能进行自动机器学习实验的工具包。 它可以自动进行获取超参、运行 Trial,测试结果,调优超参的循环。 下面会展示如何使用 NNI 来找到最佳超参组合。 NNI 是一个能进行自动机器学习实验的工具包。 它可以自动进行获取超参、运行 Trial,测试结果,调优超参的循环。 下面会展示如何使用 NNI 来找到最佳超参组合。
这是**没有 NNI** 的样例代码,用 CNN 在 MNIST 数据集上训练: 这是**没有 NNI** 的样例代码,用 CNN 在 MNIST 数据集上训练:
```python ```python
def run_trial(params): def run_trial(params):
...@@ -64,7 +56,7 @@ NNI 用来帮助超参调优。它的流程如下: ...@@ -64,7 +56,7 @@ NNI 用来帮助超参调优。它的流程如下:
```pseudo ```pseudo
输入: 搜索空间, Trial 代码, 配置文件 输入: 搜索空间, Trial 代码, 配置文件
输出: 一组最优的参数配置 输出: 一组最佳的超参配置
1: For t = 0, 1, 2, ..., maxTrialNum, 1: For t = 0, 1, 2, ..., maxTrialNum,
2: hyperparameter = 从搜索空间选择一组参数 2: hyperparameter = 从搜索空间选择一组参数
...@@ -72,7 +64,7 @@ NNI 用来帮助超参调优。它的流程如下: ...@@ -72,7 +64,7 @@ NNI 用来帮助超参调优。它的流程如下:
4: 返回最终结果给 NNI 4: 返回最终结果给 NNI
5: If 时间达到上限, 5: If 时间达到上限,
6: 停止实验 6: 停止实验
7: 返回最好的实验结果 7: return 最好的实验结果
``` ```
如果需要使用 NNI 来自动训练模型,找到最佳超参,需要如下三步: 如果需要使用 NNI 来自动训练模型,找到最佳超参,需要如下三步:
...@@ -137,7 +129,7 @@ useAnnotation: false ...@@ -137,7 +129,7 @@ useAnnotation: false
tuner: tuner:
builtinTunerName: TPE builtinTunerName: TPE
# 运行的命令,以及 Trial 代码的路径 # 运行的命令,以及 Trial 代码的路径
trial: trial:
command: python3 mnist.py command: python3 mnist.py
codeDir: . codeDir: .
gpuNum: 0 gpuNum: 0
...@@ -205,7 +197,7 @@ You can use these commands to get more information about the experiment ...@@ -205,7 +197,7 @@ You can use these commands to get more information about the experiment
启动 Experiment 后,可以在命令行界面找到如下的 `Web 界面地址` 启动 Experiment 后,可以在命令行界面找到如下的 `Web 界面地址`
```text ```text
The Web UI urls are: [IP 地址]:8080 Web 地址为:[IP 地址]:8080
``` ```
在浏览器中打开 `Web 界面地址`(即:`[IP 地址]:8080`),就可以看到 Experiment 的详细信息,以及所有的 Trial 任务。 如果无法打开终端中的 Web 界面链接,可以参考 [FAQ](FAQ.md) 在浏览器中打开 `Web 界面地址`(即:`[IP 地址]:8080`),就可以看到 Experiment 的详细信息,以及所有的 Trial 任务。 如果无法打开终端中的 Web 界面链接,可以参考 [FAQ](FAQ.md)
......
# 更改日志 # 更改日志
# 发布 0.8 - 6/4/2019 ## 发布 0.8 - 6/4/2019
## 主要功能 ### 主要功能
* 在 Windows 上支持 NNI 的 OpenPAI 和远程模式 * 在 Windows 上支持 NNI 的 OpenPAI 和远程模式
* NNI 可在 Windows 上使用 OpenPAI 模式 * NNI 可在 Windows 上使用 OpenPAI 模式
* NNI 可在 Windows 上使用 OpenPAI 模式 * NNI 可在 Windows 上使用 OpenPAI 模式
* GPU 的高级功能 * GPU 的高级功能
* 在本机或远程模式上,可在同一个 GPU 上运行多个 Trial。 * 在本机或远程模式上,可在同一个 GPU 上运行多个 Trial。
* 在已经运行非 NNI 任务的 GPU 上也能运行 Trial * 在已经运行非 NNI 任务的 GPU 上也能运行 Trial
* 支持 Kubeflow v1beta2 操作符 * 支持 Kubeflow v1beta2 操作符
* 支持 Kubeflow TFJob/PyTorchJob v1beta2 * 支持 Kubeflow TFJob/PyTorchJob v1beta2
* [通过 NAS 编程接口](./GeneralNasInterfaces.md) * [通过 NAS 编程接口](./GeneralNasInterfaces.md)
* 实现了 NAS 的编程接口,可通过 NNI Annotation 很容易的表达神经网络架构搜索空间 * 实现了 NAS 的编程接口,可通过 NNI Annotation 很容易的表达神经网络架构搜索空间
* 提供新命令 `nnictl trial codegen` 来调试 NAS 代码生成部分 * 提供新命令 `nnictl trial codegen` 来调试 NAS 代码生成部分
* 提供 NAS 编程接口教程,NAS 在 MNIST 上的示例,用于 NAS 的可定制的随机 Tuner * 提供 NAS 编程接口教程,NAS 在 MNIST 上的示例,用于 NAS 的可定制的随机 Tuner
* 支持在恢复 Experiment 时,同时恢复 Tuner 和 Advisor 的状态 * 支持在恢复 Experiment 时,同时恢复 Tuner 和 Advisor 的状态
* 在恢复 Experiment 时,Tuner 和 Advisor 会导入已完成的 Trial 的数据。 * 在恢复 Experiment 时,Tuner 和 Advisor 会导入已完成的 Trial 的数据。
* Web 界面 * Web 界面
* 改进拷贝 Trial 参数的设计 * 改进拷贝 Trial 参数的设计
* 在 hyper-parameter 图中支持 'randint' 类型 * 在 hyper-parameter 图中支持 'randint' 类型
* 使用 ComponentUpdate 来避免不必要的刷新 * 使用 ComponentUpdate 来避免不必要的刷新
## Bug 修复和其它更新 ### Bug 修复和其它更新
* 修复 `nnictl update` 不一致的命令行风格 * 修复 `nnictl update` 不一致的命令行风格
* SMAC Tuner 支持导入数据 * SMAC Tuner 支持导入数据
...@@ -40,21 +40,21 @@ ...@@ -40,21 +40,21 @@
### 主要功能 ### 主要功能
* [支持在 Windows 上使用 NNI](./WindowsLocalMode.md) * [支持在 Windows 上使用 NNI](./WindowsLocalMode.md)
* NNI 可在 Windows 上使用本机模式 * NNI 可在 Windows 上使用本机模式
* [支持新的 Advisor: BOHB](./BohbAdvisor.md) * [支持新的 Advisor: BOHB](./BohbAdvisor.md)
* 支持新的 BOHB Advisor,这是一个健壮而有效的超参调优算法,囊括了贝叶斯优化和 Hyperband 的优点 * 支持新的 BOHB Advisor,这是一个健壮而有效的超参调优算法,囊括了贝叶斯优化和 Hyperband 的优点
* [支持通过 nnictl 来导入导出 Experiment 数据](./Nnictl.md#experiment) * [支持通过 nnictl 来导入导出 Experiment 数据](./Nnictl.md#experiment)
* 在 Experiment 执行完后,可生成分析结果报告 * 在 Experiment 执行完后,可生成分析结果报告
* 支持将先前的调优数据导入到 Tuner 和 Advisor 中 * 支持将先前的调优数据导入到 Tuner 和 Advisor 中
* [可为 NNI Trial 任务指定 GPU](./ExperimentConfig.md#localConfig) * [可为 NNI Trial 任务指定 GPU](./ExperimentConfig.md#localConfig)
* 通过 gpuIndices 配置来为 Trial 任务指定GPU。如果 Experiment 配置文件中有 gpuIndices,则只有指定的 GPU 会被用于 NNI 的 Trial 任务。 * 通过 gpuIndices 配置来为 Trial 任务指定GPU。如果 Experiment 配置文件中有 gpuIndices,则只有指定的 GPU 会被用于 NNI 的 Trial 任务。
* 改进 Web 界面 * 改进 Web 界面
* 在 Web 界面上使用十进制格式的指标 * 在 Web 界面上使用十进制格式的指标
* 添加多阶段训练相关的提示 * 添加多阶段训练相关的提示
* 可将超参复制为 Python dict 格式 * 可将超参复制为 Python dict 格式
* 可将提前终止的 Trial 数据传入 Tuner。 * 可将提前终止的 Trial 数据传入 Tuner。
* 为 nnictl 提供更友好的错误消息 * 为 nnictl 提供更友好的错误消息
* 为 YAML 文件格式错误提供更有意义的错误信息 * 为 YAML 文件格式错误提供更有意义的错误信息
### Bug 修复 ### Bug 修复
...@@ -66,12 +66,12 @@ ...@@ -66,12 +66,12 @@
### 主要功能 ### 主要功能
* [版本检查](https://github.com/Microsoft/nni/blob/master/docs/en_US/PaiMode.md#version-check) * [版本检查](https://github.com/Microsoft/nni/blob/master/docs/zh_CN/PaiMode.md#version-check)
* 检查 nniManager 和 trialKeeper 的版本是否一致 * 检查 nniManager 和 trialKeeper 的版本是否一致
* [提前终止的任务也可返回最终指标](https://github.com/Microsoft/nni/issues/776) * [提前终止的任务也可返回最终指标](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](https://github.com/Microsoft/nni/issues/841)
* 增加两个管道来分离 Tuner 和 Assessor 的消息 * 增加两个管道来分离 Tuner 和 Assessor 的消息
* 使日志集合功能可配置 * 使日志集合功能可配置
* 为所有 Trial 增加中间结果的视图 * 为所有 Trial 增加中间结果的视图
...@@ -110,7 +110,7 @@ ...@@ -110,7 +110,7 @@
### 改进 ### 改进
* [日志目录](https://github.com/Microsoft/nni/blob/v0.5.1/docs/zh_CN/ExperimentConfig.md)可配置。 * [日志目录](https://github.com/Microsoft/nni/blob/v0.5.1/docs/zh_CN/ExperimentConfig.md)可配置。
* 支持[不同级别的日志](https://github.com/Microsoft/nni/blob/v0.5.1/docs/zh_CN/ExperimentConfig.md),使其更易于调试。 * 支持[不同级别的日志](https://github.com/Microsoft/nni/blob/v0.5.1/docs/zh_CN/ExperimentConfig.md),使其更易于调试。
### 文档 ### 文档
...@@ -119,7 +119,7 @@ ...@@ -119,7 +119,7 @@
### Bug 修复和其它更新 ### Bug 修复和其它更新
* 修复了 Python 虚拟环境中安装的 Bug,并重构了安装逻辑。 * 修复了 Python 虚拟环境中安装的 Bug,并重构了安装逻辑。
* 修复了在最新的 OpenPAI 下存取 HDFS 失败的问题。 * 修复了在最新的 OpenPAI 下存取 HDFS 失败的问题。
* 修复了有时刷新 stdout 会造成 Experiment 崩溃的问题。 * 修复了有时刷新 stdout 会造成 Experiment 崩溃的问题。
## 发布 0.5.0 - 01/14/2019 ## 发布 0.5.0 - 01/14/2019
...@@ -136,15 +136,15 @@ ...@@ -136,15 +136,15 @@
#### 改进训练平台 #### 改进训练平台
* [FrameworkController 训练平台](./FrameworkControllerMode.md): 支持使用在 Kubernetes 上使用 FrameworkController。 * [FrameworkController 训练平台](./FrameworkControllerMode.md): 支持使用在 Kubernetes 上使用 FrameworkController。
* FrameworkController 是 Kubernetes 上非常通用的控制器(Controller),能用来运行基于各种机器学习框架的分布式作业,如 TensorFlow,Pytorch, MXNet 等。 * FrameworkController 是 Kubernetes 上非常通用的控制器(Controller),能用来运行基于各种机器学习框架的分布式作业,如 TensorFlow,Pytorch, MXNet 等。
* NNI 为作业定义了统一而简单的规范。 * NNI 为作业定义了统一而简单的规范。
* 如何使用 FrameworkController 的 MNIST 样例。 * 如何使用 FrameworkController 的 MNIST 样例。
#### 改进用户体验 #### 改进用户体验
* 为 OpenPAI, Kubeflow 和 FrameworkController 模式提供更好的日志支持。 * 为 OpenPAI, Kubeflow 和 FrameworkController 模式提供更好的日志支持。
* 改进后的日志架构能将尝试的 stdout/stderr 通过 HTTP POST 方式发送给 NNI 管理器。 NNI 管理器将 Trial 的 stdout/stderr 消息存储在本地日志文件中。 * 改进后的日志架构能将尝试的 stdout/stderr 通过 HTTP POST 方式发送给 NNI 管理器。 NNI 管理器将 Trial 的 stdout/stderr 消息存储在本地日志文件中。
* 在 WEB 界面上显示 Trial 日志的链接。 * 在 WEB 界面上显示 Trial 日志的链接。
* 支持将最终结果显示为键值对。 * 支持将最终结果显示为键值对。
## 发布 0.4.1 - 12/14/2018 ## 发布 0.4.1 - 12/14/2018
...@@ -175,7 +175,7 @@ ...@@ -175,7 +175,7 @@
* 为指标数值图提供自动缩放的数轴 * 为指标数值图提供自动缩放的数轴
* 改进 Annotation,支持在搜索空间中显示实际的选项 * 改进 Annotation,支持在搜索空间中显示实际的选项
### 新 ### 新
* [FashionMnist](https://github.com/Microsoft/nni/tree/master/examples/trials/network_morphism),使用 network morphism Tuner * [FashionMnist](https://github.com/Microsoft/nni/tree/master/examples/trials/network_morphism),使用 network morphism Tuner
* 使用 PyTorch 的[分布式 MNIST 样例](https://github.com/Microsoft/nni/tree/master/examples/trials/mnist-distributed-pytorch) * 使用 PyTorch 的[分布式 MNIST 样例](https://github.com/Microsoft/nni/tree/master/examples/trials/mnist-distributed-pytorch)
...@@ -185,42 +185,42 @@ ...@@ -185,42 +185,42 @@
### 主要功能 ### 主要功能
* [Kubeflow 训练服务](./KubeflowMode.md) * [Kubeflow 训练服务](./KubeflowMode.md)
* 支持 tf-operator * 支持 tf-operator
* 使用 Kubeflow 的[分布式 Trial 样例](https://github.com/Microsoft/nni/tree/master/examples/trials/mnist-distributed/dist_mnist.py) * 使用 Kubeflow 的[分布式 Trial 样例](https://github.com/Microsoft/nni/tree/master/examples/trials/mnist-distributed/dist_mnist.py)
* [网格搜索 Tuner](GridsearchTuner.md) * [网格搜索 Tuner](GridsearchTuner.md)
* [Hyperband Tuner](HyperbandAdvisor.md) * [Hyperband Tuner](HyperbandAdvisor.md)
* 支持在 MAC 上运行 NNI Experiment * 支持在 MAC 上运行 NNI Experiment
* Web 界面 * Web 界面
* 支持 hyperband Tuner * 支持 hyperband Tuner
* 移除 tensorboard 按钮 * 移除 tensorboard 按钮
* 显示 Experiment 的错误消息 * 显示 Experiment 的错误消息
* 显示搜索空间和 Trial 配置的行号 * 显示搜索空间和 Trial 配置的行号
* 支持通过指定的 Trial id 来搜索 * 支持通过指定的 Trial id 来搜索
* 显示 Trial 的 hdfsLogPath * 显示 Trial 的 hdfsLogPath
* 下载 Experiment 参数 * 下载 Experiment 参数
### 其它 ### 其它
* 异步调度 * 异步调度
* 更新 Docker 文件,增加 pytorch 库 * 更新 Docker 文件,增加 pytorch 库
* 重构 'nnictl stop' 过程,发送 SIGTERM 给 NNI 管理器进程,而不是调用停止 Restful API. * 重构 'nnictl stop' 过程,发送 SIGTERM 给 NNI 管理器进程,而不是调用停止 Restful API.
* 修复 OpenPAI 训练服务的 Bug * 修复 OpenPAI 训练服务的 Bug
* 在 NNI 管理器中为 OpenPAI 集群配置文件支持 IP 配置(nniManagerIp),来修复用户计算机没有 eth0 设备的问题。 * 在 NNI 管理器中为 OpenPAI 集群配置文件支持 IP 配置(nniManagerIp),来修复用户计算机没有 eth0 设备的问题。
* codeDir 中的文件数量上限改为1000,避免用户无意中填写了 root 目录。 * codeDir 中的文件数量上限改为1000,避免用户无意中填写了 root 目录。
* 移除 OpenPAI 作业的 stdout 日志中无用的 ‘metrics is empty’。 在新指标被记录时,仅输出有用的消息,来减少用户检查 OpenPAI Trial 输出时的困惑。 * 移除 OpenPAI 作业的 stdout 日志中无用的 ‘metrics is empty’。 在新指标被记录时,仅输出有用的消息,来减少用户检查 OpenPAI Trial 输出时的困惑。
* 在 Trial keeper 的开始增加时间戳。 * 在 Trial keeper 的开始增加时间戳。
## 发布 0.3.0 - 11/2/2018 ## 发布 0.3.0 - 11/2/2018
### NNICTL 的新功能和更新 ### NNICTL 的新功能和更新
* 支持同时运行多个 Experiment。 * 支持同时运行多个 Experiment。
在 v0.3 以前,NNI 仅支持一次运行一个 Experiment。 此版本开始,用户可以同时运行多个 Experiment。 每个 Experiment 都需要一个唯一的端口,第一个 Experiment 会像以前版本一样使用默认端口。 需要为其它 Experiment 指定唯一端口: 在 v0.3 以前,NNI 仅支持一次运行一个 Experiment。 此版本开始,用户可以同时运行多个 Experiment。 每个 Experiment 都需要一个唯一的端口,第一个 Experiment 会像以前版本一样使用默认端口。 需要为其它 Experiment 指定唯一端口:
```bash ```bash
nnictl create --port 8081 --config <config file path> nnictl create --port 8081 --config <config file path>
``` ```
* 支持更新最大 Trial 的数量。 使用 `nnictl update --help` 了解详情。 或参考 [NNICTL](Nnictl.md) 查看完整帮助。 * 支持更新最大 Trial 的数量。 使用 `nnictl update --help` 了解详情。 或参考 [NNICTL](Nnictl.md) 查看完整帮助。
...@@ -229,30 +229,30 @@ ...@@ -229,30 +229,30 @@
* <span style="color:red"><strong>不兼容的改动</strong></span>:nn.get_parameters() 改为 nni.get_next_parameter。 所有以前版本的样例将无法在 v0.3 上运行,需要重新克隆 NNI 代码库获取新样例。 如果在自己的代码中使用了 NNI,也需要相应的更新。 * <span style="color:red"><strong>不兼容的改动</strong></span>:nn.get_parameters() 改为 nni.get_next_parameter。 所有以前版本的样例将无法在 v0.3 上运行,需要重新克隆 NNI 代码库获取新样例。 如果在自己的代码中使用了 NNI,也需要相应的更新。
* 新 API **nni.get_sequence_id()**。 每个 Trial 任务都会被分配一个唯一的序列数字,可通过 nni.get_sequence_id() API 来获取。 * 新 API **nni.get_sequence_id()**。 每个 Trial 任务都会被分配一个唯一的序列数字,可通过 nni.get_sequence_id() API 来获取。
```bash ```bash
git clone -b v0.3 https://github.com/Microsoft/nni.git git clone -b v0.3 https://github.com/Microsoft/nni.git
``` ```
* **nni.report_final_result(result)** API 对结果参数支持更多的数据类型。 * **nni.report_final_result(result)** API 对结果参数支持更多的数据类型。
可用类型: 可用类型:
* int * int
* float * float
* 包含有 'default' 键值的 dict,'default' 的值必须为 int 或 float。 dict 可以包含任何其它键值对。 * 包含有 'default' 键值的 dict,'default' 的值必须为 int 或 float。 dict 可以包含任何其它键值对。
### 支持新的 Tuner ### 支持新的 Tuner
* **Batch Tuner(批处理调参器)** 会执行所有超参组合,可被用来批量提交 Trial 任务。 * **Batch Tuner(批处理调参器)** 会执行所有超参组合,可被用来批量提交 Trial 任务。
### 新 ### 新
* 公开的 NNI Docker 映像: * 公开的 NNI Docker 映像:
```bash ```bash
docker pull msranni/nni:latest docker pull msranni/nni:latest
``` ```
* 新的 Trial 样例: [NNI Sklearn 样例](https://github.com/Microsoft/nni/tree/master/examples/trials/sklearn) * 新的 Trial 样例: [NNI Sklearn 样例](https://github.com/Microsoft/nni/tree/master/examples/trials/sklearn)
...@@ -269,14 +269,14 @@ ...@@ -269,14 +269,14 @@
### 主要功能 ### 主要功能
* 支持 [OpenPAI](https://github.com/Microsoft/pai) (又称 pai) 训练服务 (参考[这里](./PaiMode.md)来了解如何在 OpenPAI 下提交 NNI 任务) * 支持 [OpenPAI](https://github.com/Microsoft/pai) (又称 pai) 训练服务 (参考[这里](./PaiMode.md)来了解如何在 OpenPAI 下提交 NNI 任务)
* 支持 pai 模式的训练服务。 NNI Trial 可发送至 OpenPAI 集群上运行 * 支持 pai 模式的训练服务。 NNI Trial 可发送至 OpenPAI 集群上运行
* NNI Trial 输出 (包括日志和模型文件) 会被复制到 OpenPAI 的 HDFS 中。 * NNI Trial 输出 (包括日志和模型文件) 会被复制到 OpenPAI 的 HDFS 中。
* 支持 [SMAC](https://www.cs.ubc.ca/~hutter/papers/10-TR-SMAC.pdf) Tuner (参考[这里](SmacTuner.md),了解如何使用 SMAC Tuner) * 支持 [SMAC](https://www.cs.ubc.ca/~hutter/papers/10-TR-SMAC.pdf) Tuner (参考[这里](SmacTuner.md),了解如何使用 SMAC Tuner)
* [SMAC](https://www.cs.ubc.ca/~hutter/papers/10-TR-SMAC.pdf) 基于 Sequential Model-Based Optimization (SMBO). 它会利用使用过的结果好的模型(高斯随机过程模型),并将随机森林引入到 SMBO 中,来处理分类参数。 NNI 的 SMAC 通过包装 [SMAC3](https://github.com/automl/SMAC3) 来支持。 * [SMAC](https://www.cs.ubc.ca/~hutter/papers/10-TR-SMAC.pdf) 基于 Sequential Model-Based Optimization (SMBO). 它会利用使用过的结果好的模型(高斯随机过程模型),并将随机森林引入到 SMBO 中,来处理分类参数。 NNI 的 SMAC 通过包装 [SMAC3](https://github.com/automl/SMAC3) 来支持。
* 支持将 NNI 安装在 [conda](https://conda.io/docs/index.html) 和 Python 虚拟环境中。 * 支持将 NNI 安装在 [conda](https://conda.io/docs/index.html) 和 Python 虚拟环境中。
* 其它 * 其它
* 更新 ga squad 样例与相关文档 * 更新 ga squad 样例与相关文档
* 用户体验改善及 Bug 修复 * 用户体验改善及 Bug 修复
### 已知问题 ### 已知问题
...@@ -289,20 +289,20 @@ ...@@ -289,20 +289,20 @@
### 主要功能 ### 主要功能
* 安装和部署 * 安装和部署
* 支持 pip 和源代码安装 * 支持 pip 和源代码安装
* 支持本机(包括多 GPU 卡)训练和远程多机训练模式 * 支持本机(包括多 GPU 卡)训练和远程多机训练模式
* Tuner ,Assessor 和 Trial * Tuner ,Assessor 和 Trial
* 支持的自动机器学习算法包括: hyperopt_tpe, hyperopt_annealing, hyperopt_random, 和 evolution_tuner。 * 支持的自动机器学习算法包括: hyperopt_tpe, hyperopt_annealing, hyperopt_random, 和 evolution_tuner。
* 支持 Assessor(提前终止)算法包括:medianstop。 * 支持 Assessor(提前终止)算法包括:medianstop。
* 提供 Python API 来自定义 Tuner 和 Assessor * 提供 Python API 来自定义 Tuner 和 Assessor
* 提供 Python API 来包装 Trial 代码,以便能在 NNI 中运行 * 提供 Python API 来包装 Trial 代码,以便能在 NNI 中运行
* Experiment * Experiment
* 提供命令行工具 'nnictl' 来管理 Experiment * 提供命令行工具 'nnictl' 来管理 Experiment
* 提供网页界面来查看并管理 Experiment * 提供网页界面来查看并管理 Experiment
* 持续集成 * 持续集成
* 使用 Ubuntu 的 [travis-ci](https://github.com/travis-ci) 来支持持续集成 * 使用 Ubuntu 的 [travis-ci](https://github.com/travis-ci) 来支持持续集成
* 其它 * 其它
* 支持简单的 GPU 任务调度 * 支持简单的 GPU 任务调度
### 已知问题 ### 已知问题
......
...@@ -91,6 +91,7 @@ ...@@ -91,6 +91,7 @@
| Grid Search Tuner | &#10003; | | | &#10003; | | &#10003; | | | | | | Grid Search Tuner | &#10003; | | | &#10003; | | &#10003; | | | | |
| Hyperband Advisor | &#10003; | &#10003; | &#10003; | &#10003; | &#10003; | &#10003; | &#10003; | &#10003; | &#10003; | &#10003; | | Hyperband Advisor | &#10003; | &#10003; | &#10003; | &#10003; | &#10003; | &#10003; | &#10003; | &#10003; | &#10003; | &#10003; |
| Metis Tuner | &#10003; | &#10003; | &#10003; | &#10003; | | | | | | | | Metis Tuner | &#10003; | &#10003; | &#10003; | &#10003; | | | | | | |
| GP Tuner | &#10003; | &#10003; | &#10003; | &#10003; | &#10003; | &#10003; | | | | |
已知的局限: 已知的局限:
......
# NNI 中使用 scikit-learn # NNI 中使用 scikit-learn
[scikit-learn](https://github.com/scikit-learn/scikit-learn) (sklearn) 是数据挖掘和分析的流行工具。 它支持多种机器学习模型,如线性回归,逻辑回归,决策树,支持向量机等。 提高 scikit-learn 的效率是非常有价值的课题。 [scikit-learn](https://github.com/scikit-learn/scikit-learn) (sklearn) 是流行的数据挖掘和分析工具。 它支持多种机器学习模型,如线性回归,逻辑回归,决策树,支持向量机等。 如何更高效的使用 scikit-learn,是一个很有价值的话题。
NNI 支持多种调优算法,可以为 scikit-learn 搜索最佳的模型和超参,并支持本机、远程服务器组、云等各种环境。
NNI 支持多种调优算法来为 scikit-learn 搜索最好的模型和超参,并支持本机、远程服务器和云服务等多种环境。
## 1. 如何运行此样例 ## 1. 如何运行此样例
安装 NNI 包,并使用命令行工具 `nnictl` 来启动 Experiment。 有关安装和环境准备的内容,参考[这里](QuickStart.md)。 安装完 NNI 后,进入相应的目录,输入下列命令即可启动 Experiment: 安装 NNI 包,并使用命令行工具 `nnictl` 来启动 Experiment。 有关安装和环境准备的内容,参考[这里](QuickStart.md)
安装完 NNI 后,进入相应的目录,输入下列命令即可启动 Experiment:
```bash ```bash
nnictl create --config ./config.yml nnictl create --config ./config.yml
...@@ -15,16 +18,19 @@ nnictl create --config ./config.yml ...@@ -15,16 +18,19 @@ nnictl create --config ./config.yml
### 2.1 分类 ### 2.1 分类
此样例使用了数字数据集,由 1797 张 8x8 的图片组成,每张图片都是一个手写数字。目标是将这些图片分到 10 个类别中。 示例使用了数字数据集,它是由 1797 个 8x8 的图片组成,每个图片都是一个手写数字,目标是将图片分为 10 类。
在此样例中,使用了 SVC 作为模型,并选择了一些参数,包括 `"C", "keral", "degree", "gamma" 和 "coef0"`。 关于这些参数的更多信息,可参考[这里](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html)
在这个示例中,使用 SVC 作为模型,并为此模型选择一些参数,包括 `"C", "keral", "degree", "gamma" 和 "coef0"`。 关于这些参数的更多信息,可参考[这里](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html)
### 2.2 回归 ### 2.2 回归
此样例使用了波士顿房价数据,数据集由波士顿各地区房价所组成,还包括了房屋的周边信息,例如:犯罪率 (CRIM),非零售业务的面积 (INDUS),房主年龄 (AGE) 等等。这些信息可用来预测波士顿的房价。 本例中,尝试了不同的回归模型,包括 `"LinearRegression", "SVR", "KNeighborsRegressor", "DecisionTreeRegressor"` 和一些参数,如 `"svr_kernel", "knr_weights"`。 关于这些模型算法和参数的更多信息,可参考[这里](https://scikit-learn.org/stable/supervised_learning.html#supervised-learning) 此样例使用了波士顿房价数据,数据集由波士顿各地区房价所组成,还包括了房屋的周边信息,例如:犯罪率 (CRIM),非零售业务的面积 (INDUS),房主年龄 (AGE) 等等。这些信息可用来预测波士顿的房价。
本例中,尝试了不同的回归模型,包括 `"LinearRegression", "SVR", "KNeighborsRegressor", "DecisionTreeRegressor"` 和一些参数,如 `"svr_kernel", "knr_weights"`。 关于这些模型算法和参数的更多信息,可参考[这里](https://scikit-learn.org/stable/supervised_learning.html#supervised-learning)
## 3. 如何在 NNI 中使用 sklearn ## 3. 如何在 NNI 中使用 scikit-learn
只需要如下几步,即可在 sklearn 代码中使用 NNI。 只需要如下几步,即可在 scikit-learn 代码中使用 NNI。
* **第一步** * **第一步**
...@@ -48,8 +54,11 @@ nnictl create --config ./config.yml ...@@ -48,8 +54,11 @@ nnictl create --config ./config.yml
在 Python 代码中,可以将这些值作为一个 dict,读取到 Python 代码中。 在 Python 代码中,可以将这些值作为一个 dict,读取到 Python 代码中。
* **第二步** * **第二步**
在代码最前面,加上 `import nni` 来导入 NNI 包。 首先,要使用 `nni.get_next_parameter()` 函数从 NNI 中获取参数。 然后在代码中使用这些参数。 例如,如果定义了如下的 search_space.json:
在代码最前面,加上 `import nni` 来导入 NNI 包。
首先,要使用 `nni.get_next_parameter()` 函数从 NNI 中获取参数。 然后在代码中使用这些参数。 例如,如果定义了如下的 search_space.json:
```json ```json
{ {
...@@ -75,6 +84,8 @@ nnictl create --config ./config.yml ...@@ -75,6 +84,8 @@ nnictl create --config ./config.yml
就可以使用这些变量来编写 scikit-learn 的代码。 就可以使用这些变量来编写 scikit-learn 的代码。
* **第三步** * **第三步**
完成训练后,可以得到模型分数,如:精度,召回率,均方差等等。 NNI 会将分数发送给 Tuner 算法,并据此生成下一组参数,所以需要将分数返回给 NNI。NNI 会开始下一个 Trial 任务。
只需要在训练结束后调用 `nni.report_final_result(score)`,就可以将分数传给 NNI。 如果训练过程中有中间分数,也可以使用 `nni.report_intemediate_result(score)` 返回给 NNI。 注意, 可以不返回中间分数,但必须返回最终的分数。 完成训练后,可以得到模型分数,如:精度,召回率,均方差等等。 NNI 需要将分数传入 Tuner 算法,并生成下一组参数,将结果回传给 NNI,并开始下一个 Trial 任务。
\ No newline at end of file
在运行完 scikit-learn 代码后,只需要使用 `nni.report_final_result(score)` 来与 NNI 通信即可。 或者在每一步中都有多个分值,可使用 `nni.report_intemediate_result(score)` 来将它们回传给 NNI。 注意, 可以不返回中间分数,但必须返回最终的分数。
\ No newline at end of file
...@@ -35,7 +35,9 @@ ...@@ -35,7 +35,9 @@
RECEIVED_PARAMS = nni.get_next_parameter() RECEIVED_PARAMS = nni.get_next_parameter()
``` ```
`RECEIVED_PARAMS` 是一个对象,如: `{"conv_size": 2, "hidden_size": 124, "learning_rate": 0.0307, "dropout_rate": 0.2029}`. `RECEIVED_PARAMS` 是一个对象,如:
`{"conv_size": 2, "hidden_size": 124, "learning_rate": 0.0307, "dropout_rate": 0.2029}`.
* 定期返回指标数据(可选) * 定期返回指标数据(可选)
...@@ -72,10 +74,10 @@ searchSpacePath: /path/to/your/search_space.json ...@@ -72,10 +74,10 @@ searchSpacePath: /path/to/your/search_space.json
另一种实现 Trial 的方法是使用 Python 注释来标记 NNI。 就像其它 Python Annotation,NNI 的 Annotation 和代码中的注释一样。 不需要在代码中做大量改动。 只需要添加一些 NNI Annotation,就能够: 另一种实现 Trial 的方法是使用 Python 注释来标记 NNI。 就像其它 Python Annotation,NNI 的 Annotation 和代码中的注释一样。 不需要在代码中做大量改动。 只需要添加一些 NNI Annotation,就能够:
* 标记需要调整的参数变量 * 标记需要调整的参数变量
* 指定变量的搜索空间范围 * 指定变量的搜索空间范围
* 标记哪个变量需要作为中间结果范围给 `Assessor` * 标记哪个变量需要作为中间结果范围给 `Assessor`
* 标记哪个变量需要作为最终结果(例如:模型精度)返回给 `Tuner` * 标记哪个变量需要作为最终结果(例如:模型精度)返回给 `Tuner`
同样以 MNIST 为例,只需要两步就能用 NNI Annotation 来实现 Trial 代码。 同样以 MNIST 为例,只需要两步就能用 NNI Annotation 来实现 Trial 代码。
...@@ -119,7 +121,7 @@ with tf.Session() as sess: ...@@ -119,7 +121,7 @@ with tf.Session() as sess:
**注意** **注意**
* `@nni.variable` 会对它的下面一行进行修改,左边被赋值变量必须在 `@nni.variable``name` 参数中指定。 * `@nni.variable` 会对它的下面一行进行修改,左边被赋值变量必须在 `@nni.variable``name` 参数中指定。
* `@nni.report_intermediate_result`/`@nni.report_final_result` 会将数据发送给 Assessor、Tuner。 * `@nni.report_intermediate_result`/`@nni.report_final_result` 会将数据发送给 Assessor、Tuner。
Annotation 的语法和用法等,参考 [Annotation](AnnotationSpec.md) Annotation 的语法和用法等,参考 [Annotation](AnnotationSpec.md)
...@@ -138,7 +140,7 @@ Annotation 的语法和用法等,参考 [Annotation](AnnotationSpec.md)。 ...@@ -138,7 +140,7 @@ Annotation 的语法和用法等,参考 [Annotation](AnnotationSpec.md)。
如果使用了 Annotation 方法,转换后的 Trial 代码会存放在另一个临时目录中。 可以在 `run.sh` 文件中的 `NNI_OUTPUT_DIR` 变量找到此目录。 文件中的第二行(即:`cd`)会切换到代码所在的实际路径。 参考 `run.sh` 文件样例: 如果使用了 Annotation 方法,转换后的 Trial 代码会存放在另一个临时目录中。 可以在 `run.sh` 文件中的 `NNI_OUTPUT_DIR` 变量找到此目录。 文件中的第二行(即:`cd`)会切换到代码所在的实际路径。 参考 `run.sh` 文件样例:
```shell ```bash
#!/bin/bash #!/bin/bash
cd /tmp/user_name/nni/annotation/tmpzj0h72x6 #This is the actual directory cd /tmp/user_name/nni/annotation/tmpzj0h72x6 #This is the actual directory
export NNI_PLATFORM=local export NNI_PLATFORM=local
...@@ -166,4 +168,4 @@ echo $? `date +%s%3N` >/home/user_name/nni/experiments/$experiment_id$/trials/$t ...@@ -166,4 +168,4 @@ echo $? `date +%s%3N` >/home/user_name/nni/experiments/$experiment_id$/trials/$t
* [为 CIFAR 10 分类找到最佳的 optimizer](Cifar10Examples.md) * [为 CIFAR 10 分类找到最佳的 optimizer](Cifar10Examples.md)
* [如何在 NNI 调优 SciKit-learn 的参数](SklearnExamples.md) * [如何在 NNI 调优 SciKit-learn 的参数](SklearnExamples.md)
* [在阅读理解上使用自动模型架构搜索。](SquadEvolutionExamples.md) * [在阅读理解上使用自动模型架构搜索。](SquadEvolutionExamples.md)
* [如何在 NNI 上调优 GBDT](GbdtExample.md) * [如何在 NNI 上调优 GBDT](GbdtExample.md)
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment