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

Chinese translation (#2394)

parent 7ec3235c
...@@ -333,9 +333,15 @@ You can use these commands to get more information about the experiment ...@@ -333,9 +333,15 @@ You can use these commands to get more information about the experiment
## **反馈** ## **反馈**
*[Gitter](https://gitter.im/Microsoft/nni?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) 中参与讨论。
* [在 GitHub 上提交问题](https://github.com/microsoft/nni/issues/new/choose) * [在 GitHub 上提交问题](https://github.com/microsoft/nni/issues/new/choose)
*[Stack Overflow](https://stackoverflow.com/questions/tagged/nni?sort=Newest&edited=true) 上使用 nni 标签提问。 *[Stack Overflow](https://stackoverflow.com/questions/tagged/nni?sort=Newest&edited=true) 上使用 nni 标签提问。
*[Gitter](https://gitter.im/Microsoft/nni?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) 中参与讨论。
加入聊天组:
| Gitter | | 微信 |
| ----------------------------------------------------------------------------------------------------------- | - | ------------------------------------------------------------------------------------------- |
| ![图片](https://user-images.githubusercontent.com/39592018/80665738-e0574a80-8acc-11ea-91bc-0836dc4cbf89.png) | 或 | ![图片](https://github.com/JSong-Jia/NNI-user-group/blob/master/user%20group%20code_0512.jpg) |
## 相关项目 ## 相关项目
......
...@@ -148,19 +148,30 @@ nni.report_final_result(acc) # 报告所选架构的性能 ...@@ -148,19 +148,30 @@ nni.report_final_result(acc) # 报告所选架构的性能
### 使用导出的架构重新训练 ### 使用导出的架构重新训练
搜索阶段后,就该训练找到的架构了。 与很多开源 NAS 算法不同,它们为重新训练专门写了新的模型。 我们发现搜索模型和重新训练模型的过程非常相似,因而可直接将一样的模型代码用到最终模型上。 例如 搜索阶段后,就该训练找到的架构了。 与很多开源 NAS 算法不同,这些算法为重新训练实现了新的模型。 实际上搜索模型和重新训练模型的过程非常相似,因而可直接将一样的模型代码用到最终模型上。 例如
```python ```python
model = Net() model = Net()
apply_fixed_architecture(model, "model_dir/final_architecture.json") apply_fixed_architecture(model, "model_dir/final_architecture.json")
``` ```
JSON 文件是从 Mutable key 到 Choice 的表示。 例如 此 JSON 是从 Mutable 键值到 Choice 的映射。 Choice 可为:
* string: 根据名称来指定候选项。
* number: 根据索引来指定候选项。
* string 数组: 根据名称来指定候选项。
* number 数组: 根据索引来指定候选项。
* boolean 数组: 可直接选定多项的数组。
例如:
```json ```json
{ {
"LayerChoice1": [false, true, false, false], "LayerChoice1": "conv5x5",
"InputChoice2": [true, true, false] "LayerChoice2": 6,
"InputChoice3": ["layer1", "layer3"],
"InputChoice4": [1, 2],
"InputChoice5": [false, true, false, false, true]
} }
``` ```
......
# NNI NAS 编程接口
我们正在尝试通过统一的编程接口来支持各种 NAS 算法,当前处于试验阶段。 这意味着当前编程接口可能会进行重大变化。
## 模型的编程接口
在两种场景下需要用于设计和搜索模型的编程接口。
1. 在设计神经网络时,可能在层、子模型或连接上有多种选择,并且无法确定是其中一种或某些的组合的结果最好。 因此,需要简单的方法来表达候选的层或子模型。
2. 在神经网络上应用 NAS 时,需要统一的方式来表达架构的搜索空间,这样不必为不同的搜索算法来更改代码。
在用户代码中表示的神经网络搜索空间,可使用以下 API (以 PyTorch 为例):
```python
# 在 PyTorch module 类中
def __init__(self):
...
# 从 ``ops`` 中选择 ``ops``, 这是 PyTorch 中的 module。
# op_candidates: 在 PyTorch 中 ``ops`` 是 module 的 list,而在 TensorFlow 中是 Keras 层的 list。
# key: ``LayerChoice`` 实例的名称
self.one_layer = nni.nas.pytorch.LayerChoice([
PoolBN('max', channels, 3, stride, 1, affine=False),
PoolBN('avg', channels, 3, stride, 1, affine=False),
FactorizedReduce(channels, channels, affine=False),
SepConv(channels, channels, 3, stride, 1, affine=False),
DilConv(channels, channels, 3, stride, 2, 2, affine=False)],
key="layer_name")
...
def forward(self, x):
...
out = self.one_layer(x)
...
```
用户可为某层指定多个候选的操作,最后从其中选择一个。 `key` 是层的标识符,可被用来在多个 `LayerChoice` 间共享选项。 例如,两个 `LayerChoice` 有相同的候选操作,并希望能使用同样的选择,(即,如果第一个选择了第 `i` 个操作,第二个也应该选择第 `i` 个操作),则可给它们相同的 key。
```python
def __init__(self):
...
# 从 ``n_candidates`` 个输入中选择 ``n_selected`` 个。
# n_candidates: 候选输入数量
# n_chosen: 选择的数量
# key: ``InputChoice`` 实例的名称
self.input_switch = nni.nas.pytorch.InputChoice(
n_candidates=3,
n_chosen=1,
key="switch_name")
...
def forward(self, x):
...
out = self.input_switch([in_tensor1, in_tensor2, in_tensor3])
...
```
`InputChoice` 是一个 PyTorch module,初始化时需要元信息,例如,从多少个输入后选中选择多少个输入,以及初始化的 `InputChoice` 名称。 真正候选的输入张量只能在 `forward` 函数中获得。 在 `forward` 函数中,`InputChoice` 模块需要在 `__init__` 中创建 (如, `self.input_switch`),其会在有了实际候选输入 Tensor 的时候被调用。
一些 [NAS Trainer](#one-shot-training-mode) 需要知道输入张量的来源层,因此在 `InputChoice` 中添加了输入参数 `choose_from` 来表示每个候选输入张量的来源层。 `choose_from` 是 str 的 list,每个元素都是 `LayerChoice``InputChoice``key`,或者 module 的 name (详情参考[代码](https://github.com/microsoft/nni/blob/master/src/sdk/pynni/nni/nas/pytorch/mutables.py))。
除了 `LayerChoice``InputChoice`,还提供了 `MutableScope`,可以让用户标记自网络,从而给 NAS Trainer 提供更多的语义信息 (如网络结构)。 示例如下:
```python
class Cell(mutables.MutableScope):
def __init__(self, scope_name):
super().__init__(scope_name)
self.layer1 = nni.nas.pytorch.LayerChoice(...)
self.layer2 = nni.nas.pytorch.LayerChoice(...)
self.layer3 = nni.nas.pytorch.LayerChoice(...)
...
```
名为 `scope_name``MutableScope` 包含了三个 `LayerChoice` 层 (`layer1`, `layer2`, `layer3`)。 NAS Trainer 可获得这样的分层结构。
## 两种训练模式
在使用上述 API 在模型中嵌入 搜索空间后,下一步是从搜索空间中找到最好的模型。 有两种训练模式:[one-shot 训练模式](#one-shot-training-mode) and [经典的分布式搜索](#classic-distributed-search)
### One-shot 训练模式
与深度学习模型的优化器相似,从搜索空间中找到最好模型的过程可看作是优化过程,称之为 `NAS Trainer`。 NAS Trainer 包括 `DartsTrainer` 使用了 SGD 来交替训练架构和模型权重,`ENASTrainer` 使用 Controller 来训练模型。 新的、更高效的 NAS Trainer 在研究界不断的涌现出来。
NNI 提供了一些流行的 NAS Trainer,要使用 NAS Trainer,用户需要在模型定义后初始化 Trainer:
```python
# 创建 DartsTrainer
trainer = DartsTrainer(model,
loss=criterion,
metrics=lambda output, target: accuracy(output, target, topk=(1,)),
optimizer=optim,
num_epochs=args.epochs,
dataset_train=dataset_train,
dataset_valid=dataset_valid,)
# 从搜索空间中找到最好的模型
trainer.train()
# 导出最好的模型
trainer.export(file='./chosen_arch')
```
不同的 Trainer 可能有不同的输入参数,具体取决于其算法。 详细参数可参考具体的 [Trainer 代码](https://github.com/microsoft/nni/tree/master/src/sdk/pynni/nni/nas/pytorch)。 训练完成后,可通过 `trainer.export()` 导出找到的最好的模型。 无需通过 `nnictl` 来启动 NNI Experiment。
[这里](Overview.md#支持的-one-shot-nas-算法)是所有支持的 Trainer。 [这里](https://github.com/microsoft/nni/tree/master/examples/nas/simple/train.py)是使用 NNI NAS API 的简单示例。
### 经典分布式搜索
神经网络架构搜索通过在 Trial 任务中独立运行单个子模型来实现。 NNI 同样支持这种搜索方法,其天然适用于 NNI 的超参搜索框架。Tuner 为每个 Trial 生成子模型,并在训练平台上运行。
要使用此模式,不需要修改 NNI NAS API 的搜索空间定义 (即, `LayerChoice`, `InputChoice`, `MutableScope`)。 模型初始化后,在模型上调用 `get_and_apply_next_architecture`。 One-shot NAS Trainer 不能在此模式中使用。 简单示例:
```python
class Net(nn.Module):
# 使用 LayerChoice 和 InputChoice 的模型
...
model = Net()
# 从 Tuner 中选择架构,并应用到模型上
get_and_apply_next_architecture(model)
# 训练模型
train(model)
# 测试模型
acc = test(model)
# 返回此架构的性能
nni.report_final_result(acc)
```
搜索空间应自动生成,并发送给 Tuner。 通过 NNI NAS API,搜索空间嵌入在用户代码中,需要通过 "[nnictl ss_gen](../Tutorial/Nnictl.md)" 来生成搜索空间文件。 然后,将生成的搜索空间文件路径填入 `config.yml``searchSpacePath``config.yml` 中的其它字段参考[教程](../Tutorial/QuickStart.md)
可使用 [NNI Tuner](../Tuner/BuiltinTuner.md) 来搜索。
为了便于调试,其支持独立运行模式,可直接运行 Trial 命令,而不启动 NNI Experiment。 可以通过此方法来检查 Trial 代码是否可正常运行。 在独立模式下,`LayerChoice``InputChoice` 会选择最开始的候选项。
[此处](https://github.com/microsoft/nni/tree/master/examples/nas/classic_nas/config_nas.yml)是完整示例。
## NAS 算法的编程接口
通过简单的接口,可在 NNI 上实现新的 NAS Trainer。
### 在 NNI 上实现新的 NAS Trainer
要实现新的 NAS Trainer,基本上只需要继承 `BaseMutator``BaseTrainer` 这两个类。
`BaseMutator` 中,需要重载 `on_forward_layer_choice``on_forward_input_choice`,这是 `LayerChoice``InputChoice` 相应的实现。 可使用属性 `mutables` 来获得模型中所有的 `LayerChoice``InputChoice`。 然后实现新的 Trainer,来实例化新的 Mutator 并实现训练逻辑。 详细信息,可参考[代码](https://github.com/microsoft/nni/tree/master/src/sdk/pynni/nni/nas/pytorch),及支持的 Trainer,如 [DartsTrainer](https://github.com/microsoft/nni/tree/master/src/sdk/pynni/nni/nas/pytorch/darts)
### 为 NAS 实现 NNI Tuner
NNI 中的 NAS Tuner 需要自动生成搜索空间。 `LayerChoice``InputChoice` 的搜索空间格式如下:
```json
{
"key_name": {
"_type": "layer_choice",
"_value": ["op1_repr", "op2_repr", "op3_repr"]
},
"key_name": {
"_type": "input_choice",
"_value": {
"candidates": ["in1_key", "in2_key", "in3_key"],
"n_chosen": 1
}
}
}
```
相应的,生成的网络架构格式如下:
```json
{
"key_name": {
"_value": "op1_repr",
"_idx": 0
},
"key_name": {
"_value": ["in2_key"],
"_idex": [1]
}
}
```
...@@ -221,7 +221,7 @@ ...@@ -221,7 +221,7 @@
- 文档 - 文档
- 更新文档结构 -Issue #1231 - 更新文档结构 -Issue #1231
- [多阶段文档的改进](AdvancedFeature/MultiPhase.md) -Issue #1233 -PR #1242 - (已删除) 多阶段文档的改进 -Issue #1233 -PR #1242
+ 添加配置示例 + 添加配置示例
+ [Web 界面描述改进](Tutorial/WebUI.md) -PR #1419 + [Web 界面描述改进](Tutorial/WebUI.md) -PR #1419
...@@ -250,16 +250,11 @@ ...@@ -250,16 +250,11 @@
* 为 NAS 接口添加 `enas-mode``oneshot-mode`[PR #1201](https://github.com/microsoft/nni/pull/1201#issue-291094510) * 为 NAS 接口添加 `enas-mode``oneshot-mode`[PR #1201](https://github.com/microsoft/nni/pull/1201#issue-291094510)
* [有 Matern 核的高斯 Tuner](Tuner/GPTuner.md) * [有 Matern 核的高斯 Tuner](Tuner/GPTuner.md)
* 支持多阶段 Experiment * (已删除) 支持多阶段 Experiment
* 为多阶段 Experiment 增加新的训练平台:pai 模式从 v0.9 开始支持多阶段 Experiment。 * 为多阶段 Experiment 增加新的训练平台:pai 模式从 v0.9 开始支持多阶段 Experiment。
* 为以下内置 Tuner 增加多阶段的功能: * 为以下内置 Tuner 增加多阶段的功能:
* TPE, Random Search, Anneal, Naïve Evolution, SMAC, Network Morphism, Metis Tuner。 * TPE, Random Search, Anneal, Naïve Evolution, SMAC, Network Morphism, Metis Tuner。
有关详细信息,参考[实现多阶段的 Tuner](AdvancedFeature/MultiPhase.md)
* Web 界面 * Web 界面
* 在 Web 界面中可比较 Trial。 有关详细信息,参考[查看 Trial 状态](Tutorial/WebUI.md) * 在 Web 界面中可比较 Trial。 有关详细信息,参考[查看 Trial 状态](Tutorial/WebUI.md)
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
## 安装 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。 如果集群需要认证,则需要为 FrameworkController 创建服务账户并授予权限,然后将 FrameworkController 服务账户的名称设置到 NNI Experiment 配置中。 [参考文档](https://github.com/Microsoft/frameworkcontroller/tree/master/example/run#run-by-kubernetes-statefulset)
## 设计 ## 设计
...@@ -83,6 +83,7 @@ frameworkcontrollerConfig: ...@@ -83,6 +83,7 @@ frameworkcontrollerConfig:
```yaml ```yaml
frameworkcontrollerConfig: frameworkcontrollerConfig:
storage: azureStorage storage: azureStorage
serviceAccountName: {your_frameworkcontroller_service_account_name}
keyVault: keyVault:
vaultName: {your_vault_name} vaultName: {your_vault_name}
name: {your_secert_name} name: {your_secert_name}
......
...@@ -90,8 +90,18 @@ paiConfig: ...@@ -90,8 +90,18 @@ paiConfig:
* 必填。 在 OpenPAI 的容器中设置挂载路径。 * 必填。 在 OpenPAI 的容器中设置挂载路径。
* paiStoragePlugin * paiStoragePlugin
* 可选。 设置 PAI 中使用的存储插件的名称。 如果没在 Trial 配置中设置,则需要在 `paiConfigPath` 指定的配置文件中设置。 * 可选。 设置 PAI 中使用的存储插件的名称。 如果没在 Trial 配置中设置,则需要在 `paiConfigPath` 指定的配置文件中设置。
* paiConfigPath * command
* 可选。 设置 OpenPAI 作业配置文件路径,文件为 YAML 格式。 * 可选。 设置 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 中,否则可能会产生错误。
完成并保存 NNI Experiment 配置文件后(例如可保存为:exp_pai.yml),运行以下命令: 完成并保存 NNI Experiment 配置文件后(例如可保存为:exp_pai.yml),运行以下命令:
......
...@@ -67,10 +67,6 @@ tuner: ...@@ -67,10 +67,6 @@ tuner:
随机搜索,可用于每个 Trial 运行时间不长(例如,能够非常快的完成,或者很快的被 Assessor 终止),并有充足计算资源的情况下。 如果要均衡的探索搜索空间,它也很有用。 随机搜索可作为搜索算法的基准线。 [详细说明](./HyperoptTuner.md) 随机搜索,可用于每个 Trial 运行时间不长(例如,能够非常快的完成,或者很快的被 Assessor 终止),并有充足计算资源的情况下。 如果要均衡的探索搜索空间,它也很有用。 随机搜索可作为搜索算法的基准线。 [详细说明](./HyperoptTuner.md)
**classArgs 要求:**
* **optimize_mode** (*maximize 或 minimize, 可选项, 默认值为 maximize*) - 如果为 'maximize',表示 Tuner 会试着最大化指标。 如果为 'minimize',表示 Tuner 的目标是将指标最小化。
**配置示例:** **配置示例:**
```yaml ```yaml
...@@ -466,7 +462,7 @@ Population Based Training (PBT,基于种群的训练),将并扩展并行搜 ...@@ -466,7 +462,7 @@ Population Based Training (PBT,基于种群的训练),将并扩展并行搜
**classArgs 要求:** **classArgs 要求:**
* **optimize_mode** (*'maximize' 或 'minimize'*) - 如果为 'maximize',表示 Tuner 的目标是将指标最大化。 如果为 'minimize',表示 Tuner 的目标是将指标最小化。 * **optimize_mode** (*'maximize' 或 'minimize'*) - 如果为 'maximize',表示 Tuner 的目标是将指标最大化。 如果为 'minimize',表示 Tuner 的目标是将指标最小化。
* **all_checkpoint_dir** (*str, 可选, 默认为 None*) - Trial 保存读取检查点的目录,如果不指定,其为 "~/nni/checkpoint/<exp-id>" 注意,如果 Experiment 不是本机模式,用户需要提供能被所有 Trial 所访问的共享存储。 * **all_checkpoint_dir** (*str, 可选, 默认为 None*) - Trial 保存读取检查点的目录,如果不指定,其为 "~/nni/checkpoint/<exp-id>". 注意,如果 Experiment 不是本机模式,用户需要提供能被所有 Trial 所访问的共享存储。
* **population_size** (*int, 可选, 默认为 10*) - 种群的 Trial 数量。 每个步骤有此数量的 Trial。 在 NNI 的实现中,一步表示每个 Trial 运行一定次数 Epoch,此 Epoch 的数量由用户来指定。 * **population_size** (*int, 可选, 默认为 10*) - 种群的 Trial 数量。 每个步骤有此数量的 Trial。 在 NNI 的实现中,一步表示每个 Trial 运行一定次数 Epoch,此 Epoch 的数量由用户来指定。
* **factors** (*tuple, 可选, 默认为 (1.2, 0.8)*) - 超参变动量的因子。 * **factors** (*tuple, 可选, 默认为 (1.2, 0.8)*) - 超参变动量的因子。
* **fraction** (*float, 可选, 默认为 0.2*) - 选择的最低和最高 Trial 的比例。 * **fraction** (*float, 可选, 默认为 0.2*) - 选择的最低和最高 Trial 的比例。
......
...@@ -51,7 +51,7 @@ class CustomizedTuner(Tuner): ...@@ -51,7 +51,7 @@ class CustomizedTuner(Tuner):
... ...
``` ```
`receive_trial_result` 从输入中会接收 `parameter_id, parameters, value` 参数。 Tuner 会收到 Trial 进程发送的完全一样的 `value` 值。 如果在 Experiment 配置文件里 `multiPhase``true`, 会有一个附加的 `trial_job_id``**kwargs` 参数中返回给 `receive_trial_result``generate_parameters` `receive_trial_result` 从输入中会接收 `parameter_id, parameters, value` 参数。 Tuner 会收到 Trial 进程发送的完全一样的 `value` 值。
`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`
......
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
- [trainingServicePlatform](#trainingserviceplatform) - [trainingServicePlatform](#trainingserviceplatform)
- [searchSpacePath](#searchspacepath) - [searchSpacePath](#searchspacepath)
- [useAnnotation](#useannotation) - [useAnnotation](#useannotation)
- [multiPhase](#multiphase)
- [multiThread](#multithread) - [multiThread](#multithread)
- [nniManagerIp](#nnimanagerip) - [nniManagerIp](#nnimanagerip)
- [logDir](#logdir) - [logDir](#logdir)
...@@ -92,8 +91,6 @@ searchSpacePath: ...@@ -92,8 +91,6 @@ searchSpacePath:
# 可选项: true, false, 默认值: false # 可选项: true, false, 默认值: false
useAnnotation: useAnnotation:
# 可选项: true, false, 默认值: false # 可选项: true, false, 默认值: false
multiPhase:
# 可选项: true, false, 默认值: false
multiThread: multiThread:
tuner: tuner:
# 可选项: TPE, Random, Anneal, Evolution # 可选项: TPE, Random, Anneal, Evolution
...@@ -128,8 +125,6 @@ searchSpacePath: ...@@ -128,8 +125,6 @@ searchSpacePath:
#可选项: true, false, 默认值: false #可选项: true, false, 默认值: false
useAnnotation: useAnnotation:
#可选项: true, false, 默认值: false #可选项: true, false, 默认值: false
multiPhase:
#可选项: true, false, 默认值: false
multiThread: multiThread:
tuner: tuner:
#可选项: TPE, Random, Anneal, Evolution #可选项: TPE, Random, Anneal, Evolution
...@@ -170,8 +165,6 @@ trainingServicePlatform: ...@@ -170,8 +165,6 @@ trainingServicePlatform:
#可选项: true, false, 默认值: false #可选项: true, false, 默认值: false
useAnnotation: useAnnotation:
#可选项: true, false, 默认值: false #可选项: true, false, 默认值: false
multiPhase:
#可选项: true, false, 默认值: false
multiThread: multiThread:
tuner: tuner:
#可选项: TPE, Random, Anneal, Evolution #可选项: TPE, Random, Anneal, Evolution
...@@ -283,12 +276,6 @@ NNI 会校验 remote, pai 和 Kubernetes 模式下 NNIManager 与 trialKeeper ...@@ -283,12 +276,6 @@ NNI 会校验 remote, pai 和 Kubernetes 模式下 NNIManager 与 trialKeeper
注意:如果 **useAnnotation** 为 true,searchSpacePath 字段会被删除。 注意:如果 **useAnnotation** 为 true,searchSpacePath 字段会被删除。
### multiPhase
可选。 布尔。 默认值:false。
启用[多阶段 Experiment](../AdvancedFeature/MultiPhase.md)
### multiThread ### multiThread
可选。 布尔。 默认值:false。 可选。 布尔。 默认值:false。
......
# 安装 NNI
当前支持在 Linux,macOS 和 Windows 下安装。
## 在 Linux 或 macOS 上安装
* 通过 pip 命令安装 NNI
先决条件:`python 64-bit >= 3.5`
```bash
python3 -m pip install --upgrade nni
```
* 通过源代码安装 NNI
如果对某个或最新版本的代码感兴趣,可通过源代码安装 NNI。
先决条件:`python 64-bit >=3.5`, `git`, `wget`
```bash
git clone -b v0.8 https://github.com/Microsoft/nni.git
cd nni
./install.sh
```
* 在 Docker 映像中使用 NNI
也可将 NNI 安装到 docker 映像中。 参考[这里](../deployment/docker/README.md)来生成 NNI 的 Docker 映像。 也可通过此命令从 Docker Hub 中直接拉取 NNI 的映像 `docker pull msranni/nni:latest`
## 在 Windows 上安装
强烈建议使用 Anaconda 或 Miniconda 来管理多个 Python 环境。
* 通过 pip 命令安装 NNI
先决条件:`python 64-bit >= 3.5`
```bash
python -m pip install --upgrade nni
```
* 通过源代码安装 NNI
如果对某个或最新版本的代码感兴趣,可通过源代码安装 NNI。
先决条件:`python 64-bit >=3.5`, `git`, `PowerShell`
```bash
git clone -b v0.8 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.3 https://github.com/Microsoft/nni.git
```
* 运行 MNIST 示例。
Linux 或 macOS
```bash
nnictl create --config nni/examples/trials/mnist-tfv1/config.yml
```
Windows
```bash
nnictl create --config nni\examples\trials\mnist-tfv1\config_windows.yml
```
* 在命令行中等待输出 `INFO: Successfully started experiment!`。 此消息表明 Experiment 已成功启动。 通过命令行输出的 `Web UI url` 来访问 Experiment 的界面。
```text
INFO: Starting restful server...
INFO: Successfully started Restful server!
INFO: Setting local config...
INFO: Successfully set local config!
INFO: Starting experiment...
INFO: Successfully started experiment!
-----------------------------------------------------------------------
The experiment id is egchD4qy
The Web UI urls are: http://223.255.255.1:8080 http://127.0.0.1:8080
-----------------------------------------------------------------------
You can use these commands to get more information about the experiment
-----------------------------------------------------------------------
commands description
1. nnictl experiment show show the information of experiments
2. nnictl trial ls list all of trial jobs
3. nnictl top monitor the status of running experiments
4. nnictl log stderr show stderr log content
5. nnictl log stdout show stdout log content
6. nnictl stop stop an experiment
7. nnictl trial kill kill a trial job by id
8. nnictl --help get help information about nnictl
-----------------------------------------------------------------------
```
* 在浏览器中打开 `Web UI url`,可看到下图的 Experiment 详细信息,以及所有的 Trial 任务。 查看[这里](../Tutorial/WebUI.md)的更多页面。
![概述](../../img/webui_overview_page.png)
![详细说明](../../img/webui_trialdetail_page.png)
## 系统需求
由于程序变更,NNI 的最低配置会有所更改。
### Linux
| | 推荐配置 | 最低配置 |
| -------- | ----------------------------------------- | ------------------------------------- |
| **操作系统** | Ubuntu 16.04 或以上版本 | |
| **CPU** | Intel® Core™ i5 或 AMD Phenom™ II X3 或更高配置 | Intel® Core™ i3 或 AMD Phenom™ X3 8650 |
| **GPU** | NVIDIA® GeForce® GTX 660 或更高配置 | NVIDIA® GeForce® GTX 460 |
| **内存** | 6 GB | 4 GB |
| **存储** | 30 GB 可用的磁盘空间 | |
| **网络** | 宽带连接 | |
| **分辨率** | 1024 x 768 以上 | |
### macOS
| | 推荐配置 | 最低配置 |
| -------- | ------------------------ | -------------------------------------------------- |
| **操作系统** | macOS 10.14.1 或更高版本 | |
| **CPU** | Intel® Core™ i7-4770 或更高 | Intel® Core™ i5-760 或更高 |
| **GPU** | AMD Radeon™ R9 M395X 或更高 | NVIDIA® GeForce® GT 750M 或 AMD Radeon™ R9 M290 或更高 |
| **内存** | 8 GB | 4 GB |
| **存储** | 70GB 可用空间 SSD 硬盘 | 70GB 可用空间及 7200 RPM 硬盘 |
| **网络** | 宽带连接 | |
| **分辨率** | 1024 x 768 以上 | |
### Windows
| | 推荐配置 | 最低配置 |
| -------- | ----------------------------------------- | ------------------------------------- |
| **操作系统** | Windows 10 1809 或更高版本 | |
| **CPU** | Intel® Core™ i5 或 AMD Phenom™ II X3 或更高配置 | Intel® Core™ i3 或 AMD Phenom™ X3 8650 |
| **GPU** | NVIDIA® GeForce® GTX 660 或更高配置 | NVIDIA® GeForce® GTX 460 |
| **内存** | 6 GB | 4 GB |
| **存储** | 30 GB 可用的磁盘空间 | |
| **网络** | 宽带连接 | |
| **分辨率** | 1024 x 768 以上 | |
## 更多
* [概述](../Overview.md)
* [使用命令行工具 nnictl](Nnictl.md)
* [使用 NNIBoard](WebUI.md)
* [定制搜索空间](SearchSpaceSpec.md)
* [配置 Experiment](ExperimentConfig.md)
* [如何在本机运行 Experiment (支持多 GPU 卡)?](../TrainingService/LocalMode.md)
* [如何在多机上运行 Experiment?](../TrainingService/RemoteMachineMode.md)
* [如何在 OpenPAI 上运行 Experiment?](../TrainingService/PaiMode.md)
* [如何通过 Kubeflow 在 Kubernetes 上运行 Experiment?](../TrainingService/KubeflowMode.md)
* [如何通过 FrameworkController 在 Kubernetes 上运行 Experiment?](../TrainingService/FrameworkControllerMode.md)
\ No newline at end of file
# Windows 上的 NNI(实验阶段的功能)
在 Windows 上运行 NNI 是测试中的功能。 推荐 Windows 10 的 1809 版,其经过了测试。
## **在 Windows 上安装**
详细信息参考[安装文档](Installation.md)
完成操作后,使用 **config_windows.yml** 配置来开始 Experiment 进行验证。
```bash
nnictl create --config nni\examples\trials\mnist-tfv1\config_windows.yml
```
同样,其它示例的 YAML 配置中也需将 Trial 命令的 `python3` 替换为 `python`
## **常见问答**
### 安装 NNI 时出现 simplejson 错误
确保安装了 C++ 14.0 编译器。
> building 'simplejson._speedups' extension error: [WinError 3] The system cannot find the path specified
### 在命令行或 PowerShell 中,Trial 因为缺少 DLL 而失败
此错误因为缺少 LIBIFCOREMD.DLL 和 LIBMMD.DLL 文件,且 SciPy 安装失败。 使用 Anaconda 或 Miniconda 和 Python(64位)可解决。
> ImportError: DLL load failed
### Web 界面上的 Trial 错误
检查 Trial 日志文件来了解详情。
如果存在 stderr 文件,也需要查看其内容。 可能的错误情况包括:
* 忘记将 Experiment 配置的 Trial 命令中的 `python3` 改为 `python`
* 忘记安装 Experiment 的依赖,如 TensorFlow,Keras 等。
### 无法在 Windows 上使用 BOHB
确保安装了 C ++ 14.0 编译器然后尝试运行 `nnictl package install --name=BOHB` 来安装依赖项。
### Windows 上不支持的 Tuner
当前不支持 SMAC,原因可参考[此问题](https://github.com/automl/SMAC3/issues/483)
### 将 Windows 服务器用作远程服务器
目前不支持。
注意:
* 如果遇到如 `Segmentation fault` 这样的任何错误,参考[常见问题](FAQ.md)
\ No newline at end of file
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
来克隆源代码 来克隆源代码
### 2. 准备调试环境并安装依赖项** ### 2. 准备调试环境并安装依赖项
将目录切换到源码目录,然后运行命令 将目录切换到源码目录,然后运行命令
...@@ -61,10 +61,8 @@ Trial 启动 Experiment 来检查环境。 例如,运行命令 ...@@ -61,10 +61,8 @@ Trial 启动 Experiment 来检查环境。 例如,运行命令
#### TypeScript #### TypeScript
* 如果要更改 `src/nni_manager`,运行 `yarn watch` 可持续编译改动。 它将实时重建代码。 * 如果要更改 `src/nni_manager`,运行 `yarn watch` 可持续编译改动。 它将实时重建代码。 可能需要重新启动 nnictl 来重新加载 NNI 管理器。
* 如果更改了 `src/webui``src/nasui` ,请使用 **第 3 步** 来重建代码。 * 如果改动了 `src/webui``src/nasui`,在相应目录下运行 `yarn start`。 Web 界面会在代码修改后自动刷新。
可能需要重新启动 nnictl。
* * * * * *
......
高级功能
=====================
.. toctree::
多阶段<./AdvancedFeature/MultiPhase>
Assessor(评估器)
==================
为了节省计算资源,在 NNI 中可通过创建 **Assessor**,来配置提前终止策略。
Assessor 从 Trial 中接收中间结果,并通过指定的算法决定此 Trial 是否应该终止。 一旦 Trial 满足了提前终止策略(这表示 Assessor 认为最终结果不会太好),Assessor 会终止此 Trial,并将其状态标志为 `"EARLY_STOPPED"`。
这是 MNIST 在使用了 'Curvefitting' Assessor 的 'maximize' 模式后的实验结果,可以看到 Assessor 成功的将大量最终结果不好的 Trial **提前结束** 。 使用 Assessor,能在相同的计算资源下,得到更好的结果。
*实现代码:config_assessor.yml <https://github.com/Microsoft/nni/blob/master/examples/trials/mnist-tfv1/config_assessor.yml>*
.. image:: ../img/Assessor.png
与 Tuner 类似,可使用内置的 Assessor,也可以自定义 Assessor。 参考下列教程,获取详细信息:
.. toctree::
:maxdepth: 2
内置 Assessor<builtin_assessor>
自定义 Assessor<Assessor/CustomizeAssessor>
...@@ -45,6 +45,7 @@ extensions = [ ...@@ -45,6 +45,7 @@ extensions = [
'sphinx_markdown_tables', 'sphinx_markdown_tables',
'sphinxarg.ext', 'sphinxarg.ext',
'sphinx.ext.napoleon', 'sphinx.ext.napoleon',
'sphinx.ext.viewcode',
] ]
# 添加示例模块 # 添加示例模块
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
.. toctree:: .. toctree::
:maxdepth: 2 :maxdepth: 2
启用多阶段 <AdvancedFeature/MultiPhase>
编写新的 Tuner <Tuner/CustomizeTuner> 编写新的 Tuner <Tuner/CustomizeTuner>
编写新的 Assessor <Assessor/CustomizeAssessor> 编写新的 Assessor <Assessor/CustomizeAssessor>
编写新的 Advisor <Tuner/CustomizeAdvisor> 编写新的 Advisor <Tuner/CustomizeAdvisor>
......
#################
Tuner(调参器)
#################
NNI 能用简单快速的方法来配置超参调优算法,称之为 **Tuner**。
Tuner 从 Trial 接收指标结果,来评估一组超参或网络结构的性能。 然后 Tuner 会将下一组超参或网络结构的配置发送给新的 Trial。
在 NNI 中,有两种方法来选择调优算法:可以使用内置的 Tuner,也可以自定义 Tuner。 另外,也可以使用 Advisor,它同时支持 Tuner 和 Assessor 的功能。
详细信息,参考以下教程:
.. toctree::
:maxdepth: 2
内置 Tuner<builtin_tuner>
自定义 Tuner<Tuner/CustomizeTuner>
自定义 Advisor<Tuner/CustomizeAdvisor>
######################
教程
######################
.. toctree::
:maxdepth: 2
安装<Tutorial/Installation>
实现 Trial<./TrialExample/Trials>
Tuner<tuners>
Assessor<assessors>
NAS (Beta) <nas>
模型压缩 (Beta) <model_compression>
特征工程 (Beta) <feature_engineering>
Web 界面<Tutorial/WebUI>
训练平台<training_services>
如何使用 Docker<Tutorial/HowToUseDocker>
高级功能<advanced>
如何调试<Tutorial/HowToDebug>
Windows 中使用 NNI<Tutorial/NniOnWindows>
\ No newline at end of file
# 加速掩码的模型
*此功能还处于预览版。*
## 介绍
剪枝算法通常都用权重掩码来模拟实际的剪枝。 掩码可以用来检查某个剪枝(或稀疏)算法的模型性能,但还没有真正加速。 模型加速才是模型剪枝的最终目标。因此提供了此工具,来帮助基于用户提供的掩码(掩码来自于剪枝算法),将已有模型转换成小模型。
有两种剪枝算法。 一种是细粒度的剪枝,不改变权重形状,和输入输出的张量。 稀疏内核会被用来加速细粒度剪枝的层。 另一类是粗粒度的剪枝(例如,通道),通常,权重形状,输入输出张量会有所改变。 要加速这类剪枝算法,不需要使用系数内核,只需要用更小的层来替换。 由于开源社区中对稀疏内核的支持还比较有限,当前仅支持粗粒度剪枝,会在将来再支持细粒度的剪枝算法。
## 设计和实现
为了加速模型,被剪枝的层应该被替换掉,要么为粗粒度掩码使用较小的层,要么用稀疏内核来替换细粒度的掩码。 粗粒度掩码通常会改变权重的形状,或输入输出张量,因此,应该通过形状推断,来检查是否其它未被剪枝的层由于形状变化而需要改变形状。 因此,在设计中,主要有两个步骤:第一,做形状推理,找出所有应该替换的模块;第二,替换模块。 第一步需要模型的拓扑(即连接),我们使用了 `jit.trace` 来获取 PyTorch 的模型图。
对于每个模块,要准备四个函数,三个用于形状推理,一个用于模块替换。 三个形状推理函数是:给定权重形状推断输入/输出形状,给定输入形状推断权重/输出形状,给定输出形状推断权重/输入形状。 模块替换功能返回一个较小的新创建的模块。
## 用法
```python
from nni.compression.speedup.torch import ModelSpeedup
# model: 要加速的模型
# dummy_input: 模型的示输入,传给 `jit.trace`
# masks_file: 剪枝算法创建的掩码文件
m_speedup = ModelSpeedup(model, dummy_input.to(device), masks_file)
m_speedup.speedup_model()
dummy_input = dummy_input.to(device)
start = time.time()
out = model(dummy_input)
print('elapsed time: ', time.time() - start)
```
完整示例参考[这里](https://github.com/microsoft/nni/tree/master/examples/model_compress/model_speedup.py)
注意:当前实现仅用于 torch 1.3.1 和 torchvision 0.4.2
## 局限性
由于每个模块需要 4 个函数用于形状推理和模块替换,因此工作量较大,当前仅实现了示例所需的函数。 如果要加速自己的模型,但当前不支持,欢迎贡献。
对于 PyTorch,仅提供了替换模块,如果是在 `forward` 中的函数,当前不支持。 一种解决方案是将函数变为 PyTorch 模块。
## 示例的加速结果
实验代码可在[这里](https://github.com/microsoft/nni/tree/master/examples/model_compress/model_speedup.py)找到。
### slim Pruner 示例
在一块 V100 GPU 上, 输入张量:`torch.randn(64, 3, 32, 32)`
| 次数 | 掩码时延 | 加速后的时延 |
| -- | ------- | -------- |
| 1 | 0.01197 | 0.005107 |
| 2 | 0.02019 | 0.008769 |
| 4 | 0.02733 | 0.014809 |
| 8 | 0.04310 | 0.027441 |
| 16 | 0.07731 | 0.05008 |
| 32 | 0.14464 | 0.10027 |
### fpgm Pruner 示例
在 CPU 上, 输入张量:`torch.randn(64, 1, 28, 28)`, 方差较大
| 次数 | 掩码时延 | 加速后的时延 |
| --- | ------- | -------- |
| 1 | 0.01383 | 0.01839 |
| 2 | 0.01167 | 0.003558 |
| 4 | 0.01636 | 0.01088 |
| 40 | 0.14412 | 0.08268 |
| 40 | 1.29385 | 0.14408 |
| 40 | 0.41035 | 0.46162 |
| 400 | 6.29020 | 5.82143 |
### l1filter Pruner 示例
在一块 V100 GPU 上, 输入张量:`torch.randn(64, 3, 32, 32)`
| 次数 | 掩码时延 | 加速后的时延 |
| -- | ------- | -------- |
| 1 | 0.01026 | 0.003677 |
| 2 | 0.01657 | 0.008161 |
| 4 | 0.02458 | 0.020018 |
| 8 | 0.03498 | 0.025504 |
| 16 | 0.06757 | 0.047523 |
| 32 | 0.10487 | 0.086442 |
### APoZ Pruner 示例
在一块 V100 GPU 上, 输入张量:`torch.randn(64, 3, 32, 32)`
| 次数 | 掩码时延 | 加速后的时延 |
| -- | ------- | -------- |
| 1 | 0.01389 | 0.004208 |
| 2 | 0.01628 | 0.008310 |
| 4 | 0.02521 | 0.014008 |
| 8 | 0.03386 | 0.023923 |
| 16 | 0.06042 | 0.046183 |
| 32 | 0.12421 | 0.087113 |
\ 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