# Experiment(实验)配置参考
创建 Experiment 时,需要给 nnictl 命令提供配置文件的路径。 配置文件是 YAML 格式,需要保证其格式正确。 本文介绍了配置文件的内容,并提供了一些示例和模板。
- [Experiment(实验)配置参考](#Experiment-config-reference)
- [模板](#Template)
- [说明](#Configuration-spec)
- [样例](#Examples)
## 模板
- **简化版(不包含 Annotation(标记)和 Assessor)**
```yaml
authorName:
experimentName:
trialConcurrency:
maxExecDuration:
maxTrialNum:
#可选项: local, remote, pai, kubeflow
trainingServicePlatform:
searchSpacePath:
#可选项: true, false
useAnnotation:
tuner:
#可选项: TPE, Random, Anneal, Evolution
builtinTunerName:
classArgs:
#可选项: maximize, minimize
optimize_mode:
gpuNum:
trial:
command:
codeDir:
gpuNum:
#在本地使用时,machineList 可为空
machineList:
- ip:
port:
username:
passwd:
```
- **使用 Assessor**
```yaml
authorName:
experimentName:
trialConcurrency:
maxExecDuration:
maxTrialNum:
#可选项: local, remote, pai, kubeflow
trainingServicePlatform:
searchSpacePath:
#可选项: true, false
useAnnotation:
tuner:
#可选项: TPE, Random, Anneal, Evolution
builtinTunerName:
classArgs:
#可选项: maximize, minimize
optimize_mode:
gpuNum:
assessor:
#可选项: Medianstop
builtinAssessorName:
classArgs:
#可选项: maximize, minimize
optimize_mode:
gpuNum:
trial:
command:
codeDir:
gpuNum:
#在本地使用时,machineList 可为空
machineList:
- ip:
port:
username:
passwd:
```
- **使用 Annotation**
```yaml
authorName:
experimentName:
trialConcurrency:
maxExecDuration:
maxTrialNum:
#可选项: local, remote, pai, kubeflow
trainingServicePlatform:
#可选项: true, false
useAnnotation:
tuner:
#可选项: TPE, Random, Anneal, Evolution
builtinTunerName:
classArgs:
#可选项: maximize, minimize
optimize_mode:
gpuNum:
assessor:
#可选项: Medianstop
builtinAssessorName:
classArgs:
#可选项: maximize, minimize
optimize_mode:
gpuNum:
trial:
command:
codeDir:
gpuNum:
#在本地使用时,machineList 可为空
machineList:
- ip:
port:
username:
passwd:
```
## 说明
- **authorName**
- 说明
**authorName** 是创建 Experiment 的作者。
待定: 增加默认值
- **experimentName**
- 说明
**experimentName** 是创建的 Experiment 的名称。
待定: 增加默认值
- **trialConcurrency**
- 说明
**trialConcurrency** 定义了并发尝试任务的最大数量。
注意:如果 trialGpuNum 大于空闲的 GPU 数量,并且并发的 Trial 任务数量还没达到 trialConcurrency,Trial 任务会被放入队列,等待分配 GPU 资源。
- **maxExecDuration**
- 说明
**maxExecDuration** 定义 Experiment 执行的最长时间。时间单位:{**s**, **m**, **h**, **d**},分别代表:{*seconds*, *minutes*, *hours*, *days*}。
注意:maxExecDuration 设置的是 Experiment 执行的时间,不是 Trial 的。 如果 Experiment 达到了设置的最大时间,Experiment 不会停止,但不会再启动新的 Trial 作业。
- **versionCheck**
- 说明
NNI 会校验 remote, pai 和 Kubernetes 模式下 NNIManager 与 trialKeeper 进程的版本。 如果需要禁用版本校验,versionCheck 应设置为 false。
- **debug**
- 说明
调试模式会将 versionCheck 设置为 False,并将 logLevel 设置为 'debug'。
- **maxTrialNum**
- 说明
**maxTrialNum** 定义了 Trial 任务的最大数量,成功和失败的都计算在内。
- **trainingServicePlatform**
- 说明
**trainingServicePlatform** 定义运行 Experiment 的平台,包括:{**local**, **remote**, **pai**, **kubeflow**}.
- **local** 在本机的 Ubuntu 上运行 Experiment。
- **remote** 将任务提交到远程的 Ubuntu 上,必须用 **machineList** 来指定远程的 SSH 连接信息。
- **pai** 提交任务到微软开源的 [OpenPAI](https://github.com/Microsoft/pai) 上。 更多 OpenPAI 配置,参考 [pai 模式](./PaiMode.md)。
- **kubeflow** 提交任务至 [Kubeflow](https://www.kubeflow.org/docs/about/kubeflow/)。 NNI 支持基于 Kubeflow 的 Kubenetes,以及[Azure Kubernetes](https://azure.microsoft.com/en-us/services/kubernetes-service/)。
- **searchSpacePath**
- 说明
**searchSpacePath** 定义搜索空间文件的路径,此文件必须在运行 nnictl 的本机。
注意: 如果设置了 useAnnotation=True,searchSpacePath 字段必须被删除。
- **useAnnotation**
- 说明
**useAnnotation** 定义使用标记来分析代码并生成搜索空间。
注意: 如果设置了 useAnnotation=True,searchSpacePath 字段必须被删除。
- **nniManagerIp**
- 说明
**nniManagerIp** 设置 NNI 管理器运行的 IP 地址。 此字段为可选项,如果没有设置,则会使用 eth0 的 IP 地址。
注意: 可在 NNI 管理器机器上运行 ifconfig 来检查 eth0 是否存在。 如果不存在,推荐显式设置 nnimanagerIp。
- **logDir**
- 说明
**logDir** 配置存储日志和数据的目录。 默认值是 `/nni/experiment`
- **logLevel**
- 说明
**logLevel** 为 Experiment 设置日志级别,支持的日志级别有:`trace, debug, info, warning, error, fatal`。 默认值是 `info`。
- **logCollection**
- 说明
**logCollection** 设置在 remote, pai, kubeflow, frameworkcontroller 平台下收集日志的方法。 日志支持两种设置,一种是通过 `http`,让 Trial 将日志通过 POST 方法发回日志,这种方法会减慢 trialKeeper 的速度。 另一种方法是 `none`,Trial 不将日志回传回来,仅仅回传 Job 的指标。 如果日志较大,可将此参数设置为 `none`。
- **Tuner**
- 说明
**tuner** 指定了 Experiment 的 Tuner 算法。有两种方法可设置 Tuner。 一种方法是使用 SDK 提供的 Tuner,需要设置 **builtinTunerName** 和 **classArgs**。 另一种方法,是使用用户自定义的 Tuner,需要设置 **codeDirectory**,**classFileName**,**className** 和 **classArgs**。
- **builtinTunerName** 和 **classArgs**
- **builtinTunerName**
**builtinTunerName** 指定了系统 Tuner 的名字,NNI SDK 提供了多种 Tuner,如:{**TPE**, **Random**, **Anneal**, **Evolution**, **BatchTuner**, **GridSearch**}。
- **classArgs**
**classArgs** 指定了 Tuner 算法的参数。 如果 **builtinTunerName** 是{**TPE**, **Random**, **Anneal**, **Evolution**},用户需要设置 **optimize_mode**。
- **codeDir**, **classFileName**, **className** 和 **classArgs**
- **codeDir**
**codeDir** 指定 Tuner 代码的目录。
- **classFileName**
**classFileName** 指定 Tuner 文件名。
- **className**
**className** 指定 Tuner 类名。
- **classArgs**
**classArgs** 指定了 Tuner 算法的参数。
- **gpuNum**
__gpuNum__ 指定了运行 Tuner 进程的 GPU 数量。 此字段的值必须是正整数。
注意: 只能使用一种方法来指定 Tuner,例如:设置 {tunerName, optimizationMode} 或 {tunerCommand, tunerCwd},不能同时设置两者。
- **includeIntermediateResults**
如果 __includeIntermediateResults__ 为 true,最后一个 Assessor 的中间结果会被发送给 Tuner 作为最终结果。 __includeIntermediateResults__ 的默认值为 false。
- **Assessor**
- 说明
**assessor** 指定了 Experiment 的 Assessor 算法。有两种方法可设置 Assessor。 一种方法是使用 SDK 提供的 Assessor,需要设置 **builtinAssessorName** 和 **classArgs**。 另一种方法,是使用用户自定义的 Assessor,需要设置 **codeDirectory**,**classFileName**,**className** 和 **classArgs**。
- **builtinAssessorName** 和 **classArgs**
- **builtinAssessorName**
**builtinAssessorName** 指定了系统 Assessor 的名称, NNI 内置的 Assessor 有 {**Medianstop**,等等}。
- **classArgs**
**classArgs** 指定了 Assessor 算法的参数
- **codeDir**, **classFileName**, **className** 和 **classArgs**
- **codeDir**
**codeDir** 指定 Assessor 代码的目录。
- **classFileName**
**classFileName** 指定 Assessor 文件名。
- **className**
**className** 指定 Assessor 类名。
- **classArgs**
**classArgs** 指定了 Assessor 算法的参数。
- **gpuNum**
**gpuNum** 指定了运行 Assessor 进程的 GPU 数量。 此字段的值必须是正整数。
注意: 只能使用一种方法来指定 Assessor,例如:设置 {assessorName, optimizationMode} 或 {assessorCommand, assessorCwd},不能同时设置。如果不需要使用 Assessor,可将其置为空。
- **trial (local, remote)**
- **command**
**command** 指定了运行 Trial 进程的命令行。
- **codeDir**
**codeDir** 指定了 Trial 代码文件的目录。
- **gpuNum**
**gpuNum** 指定了运行 Trial 进程的 GPU 数量。 默认值为 0。
- **trial (pai)**
- **command**
**command** 指定了运行 Trial 进程的命令行。
- **codeDir**
**codeDir** 指定了 Trial 代码文件的目录。
- **gpuNum**
**gpuNum** 指定了运行 Trial 进程的 GPU 数量。 默认值为 0。
- **cpuNum**
**cpuNum** 指定了 OpenPAI 容器中使用的 CPU 数量。
- **memoryMB**
**memoryMB** 指定了 OpenPAI 容器中使用的内存数量。
- **image**
**image** 指定了 OpenPAI 中使用的 docker 映像。
- **dataDir**
**dataDir** 是 HDFS 中用到的数据目录变量。
- **outputDir**
**outputDir** 是 HDFS 中用到的输出目录变量。在 OpenPAI 中,stdout 和 stderr 文件会在作业完成后,存放在此目录中。
- **trial (kubeflow)**
- **codeDir**
**codeDir** 指定了代码文件的本机路径。
- **ps (可选)**
**ps** 是 Kubeflow 的 Tensorflow-operator 配置。
- **replicas**
**replicas** 是 **ps** 角色的副本数量。
- **command**
**command** 是在 **ps** 的容器中运行的脚本命令。
- **gpuNum**
**gpuNum** 是在 **ps** 容器中使用的 GPU 数量。
- **cpuNum**
**cpuNum** 是在 **ps** 容器中使用的 CPU 数量。
- **memoryMB**
**memoryMB** 指定了容器中使用的内存数量。
- **image**
**image** 设置了 **ps** 使用的 docker 映像。
- **worker**
**worker** 是 Kubeflow 的 Tensorflow-operator 配置。
- **replicas**
**replicas** 是 **worker** 角色的副本数量。
- **command**
**command** 是在 **worker** 的容器中运行的脚本命令。
- **gpuNum**
**gpuNum** 是在 **worker** 容器中使用的 GPU 数量。
- **cpuNum**
**cpuNum** 是在 **worker** 容器中使用的 CPU 数量。
- **memoryMB**
**memoryMB** 指定了容器中使用的内存数量。
- **image**
**image** 设置了 **worker** 使用的 docker 映像。
- **localConfig**
**localConfig** 仅在 **trainingServicePlatform** 设为 `local` 时有效,否则,配置文件中不应该有 **localConfig** 部分。
- **gpuIndices**
**gpuIndices** 用于指定 GPU。设置此值后,只有指定的 GPU 会被用来运行 Trial 任务。 可指定单个或多个 GPU 的索引,多个 GPU 之间用逗号(,)隔开,例如 `1` 或 `0,1,3`。
- **maxTrialNumPerGpu**
**maxTrialNumPerGpu** 用于指定每个 GPU 设备上最大并发的 Trial 数量。
- **useActiveGpu**
**useActiveGpu** 用于指定 NNI 是否使用还有其它进程的 GPU。 默认情况下,NNI 只会使用没有其它进程的空闲 GPU,如果 **useActiveGpu** 设置为 true,NNI 会使用所有 GPU。 此字段不适用于 Windows 版的 NNI。
- **machineList**
如果 **trainingServicePlatform** 为 remote,则需要设置 **machineList**。否则应将其置为空。
- **ip**
**ip** 是远程计算机的 ip 地址。
- **port**
**端口** 是用于连接远程计算机的 ssh 端口。
注意:如果 port 设为空,则为默认值 22。
- **username**
**username** 是远程计算机的用户名。
- **passwd**
**passwd** 指定了账户的密码。
- **sshKeyPath**
如果要使用 ssh 密钥登录远程计算机,则需要设置 **sshKeyPath**。 **sshKeyPath** 为有效的 ssh 密钥文件路径。
注意:如果同时设置了 passwd 和 sshKeyPath,NNI 会使用 passwd。
- **passphrase**
**passphrase** 用于保护 ssh 密钥,如果没有使用,可为空。
- **gpuIndices**
**gpuIndices** 用于指定 GPU。设置此值后,远程计算机上只有指定的 GPU 会被用来运行 Trial 任务。 可指定单个或多个 GPU 的索引,多个 GPU 之间用逗号(,)隔开,例如 `1` 或 `0,1,3`。
- **maxTrialNumPerGpu**
**maxTrialNumPerGpu** 用于指定每个 GPU 设备上最大并发的 Trial 数量。
- **useActiveGpu**
**useActiveGpu** 用于指定 NNI 是否使用还有其它进程的 GPU。 默认情况下,NNI 只会使用没有其它进程的空闲 GPU,如果 **useActiveGpu** 设置为 true,NNI 会使用所有 GPU。 此字段不适用于 Windows 版的 NNI。
- **kubeflowConfig**:
- **operator**
**operator** 指定了 kubeflow 使用的 operator,NNI 当前版本支持 **tf-operator**。
- **storage**
**storage** 指定了 kubeflow 的存储类型,包括 {**nfs**,**azureStorage**}。 此字段可选,默认值为 **nfs**。 如果使用了 azureStorage,此字段必须填写。
- **nfs**
**server** 是 NFS 服务器的地址
**path** 是 NFS 挂载的路径
- **keyVault**
如果用户使用 Azure Kubernetes Service,需要设置 keyVault 来使用 Azure 存储账户的私钥。 参考: https://docs.microsoft.com/zh-cn/azure/key-vault/key-vault-manage-with-cli2
- **vaultName**
**vaultName** 是 az 命令中 `--vault-name` 的值。
- **name**
**name** 是 az 命令中 `--name` 的值。
- **azureStorage**
如果用户使用了 Azure Kubernetes Service,需要设置 Azure 存储账户来存放代码文件。
- **accountName**
**accountName** 是 Azure 存储账户的名称。
- **azureShare**
**azureShare** 是 Azure 文件存储的共享参数。
- **paiConfig**
- **userName**
**userName** 是 OpenPAI 的用户名。
- **password**
**password** 是 OpenPAI 用户的密码。
- **host**
**host** 是 OpenPAI 的主机地址。
## 样例
- **本机模式**
如果要在本机运行 Trial 任务,并使用标记来生成搜索空间,可参考下列配置:
```yaml
authorName: test
experimentName: test_experiment
trialConcurrency: 3
maxExecDuration: 1h
maxTrialNum: 10
#可选项: local, remote, pai, kubeflow
trainingServicePlatform: local
#可选项: true, false
useAnnotation: true
tuner:
#可选项: TPE, Random, Anneal, Evolution
builtinTunerName: TPE
classArgs:
#可选项: maximize, minimize
optimize_mode: maximize
gpuNum: 0
trial:
command: python3 mnist.py
codeDir: /nni/mnist
gpuNum: 0
```
增加 Assessor 配置
```yaml
authorName: test
experimentName: test_experiment
trialConcurrency: 3
maxExecDuration: 1h
maxTrialNum: 10
#可选项: local, remote, pai, kubeflow
trainingServicePlatform: local
searchSpacePath: /nni/search_space.json
#可选项: true, false
useAnnotation: false
tuner:
#可选项: TPE, Random, Anneal, Evolution
builtinTunerName: TPE
classArgs:
#可选项: maximize, minimize
optimize_mode: maximize
gpuNum: 0
assessor:
#可选项: Medianstop
builtinAssessorName: Medianstop
classArgs:
#可选项: maximize, minimize
optimize_mode: maximize
gpuNum: 0
trial:
command: python3 mnist.py
codeDir: /nni/mnist
gpuNum: 0
```
或者可以指定自定义的 Tuner 和 Assessor:
```yaml
authorName: test
experimentName: test_experiment
trialConcurrency: 3
maxExecDuration: 1h
maxTrialNum: 10
#可选项: local, remote, pai, kubeflow
trainingServicePlatform: local
searchSpacePath: /nni/search_space.json
#可选项: true, false
useAnnotation: false
tuner:
codeDir: /nni/tuner
classFileName: mytuner.py
className: MyTuner
classArgs:
#可选项: maximize, minimize
optimize_mode: maximize
gpuNum: 0
assessor:
codeDir: /nni/assessor
classFileName: myassessor.py
className: MyAssessor
classArgs:
#choice: maximize, minimize
optimize_mode: maximize
gpuNum: 0
trial:
command: python3 mnist.py
codeDir: /nni/mnist
gpuNum: 0
```
- **远程模式**
如果要在远程服务器上运行 Trial 任务,需要增加服务器信息:
```yaml
authorName: test
experimentName: test_experiment
trialConcurrency: 3
maxExecDuration: 1h
maxTrialNum: 10
#可选项: local, remote, pai, kubeflow
trainingServicePlatform: remote
searchSpacePath: /nni/search_space.json
#可选项: true, false
useAnnotation: false
tuner:
#可选项: TPE, Random, Anneal, Evolution
builtinTunerName: TPE
classArgs:
#可选项: maximize, minimize
optimize_mode: maximize
gpuNum: 0
trial:
command: python3 mnist.py
codeDir: /nni/mnist
gpuNum: 0
# 如果是本地 Experiment,machineList 可为空。
machineList:
- ip: 10.10.10.10
port: 22
username: test
passwd: test
- ip: 10.10.10.11
port: 22
username: test
passwd: test
- ip: 10.10.10.12
port: 22
username: test
sshKeyPath: /nni/sshkey
passphrase: qwert
```
- **pai 模式**
```yaml
authorName: test
experimentName: nni_test1
trialConcurrency: 1
maxExecDuration:500h
maxTrialNum: 1
#可选项: local, remote, pai, kubeflow
trainingServicePlatform: pai
searchSpacePath: search_space.json
#可选项: true, false
useAnnotation: false
tuner:
#可选项: TPE, Random, Anneal, Evolution, BatchTuner
#SMAC (SMAC 需要使用 nnictl package 单独安装)
builtinTunerName: TPE
classArgs:
#可选项: maximize, minimize
optimize_mode: maximize
trial:
command: python3 main.py
codeDir: .
gpuNum: 4
cpuNum: 2
memoryMB: 10000
# 在 OpenPAI 上用来运行 Nni 作业的 docker 映像
image: msranni/nni:latest
# 在 OpenPAI 的 hdfs 上存储数据的目录,如:'hdfs://host:port/directory'
dataDir: hdfs://10.11.12.13:9000/test
# 在 OpenPAI 的 hdfs 上存储输出的目录,如:'hdfs://host:port/directory'
outputDir: hdfs://10.11.12.13:9000/test
paiConfig:
# OpenPAI 用户名
userName: test
# OpenPAI 密码
passWord: test
# OpenPAI 服务器 Ip
host: 10.10.10.10
```
- **Kubeflow 模式**
使用 NFS 存储。
```yaml
authorName: default
experimentName: example_mni
trialConcurrency: 1
maxExecDuration: 1h
maxTrialNum: 1
#可选项: local, remote, pai, kubeflow
trainingServicePlatform: kubeflow
searchSpacePath: search_space.json
#可选项: true, false
useAnnotation: false
tuner:
#可选项: TPE, Random, Anneal, Evolution
builtinTunerName: TPE
classArgs:
#可选项: maximize, minimize
optimize_mode: maximize
trial:
codeDir: .
worker:
replicas: 1
command: python3 mnist.py
gpuNum: 0
cpuNum: 1
memoryMB: 8192
image: msranni/nni:latest
kubeflowConfig:
operator: tf-operator
nfs:
server: 10.10.10.10
path: /var/nfs/general
```
使用 Azure 存储。
```yaml
authorName: default
experimentName: example_mni
trialConcurrency: 1
maxExecDuration: 1h
maxTrialNum: 1
#可选项: local, remote, pai, kubeflow
trainingServicePlatform: kubeflow
searchSpacePath: search_space.json
#可选项: true, false
useAnnotation: false
#nniManagerIp: 10.10.10.10
tuner:
#可选项: TPE, Random, Anneal, Evolution
builtinTunerName: TPE
classArgs:
#可选项: maximize, minimize
optimize_mode: maximize
assessor:
builtinAssessorName: Medianstop
classArgs:
optimize_mode: maximize
gpuNum: 0
trial:
codeDir: .
worker:
replicas: 1
command: python3 mnist.py
gpuNum: 0
cpuNum: 1
memoryMB: 4096
image: msranni/nni:latest
kubeflowConfig:
operator: tf-operator
keyVault:
vaultName: Contoso-Vault
name: AzureStorageAccountKey
azureStorage:
accountName: storage
azureShare: share01
```