"docs/en_US/TrialExample/Trials.md" did not exist on "eb0df3dcd6c8f740863baec920208d83980ee065"
Unverified Commit 6c3148c7 authored by SparkSnail's avatar SparkSnail Committed by GitHub
Browse files

Merge pull request #239 from microsoft/master

merge master
parents 0fb78620 a2e524d3
......@@ -19,7 +19,7 @@
先决条件:`python 64-bit >=3.5`, `git`, `PowerShell`
```bash
git clone -b v1.3 https://github.com/Microsoft/nni.git
git clone -b v1.4 https://github.com/Microsoft/nni.git
cd nni
powershell -ExecutionPolicy Bypass -file install.ps1
```
......@@ -31,7 +31,7 @@
* 通过克隆源代码下载示例。
```bash
git clone -b v1.3 https://github.com/Microsoft/nni.git
git clone -b v1.4 https://github.com/Microsoft/nni.git
```
* 运行 MNIST 示例。
......@@ -70,7 +70,7 @@ You can use these commands to get more information about the experiment
-----------------------------------------------------------------------
```
* 在浏览器中打开 `Web UI url`,可看到下图的 Experiment 详细信息,以及所有的 Trial 任务。 查看[这里](../Tutorial/WebUI.md)的更多页面。
* 在浏览器中打开 `Web UI url`,可看到下图的实验详细信息,以及所有的尝试任务。 查看[这里](../Tutorial/WebUI.md)的更多页面。
![概述](../../img/webui_overview_page.png)
......@@ -106,7 +106,7 @@ You can use these commands to get more information about the experiment
检查 Trial 日志文件来了解详情。
如果存在 stderr 文件,也需要查看其内容。 可能的错误情况包括
如果存在 stderr 文件,也需要查看其内容。 两种可能的情况是
* 忘记将 Experiment 配置的 Trial 命令中的 `python3` 改为 `python`
* 忘记安装 Experiment 的依赖,如 TensorFlow,Keras 等。
......@@ -122,7 +122,7 @@ You can use these commands to get more information about the experiment
注意:
* 如果遇到 `Segmentation fault` 这样的错误,参考[常见问](FAQ.md)
* 如果遇到 `Segmentation fault` 的错误,请参阅[常见问](FAQ.md)
## 更多
......
......@@ -2,7 +2,7 @@
## 安装
前支持 LinuxmacOS 和 Windows,在 Ubuntu 16.04 或更高版本macOS 10.14.1 以及 Windows 10.1809 上进行了测试。 在 `python >= 3.5` 的环境中,只需要运行 `pip install` 即可完成安装。
前支持 LinuxmacOS 和 Windows Ubuntu 16.04 或更高版本macOS 10.14.1 Windows 10.1809 均经过测试并支持。 在 `python >= 3.5` 的环境中,只需要运行 `pip install` 即可完成安装。
**Linux 和 macOS**
......@@ -19,12 +19,12 @@
注意:
* 在 Linux 和 macOS 上,如果要将 NNI 安装到当前用户的 home 目录中,可使用 `--user`,则不需要特殊权限。
* 如果遇到`Segmentation fault` 这样的任何错误参考[常见问](FAQ.md)
* 如果遇到 `Segmentation fault` 这样的错误参考[常见问](FAQ.md)
* 有关 NNI 的`系统要求`,参考[在 Linux 和 macOS 上安装](InstallationLinux.md)[Windows](InstallationWin.md)
## MNIST 上的 "Hello World"
NNI 是一个能进行自动机器学习实验的工具包。 它可以自动进行获取超参、运行 Trial,测试结果,调优超参的循环。 下面会展示如何使用 NNI 来找到最佳超参组合
NNI 是一个能进行自动机器学习实验的工具包。 它可以自动进行获取超参、运行 Trial,测试结果,调优超参的循环。 在这里,将演示如何使用 NNI 帮助找到 MNIST 模型的最佳超参
这是还**没有 NNI** 的示例代码,用 CNN 在 MNIST 数据集上训练:
......@@ -67,7 +67,7 @@ NNI 用来帮助超参调优。它的流程如下:
7: return 最好的实验结果
```
如果需要使用 NNI 来自动训练模型,找到最佳超参,需要如下三步:
如果需要使用 NNI 来自动训练模型,找到最佳超参,需要根据代码,进行如下三步改动
**启动 Experiment 的三个步骤**
......@@ -114,7 +114,7 @@ NNI 用来帮助超参调优。它的流程如下:
*实现代码:[mnist.py](https://github.com/Microsoft/nni/tree/master/examples/trials/mnist-tfv1/mnist.py)*
**第三步**:定义 YAML 格式的`配置`文件,其中声明了搜索空间和 Trial 文件的`路径`,以及`其它信息`如调算法,最大尝试次数最大运行时间等等
**第三步**:定义 YAML 格式的`配置`文件,其中声明了搜索空间和 Trial 文件的`路径`。 它还提供其他信息,例如调算法,最大 Trial 运行次数最大持续时间的参数
```yaml
authorName: default
......@@ -135,7 +135,7 @@ trial:
gpuNum: 0
```
注意:**在 Windows 上,需要将 Trial 命令的 `python3` 改为 `python`**
注意:**在 Windows 上,需要将 Trial 命令的 `python3` 改为 `python`**
*实现代码:[config.yml](https://github.com/Microsoft/nni/tree/master/examples/trials/mnist-tfv1/config.yml)*
......@@ -190,7 +190,7 @@ You can use these commands to get more information about the experiment
-----------------------------------------------------------------------
```
如果根据上述步骤准备好了相应 `Trial`, `搜索空间``配置`,并成功创建的 NNI 任务。NNI 会自动开始通过配置的搜索空间来运行不同的超参集合,搜索最好的超参。 通过 Web 界面可看到 NNI 的进度。
如果根据上述步骤准备好了相应 `Trial`, `搜索空间``配置`,并成功创建的 NNI 任务。NNI 会自动开始通过配置的搜索空间来运行不同的超参集合,搜索最好的超参。 通过 Web 界面可看到 NNI 的进度。
## Web 界面
......@@ -200,17 +200,17 @@ You can use these commands to get more information about the experiment
Web 地址为:[IP 地址]:8080
```
在浏览器中打开 `Web 界面地址`(即:`[IP 地址]:8080`),就可以看到 Experiment 的详细信息,以及所有的 Trial 任务。 如果无法打开终端中的 Web 界面链接,可以参考 [FAQ](FAQ.md)
在浏览器中打开 `Web 界面地址`(即:`[IP 地址]:8080`),就可以看到 Experiment 的详细信息,以及所有的 Trial 任务。 如果无法打开终端中的 Web 界面链接,可以参考[常见问题](FAQ.md)
### 查看概要页面
点击标签 "Overview"。
点击 "Overview" 标签
Experiment 相关信息会显示在界面上,配置和搜索空间等。 可通过 **Download** 按钮来`下载信息和参数`。 可以在运行中或结束后,随时下载 Experiment 的结果
Experiment 相关信息会显示在界面上,配置和搜索空间等。 可通过 **Download** 按钮来下载信息和参数。 可以在 Experiment 运行时随时下载结果,也可以等到执行结束
![](../../img/QuickStart1.png)
前 10 个 Trial 结果也会列在 Overview 页面中,可以在 "Trials Detail" 部分浏览所有 Trial。
前 10 个 Trial 列在 Overview 页上。 可以在 "Trials Detail" 页面上浏览所有 Trial。
![](../../img/QuickStart2.png)
......@@ -233,10 +233,10 @@ Experiment 相关信息会显示在界面上,配置和搜索空间等。 可
下面是所有 Trial 的状态。 包括:
* Trial 详情:Trial 的 id,持续时间,开始时间,结束时间,状态,精度和搜索空间。
* Trial 详情:Trial 的 id,持续时间,开始时间,结束时间,状态,精度和搜索空间文件
* 如果在 OpenPAI 平台上运行,还可以看到 hdfsLog。
* Kill: 可终止正在运行的任务。
* 支持搜索某个定的 Trial。
* Kill: 可结束在 `Running` 状态的任务。
* Support: 用于搜索某个定的 Trial。
![](../../img/QuickStart6.png)
......
......@@ -4,7 +4,7 @@
点击标签 "Overview"。
* 查看 Experiment Trial 配置、搜索空间以及结果好的 Trial。
* 在 Overview 标签上,可看到 Experiment Trial 的概况、搜索空间以及好的 Trial 结果
![](../../img/webui-img/over1.png) ![](../../img/webui-img/over2.png)
......@@ -16,11 +16,11 @@
![](../../img/webui-img/download.png)
* 如果 Experiment 状态为 ERROR,可点击图标,查看 Experiment 错误日志
* 如果实验的状态为错误,可以单击错误框中的感叹号来查看日志消息
![](../../img/webui-img/log-error.png) ![](../../img/webui-img/review-log.png)
* 点击 "Feedback" 反馈问题。
* 点击 "Feedback" 报告任何问题。
## 查看任务默认指标
......@@ -55,17 +55,15 @@
Trial 可能在训练过程中有大量中间结果。 为了更清楚的理解一些 Trial 的趋势,可以为中间结果图设置过滤。
这样可以发现 Trial 在某个中间结果上会变得更好或更差。 换句话说,这是一个重要的中间结果。 如果要仔细查看这个点,可以在 #Intermediate 中输入其横坐标。
并输入这个中间结果的指标范围。 如下图所示,选择了第 4 个中间结果, 并将指标范围设置为了 0.8 -1。
这样可以发现 Trial 在某个中间结果上会变得更好或更差。 这表明它是一个重要的并相关的中间结果。 如果要仔细查看这个点,可以在 #Intermediate 中输入其 X 坐标。 并输入这个中间结果的指标范围。 在下图中,选择了 No。 并将指标范围设置为了 0.8 -1。
![](../../img/webui-img/filter-intermediate.png)
## 查看 Trial 状态
点击 "Trials Detail" 标签查看所有 Trial 的状态。 包括
点击 "Trials Detail" 标签查看所有 Trial 的状态。 特别是
* Trial 详情:Trial 的 id,持续时间,开始时间,结束时间,状态,精度和搜索空间。
* Trial 详情:Trial 的 id,持续时间,开始时间,结束时间,状态,精度和搜索空间文件
![](../../img/webui-img/detail-local.png)
......
# 自动调优的 Python API 参考
```eval_rst
.. contents::
```
## Trial
```eval_rst
.. autofunction:: nni.get_next_parameter
.. autofunction:: nni.get_current_parameter
.. autofunction:: nni.report_intermediate_result
.. autofunction:: nni.report_final_result
.. autofunction:: nni.get_experiment_id
.. autofunction:: nni.get_trial_id
.. autofunction:: nni.get_sequence_id
```
## Tuner
```eval_rst
.. autoclass:: nni.tuner.Tuner
:members:
.. autoclass:: nni.hyperopt_tuner.hyperopt_tuner.HyperoptTuner
:members:
.. autoclass:: nni.evolution_tuner.evolution_tuner.EvolutionTuner
:members:
.. autoclass:: nni.smac_tuner.SMACTuner
:members:
.. autoclass:: nni.gridsearch_tuner.GridSearchTuner
:members:
.. autoclass:: nni.networkmorphism_tuner.networkmorphism_tuner.NetworkMorphismTuner
:members:
.. autoclass:: nni.metis_tuner.metis_tuner.MetisTuner
:members:
.. autoclass:: nni.ppo_tuner.PPOTuner
:members:
.. autoclass:: nni.batch_tuner.batch_tuner.BatchTuner
:members:
.. autoclass:: nni.gp_tuner.gp_tuner.GPTuner
:members:
```
## Assessor
```eval_rst
.. autoclass:: nni.assessor.Assessor
:members:
.. autoclass:: nni.assessor.AssessResult
:members:
.. autoclass:: nni.curvefitting_assessor.CurvefittingAssessor
:members:
.. autoclass:: nni.medianstop_assessor.MedianstopAssessor
:members:
```
## Advisor
```eval_rst
.. autoclass:: nni.msg_dispatcher_base.MsgDispatcherBase
:members:
.. autoclass:: nni.hyperband_advisor.hyperband_advisor.Hyperband
:members:
.. autoclass:: nni.bohb_advisor.bohb_advisor.BOHB
:members:
```
内置 Assessor
=================
为了节省计算资源,NNI 中可通过创建 **Assessor**,来配置提前终止策略
为了节省计算资源,NNI 支持提前终止策略,并且通过叫做 **Assessor** 的接口来执行此操作
Assessor 从 Trial 中接收中间结果,并通过指定的算法决定此 Trial 是否应该终止。 一旦 Trial 满足了提前终止策略(这表示 Assessor 认为最终结果不会太好),Assessor 会终止此 Trial,并将其状态标志为 `"EARLY_STOPPED"`。
Assessor 从 Trial 中接收中间结果,并通过指定的算法决定此 Trial 是否应该终止。 一旦 Trial 满足了提前终止策略(这表示 Assessor 认为最终结果不会太好),Assessor 会终止此 Trial,并将其状态标志为 `EARLY_STOPPED`。
这是 MNIST 在使用了 'Curvefitting' Assessor 的 'maximize' 模式后的实验结果可以看到 Assessor 成功的将大量最终结果不好的 Trial **提前结束** 。 使用 Assessor,能在相同的计算资源下,得到更好的结果。
这是 MNIST 在 "最大化" 模式下使用 "曲线拟合" Assessor 的实验结果可以看到 Assessor 成功的 **提前终止** 了许多结果不好超参组合的 Trial。 使用 Assessor,能在相同的计算资源下,得到更好的结果。
*实现代码:config_assessor.yml <https://github.com/Microsoft/nni/blob/master/examples/trials/mnist-tfv1/config_assessor.yml>*
*实现代码:[config_assessor.yml](https://github.com/Microsoft/nni/blob/master/examples/trials/mnist-tfv1/config_assessor.yml) *
.. image:: ../img/Assessor.png
......
......@@ -28,7 +28,7 @@ author = 'Microsoft'
# The short X.Y version
version = ''
# The full version, including alpha/beta/rc tags
release = 'v1.3'
release = 'v1.4'
# -- General configuration ---------------------------------------------------
......
......@@ -2,6 +2,8 @@
=================
.. toctree::
:maxdepth: 2
启用多阶段 <AdvancedFeature/MultiPhase>
编写新的 Tuner <Tuner/CustomizeTuner>
编写新的 Assessor <Assessor/CustomizeAssessor>
......
......@@ -3,7 +3,7 @@
#############################
自动调优是 NNI 提供的关键功能之一,主要应用场景是
超参调优。 Trial 代码是需要被调优的,这里提供了一些常见
超参调优。 应用于 Trial 代码的调优。 提供了很多流行
自动调优算法(称为 Tuner )和一些提前终止算法(称为 Assessor)。
NNI 支持在各种培训平台上运行 Trial,例如,在本地计算机上运行,
在多台服务器上分布式运行,或在 OpenPAI,Kubernetes 等平台上。
......@@ -12,7 +12,7 @@ NNI 的其它重要功能,例如模型压缩,特征工程,也可以进一
通过自动调优来提高,这会在介绍具体功能时提及。
NNI 具有高扩展性,高级用户可以定制自己的 Tuner、 Assessor,以及训练平台
根据自己的需求。
来适应不同的需求。
.. toctree::
:maxdepth: 2
......
......@@ -21,3 +21,4 @@ NNI 中也内置了一些流程的模型压缩算法。
Quantizer <quantizers>
模型加速 <Compressor/ModelSpeedup>
自动模型压缩 <Compressor/AutoCompression>
实现 <Compressor/Framework>
############################
支持的剪枝算法
############################
.. toctree::
:maxdepth: 1
Level Pruner <Compressor/Pruner>
AGP Pruner <Compressor/Pruner>
Lottery Ticket Pruner <Compressor/LotteryTicketHypothesis>
FPGM Pruner <Compressor/Pruner>
L1Filter Pruner <Compressor/l1filterpruner>
L2Filter Pruner <Compressor/Pruner>
ActivationAPoZRankFilterPruner <Compressor/Pruner>
ActivationMeanRankFilterPruner <Compressor/Pruner>
Slim Pruner <Compressor/SlimPruner>
#################################
支持的量化算法
#################################
.. toctree::
:maxdepth: 1
Naive Quantizer <Compressor/Quantizer>
QAT Quantizer <Compressor/Quantizer>
DoReFa Quantizer <Compressor/Quantizer>
BNN Quantizer <Compressor/Quantizer>
\ No newline at end of file
###########################
####################
Python API 参考
###########################
####################
Trial(尝试)
------------------------
.. autofunction:: nni.get_next_parameter
.. autofunction:: nni.get_current_parameter
.. autofunction:: nni.report_intermediate_result
.. autofunction:: nni.report_final_result
.. autofunction:: nni.get_experiment_id
.. autofunction:: nni.get_trial_id
.. autofunction:: nni.get_sequence_id
.. toctree::
:maxdepth: 1
Tuner(调参器)
------------------------
.. autoclass:: nni.tuner.Tuner
:members:
.. autoclass:: nni.hyperopt_tuner.hyperopt_tuner.HyperoptTuner
:members:
.. autoclass:: nni.evolution_tuner.evolution_tuner.EvolutionTuner
:members:
.. autoclass:: nni.smac_tuner.SMACTuner
:members:
.. autoclass:: nni.gridsearch_tuner.GridSearchTuner
:members:
.. autoclass:: nni.networkmorphism_tuner.networkmorphism_tuner.NetworkMorphismTuner
:members:
.. autoclass:: nni.metis_tuner.metis_tuner.MetisTuner
:members:
.. autoclass:: nni.ppo_tuner.PPOTuner
:members:
.. autoclass:: nni.batch_tuner.batch_tuner.BatchTuner
:members:
.. autoclass:: nni.gp_tuner.gp_tuner.GPTuner
:members:
Assessor(评估器)
------------------------
.. autoclass:: nni.assessor.Assessor
:members:
.. autoclass:: nni.assessor.AssessResult
:members:
.. autoclass:: nni.curvefitting_assessor.CurvefittingAssessor
:members:
.. autoclass:: nni.medianstop_assessor.MedianstopAssessor
:members:
Advisor
------------------------
.. autoclass:: nni.msg_dispatcher_base.MsgDispatcherBase
:members:
.. autoclass:: nni.hyperband_advisor.hyperband_advisor.Hyperband
:members:
.. autoclass:: nni.bohb_advisor.bohb_advisor.BOHB
:members:
自动调优 <autotune_ref>
NAS <NAS/NasReference>
\ No newline at end of file
......@@ -9,3 +9,4 @@ NNI 支持的训练平台介绍
OpenPAI Yarn 模式<./TrainingService/PaiYarnMode>
Kubeflow<./TrainingService/KubeflowMode>
FrameworkController<./TrainingService/FrameworkControllerMode>
OpenPAI<./TrainingService/DLTSMode>
......@@ -53,13 +53,13 @@ prune_config = {
'op_types': ['Conv2d']
}]
},
'l1': {
'l1filter': {
'dataset_name': 'cifar10',
'model_name': 'vgg16',
'pruner_class': L1FilterPruner,
'config_list': [{
'sparsity': 0.5,
'op_types': ['default'],
'op_types': ['Conv2d'],
'op_names': ['feature.0', 'feature.24', 'feature.27', 'feature.30', 'feature.34', 'feature.37']
}]
},
......@@ -69,7 +69,7 @@ prune_config = {
'pruner_class': ActivationMeanRankFilterPruner,
'config_list': [{
'sparsity': 0.5,
'op_types': ['default'],
'op_types': ['Conv2d'],
'op_names': ['feature.0', 'feature.24', 'feature.27', 'feature.30', 'feature.34', 'feature.37']
}]
},
......
......@@ -25,7 +25,7 @@ config = {
'model_name': 'vgg16',
'device': 'cuda',
'input_shape': [64, 3, 32, 32],
'masks_file': './checkpoints/mask_vgg16_cifar10_l1.pth'
'masks_file': './checkpoints/mask_vgg16_cifar10_l1filter.pth'
},
'fpgm': {
'model_name': 'naive',
......
......@@ -149,7 +149,7 @@ def get_params():
# Training settings
parser = argparse.ArgumentParser(description='PyTorch MNIST Example')
parser.add_argument("--data_dir", type=str,
default='/tmp/tensorflow/mnist/input_data', help="data directory")
default='./data', help="data directory")
parser.add_argument('--batch_size', type=int, default=64, metavar='N',
help='input batch size for training (default: 64)')
parser.add_argument("--hidden_size", type=int, default=512, metavar='N',
......
......@@ -22,12 +22,13 @@ if __name__ == "__main__":
parser.add_argument("--batch-size", default=64, type=int)
parser.add_argument("--log-frequency", default=10, type=int)
parser.add_argument("--epochs", default=50, type=int)
parser.add_argument("--channels", default=16, type=int)
parser.add_argument("--unrolled", default=False, action="store_true")
args = parser.parse_args()
dataset_train, dataset_valid = datasets.get_dataset("cifar10")
model = CNN(32, 3, 16, 10, args.layers)
model = CNN(32, 3, args.channels, 10, args.layers)
criterion = nn.CrossEntropyLoss()
optim = torch.optim.SGD(model.parameters(), 0.025, momentum=0.9, weight_decay=3.0E-4)
......
......@@ -24,16 +24,17 @@ if __name__ == "__main__":
parser.add_argument("--batch-size", default=128, type=int)
parser.add_argument("--log-frequency", default=10, type=int)
parser.add_argument("--search-for", choices=["macro", "micro"], default="macro")
parser.add_argument("--epochs", default=None, type=int, help="Number of epochs (default: macro 310, micro 150)")
args = parser.parse_args()
dataset_train, dataset_valid = datasets.get_dataset("cifar10")
if args.search_for == "macro":
model = GeneralNetwork()
num_epochs = 310
num_epochs = args.epochs or 310
mutator = None
elif args.search_for == "micro":
model = MicroNetwork(num_layers=6, out_channels=20, num_nodes=5, dropout_rate=0.1, use_aux_heads=True)
num_epochs = 150
num_epochs = args.epochs or 150
mutator = enas.EnasMutator(model, tanh_constant=1.1, cell_exit_extra_step=True)
else:
raise AssertionError
......
......@@ -25,23 +25,28 @@ logger = logging.getLogger('nni')
if __name__ == "__main__":
parser = ArgumentParser("pdarts")
parser.add_argument('--add_layers', action='append',
default=[0, 6, 12], help='add layers')
parser.add_argument('--dropped_ops', action='append',
default=[3, 2, 1], help='drop ops')
parser.add_argument('--add_layers', action='append', type=int,
help='add layers, default: [0, 6, 12]')
parser.add_argument('--dropped_ops', action='append', type=int,
help='drop ops, default: [3, 2, 1]')
parser.add_argument("--nodes", default=4, type=int)
parser.add_argument("--init_layers", default=5, type=int)
parser.add_argument("--channels", default=16, type=int)
parser.add_argument("--batch-size", default=64, type=int)
parser.add_argument("--log-frequency", default=1, type=int)
parser.add_argument("--epochs", default=50, type=int)
parser.add_argument("--unrolled", default=False, action="store_true")
args = parser.parse_args()
if args.add_layers is None:
args.add_layers = [0, 6, 12]
if args.dropped_ops is None:
args.dropped_ops = [3, 2, 1]
logger.info("loading data")
dataset_train, dataset_valid = datasets.get_dataset("cifar10")
def model_creator(layers):
model = CNN(32, 3, 16, 10, layers, n_nodes=args.nodes)
model = CNN(32, 3, args.channels, 10, layers, n_nodes=args.nodes)
criterion = nn.CrossEntropyLoss()
optim = torch.optim.SGD(model.parameters(), 0.025, momentum=0.9, weight_decay=3.0E-4)
......
......@@ -241,7 +241,8 @@ def init_trainable_embedding(embedding_path, word_id_dict, embed_dim=300):
embedding = np.random.random([len(word_id_dict), embed_dim]).astype(np.float32) / 2.0 - 0.25
embedding[0] = np.zeros(embed_dim) # PAD
embedding[1] = (np.random.rand(embed_dim) - 0.5) / 2 # UNK
for word, idx in word_id_dict.items():
for word in sorted(word_id_dict.keys()):
idx = word_id_dict[word]
if idx == 0 or idx == 1:
continue
if word in word_embed_model["mapping"]:
......
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