Skip to content
This repository has been archived by the owner on Sep 18, 2024. It is now read-only.

Commit

Permalink
Chinese translation (#2250)
Browse files Browse the repository at this point in the history
  • Loading branch information
squirrelsc authored Apr 20, 2020
1 parent aca75e8 commit bcb53a7
Show file tree
Hide file tree
Showing 20 changed files with 334 additions and 47 deletions.
8 changes: 5 additions & 3 deletions README_zh_CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ NNI 管理自动机器学习 (AutoML) 的 Experiment,**调度运行**由调优
* 想要更容易**实现或试验新的自动机器学习算法**的研究员或数据科学家,包括:超参调优算法,神经网络搜索算法以及模型压缩算法。
* 在机器学习平台中**支持自动机器学习**

### **NNI v1.4 已发布! &nbsp;[<img width="48" src="docs/img/release_icon.png" />](#nni-released-reminder)**
### **NNI v1.5 已发布! &nbsp;[<img width="48" src="docs/img/release_icon.png" />](#nni-released-reminder)**

## **NNI 功能一览**

Expand Down Expand Up @@ -102,6 +102,7 @@ NNI 提供命令行工具以及友好的 WebUI 来管理训练的 Experiment。
<li><a href="docs/zh_CN/Tuner/BuiltinTuner.md#Evolution">Naïve Evolution(朴素进化)</a></li>
<li><a href="docs/zh_CN/Tuner/BuiltinTuner.md#Anneal">Anneal(退火算法)</a></li>
<li><a href="docs/zh_CN/Tuner/BuiltinTuner.md#Hyperband">Hyperband</a></li>
<li><a href="docs/zh_CN/Tuner/BuiltinTuner.md#PBTTuner">PBT</a></li>
</ul>
<b>贝叶斯优化</b>
<ul>
Expand All @@ -125,7 +126,8 @@ NNI 提供命令行工具以及友好的 WebUI 来管理训练的 Experiment。
<li><a href="docs/zh_CN/NAS/CDARTS.md">CDARTS</a></li>
<li><a href="docs/zh_CN/NAS/SPOS.md">SPOS</a></li>
<li><a href="docs/zh_CN/NAS/Proxylessnas.md">ProxylessNAS</a></li>
<li><a href="docs/zh_CN/Tuner/BuiltinTuner.md#NetworkMorphism">Network Morphism</a> </li>
<li><a href="docs/zh_CN/Tuner/BuiltinTuner.md#NetworkMorphism">Network Morphism</a></li>
<li><a href="docs/zh_CN/NAS/TextNAS.md">TextNAS</a></li>
</ul>
</ul>
<a href="docs/zh_CN/Compressor/Overview.md">模型压缩</a>
Expand Down Expand Up @@ -230,7 +232,7 @@ Linux 和 macOS 下 NNI 系统需求[参考这里](https://nni.readthedocs.io/zh
* 通过克隆源代码下载示例。

```bash
git clone -b v1.4 https://github.com/Microsoft/nni.git
git clone -b v1.5 https://github.com/Microsoft/nni.git
```

* 运行 MNIST 示例。
Expand Down
6 changes: 3 additions & 3 deletions docs/zh_CN/FeatureEngineering/Overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ from sklearn.feature_selection.base import SelectorMixin

from nni.feature_engineering.feature_selector import FeatureSelector

class CustomizedSelector(FeatureSelector, BaseEstimator):
class CustomizedSelector(FeatureSelector, BaseEstimator, SelectorMixin):
def __init__(self, ...):
...

Expand All @@ -157,9 +157,9 @@ class CustomizedSelector(FeatureSelector, BaseEstimator):
if not key.endswith('_')}
return params

def set_params(self, **params):
def set_params(self, **params):
"""
设置参数
为此 estimator 设置参数
"""
for param in params:
if hasattr(self, param):
Expand Down
8 changes: 5 additions & 3 deletions docs/zh_CN/NAS/NasGuide.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,9 @@ trainer.export(file="model_dir/final_architecture.json") # 将最终架构导

用户可直接通过 `python3 train.py` 开始训练,不需要使用 `nnictl`。 训练完成后,可通过 `trainer.export()` 导出找到的最好的模型。

通常,Trainer 会提供一些可以自定义的参数。 如,损失函数,指标函数,优化器以及数据集。 这些功能可满足大部分需求,NNI 会尽力让内置 Trainer 能够处理更多的模型、任务和数据集。 但无法保证全面的支持。 例如,一些 Trainer 假设必须是分类任务;一些 Trainer 对 "Epoch" 的定义有所不同(例如,ENAS 的 epoch 表示一部分子步骤加上一些 Controller 的步骤);大多数 Trainer 不支持分布式训练,不会将模型通过 `DataParallel``DistributedDataParallel` 进行包装。 如果通过试用,想要在定制的应用中使用 Trainer,可能需要[自定义 Trainer](#extend-the-ability-of-one-shot-trainers)
通常,Trainer 会提供一些可以自定义的参数。 如,损失函数,指标函数,优化器以及数据集。 这些功能可满足大部分需求,NNI 会尽力让内置 Trainer 能够处理更多的模型、任务和数据集。 但无法保证全面的支持。 例如,一些 Trainer 假设必须是分类任务;一些 Trainer 对 "Epoch" 的定义有所不同(例如,ENAS 的 epoch 表示一部分子步骤加上一些 Controller 的步骤);大多数 Trainer 不支持分布式训练,不会将模型通过 `DataParallel``DistributedDataParallel` 进行包装。 如果通过试用,想要在定制的应用中使用 Trainer,可能需要[自定义 Trainer](./Advanced.md#extend-the-ability-of-one-shot-trainers)

此外,可以使用 NAS 可视化来显示 One-Shot NAS。 [了解详情](./Visualization.md)

### 分布式 NAS

Expand Down Expand Up @@ -146,14 +148,14 @@ nni.report_final_result(acc) # 报告所选架构的性能

### 使用导出的架构重新训练

搜索阶段后,就该训练找到的架构了。 与很多开源 NAS 算法不同,它们为重新训练专门写了新的模型。 我们发现搜索模型和重新训练模型的过程非常相似,因而可直接将一样的模型代码用到最终模型上。 例如
搜索阶段后,就该训练找到的架构了。 与很多开源 NAS 算法不同,它们为重新训练专门写了新的模型。 我们发现搜索模型和重新训练模型的过程非常相似,因而可直接将一样的模型代码用到最终模型上。 例如

```python
model = Net()
apply_fixed_architecture(model, "model_dir/final_architecture.json")
```

JSON 文件是从 Mutable key 到 Choice 的表示。 例如
JSON 文件是从 Mutable key 到 Choice 的表示。 例如

```json
{
Expand Down
10 changes: 8 additions & 2 deletions docs/zh_CN/NAS/Overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,19 @@ NNI 目前支持下面列出的 NAS 算法,并且正在添加更多算法。
| [P-DARTS](PDARTS.md) | [Progressive Differentiable Architecture Search: Bridging the Depth Gap between Search and Evaluation](https://arxiv.org/abs/1904.12760) 基于DARTS。 它引入了一种有效的算法,可在搜索过程中逐渐增加搜索的深度。 |
| [SPOS](SPOS.md) | 论文 [Single Path One-Shot Neural Architecture Search with Uniform Sampling](https://arxiv.org/abs/1904.00420) 构造了一个采用统一的路径采样方法来训练简化的超网络,并使用进化算法来提高搜索神经网络结构的效率。 |
| [CDARTS](CDARTS.md) | [Cyclic Differentiable Architecture Search](https://arxiv.org/abs/****) 在搜索和评估的网络见构建了循环反馈的机制。 通过引入的循环的可微分架构搜索框架将两个网络集成为一个架构。 |
| [ProxylessNAS](Proxylessnas.md) | [ProxylessNAS: Direct Neural Architecture Search on Target Task and Hardware](https://arxiv.org/abs/1812.00332). |
| [ProxylessNAS](Proxylessnas.md) | [ProxylessNAS: Direct Neural Architecture Search on Target Task and Hardware](https://arxiv.org/abs/1812.00332). 它删除了代理,直接从大规模目标任务和目标硬件平台进行学习。 |
| [TextNAS](TextNAS.md) | [TextNAS: A Neural Architecture Search Space tailored for Text Representation](https://arxiv.org/pdf/1912.10729.pdf)。 这是专门用于文本表示的神经网络架构搜索算法。 |

One-shot 算法**不需要 nnictl,可单独运行**。 只实现了 PyTorch 版本。 将来的版本会支持 Tensorflow 2.x。

这是运行示例的一些常见依赖项。 PyTorch 需要高于 1.2 才能使用 `BoolTensor`.

* NNI 1.2+
* tensorboard
* PyTorch 1.2+
* git

一次性 NAS 可以通过可视化工具来查看。 点击[这里](./Visualization.md),了解详情。

## 支持的分布式 NAS 算法

| 名称 | 算法简介 |
Expand All @@ -49,6 +51,10 @@ One-shot 算法**不需要 nnictl,可单独运行**。 只实现了 PyTorch

[这里](./NasGuide.md)是在 NNI 上开始使用 NAS 的用户指南。

## NAS 可视化

为了帮助用户跟踪指定搜索空间下搜索模型的过程和状态,开发了此可视化工具。 它将搜索空间可视化为超网络,并显示子网络、层和操作的重要性,同时还能显示重要性是如何在搜索过程中变化的。 参考 [NAS 可视化](./Visualization.md)文档了解详情。

## 参考和反馈

* 在 GitHub 中[提交此功能的 Bug](https://github.com/microsoft/nni/issues/new?template=bug-report.md)
Expand Down
80 changes: 80 additions & 0 deletions docs/zh_CN/NAS/TextNAS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# TextNAS

## 介绍

这是论文 [TextNAS: A Neural Architecture Search Space tailored for Text Representation](https://arxiv.org/pdf/1912.10729.pdf) 中 TextNAS 算法的实现。 TextNAS 是用于文本表示的神经网络架构搜索算法,具体来说,TextNAS 基于由适配各种自然语言任务的操作符所组成的新的搜索空间,TextNAS 还支持单个网络中的多路径集成,来平衡网络的宽度和深度。

TextNAS 的搜索空间包含:

* 过滤器尺寸为 1, 3, 5, 7 的一维卷积操作
* 循环操作符(双向 GRU)
* 自注意操作符
* 池化操作符(最大值、平均值)

遵循 ENAS 算法,TextNAS 也用了参数共享来加速搜索速度,并采用了强化学习的 Controller 来进行架构采样和生成。 参考 TextNAS 论文了解更多细节。

## 准备

准备词向量和 SST 数据集,并按如下结构放到 data 目录中:

```
textnas
├── data
│ ├── sst
│ │ └── trees
│ │ ├── dev.txt
│ │ ├── test.txt
│ │ └── train.txt
│ └── glove.840B.300d.txt
├── dataloader.py
├── model.py
├── ops.py
├── README.md
├── search.py
└── utils.py
```

以下链接有助于查找和下载相应的数据集:

* [GloVe: Global Vectors for Word Representation](https://nlp.stanford.edu/projects/glove/)
* [glove.840B.300d.txt](http://nlp.stanford.edu/data/glove.840B.300d.zip)
* [Recursive Deep Models for Semantic Compositionality Over a Sentiment Treebank](https://nlp.stanford.edu/sentiment/)
* [trainDevTestTrees_PTB.zip](https://nlp.stanford.edu/sentiment/trainDevTestTrees_PTB.zip)

## 示例

### 搜索空间

[示例代码](https://github.com/microsoft/nni/tree/master/examples/nas/textnas)

```bash
#如果未克隆 NNI 代码。 如果代码已被克隆,请忽略此行并直接进入代码目录。
git clone https://github.com/Microsoft/nni.git

# 搜索最佳网络结构
cd examples/nas/textnas

# 查看搜索的更多选项
python3 search.py -h
```

在每个搜索 Epoch 后,会直接测试 10 个采样的结构。 10 个 Epoch 后的性能预计为 40% - 42%。

默认情况下,20 个采样结构会被导出到 `checkpoints` 目录中,以便进行下一步处理。

### 重新训练

```bash
#如果未克隆 NNI 代码。 如果代码已被克隆,请忽略此行并直接进入代码目录。
git clone https://github.com/Microsoft/nni.git

# 搜索最佳网络结构
cd examples/nas/textnas

# 默认在 sst-2 上训练
sh run_retrain.sh
```

## 参考

TextNAS 直接使用了 EnasTrainer,参考 [ENAS](./ENAS.md) 了解 Trainer 的 API。
69 changes: 69 additions & 0 deletions docs/zh_CN/NAS/Visualization.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# NAS 可视化(测试版)

## 内置 Trainer 支持

当前,仅 ENAS 和 DARTS 支持可视化。 [ENAS](./ENAS.md)[DARTS](./DARTS.md) 的示例演示了如何在代码中启用可视化,其需要在 `trainer.train()` 前添加代码。

```python
trainer.enable_visualization()
```

此代码会在当前目录中创建新目录 `logs/<current_time_stamp>`,并创建两个新文件 `graph.json``log`

不必等到程序运行完后,再启动 NAS 界面,但需要确保这两个文件产生后,再启动。 启动 NAS 界面:

```bash
nnictl webui nas --logdir logs/<current_time_stamp> --port <port>
```

## 可视化定制的 Trainer

如果要定制 Trainer,参考[文档](./Advanced.md#extend-the-ability-of-one-shot-trainers)

需要对已有 Trainer 代码做两处改动来支持可视化:

1. 在训练前导出图:

```python
vis_graph = self.mutator.graph(inputs)
# `inputs` 是模型的虚拟输入。 例如,torch.randn((1, 3, 32, 32)).cuda()
# 如果模型有多个输入,则要使用 tuple。
with open("/path/to/your/logdir/graph.json", "w") as f:
json.dump(vis_graph, f)
```

2. 记录选择的 Choice。 可以每个 Epoch,批处理或任何频率下做次记录。

```python
def __init__(self):
# ...
self.status_writer = open("/path/to/your/logdir/log", "w") # create a writer

def train(self):
# ...
print(json.dumps(self.mutator.status()), file=self.status_writer, flush=True) # 保存状态
```

如果继承 `Trainer`,实现定制的 Trainer。 NNI 提供了 `enable_visualization()``_write_graph_status()` 来简化可视化。 只需要在开始前调用 `trainer.enable_visualization()`,并在每次要记录日志前调用 `trainer._write_graph_status()`。 注意,这两个 API 还处于试用阶段,未来可能会有所更改。

最后,启动 NAS 界面:

```bash
nnictl webui nas --logdir /path/to/your/logdir
```

## NAS 界面预览

![](../../img/nasui-1.png)

![](../../img/nasui-2.png)

## 局限性

* NAS 可视化仅适用于 PyTorch >=1.4。PyTorch 1.3.1 无法正常工作。
* 其依赖于 PyTorch 对 tensorboard 导出图的支持,即依赖于 `torch.jit`。 如果模型不支持 `jit`,也无法使用。
* 在加载中等大小,但有许多 Choice 的模型时(如 DARTS 的搜索空间),会遇到性能问题。

## 反馈

NAS UI 目前是测试版。 欢迎提交反馈。 [这里](https://github.com/microsoft/nni/pull/2085)列出了 NAS UI 接下来的工作。 欢迎直接评论,如果有其它建议,也可以[提交新问题](https://github.com/microsoft/nni/issues/new?template=enhancement.md)
Loading

0 comments on commit bcb53a7

Please sign in to comment.