Unverified Commit 346721be authored by kvartet's avatar kvartet Committed by GitHub
Browse files

Update Chinese translation (#3413)

parent b122c63d
#################
Retiarii 概览
#################
`Retiarii <https://www.usenix.org/system/files/osdi20-zhang_quanlu.pdf>`__ 是一个支持神经体系架构搜索和超参数调优的新框架。 它允许用户以高度的灵活性表达各种搜索空间,重用许多前沿搜索算法,并利用系统级优化来加速搜索过程。 该框架提供了以下全新的用户体验。
.. toctree::
:maxdepth: 2
快速入门 <Tutorial>
自定义 Trainer <WriteTrainer>
自定义 Strategy <WriteStrategy>
Retiarii APIs <ApiReference>
\ No newline at end of file
This diff is collapsed.
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
* :githublink:`MNIST-pytorch <examples/trials/mnist-distributed-pytorch>` * :githublink:`MNIST-pytorch <examples/trials/mnist-distributed-pytorch>`
* `CIFAR-10 <./TrialExample/Cifar10Examples.rst>`__ * `CIFAR-10 <./TrialExample/Cifar10Examples.rst>`__
* :githublink:`TGS salt identification chanllenge <examples/trials/kaggle-tgs-salt/README.md>` * :githublink:`TGS 盐识别挑战 <examples/trials/kaggle-tgs-salt/README.md>`
* :githublink:`Network_morphism <examples/trials/network_morphism/README.md>` * :githublink:`Network_morphism <examples/trials/network_morphism/README.md>`
* `TensorFlow <https://github.com/tensorflow/tensorflow>`__ * `TensorFlow <https://github.com/tensorflow/tensorflow>`__
...@@ -31,18 +31,19 @@ ...@@ -31,18 +31,19 @@
* `MXNet <https://github.com/apache/incubator-mxnet>`__ * `MXNet <https://github.com/apache/incubator-mxnet>`__
* `Caffe2 <https://github.com/BVLC/caffe>`__ * `Caffe2 <https://github.com/BVLC/caffe>`__
* `CNTK (Python language) <https://github.com/microsoft/CNTK>`__ * `CNTKPython <https://github.com/microsoft/CNTK>`__
* `Spark MLlib <http://spark.apache.org/mllib/>`__ * `Spark MLlib <http://spark.apache.org/mllib/>`__
* `Chainer <https://chainer.org/>`__ * `Chainer <https://chainer.org/>`__
* `Theano <https://pypi.org/project/Theano/>`__ * `Theano <https://pypi.org/project/Theano/>`__
鼓励您为其他的 NNI 用户\ `贡献更多示例 <Tutorial/Contributing.rst>`__ 鼓励您 `贡献更多示例 <Tutorial/Contributing.rst>`__ 为其他的 NNI 用户
支持的库 支持的库
----------------- -----------------
NNI 也支持其它 Python 库,包括一些基于 GBDT 的算法:XGBoost, CatBoost 以及 lightGBM。 NNI 也支持其它 Python 库,包括一些基于 GBDT 的算法:XGBoost, CatBoost 以及 lightGBM。
* `Scikit-learn <https://scikit-learn.org/stable/>`__ * `Scikit-learn <https://scikit-learn.org/stable/>`__
* `Scikit-learn <TrialExample/SklearnExamples.rst>`__ * `Scikit-learn <TrialExample/SklearnExamples.rst>`__
......
...@@ -10,7 +10,7 @@ NNI 支持在 `AML <https://azure.microsoft.com/zh-cn/services/machine-learning/ ...@@ -10,7 +10,7 @@ NNI 支持在 `AML <https://azure.microsoft.com/zh-cn/services/machine-learning/
步骤 2. 通过此 `链接 <https://azure.microsoft.com/zh-cn/free/services/machine-learning/>`__ 创建 Azure 账户/订阅。 如果已有 Azure 账户/订阅,跳过此步骤。 步骤 2. 通过此 `链接 <https://azure.microsoft.com/zh-cn/free/services/machine-learning/>`__ 创建 Azure 账户/订阅。 如果已有 Azure 账户/订阅,跳过此步骤。
步骤 3. 在机器上安装 Azure CLI,参照 `此 <https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest>`__ 安装指南。 步骤 3. 在机器上安装 Azure CLI,参照 `此 <https://docs.microsoft.com/zh-cn/cli/azure/install-azure-cli?view=azure-cli-latest>`__ 安装指南。
步骤 4. 从 CLI 验证您的 Azure 订阅。 要进行交互式身份验证,请打开命令行或终端并使用以下命令: 步骤 4. 从 CLI 验证您的 Azure 订阅。 要进行交互式身份验证,请打开命令行或终端并使用以下命令:
...@@ -42,7 +42,7 @@ NNI 支持在 `AML <https://azure.microsoft.com/zh-cn/services/machine-learning/ ...@@ -42,7 +42,7 @@ NNI 支持在 `AML <https://azure.microsoft.com/zh-cn/services/machine-learning/
运行实验 运行实验
----------------- -----------------
以 ``examples/trials/mnist-tfv1`` 为例。 NNI 的 YAML 配置文件如下: 以 ``examples/trials/mnist-pytorch`` 为例。 NNI 的 YAML 配置文件如下:
.. code-block:: yaml .. code-block:: yaml
...@@ -81,9 +81,8 @@ NNI 支持在 `AML <https://azure.microsoft.com/zh-cn/services/machine-learning/ ...@@ -81,9 +81,8 @@ NNI 支持在 `AML <https://azure.microsoft.com/zh-cn/services/machine-learning/
* image * image
* 必填。 作业中使用的 Docker 映像名称。 NNI 支持 ``msranni/nni`` 的映像来跑 jobs。 * 必填。 作业中使用的 Docker 映像名称。 NNI 支持 ``msranni/nni`` 的映像来跑 jobs。
.. code-block:: bash
注意:映像是基于 cuda 环境来打包的,可能并不适用于 aml 模式 CPU 集群。 .. Note:: 映像是基于 cuda 环境来打包的,可能并不适用于 aml 模式 CPU 集群。
amlConfig: amlConfig:
...@@ -119,10 +118,10 @@ amlConfig 需要的信息可以从步骤 5 下载的 ``config.json`` 找到。 ...@@ -119,10 +118,10 @@ amlConfig 需要的信息可以从步骤 5 下载的 ``config.json`` 找到。
.. code-block:: bash .. code-block:: bash
git clone -b ${NNI_VERSION} https://github.com/microsoft/nni git clone -b ${NNI_VERSION} https://github.com/microsoft/nni
cd nni/examples/trials/mnist-tfv1 cd nni/examples/trials/mnist-pytorch
# modify config_aml.yml ... # modify config_aml.yml ...
nnictl create --config config_aml.yml nnictl create --config config_aml.yml
将 ``${NNI_VERSION}`` 替换为发布的版本或分支名称,例如:``v1.9``。 将 ``${NNI_VERSION}`` 替换为发布的版本或分支名称,例如:``v2.0``。
在 AdaptDL 上运行 Experiment 在 AdaptDL 上运行 Experiment
============================ ============================
NNI 支持在 `AdaptDL <https://github.com/petuum/adaptdl>`__ 上运行,称为 AdaptDL 模式。 在开始使用 NNI 的 AdaptDL 模式前,需要有一个 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 集群。 在 AdaptDL 模式下,每个 Trial 程序会在 AdaptDL 集群中作为一个 Kubeflow 作业来运行。 NNI 支持在 `AdaptDL <https://github.com/petuum/adaptdl>`__ 上运行,称为 AdaptDL 模式。 在开始使用 NNI 的 AdaptDL 模式前,需要有一个 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 集群。 在 AdaptDL 模式下,每个 Trial 程序会在 AdaptDL 集群中作为一个 Kubeflow 作业来运行。
AdaptDL 旨在使动态资源环境(例如共享集群和云)中的分布式深度学习变得轻松高效。 AdaptDL 旨在使动态资源环境(例如共享集群和云)中的分布式深度学习变得轻松高效。
...@@ -9,9 +9,9 @@ AdaptDL 旨在使动态资源环境(例如共享集群和云)中的分布式 ...@@ -9,9 +9,9 @@ AdaptDL 旨在使动态资源环境(例如共享集群和云)中的分布式
----------------------------------- -----------------------------------
#. 采用 **Kubernetes 1.14** 或更高版本。 根据下面的指南设置 Kubernetes 环境: `on Azure <https://azure.microsoft.com/zh-cn/services/kubernetes-service/>`__\ , `on-premise <https://kubernetes.io/docs/setup/>`__ , `cephfs <https://kubernetes.io/docs/concepts/storage/storage-classes/#ceph-rbd>`__\ `microk8s with storage add-on enabled <https://microk8s.io/docs/addons>`__。 #. 采用 **Kubernetes 1.14** 或更高版本。 根据下面的指南设置 Kubernetes 环境: `on Azure <https://azure.microsoft.com/zh-cn/services/kubernetes-service/>`__\ , `on-premise <https://kubernetes.io/docs/setup/>`__ , `cephfs <https://kubernetes.io/docs/concepts/storage/storage-classes/#ceph-rbd>`__\ `microk8s with storage add-on enabled <https://microk8s.io/docs/addons>`__。
#. Helm 将 **AdaptDL Scheduler** 安装到 Kubernetes 集群中。 参照 `指南 <https://adaptdl.readthedocs.io/en/latest/installation/install-adaptdl.html>`__ 来设置 AdaptDL scheduler。 #. Helm 将 **AdaptDL Scheduler** 安装到 Kubernetes 集群中。 参照 `指南 <https://adaptdl.readthedocs.io/en/latest/installation/install-adaptdl.html>`__ 来设置 AdaptDL scheduler。
#. 配置 **kubeconfig** 文件,NNI 将使用此配置与 Kubernetes API 服务交互。 默认情况下,NNI 管理器会使用 $(HOME)/.kube/config 作为 kubeconfig 文件的路径。 也可以通过环境变量 **KUBECONFIG** 来指定其它 kubeconfig 文件。 根据 `指南 <https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig>`__ 了解更多 kubeconfig 的信息。 #. 配置 **kubeconfig** 文件,NNI 将使用此配置与 Kubernetes API 服务交互。 默认情况下,NNI 管理器会使用 ``$(HOME)/.kube/config`` 作为 kubeconfig 文件的路径。 也可以通过环境变量 **KUBECONFIG** 来指定其它 kubeconfig 文件。 根据 `指南 <https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig>`__ 了解更多 kubeconfig 的信息。
#. 如果 NNI Trial 作业需要 GPU 资源,需按照 `指南 <https://github.com/NVIDIA/k8s-device-plugin>`__ 来配置 **Kubernetes 下的 Nvidia 插件**。 #. 如果 NNI Trial 作业需要 GPU 资源,需按照 `指南 <https://github.com/NVIDIA/k8s-device-plugin>`__ 来配置 **Kubernetes 下的 Nvidia 插件**。
#. (可选)准备 **NFS服务器** 并导出通用装载作为外部存储。 #. (可选)准备 **NFS服务器** 并导出通用装载作为外部存储。
#. 参考 `指南 <../Tutorial/QuickStart.rst>`__ 安装 **NNI**。 #. 参考 `指南 <../Tutorial/QuickStart.rst>`__ 安装 **NNI**。
...@@ -76,7 +76,7 @@ AdaptDL 旨在使动态资源环境(例如共享集群和云)中的分布式 ...@@ -76,7 +76,7 @@ AdaptDL 旨在使动态资源环境(例如共享集群和云)中的分布式
storageSize: 1Gi storageSize: 1Gi
下文中没有提及的 config 可以参考这篇文档: 下文中没有提及的 config 可以参考这篇文档:
`default specs defined in the NNI doc </Tutorial/ExperimentConfig.html#configuration-spec>`__。 `默认配置说明 </Tutorial/ExperimentConfig.rst#configuration-spec>`__。
* **trainingServicePlatform**\ : 选择 ``adl`` 以将 Kubernetes 集群与 AdaptDL 调度程序一起使用。 * **trainingServicePlatform**\ : 选择 ``adl`` 以将 Kubernetes 集群与 AdaptDL 调度程序一起使用。
...@@ -133,7 +133,7 @@ NFS 存储 ...@@ -133,7 +133,7 @@ NFS 存储
简而言之,并没有限制 trial 如何读取或写入 NFS 存储,因此可以根据需要灵活使用它。 简而言之,并没有限制 trial 如何读取或写入 NFS 存储,因此可以根据需要灵活使用它。
通过日志流监控 通过日志流监控
---------------------- ---------------------------------------------
遵循特定 trial 的日志流: 遵循特定 trial 的日志流:
......
在 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 的准备工作
...@@ -9,7 +8,7 @@ NNI 支持使用 `FrameworkController <https://github.com/Microsoft/frameworkcon ...@@ -9,7 +8,7 @@ NNI 支持使用 `FrameworkController <https://github.com/Microsoft/frameworkcon
#. 采用 **Kubernetes 1.8** 或更高版本。 根据 `指南 <https://kubernetes.io/docs/setup/>`__ 来安装 Kubernetes。 #. 采用 **Kubernetes 1.8** 或更高版本。 根据 `指南 <https://kubernetes.io/docs/setup/>`__ 来安装 Kubernetes。
#. 配置 **kubeconfig** 文件,NNI 将使用此配置与 Kubernetes API 服务交互。 默认情况下,NNI 管理器会使用 ``$(HOME)/.kube/config`` 作为 kubeconfig 文件的路径。 也可以通过环境变量 **KUBECONFIG** 来指定其它 kubeconfig 文件。 根据 `指南 <https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig>`__ 了解更多 kubeconfig 的信息。 #. 配置 **kubeconfig** 文件,NNI 将使用此配置与 Kubernetes API 服务交互。 默认情况下,NNI 管理器会使用 $(HOME)/.kube/config 作为 kubeconfig 文件的路径。 也可以通过环境变量 **KUBECONFIG** 来指定其它 kubeconfig 文件。 根据 `指南 <https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig>`__ 了解更多 kubeconfig 的信息。
#. 如果 NNI Trial 作业需要 GPU 资源,需按照 `指南 <https://github.com/NVIDIA/k8s-device-plugin>`__ 来配置 **Kubernetes 下的 Nvidia 插件**。 #. 如果 NNI Trial 作业需要 GPU 资源,需按照 `指南 <https://github.com/NVIDIA/k8s-device-plugin>`__ 来配置 **Kubernetes 下的 Nvidia 插件**。
#. 准备 **NFS 服务器** 并导出通用的装载 (mount),推荐将 NFS 服务器路径映射到 **root_squash 选项**,否则可能会在 NNI 复制文件到 NFS 时出现权限问题。 参考 `页面 <https://linux.die.net/man/5/exports>`__,来了解关于 root_squash 选项,或 **Azure File Storage**。 #. 准备 **NFS 服务器** 并导出通用的装载 (mount),推荐将 NFS 服务器路径映射到 **root_squash 选项**,否则可能会在 NNI 复制文件到 NFS 时出现权限问题。 参考 `页面 <https://linux.die.net/man/5/exports>`__,来了解关于 root_squash 选项,或 **Azure File Storage**。
#. 在安装 NNI 并运行 nnictl 的计算机上安装 **NFS 客户端**。 运行此命令安装 NFSv4 客户端: #. 在安装 NNI 并运行 nnictl 的计算机上安装 **NFS 客户端**。 运行此命令安装 NFSv4 客户端:
...@@ -18,15 +17,15 @@ NNI 支持使用 `FrameworkController <https://github.com/Microsoft/frameworkcon ...@@ -18,15 +17,15 @@ NNI 支持使用 `FrameworkController <https://github.com/Microsoft/frameworkcon
apt-get install nfs-common apt-get install nfs-common
#. 参考 `指南 <../Tutorial/QuickStart.rst>`__ 安装 **NNI**。 7. 参考 `指南 <../Tutorial/QuickStart.rst>`__ 安装 **NNI**。
Azure 部署的 Kubernetes 的准备工作 Azure 部署的 Kubernetes 的准备工作
----------------------------------------- -----------------------------------------
#. NNI 支持基于 Azure Kubernetes Service 的 Kubeflow,参考 `指南 <https://azure.microsoft.com/zh-cn/services/kubernetes-service/>`__ 来设置 Azure Kubernetes Service。 #. NNI 支持基于 Azure Kubernetes Service 的 Kubeflow,参考 `指南 <https://azure.microsoft.com/zh-cn/services/kubernetes-service/>`__ 来设置 Azure Kubernetes Service。
#. 安装 `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/zh-cn/azure/aks/kubernetes-walkthrough#connect-to-the-cluster>`__。 #. 安装 `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>`__。
#. 参考此 `指南 <https://docs.microsoft.com/zh-cn/azure/storage/common/storage-quickstart-create-account?tabs=portal>`__ 来创建 Azure 文件存储账户。 NNI 需要 Azure Storage Service 来存取代码和输出文件。 #. 参考此 `指南 <https://docs.microsoft.com/zh-cn/azure/storage/common/storage-quickstart-create-account?tabs=portal>`__ 来创建 Azure 文件存储账户。 NNI 需要 Azure Storage Service 来存取代码和输出文件。
#. 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>`__ 来存储访问密钥。 #. 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
...@@ -101,7 +100,7 @@ FrameworkController 配置文件的格式如下: ...@@ -101,7 +100,7 @@ FrameworkController 配置文件的格式如下:
注意:如果用 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/ps/cpu/tensorflowdistributedtrainingwithcpu.yaml>`__ 了解详情。
frameworkcontroller 模式中的 Trial 配置使用以下主键: frameworkcontroller 模式中的 Trial 配置使用以下主键:
...@@ -115,7 +114,7 @@ frameworkcontroller 模式中的 Trial 配置使用以下主键: ...@@ -115,7 +114,7 @@ frameworkcontroller 模式中的 Trial 配置使用以下主键:
* cpuNum: 容器中要使用的 CPU 数量。 * cpuNum: 容器中要使用的 CPU 数量。
* memoryMB: 容器的内存限制。 * memoryMB: 容器的内存限制。
* image: 用来创建 pod,并运行程序的 Docker 映像。 * image: 用来创建 pod,并运行程序的 Docker 映像。
* frameworkAttemptCompletionPolicy: 运行框架的策略,参考 `用户手册 <https://github.com/Microsoft/frameworkcontroller/blob/master/doc/user-manual.rst#frameworkattemptcompletionpolicy>`__ 了解更多信息。 这些策略可以用来控制 pod,例如,如果 worker 任务停止了,但 ps 还在运行,要通过完成策略来停止 ps。 * frameworkAttemptCompletionPolicy: 运行框架的策略,参考 `用户手册 <https://github.com/Microsoft/frameworkcontroller/blob/master/doc/user-manual.md#frameworkattemptcompletionpolicy>`__ 了解更多信息。 这些策略可以用来控制 pod,例如,如果 worker 任务停止了,但 ps 还在运行,要通过完成策略来停止 ps。
如何运行示例 如何运行示例
------------------ ------------------
......
...@@ -15,8 +15,8 @@ TrainingService 是与平台管理、任务调度相关的模块。 TrainingServ ...@@ -15,8 +15,8 @@ TrainingService 是与平台管理、任务调度相关的模块。 TrainingServ
:alt: :alt:
NNI 的架构如图所示。 NNIManager 是系统的核心管理模块,负责调用 TrainingService 来管理 Trial,并负责不同模块之间的通信。 Dispatcher 是消息处理中心。 TrainingService 是管理任务的模块,它和 NNIManager 通信,并且根据平台的特点有不同的实现。 NNI 目前支持的平台有 `local platfrom <LocalMode.md>`__\ NNI 的架构如图所示。 NNIManager 是系统的核心管理模块,负责调用 TrainingService 来管理 Trial,并负责不同模块之间的通信。 Dispatcher 是消息处理中心。 TrainingService 是管理任务的模块,它和 NNIManager 通信,并且根据平台的特点有不同的实现。 NNI 目前支持的平台有 `本地平台 <LocalMode.rst>`__\
,`remote platfrom <RemoteMachineMode.md>`__\ , `PAI platfrom <PaiMode.md>`__\ , `kubeflow platform <KubeflowMode.md>`__ 和 `FrameworkController platfrom <FrameworkControllerMode.rst>`__。 ,`远程平台 <RemoteMachineMode.rst>`__\ , `PAI <PaiMode.rst>`__\ , `kubeflow <KubeflowMode.rst>`__ 和 `FrameworkController <FrameworkControllerMode.rst>`__。
本文中,会介绍 TrainingService 的简要设计。 如果要添加新的 TrainingService,只需要继承 TrainingServcie 类并实现相应的方法,不需要理解NNIManager、Dispatcher 等其它模块的细节。 本文中,会介绍 TrainingService 的简要设计。 如果要添加新的 TrainingService,只需要继承 TrainingServcie 类并实现相应的方法,不需要理解NNIManager、Dispatcher 等其它模块的细节。
......
**在异构模式下运行 Experiment** **以混合模式进行实验**
=========================================== ===========================================
异构模式下运行 NNI 意味着 NNI 将同时在多种培训平台上运行试验工作。 例如,NNI 可以同时将试用作业提交到远程计算机和 AML。 混合模式下运行 NNI 意味着 NNI 将在多种培训平台上运行试验工作。 例如,NNI 可以同时将试用作业提交到远程计算机和 AML。
设置环境 设置环境
---------------------- -----------------
NNI 的异构模式目前支持 `local <./LocalMode.rst>`__\ , `remote <./RemoteMachineMode.rst>`__\ , `PAI <./PaiMode.rst>`__\ 和 `AML <./AMLMode.rst>`__ 四种训练环境。在使用这些模式开始实验之前,应在平台上设置对应的环境。环境设置的详细信息,参见以上文档。
对于混合模式,NNI 目前支持的平台有 `本地平台 <LocalMode.rst>`__\ ,`远程平台 <RemoteMachineMode.rst>`__\ , `PAI <PaiMode.rst>`__ 和 `AML <./AMLMode.rst>`__\ 。 使用这些模式开始 Experiment 之前,用户应为平台设置相应的环境。 有关环境设置的详细信息,请参见相应的文档。
运行实验 运行实验
-------------------- -----------------
以 `examples/trials/mnist-tfv1` 为例。 NNI 的 YAML 配置文件如下: ``examples/trials/mnist-tfv1`` 为例。 NNI 的 YAML 配置文件如下:
.. code-block:: yaml .. code-block:: yaml
...@@ -21,20 +20,20 @@ NNI 的异构模式目前支持 `local <./LocalMode.rst>`__\ , `remote <./Remote ...@@ -21,20 +20,20 @@ NNI 的异构模式目前支持 `local <./LocalMode.rst>`__\ , `remote <./Remote
trialConcurrency: 2 trialConcurrency: 2
maxExecDuration: 1h maxExecDuration: 1h
maxTrialNum: 10 maxTrialNum: 10
trainingServicePlatform: heterogeneous trainingServicePlatform: hybrid
searchSpacePath: search_space.json searchSpacePath: search_space.json
#choice: true, false # 可选项:true, false
useAnnotation: false useAnnotation: false
tuner: tuner:
builtinTunerName: TPE builtinTunerName: TPE
classArgs: classArgs:
#choice: maximize, minimize # 可选项: maximize, minimize
optimize_mode: maximize optimize_mode: maximize
trial: trial:
command: python3 mnist.py command: python3 mnist.py
codeDir: . codeDir: .
gpuNum: 1 gpuNum: 1
heterogeneousConfig: hybridConfig:
trainingServicePlatforms: trainingServicePlatforms:
- local - local
- remote - remote
...@@ -45,11 +44,11 @@ NNI 的异构模式目前支持 `local <./LocalMode.rst>`__\ , `remote <./Remote ...@@ -45,11 +44,11 @@ NNI 的异构模式目前支持 `local <./LocalMode.rst>`__\ , `remote <./Remote
username: bob username: bob
passwd: bob123 passwd: bob123
异构模式的配置: 混合模式的配置:
heterogeneousConfig: hybridConfig:
* trainingServicePlatforms. 必填。 该字段指定用于异构模式的平台,值使用 yaml 列表格式。 NNI 支持在此字段中设置 `local`, `remote`, `aml`, `pai` 。 * trainingServicePlatforms. 必填。 该字段指定用于混合模式的平台,值使用 yaml 列表格式。 NNI 支持在此字段中设置 ``local``, ``remote``, ``aml``, ``pai``
.. Note:: 如果将平台设置为 trainingServicePlatforms 模式,则用户还应该为平台设置相应的配置。 例如,如果使用 ``remote`` 作为平台,还应设置 ``machineList`` 和 ``remoteConfig`` 配置。 .. Note:: 如果将平台设置为 trainingServicePlatforms 模式,则用户还应该为平台设置相应的配置。 例如,如果使用 ``remote`` 作为平台,还应设置 ``machineList`` 和 ``remoteConfig`` 配置。 混合模式下的本地平台暂时不支持Windows。
在 Kubeflow 上运行 Experiment 在 Kubeflow 上运行 Experiment
============================= =============================
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 作业来运行。 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 的准备工作
...@@ -20,16 +18,16 @@ NNI 支持在 `Kubeflow <https://github.com/kubeflow/kubeflow>`__ 上运行, ...@@ -20,16 +18,16 @@ NNI 支持在 `Kubeflow <https://github.com/kubeflow/kubeflow>`__ 上运行,
apt-get install nfs-common apt-get install nfs-common
#. 参考 `指南 <../Tutorial/QuickStart.rst>`__ 安装 **NNI**。 7. 参考 `指南 <../Tutorial/QuickStart.rst>`__ 安装 **NNI**。
Azure 部署的 Kubernetes 的准备工作 Azure 部署的 Kubernetes 的准备工作
----------------------------------------- -----------------------------------------
#. NNI 支持基于 Azure Kubernetes Service 的 Kubeflow,参考 `指南 <https://azure.microsoft.com/zh-cn/services/kubernetes-service/>`__ 来设置 Azure Kubernetes Service。 #. NNI 支持基于 Azure Kubernetes Service 的 Kubeflow,参考 `指南 <https://azure.microsoft.com/zh-cn/services/kubernetes-service/>`__ 来设置 Azure Kubernetes Service。
#. 安装 `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/zh-cn/azure/aks/kubernetes-walkthrough#connect-to-the-cluster>`__。 #. 安装 `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>`__。
#. 在 Azure Kubernetes Service 上部署 Kubeflow,参考此 `指南 <https://www.kubeflow.org/docs/started/getting-started/>`__。 #. 在 Azure Kubernetes Service 上部署 Kubeflow,参考此 `指南 <https://www.kubeflow.org/docs/started/getting-started/>`__。
#. 参考此 `指南 <https://docs.microsoft.com/zh-cn/azure/storage/common/storage-quickstart-create-account?tabs=portal>`__ 来创建 Azure 文件存储账户。 NNI 需要 Azure Storage Service 来存取代码和输出文件。 #. 参考此 `指南 <https://docs.microsoft.com/zh-cn/azure/storage/common/storage-quickstart-create-account?tabs=portal>`__ 来创建 Azure 文件存储账户。 NNI 需要 Azure Storage Service 来存取代码和输出文件。
#. 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>`__ 来存储访问密钥。 #. 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>`__ 来存储访问密钥。
设计 设计
...@@ -42,10 +40,10 @@ Azure 部署的 Kubernetes 的准备工作 ...@@ -42,10 +40,10 @@ Azure 部署的 Kubernetes 的准备工作
Kubeflow 训练平台会实例化一个 Kubernetes 客户端来与 Kubernetes 集群的 API 服务器交互。 Kubeflow 训练平台会实例化一个 Kubernetes 客户端来与 Kubernetes 集群的 API 服务器交互。
对于每个 Trial,会上传本机 codeDir 路径(在 nni_config.yml 中配置)中的所有文件,包括 parameter.cfg 这样的生成的文件到存储卷中。 当前支持两种存储卷:`nfs <https://zh.wikipedia.org/wiki/Network_File_System>`__ 和 `azure file storage <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,以便浏览日志和输出文件。 对于每个 Trial,会上传本机 codeDir 路径(在 nni_config.yml 中配置)中的所有文件,包括 parameter.cfg 这样的生成的文件到存储卷中。 当前支持两种存储卷:`nfs <https://en.wikipedia.org/wiki/Network_File_System>`__ 和 `azure file storage <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,其它操作符未经测试。 NNI 仅支持 Kubeflow 的 tf-operator 和 pytorch-operator,其它操作符未经测试。
可以在配置文件中设置操作符类型。 可以在配置文件中设置操作符类型。
...@@ -231,6 +229,8 @@ kubeflow 模式的配置有下列主键: ...@@ -231,6 +229,8 @@ kubeflow 模式的配置有下列主键:
* 必填。 Kubeflow 的 API 版本。 * 必填。 Kubeflow 的 API 版本。
.. cannot find :githublink:`msranni/nni <deployment/docker/Dockerfile>`
* ps (可选)。 此部分用于配置 TensorFlow 的 parameter 服务器角色。 * ps (可选)。 此部分用于配置 TensorFlow 的 parameter 服务器角色。
* master (可选)。 此部分用于配置 PyTorch 的 parameter 服务器角色。 * master (可选)。 此部分用于配置 PyTorch 的 parameter 服务器角色。
......
**教程:使用 NNI API 在本地创建和运行 Experiment** **教程:使用 NNI API 在本地创建和运行 Experiment**
==================================================================== ================================================================================================================================
本教程会使用 [~/examples/trials/mnist-tfv1] 示例来解释如何在本地使用 NNI API 来创建并运行 Experiment。 本教程会使用 [~/examples/trials/mnist-pytorch] 示例来解释如何在本地使用 NNI API 来创建并运行 Experiment。
.. ..
...@@ -17,23 +17,25 @@ ...@@ -17,23 +17,25 @@
对代码进行以下改动来启用 NNI API: 对代码进行以下改动来启用 NNI API:
* 声明 NNI API 在 Trial 代码中通过 ``import nni`` 来导入 NNI API。 1.1 声明 NNI API 在 Trial 代码中通过 ``import nni`` 来导入 NNI API。
* 获取预定义参数
1.2 获取预定义参数
使用一下代码段: 使用一下代码段:
.. code-block:: python .. code-block:: python
RECEIVED_PARAMS = nni.get_next_parameter() tuner_params = nni.get_next_parameter()
获得 tuner 分配的超参数值。 ``RECEIVED_PARAMS`` 是一个对象,如: 获得 tuner 分配的超参数值。 ``tuner_params`` 是一个对象,如:
.. code-block:: json .. code-block:: json
{"conv_size": 2, "hidden_size": 124, "learning_rate": 0.0307, "dropout_rate": 0.2029} {"batch_size": 32, "hidden_size": 128, "lr": 0.01, "momentum": 0.2029}
..
* 导出 NNI results API:``nni.report_intermediate_result(accuracy)`` 发送 ``accuracy`` 给 assessor。 1.3 导出 NNI results API:``nni.report_intermediate_result(accuracy)`` 发送 ``accuracy`` 给 assessor。 使用 API: ``nni.report_final_result(accuracy)`` 返回 ``accuracy`` 的值给 Tuner。
使用 API: ``nni.report_final_result(accuracy)`` 返回 ``accuracy`` 的值给 Tuner。
将改动保存到 ``mnist.py`` 文件中。 将改动保存到 ``mnist.py`` 文件中。
...@@ -54,12 +56,12 @@ ...@@ -54,12 +56,12 @@
.. code-block:: bash .. code-block:: bash
{ {
"dropout_rate":{"_type":"uniform","_value":[0.1,0.5]}, "batch_size": {"_type":"choice", "_value": [16, 32, 64, 128]},
"conv_size":{"_type":"choice","_value":[2,3,5,7]}, "hidden_size":{"_type":"choice","_value":[128, 256, 512, 1024]},
"hidden_size":{"_type":"choice","_value":[124, 512, 1024]}, "lr":{"_type":"choice","_value":[0.0001, 0.001, 0.01, 0.1]},
"learning_rate":{"_type":"uniform","_value":[0.0001, 0.1]} "momentum":{"_type":"uniform","_value":[0, 1]}
} }
参考 `define search space <../Tutorial/SearchSpaceSpec.rst>`__ 进一步了解搜索空间。 参考 `define search space <../Tutorial/SearchSpaceSpec.rst>`__ 进一步了解搜索空间。
...@@ -91,7 +93,7 @@ ...@@ -91,7 +93,7 @@
.. ..
在克隆代码后,可以在 ~/nni/examples 中找到一些示例,运行 ``ls examples/trials`` 查看所有 Trial 示例 安装 NNI 之后,NNI 的样例已经在目录 ``nni/examples`` 下,运行 ``ls nni/examples/trials`` 可以看到所有的 examples
以一个简单的 trial 来举例。 NNI 提供了 mnist 样例。 安装 NNI 之后,NNI 的样例已经在目录 ~/nni/examples下,运行 ``ls ~/nni/examples/trials`` 可以看到所有的 examples。 执行下面的命令可轻松运行 NNI 的 mnist 样例: 以一个简单的 trial 来举例。 NNI 提供了 mnist 样例。 安装 NNI 之后,NNI 的样例已经在目录 ~/nni/examples下,运行 ``ls ~/nni/examples/trials`` 可以看到所有的 examples。 执行下面的命令可轻松运行 NNI 的 mnist 样例:
......
...@@ -6,14 +6,14 @@ ...@@ -6,14 +6,14 @@
NNI 训练平台让用户专注于 AutoML 任务,不需要关心 Trial 实际运行的计算基础架构平台。 当从一个集群迁移到另一个集群时 (如,从本机迁移到 Kubeflow),用户只需要调整几项配置,能很容易的扩展计算资源。 NNI 训练平台让用户专注于 AutoML 任务,不需要关心 Trial 实际运行的计算基础架构平台。 当从一个集群迁移到另一个集群时 (如,从本机迁移到 Kubeflow),用户只需要调整几项配置,能很容易的扩展计算资源。
用户可以使用 NNI 提供的训练平台来跑 trial, 训练平台有:`local machine <./LocalMode.rst>`__\ , `remote machines <./RemoteMachineMode.rst>`__\ 以及集群类的 `PAI <./PaiMode.rst>`__\ ,`Kubeflow <./KubeflowMode.rst>`__\ ,`AdaptDL <./AdaptDLMode.rst>`__\ , `FrameworkController <./FrameworkControllerMode.rst>`__\ , `DLTS <./DLTSMode.rst>`__ 和 `AML <./AMLMode.rst>`__。 这些都是\ *内置的训练平台*。 用户可以使用 NNI 提供的训练平台来跑 trial, 训练平台有:`local machine <./LocalMode.rst>`__\ , `remote machines <./RemoteMachineMode.rst>`__\ 以及集群类的 `PAI <./PaiMode.rst>`__\ ,`Kubeflow <./KubeflowMode.rst>`__\ ,`AdaptDL <./AdaptDLMode.rst>`__\ , `FrameworkController <./FrameworkControllerMode.rst>`__\ , `DLTS <./DLTSMode.rst>`__ 和 `AML <./AMLMode.rst>`__。 这些都是 *内置的训练平台*。
如果需要在计算资源上使用 NNI,可以根据相关接口,轻松构建对其它训练平台的支持。 详情请参考 `NNI 中如何实训练平台 <./HowToImplementTrainingService.rst>`__ 如果需要在计算资源上使用 NNI,可以根据相关接口,轻松构建对其它训练平台的支持。 详情请参考 `如何实训练平台 <./HowToImplementTrainingService.rst>`__ 。
如何使用训练平台? 如何使用训练平台?
---------------------------- ----------------------------
在 Experiment 的 YAML 配置文件中选择并配置好训练平台。 参考相应训练平台的文档来了解如何配置。 同时, `Experiment 文档 <../Tutorial/ExperimentConfig.rst>`__ 提供了更多详细信息。 在 Experiment 的 YAML 配置文件中选择并配置好训练平台。 参考相应训练平台的文档来了解如何配置。 `此文档 <../Tutorial/ExperimentConfig.rst>`__ 提供了更多详细信息。
然后,需要准备代码目录,将路径填入配置文件的 ``codeDir`` 字段。 注意,非本机模式下,代码目录会在 Experiment 运行前上传到远程或集群中。 因此,NNI 将文件数量限制到 2000,总大小限制为 300 MB。 如果 codeDir 中包含了过多的文件,可添加 ``.nniignore`` 文件来排除部分,与 ``.gitignore`` 文件用法类似。 写好这个文件请参考 :githublink:`示例 <examples/trials/mnist-tfv1/.nniignore>` 和 `git 文档 <https://git-scm.com/docs/gitignore#_pattern_format>`__。 然后,需要准备代码目录,将路径填入配置文件的 ``codeDir`` 字段。 注意,非本机模式下,代码目录会在 Experiment 运行前上传到远程或集群中。 因此,NNI 将文件数量限制到 2000,总大小限制为 300 MB。 如果 codeDir 中包含了过多的文件,可添加 ``.nniignore`` 文件来排除部分,与 ``.gitignore`` 文件用法类似。 写好这个文件请参考 :githublink:`示例 <examples/trials/mnist-tfv1/.nniignore>` 和 `git 文档 <https://git-scm.com/docs/gitignore#_pattern_format>`__。
...@@ -35,9 +35,9 @@ NNI 训练平台让用户专注于 AutoML 任务,不需要关心 Trial 实际 ...@@ -35,9 +35,9 @@ NNI 训练平台让用户专注于 AutoML 任务,不需要关心 Trial 实际
* - `PAI <./PaiMode.rst>`__ * - `PAI <./PaiMode.rst>`__
- NNI 支持在 `OpenPAI <https://github.com/Microsoft/pai>`__ (aka PAI) 上运行 Experiment,即 pai 模式。 在使用 NNI 的 pai 模式前, 需要有 `OpenPAI <https://github.com/Microsoft/pai>`__ 群集的账户。 如果没有 OpenPAI 账户,参考 `这里 <https://github.com/Microsoft/pai#how-to-deploy>`__ 来进行部署。 在 pai 模式中,会在 Docker 创建的容器中运行 Trial 程序。 - NNI 支持在 `OpenPAI <https://github.com/Microsoft/pai>`__ (aka PAI) 上运行 Experiment,即 pai 模式。 在使用 NNI 的 pai 模式前, 需要有 `OpenPAI <https://github.com/Microsoft/pai>`__ 群集的账户。 如果没有 OpenPAI 账户,参考 `这里 <https://github.com/Microsoft/pai#how-to-deploy>`__ 来进行部署。 在 pai 模式中,会在 Docker 创建的容器中运行 Trial 程序。
* - `Kubeflow <./KubeflowMode.rst>`__ * - `Kubeflow <./KubeflowMode.rst>`__
- 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 作业来运行。 - 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 作业来运行。
* - `AdaptDL <./AdaptDLMode.rst>`__ * - `AdaptDL <./AdaptDLMode.rst>`__
- NNI 支持在 `AdaptDL <https://github.com/petuum/adaptdl>`__ 上运行,称为 AdaptDL 模式。 在开始使用 NNI kubeflow 模式之前,应该具有 Kubernetes 集群。 - NNI 支持在 `AdaptDL <https://github.com/petuum/adaptdl>`__ 上运行,称为 AdaptDL 模式。 在开始使用 AdaptDL 模式之前,应该具有 Kubernetes 集群。
* - `FrameworkController <./FrameworkControllerMode.rst>`__ * - `FrameworkController <./FrameworkControllerMode.rst>`__
- 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 的训练平台。
* - `DLTS <./DLTSMode.rst>`__ * - `DLTS <./DLTSMode.rst>`__
...@@ -57,7 +57,7 @@ NNI 训练平台让用户专注于 AutoML 任务,不需要关心 Trial 实际 ...@@ -57,7 +57,7 @@ NNI 训练平台让用户专注于 AutoML 任务,不需要关心 Trial 实际
</p> </p>
根据 `概述 <../Overview>`__ 中展示的架构,训练平台会做三件事:1) 启动 Trial; 2) 收集指标,并与 NNI 核心(NNI 管理器)通信;3) 监控 Trial 任务状态。 为了展示训练平台的详细工作原理,下面介绍了训练平台从最开始到第一个 Trial 运行成功的过程。 根据 `概述 <../Overview.rst>`__ 中展示的架构,训练平台会做三件事:1) 启动 Trial; 2) 收集指标,并与 NNI 核心(NNI 管理器)通信;3) 监控 Trial 任务状态。 为了展示训练平台的详细工作原理,下面介绍了训练平台从最开始到第一个 Trial 运行成功的过程。
步骤 1. **验证配置,并准备训练平台。** 训练平台会首先检查用户配置是否正确(例如,身份验证是否有错)。 然后,训练平台会为 Experiment 做准备,创建训练平台可访问的代码目录( ``codeDir`` )。 步骤 1. **验证配置,并准备训练平台。** 训练平台会首先检查用户配置是否正确(例如,身份验证是否有错)。 然后,训练平台会为 Experiment 做准备,创建训练平台可访问的代码目录( ``codeDir`` )。
......
...@@ -12,7 +12,7 @@ NNI 支持在 `OpenPAI <https://github.com/Microsoft/pai>`__ 上运行 Experime ...@@ -12,7 +12,7 @@ NNI 支持在 `OpenPAI <https://github.com/Microsoft/pai>`__ 上运行 Experime
设置环境 设置环境
----------------- -----------------
**步骤 1. 参考** `指南 <../Tutorial/QuickStart.rst>`__ **安装 NNI。** **步骤 1. 参考 `指南 <../Tutorial/QuickStart.rst>`__ 安装 NNI。**
**步骤 2. 获得令牌(token)。** **步骤 2. 获得令牌(token)。**
...@@ -111,7 +111,7 @@ NNI 支持在 `OpenPAI <https://github.com/Microsoft/pai>`__ 上运行 Experime ...@@ -111,7 +111,7 @@ NNI 支持在 `OpenPAI <https://github.com/Microsoft/pai>`__ 上运行 Experime
Trial 配置 Trial 配置
^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^
与 `LocalMode <LocalMode.md>`__ 和 `RemoteMachineMode <RemoteMachineMode.rst>`__\ 相比, pai 模式下的 ``trial`` 配置有下面所列的其他 keys: 与 `LocalMode <LocalMode.rst>`__ 和 `RemoteMachineMode <RemoteMachineMode.rst>`__\ 相比, pai 模式下的 ``trial`` 配置有下面所列的其他 keys:
* *
...@@ -131,6 +131,8 @@ Trial 配置 ...@@ -131,6 +131,8 @@ Trial 配置
我们已经 build 了一个 docker image :githublink:`nnimsra/nni <deployment/docker/Dockerfile>`。 可以直接使用此映像,或参考它来生成自己的映像。 如果没在 Trial 配置中设置,则需要在 ``paiConfigPath`` 指定的配置文件中设置。 我们已经 build 了一个 docker image :githublink:`nnimsra/nni <deployment/docker/Dockerfile>`。 可以直接使用此映像,或参考它来生成自己的映像。 如果没在 Trial 配置中设置,则需要在 ``paiConfigPath`` 指定的配置文件中设置。
.. cannot find :githublink:`nnimsra/nni <deployment/docker/Dockerfile>`
* *
virtualCluster virtualCluster
...@@ -166,7 +168,7 @@ Trial 配置 ...@@ -166,7 +168,7 @@ Trial 配置
#. #.
OpenPAI 配置文件中的作业名称会由 NNI 指定,格式为:nni\ *exp*\ ${this.experimentId}*trial*\ ${trialJobId}。 OpenPAI 配置文件中的作业名称会由 NNI 指定,格式为:``nni_exp_${this.experimentId}_trial_${trialJobId}``
#. #.
如果在 OpenPAI 配置文件中有多个 taskRoles,NNI 会将这些 taksRoles 作为一个 Trial 任务,用户需要确保只有一个 taskRole 会将指标上传到 NNI 中,否则可能会产生错误。 如果在 OpenPAI 配置文件中有多个 taskRoles,NNI 会将这些 taksRoles 作为一个 Trial 任务,用户需要确保只有一个 taskRole 会将指标上传到 NNI 中,否则可能会产生错误。
...@@ -218,7 +220,7 @@ OpenPAI 配置 ...@@ -218,7 +220,7 @@ OpenPAI 配置
在 Trial 列表页面中展开 Trial 信息,点击如下的 logPath: 在 Trial 列表页面中展开 Trial 信息,点击如下的 logPath:
.. image:: ../../img/nni_webui_joblist.jpg .. image:: ../../img/nni_webui_joblist.png
:scale: 30% :scale: 30%
接着将会打开 HDFS 的 WEB 界面,并浏览到 Trial 的输出文件: 接着将会打开 HDFS 的 WEB 界面,并浏览到 Trial 的输出文件:
...@@ -248,5 +250,5 @@ OpenPAI 配置 ...@@ -248,5 +250,5 @@ OpenPAI 配置
如果 Experiment 无法运行,而且不能确认是否是因为版本不匹配造成的,可以在 Web 界面检查是否有相关的错误消息。 如果 Experiment 无法运行,而且不能确认是否是因为版本不匹配造成的,可以在 Web 界面检查是否有相关的错误消息。
.. image:: ../../img/version_check.png .. image:: ../../img/webui-img/experimentError.png
:scale: 80% :scale: 80%
.. role:: raw-html(raw)
:format: html
**在 OpenPAIYarn 上运行 Experiment**
========================================
原始的 ``pai`` 模式改为了 ``paiYarn`` 模式,这是基于 Yarn 的分布式训练平台。
设置环境
-----------------
参考 `指南 <../Tutorial/QuickStart.rst>`__ 安装 NNI。
运行实验
-----------------
以 ``examples/trials/mnist-tfv1`` 为例。 NNI 的 YAML 配置文件如下:
.. code-block:: yaml
authorName: your_name
experimentName: auto_mnist
# how many trials could be concurrently running
trialConcurrency: 2
# maximum experiment running duration
maxExecDuration: 3h
# empty means never stop
maxTrialNum: 100
# choice: local, remote, pai, paiYarn
trainingServicePlatform: paiYarn
# search space file
searchSpacePath: search_space.json
# choice: true, false
useAnnotation: false
tuner:
builtinTunerName: TPE
classArgs:
optimize_mode: maximize
trial:
command: python3 mnist.py
codeDir: ~/nni/examples/trials/mnist-tfv1
gpuNum: 0
cpuNum: 1
memoryMB: 8196
image: msranni/nni:latest
# Configuration to access OpenpaiYarn Cluster
paiYarnConfig:
userName: your_paiYarn_nni_user
passWord: your_paiYarn_password
host: 10.1.1.1
注意:如果用 paiYarn 模式运行,需要在 YAML 文件中设置 ``trainingServicePlatform: paiYarn`` 。
与 `LocalMode <LocalMode.md>`__ 和 `RemoteMachineMode <RemoteMachineMode.rst>`__\ 相比, paiYarn 模式下的 trial 配置有其他 keys:
* cpuNum
* 必填。 Trial 程序的 CPU 需求,必须为正数。
* memoryMB
* 必填。 Trial 程序的内存需求,必须为正数。
* image
* 必填。 在 paiYarn 模式下,OpenpaiYarn 将安排试用程序在 `Docker 容器 <https://www.docker.com/>`__ 中运行。 此键用来指定 Trial 程序的容器使用的 Docker 映像。
* 我们已经 build 了一个 docker image :githublink:`nnimsra/nni <deployment/docker/Dockerfile>`。 可以直接使用此映像,或参考它来生成自己的映像。
* virtualCluster
* 可选。 设置 OpenPAIYarn 的 virtualCluster,即虚拟集群。 如果未设置此参数,将使用默认的虚拟集群。
* shmMB
* 可选。 设置 OpenPAIYarn 的 shmMB,即 Docker 中的共享内存。
* authFile
* 可选。在使用 paiYarn 模式时,为私有 Docker 仓库设置认证文件,`见参考文档 <https://github.com/microsoft/paiYarn/blob/2ea69b45faa018662bc164ed7733f6fdbb4c42b3/docs/faq.rst#q-how-to-use-private-docker-registry-job-image-when-submitting-an-openpaiYarn-job>`__\。提供 authFile 的本地路径即可, NNI 会上传此文件。
*
portList
*
可选。 设置 OpenPAIYarn 的 portList。指定了容器中使用的端口列表,`参考文档 <https://github.com/microsoft/paiYarn/blob/b2324866d0280a2d22958717ea6025740f71b9f0/docs/job_tutorial.rst#specification>`__。\ :raw-html:`<br>`
NNI 中的配置架构如下所示:
.. code-block:: bash
portList:
- label: test
beginAt: 8080
portNumber: 2
假设需要在 MNIST 示例中使用端口来运行 TensorBoard。 第一步是编写 ``mnist.py`` 的包装脚本 ``launch_paiYarn.sh``。
.. code-block:: bash
export TENSORBOARD_PORT=paiYarn_PORT_LIST_${paiYarn_CURRENT_TASK_ROLE_NAME}_0_tensorboard
tensorboard --logdir . --port ${!TENSORBOARD_PORT} &
python3 mnist.py
portList 的配置部分如下:
.. code-block:: yaml
trial:
command: bash launch_paiYarn.sh
portList:
- label: tensorboard
beginAt: 0
portNumber: 1
NNI 支持 OpenPAIYarn 中的两种认证授权方法,即密码和 paiYarn 令牌(token),`参考 <https://github.com/microsoft/paiYarn/blob/b6bd2ab1c8890f91b7ac5859743274d2aa923c22/docs/rest-server/API.rst#2-authentication>`__。 授权在 ``paiYarnConfig`` 字段中配置。\ :raw-html:`<br>`
密码认证的 ``paiYarnConfig`` 配置如下:
.. code-block:: bash
paiYarnConfig:
userName: your_paiYarn_nni_user
passWord: your_paiYarn_password
host: 10.1.1.1
paiYarn 令牌认证的 ``paiYarnConfi`` 配置如下:
.. code-block:: bash
paiYarnConfig:
userName: your_paiYarn_nni_user
token: your_paiYarn_token
host: 10.1.1.1
完成并保存 NNI Experiment 配置文件后(例如可保存为:exp_paiYarn.yml),运行以下命令:
.. code-block:: bash
nnictl create --config exp_paiYarn.yml
来在 paiYarn 模式下启动 Experiment。 NNI 会为每个 Trial 创建 OpenpaiYarn 作业,作业名称的格式为 ``nni_exp_{experiment_id}_trial_{trial_id}``。
可以在 OpenPAIYarn 集群的网站中看到 NNI 创建的作业,例如:
.. image:: ../../img/nni_pai_joblist.jpg
:target: ../../img/nni_pai_joblist.jpg
:alt:
注意:paiYarn 模式下,NNIManager 会启动 RESTful 服务,监听端口为 NNI 网页服务器的端口加 1。 例如,如果网页端口为 ``8080``,那么 RESTful 服务器会监听在 ``8081`` 端口,来接收运行在 Kubernetes 中的 Trial 作业的指标。 因此,需要在防火墙中启用端口 ``8081`` 的 TCP 协议,以允许传入流量。
当一个 Trial 作业完成后,可以在 NNI 网页的概述页面(如:http://localhost:8080/oview)中查看 Trial 的信息。
在 Trial 列表页面中展开 Trial 信息,点击如下的 logPath:
.. image:: ../../img/nni_webui_joblist.jpg
:target: ../../img/nni_webui_joblist.jpg
:alt:
接着将会打开 HDFS 的 WEB 界面,并浏览到 Trial 的输出文件:
.. image:: ../../img/nni_trial_hdfs_output.jpg
:target: ../../img/nni_trial_hdfs_output.jpg
:alt:
在输出目录中可以看到三个文件:stderr,stdout 以及 trial.log。
数据管理
---------------
如果训练数据集不大,可放在 codeDir中,NNI会将其上传到 HDFS,或者构建 Docker 映像来包含数据。 如果数据集非常大,则不可放在 codeDir 中,可参考此 `指南 <https://github.com/microsoft/paiYarn/blob/master/docs/user/storage.rst>`__ 来将数据目录挂载到容器中。
如果要将 Trial 的其它输出保存到 HDFS 上,如模型文件等,需要在 Trial 代码中使用 ``NNI_OUTPUT_DIR`` 来保存输出文件。NNI 的 SDK 会将文件从 Trial 容器的 ``NNI_OUTPUT_DIR`` 复制到 HDFS 上,目标路径为:``hdfs://host:port/{username}/nni/{experiments}/{experimentId}/trials/{trialId}/nnioutput``。
版本校验
-------------
从 0.6 开始,NNI 支持版本校验。 确保 NNIManager 与 trialKeeper 的版本一致,避免兼容性错误。
检查策略:
#. 0.6 以前的 NNIManager 可与任何版本的 trialKeeper 一起运行,trialKeeper 支持向后兼容。
#. 从 NNIManager 0.6 开始,与 triakKeeper 的版本必须一致。 例如,如果 NNIManager 是 0.6 版,则 trialKeeper 也必须是 0.6 版。
#. 注意,只有版本的前两位数字才会被检查。例如,NNIManager 0.6.1 可以和 trialKeeper 的 0.6 或 0.6.2 一起使用,但不能与 trialKeeper 的 0.5.1 或 0.7 版本一起使用。
如果 Experiment 无法运行,而且不能确认是否是因为版本不匹配造成的,可以在 Web 界面检查是否有相关的错误消息。
.. image:: ../../img/version_check.png
:target: ../../img/version_check.png
:alt:
...@@ -13,7 +13,7 @@ NNI 可以通过 SSH 在多个远程计算机上运行同一个 Experiment,称 ...@@ -13,7 +13,7 @@ NNI 可以通过 SSH 在多个远程计算机上运行同一个 Experiment,称
确保远程计算机的默认环境符合 Trial 代码的需求。 如果默认环境不符合要求,可以将设置脚本添加到 NNI 配置的 ``command`` 字段。 确保远程计算机的默认环境符合 Trial 代码的需求。 如果默认环境不符合要求,可以将设置脚本添加到 NNI 配置的 ``command`` 字段。
* *
确保远程计算机能被运行 ``nnictl`` 命令的计算机通过 SSH 访问。 同时支持 SSH 的密码和密钥验证方法。 高级用法请参考 `实验配置参考 <../Tutorial/ExperimentConfig.rst>`__ 。 确保远程计算机能被运行 ``nnictl`` 命令的计算机通过 SSH 访问。 同时支持 SSH 的密码和密钥验证方法。 高级用法请参考 `machineList part of configuration <../Tutorial/ExperimentConfig.rst>`__ 。
* *
确保每台计算机上的 NNI 版本一致。 确保每台计算机上的 NNI 版本一致。
...@@ -25,14 +25,14 @@ Linux ...@@ -25,14 +25,14 @@ Linux
^^^^^ ^^^^^
* 按照 `安装教程 <../Tutorial/InstallationLinux.rst>`__ 在远程计算机上安装 NNI 。 * 按照 `安装教程 <../Tutorial/InstallationLinux.rst>`__ 在远程计算机上安装 NNI 。
Windows Windows
^^^^^^^ ^^^^^^^
* *
按照 `安装教程 <../Tutorial/InstallationLinux.rst>`__ 在远程计算机上安装 NNI 。 按照 `安装教程 <../Tutorial/InstallationLinux.rst>`__ 在远程计算机上安装 NNI 。
* *
安装并启动 ``OpenSSH Server``。 安装并启动 ``OpenSSH Server``。
...@@ -176,44 +176,13 @@ Windows ...@@ -176,44 +176,13 @@ Windows
- ip: ${replace_to_your_remote_machine_ip} - ip: ${replace_to_your_remote_machine_ip}
username: ${replace_to_your_remote_machine_username} username: ${replace_to_your_remote_machine_username}
sshKeyPath: ${replace_to_your_remote_machine_sshKeyPath} sshKeyPath: ${replace_to_your_remote_machine_sshKeyPath}
# Pre-command will be executed before the remote machine executes other commands.
# Below is an example of specifying python environment. # Below is an example of specifying python environment.
# If you want to execute multiple commands, please use "&&" to connect them. pythonPath: ${replace_to_python_environment_path_in_your_remote_machine}
# preCommand: source ${replace_to_absolute_path_recommended_here}/bin/activate
# preCommand: source ${replace_to_conda_path}/bin/activate ${replace_to_conda_env_name}
preCommand: export PATH=${replace_to_python_environment_path_in_your_remote_machine}:$PATH
在远程机器执行其他命令之前,将执行 **预命令**。 因此,可以像这样配置 python 环境路径: 远程计算机支持以重用模式运行实验。 在这种模式下,NNI 将重用远程机器任务来运行尽可能多的 Trial. 这样可以节省创建新作业的时间。 用户需要确保同一作业中的每个 Trial 相互独立,例如,要避免从之前的 Trial 中读取检查点。
按照以下设置启用重用模式:
.. code-block:: yaml .. code-block:: yaml
# Linux remote machine remoteConfig:
preCommand: export PATH=${replace_to_python_environment_path_in_your_remote_machine}:$PATH reuse: true
# Windows remote machine \ No newline at end of file
preCommand: set path=${replace_to_python_environment_path_in_your_remote_machine};%path%
或者,如果想激活 ``virtualen`` 环境:
.. code-block:: yaml
# Linux remote machine
preCommand: source ${replace_to_absolute_path_recommended_here}/bin/activate
# Windows remote machine
preCommand: ${replace_to_absolute_path_recommended_here}\\scripts\\activate
或者,如果想激活 ``conda`` 环境:
.. code-block:: yaml
# Linux remote machine
preCommand: source ${replace_to_conda_path}/bin/activate ${replace_to_conda_env_name}
# Windows remote machine
preCommand: call activate ${replace_to_conda_env_name}
如果要执行多个命令,可以使用 ``&&`` 连接以下命令:
.. code-block:: yaml
preCommand: command1 && command2 && command3
**注意**:因为 ``preCommand`` 每次都会在其他命令之前执行,所以强烈建议不要设置 **preCommand** 来对系统进行更改,即 ``mkdir`` or ``touch``.
...@@ -13,7 +13,7 @@ CIFAR-10 示例 ...@@ -13,7 +13,7 @@ CIFAR-10 示例
本例中,选择了以下常见的深度学习优化器: 本例中,选择了以下常见的深度学习优化器:
.. .. code-block:: bash
"SGD", "Adadelta", "Adagrad", "Adam", "Adamax" "SGD", "Adadelta", "Adagrad", "Adam", "Adamax"
...@@ -48,7 +48,7 @@ NNI 与 CIFAR-10 ...@@ -48,7 +48,7 @@ NNI 与 CIFAR-10
"model":{"_type":"choice", "_value":["vgg", "resnet18", "googlenet", "densenet121", "mobilenet", "dpn92", "senet18"]} "model":{"_type":"choice", "_value":["vgg", "resnet18", "googlenet", "densenet121", "mobilenet", "dpn92", "senet18"]}
} }
示例: :githublink:`search_space.json <examples/trials/cifar10_pytorch/search_space.json>` 代码示例: :githublink:`search_space.json <examples/trials/cifar10_pytorch/search_space.json>`
**Trial** **Trial**
...@@ -59,7 +59,7 @@ NNI 与 CIFAR-10 ...@@ -59,7 +59,7 @@ NNI 与 CIFAR-10
* 使用 ``nni.report_intermediate_result(acc)`` 在每个 epoch 结束时返回中间结果。 * 使用 ``nni.report_intermediate_result(acc)`` 在每个 epoch 结束时返回中间结果。
* 使用 ``nni.report_final_result(acc)`` 在每个 Trial 结束时返回最终结果。 * 使用 ``nni.report_final_result(acc)`` 在每个 Trial 结束时返回最终结果。
示例: :githublink:`main.py <examples/trials/cifar10_pytorch/main.py>` 代码示例: :githublink:`main.py <examples/trials/cifar10_pytorch/main.py>`
还可直接修改现有的代码来支持 Nni,参考:`如何实现 Trial <Trials.rst>`__。 还可直接修改现有的代码来支持 Nni,参考:`如何实现 Trial <Trials.rst>`__。
...@@ -71,9 +71,9 @@ NNI 与 CIFAR-10 ...@@ -71,9 +71,9 @@ NNI 与 CIFAR-10
这是在 OpenPAI 上运行 Experiment 的示例: 这是在 OpenPAI 上运行 Experiment 的示例:
代码 :githublink:`examples/trials/cifar10_pytorch/config_pai.yml <examples/trials/cifar10_pytorch/config_pai.yml>` 代码 :githublink:`examples/trials/cifar10_pytorch/config_pai.yml <examples/trials/cifar10_pytorch/config_pai.yml>`
完整示例 :githublink:`examples/trials/cifar10_pytorch/ <examples/trials/cifar10_pytorch>` 完整示例 :githublink:`examples/trials/cifar10_pytorch/ <examples/trials/cifar10_pytorch>`
运行 Experiment 运行 Experiment
^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^
......
...@@ -4,14 +4,13 @@ NNI 上的知识蒸馏 ...@@ -4,14 +4,13 @@ NNI 上的知识蒸馏
知识蒸馏 (Knowledge Distillation) 知识蒸馏 (Knowledge Distillation)
--------------------------------------- ---------------------------------------
知识蒸馏,在 `Distilling the Knowledge in a Neural Network <https://arxiv.org/abs/1503.02531>`__ 中,压缩模型被训练成模拟预训练的模型。 这种训练设置也称为"师生(teacher-student)"方式,其中大模型是教师,小模型是学生。 在 `Distilling the Knowledge in a Neural Network <https://arxiv.org/abs/1503.02531>`__\提出了知识蒸馏(KD)的概念, 压缩后的模型被训练去模仿预训练的、较大的模型。 这种训练设置也称为"师生(teacher-student)"方式,其中大模型是教师,小模型是学生。 KD 通常用于微调剪枝后的模型。
.. image:: ../../img/distill.png .. image:: ../../img/distill.png
:target: ../../img/distill.png :target: ../../img/distill.png
:alt: :alt:
用法 用法
^^^^^ ^^^^^
...@@ -19,24 +18,29 @@ PyTorch 代码 ...@@ -19,24 +18,29 @@ PyTorch 代码
.. code-block:: python .. code-block:: python
from knowledge_distill.knowledge_distill import KnowledgeDistill for batch_idx, (data, target) in enumerate(train_loader):
kd = KnowledgeDistill(kd_teacher_model, kd_T=5) data, target = data.to(device), target.to(device)
alpha = 1 optimizer.zero_grad()
beta = 0.8 y_s = model_s(data)
for batch_idx, (data, target) in enumerate(train_loader): y_t = model_t(data)
data, target = data.to(device), target.to(device) loss_cri = F.cross_entropy(y_s, target)
optimizer.zero_grad()
output = model(data) # kd 损失值
loss = F.cross_entropy(output, target) p_s = F.log_softmax(y_s/kd_T, dim=1)
# 只需要添加以下行来使用知识蒸馏微调模型 p_t = F.softmax(y_t/kd_T, dim=1)
loss = alpha * loss + beta * kd.loss(data=data, student_out=output) loss_kd = F.kl_div(p_s, p_t, size_average=False) * (self.T**2) / y_s.shape[0]
loss.backward()
# 总损失
loss = loss_cir + loss_kd
loss.backward()
微调剪枝模型的完整代码在 :githublink:`这里 <examples/model_compress/pruning/finetune_kd_torch.py>`
.. code-block:: python
知识蒸馏的用户配置 python finetune_kd_torch.py --model [model name] --teacher-model-dir [pretrained checkpoint path] --student-model-dir [pruned checkpoint path] --mask-path [mask file path]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
请注意:要微调剪枝后的模型,请先运行 :githublink:`basic_pruners_torch.py <examples/model_compress/pruning/basic_pruners_torch.py>` 来获取掩码文件,然后将掩码路径作为参数传递给脚本。
* **kd_teacher_model**:预训练过的教师模型
* **kd_T**:用于平滑教师模型输出的温度。
完整代码在 `这里 <https://github.com/microsoft/nni/tree/v1.3/examples/model_compress/knowledge_distill/>`__。
...@@ -8,8 +8,9 @@ MNIST 示例 ...@@ -8,8 +8,9 @@ MNIST 示例
在深度学习中,用 CNN 来分类 MNIST 数据,就像介绍编程语言中的 ``hello world`` 示例。 因此,NNI 将 MNIST 作为示例来介绍功能。 示例如下: 在深度学习中,用 CNN 来分类 MNIST 数据,就像介绍编程语言中的 ``hello world`` 示例。 因此,NNI 将 MNIST 作为示例来介绍功能。 示例如下:
* `MNIST 中使用 NNI API (TensorFlow v1.x) <#mnist-tfv1>`__ * `MNIST 中使用 NNI API (PyTorch) <#mnist-pytorch>`__
* `MNIST 中使用 NNI API (TensorFlow v2.x) <#mnist-tfv2>`__ * `MNIST 中使用 NNI API (TensorFlow v2.x) <#mnist-tfv2>`__
* `MNIST 中使用 NNI API (TensorFlow v1.x) <#mnist-tfv1>`__
* `MNIST 中使用 NNI 标记(annotation) <#mnist-annotation>`__ * `MNIST 中使用 NNI 标记(annotation) <#mnist-annotation>`__
* `在 keras 中使用 MNIST <#mnist-keras>`__ * `在 keras 中使用 MNIST <#mnist-keras>`__
* `MNIST -- 用批处理 tuner 来调优 <#mnist-batch>`__ * `MNIST -- 用批处理 tuner 来调优 <#mnist-batch>`__
...@@ -18,65 +19,70 @@ MNIST 示例 ...@@ -18,65 +19,70 @@ MNIST 示例
* `用 Kubeflow 运行分布式的 MNIST(TensorFlow) <#mnist-kubeflow-tf>`__ * `用 Kubeflow 运行分布式的 MNIST(TensorFlow) <#mnist-kubeflow-tf>`__
* `用 Kubeflow 运行分布式的 MNIST(PyTorch) <#mnist-kubeflow-pytorch>`__ * `用 Kubeflow 运行分布式的 MNIST(PyTorch) <#mnist-kubeflow-pytorch>`__
:raw-html:`<a name="mnist-tfv1"></a>` :raw-html:`<a name="mnist-pytorch"></a>`
**MNIST 中使用 NNI API (TensorFlow v1.x)** **MNIST 中使用 NNI API (PyTorch)**
这是个简单的卷积网络,有两个卷积层,两个池化层和一个全连接层。 调优的超参包括 dropout 比率,卷积层大小,隐藏层(全连接层)大小等等。 它能用 NNI 中大部分内置的 Tuner 来调优,如 TPE,SMAC,Random。 示例的 YAML 文件也启用了评估器来提前终止一些中间结果不好的尝试。 这是个简单的卷积网络,有两个卷积层,两个池化层和一个全连接层。
调优的超参包括 dropout 比率,卷积层大小,隐藏层(全连接层)大小等等。
它能用 NNI 中大部分内置的 Tuner 来调优,如 TPE,SMAC,Random。
示例的 YAML 文件也启用了评估器来提前终止一些中间结果不好的尝试。
``代码目录:examples/trials/mnist-tfv1/`` 代码示例: :githublink:`mnist-pytorch/ <examples/trials/mnist-pytorch/>`
:raw-html:`<a name="mnist-tfv2"></a>` :raw-html:`<a name="mnist-tfv2"></a>`
**MNIST 中使用 NNI API (TensorFlow v2.x)** **MNIST 中使用 NNI API (TensorFlow v2.x)**
与上述示例的网络相同,但使用了 TensorFlow v2.x Keras API 与上述示例的网络相同,但使用了 TensorFlow。
``代码目录:examples/trials/mnist-tfv2/`` 代码示例: :githublink:`mnist-tfv2/ <examples/trials/mnist-tfv2/>`
:raw-html:`<a name="mnist-annotation"></a>` :raw-html:`<a name="mnist-tfv1"></a>`
**MNIST 中使用 NNI 标记(annotation)** **MNIST 中使用 NNI API (TensorFlow v1.x)**
此样例与上例类似,上例使用的是 NNI API 来指定搜索空间并返回结果,而此例使用的是 NNI 标记 与上述示例的网络相同,但使用了 TensorFlow v1.x Keras API
``代码目录:examples/trials/mnist-annotation/`` 代码示例: :githublink:`mnist-tfv1/ <examples/trials/mnist-tfv1/>`
:raw-html:`<a name="mnist-keras"></a>` :raw-html:`<a name="mnist-annotation"></a>`
**在 Keras 中使用 MNIST** **MNIST 中使用 NNI 标记(annotation)**
此样例由 Keras 实现。 这也MNIST 数据集的网络,包括两个卷积层,一个池化层和两个全连接层 此样例与上例类似,上例使用的是 NNI API 来指定搜索空间并返回结果,而此例使用的NNI 标记
``代码目录:examples/trials/mnist-keras/`` 代码示例: :githublink:`mnist-annotation/ <examples/trials/mnist-annotation/>`
:raw-html:`<a name="mnist-batch"></a>` :raw-html:`<a name="mnist-batch"></a>`
**MNIST -- 用批处理 Tuner 来调优** **MNIST -- 用批处理 Tuner 来调优**
此样例演示了如何使用批处理 Tuner。 只需要在搜索空间文件中列出所有要尝试的配置, NNI 会逐个尝试。 此样例演示了如何使用批处理 Tuner。 只需要在搜索空间文件中列出所有要尝试的配置, NNI 会逐个尝试。
``代码目录:examples/trials/mnist-batch-tune-keras/`` 代码示例: :githublink:`mnist-batch-tune-keras/ <examples/trials/mnist-batch-tune-keras/>`
:raw-html:`<a name="mnist-hyperband"></a>` :raw-html:`<a name="mnist-hyperband"></a>`
**MNIST -- 用 hyperband 调优** **MNIST -- 用 hyperband 调优**
此样例演示了如何使用 hyperband 来调优模型。 在尝试收到的配置中,有个主键叫做 ``STEPS``,尝试要用它来控制运行多长时间(例如,控制迭代的次数)。 此样例演示了如何使用 hyperband 来调优模型。 在尝试收到的配置中,有个主键叫做 ``STEPS``,尝试要用它来控制运行多长时间(例如,控制迭代的次数)。
``代码目录:examples/trials/mnist-hyperband/`` .. cannot find :githublink:`mnist-hyperband/ <examples/trials/mnist-hyperband/>`
代码示例: :githublink:`mnist-hyperband/ <examples/trials/mnist-hyperband/>`
:raw-html:`<a name="mnist-nested"></a>` :raw-html:`<a name="mnist-nested"></a>`
**MNIST -- 用嵌套搜索空间调优** **MNIST -- 用嵌套搜索空间调优**
此样例演示了 NNI 如何支持嵌套的搜索空间。 搜索空间文件示了如何定义嵌套的搜索空间。 此样例演示了 NNI 如何支持嵌套的搜索空间。 搜索空间文件示了如何定义嵌套的搜索空间。
``代码目录:examples/trials/mnist-nested-search-space/`` 代码示例: :githublink:`mnist-nested-search-space/ <examples/trials/mnist-nested-search-space/>`
:raw-html:`<a name="mnist-kubeflow-tf"></a>` :raw-html:`<a name="mnist-kubeflow-tf"></a>`
**用 Kubeflow 运行分布式的 MNIST (tensorflow)** **用 Kubeflow 运行分布式的 MNIST (tensorflow)**
此样例展示了如何通过 NNI 来在 Kubeflow 上运行分布式训练。 只需要简单的提供分布式训练代码,并在配置文件中指定 kubeflow 模式。 例如,运行 ps 和 worker 的命令行,以及各自需要的资源。 此样例使用了 Tensorflow 来实现,因而,需要使用 Kubeflow 的 tf-operator。 此样例展示了如何通过 NNI 来在 Kubeflow 上运行分布式训练。 只需要简单的提供分布式训练代码,并在配置文件中指定 kubeflow 模式。 例如,运行 ps 和 worker 的命令行,以及各自需要的资源。 此样例使用了 Tensorflow 来实现,因而,需要使用 Kubeflow 的 tf-operator。
``代码目录:examples/trials/mnist-distributed/`` 代码示例: :githublink:`mnist-distributed/ <examples/trials/mnist-distributed/>`
:raw-html:`<a name="mnist-kubeflow-pytorch"></a>` :raw-html:`<a name="mnist-kubeflow-pytorch"></a>`
**用 Kubeflow 运行分布式的 MNIST (PyTorch)** **用 Kubeflow 运行分布式的 MNIST (PyTorch)**
与前面的样例类似,不同之处是此样例是 Pytorch 实现的,因而需要使用 Kubeflow 的 pytorch-operator。 与前面的样例类似,不同之处是此样例是 Pytorch 实现的,因而需要使用 Kubeflow 的 pytorch-operator。
``代码目录:examples/trials/mnist-distributed-pytorch/`` 代码示例: :githublink:`mnist-distributed-pytorch/ <examples/trials/mnist-distributed-pytorch/>`
...@@ -111,7 +111,7 @@ NNI 上调优张量算子 ...@@ -111,7 +111,7 @@ NNI 上调优张量算子
请注意,G-BFS 和 N-A2C 这两种方法是专为优化行和列为2的幂的矩阵相乘的平铺(tiling)策略而设计的,所以他们不能够兼容其他类型的搜索空间,因此不能够用来优化批量矩阵乘和2维卷积这两种张量算子。 这里,AutoTVM是由作者在 TVM 项目中实现的,因此调优结果打印在屏幕上,而不是报告给 NNI 管理器。 容器的端口 8080 绑定到主机的同一端口,因此可以通过 ``host_ip_addr:8080`` 访问 NNI Web 界面,并监视调优过程,如下面的屏幕截图所示。 请注意,G-BFS 和 N-A2C 这两种方法是专为优化行和列为2的幂的矩阵相乘的平铺(tiling)策略而设计的,所以他们不能够兼容其他类型的搜索空间,因此不能够用来优化批量矩阵乘和2维卷积这两种张量算子。 这里,AutoTVM是由作者在 TVM 项目中实现的,因此调优结果打印在屏幕上,而不是报告给 NNI 管理器。 容器的端口 8080 绑定到主机的同一端口,因此可以通过 ``host_ip_addr:8080`` 访问 NNI Web 界面,并监视调优过程,如下面的屏幕截图所示。
:raw-html:`<img src="https://github.com/microsoft/nni/blob/v2.0/docs/img/opevo.png?raw=true" />` .. image:: ../../img/opevo.png
引用 OpEvo 引用 OpEvo
------------ ------------
......
...@@ -8,11 +8,11 @@ ...@@ -8,11 +8,11 @@
RocksDB 的性能表现非常依赖于调优操作。 但由于其底层技术较复杂,可配置参数非常多,很难获得较好的配置。 NNI 可帮助解决此问题。 NNI 支持多种调优算法来为 RocksDB 搜索最好的配置,并支持本机、远程服务器和云服务等多种环境。 RocksDB 的性能表现非常依赖于调优操作。 但由于其底层技术较复杂,可配置参数非常多,很难获得较好的配置。 NNI 可帮助解决此问题。 NNI 支持多种调优算法来为 RocksDB 搜索最好的配置,并支持本机、远程服务器和云服务等多种环境。
本示例展示了如何使用 NNI,通过评测工具 ``db_bench`` 来找到 ``fillrandom`` 基准的最佳配置,此工具是 RocksDB 官方提供的评测工具。 在运行示例前,需要检查 NNI 已安装, `db_bench <https://github.com/facebook/rocksdb/wiki/Benchmarking-tools>`__ 已经加入到了 ``PATH`` 中。 参考 `这里 <../Tutorial/QuickStart.rst>`__ ,了解如何安装并准备 NNI 环境,参考 `这里 <https://github.com/facebook/rocksdb/blob/master/INSTALL.rst>`__ 来编译 RocksDB 以及 ``db_bench``。 本示例展示了如何使用 NNI,通过评测工具 ``db_bench`` 来找到 ``fillrandom`` 基准的最佳配置,此工具是 RocksDB 官方提供的评测工具。 在运行示例前,需要检查 NNI 已安装, `db_bench <https://github.com/facebook/rocksdb/wiki/Benchmarking-tools>`__ 已经加入到了 ``PATH`` 中。 参考 `这里 <../Tutorial/QuickStart.rst>`__ ,了解如何安装并准备 NNI 环境,参考 `这里 <https://github.com/facebook/rocksdb/blob/master/INSTALL.md>`__ 来编译 RocksDB 以及 ``db_bench``。
此简单脚本 :githublink:`db_bench_installation.sh <examples/trials/systems/rocksdb-fillrandom/db_bench_installation.sh>` 可帮助编译并在 Ubuntu 上安装 ``db_bench`` 及其依赖包。 可遵循相同的过程在其它系统中安装 RocksDB。 此简单脚本 :githublink:`db_bench_installation.sh <examples/trials/systems_auto_tuning/rocksdb-fillrandom/db_bench_installation.sh>` 可帮助编译并在 Ubuntu 上安装 ``db_bench`` 及其依赖包。 可遵循相同的过程在其它系统中安装 RocksDB。
代码目录: :githublink:`example/trials/systems/rocksdb-fillrandom <examples/trials/systems/rocksdb-fillrandom>` :githublink:`代码文件 <examples/trials/systems_auto_tuning/rocksdb-fillrandom>`
Experiment 设置 Experiment 设置
---------------- ----------------
...@@ -43,7 +43,7 @@ Experiment 设置 ...@@ -43,7 +43,7 @@ Experiment 设置
} }
} }
代码目录 :githublink:`example/trials/systems/rocksdb-fillrandom/search_space.json <examples/trials/systems/rocksdb-fillrandom/search_space.json>` :githublink:`代码文件 <examples/trials/systems_auto_tuning/rocksdb-fillrandom/search_space.json>`
基准测试 基准测试
^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^
...@@ -54,7 +54,7 @@ Experiment 设置 ...@@ -54,7 +54,7 @@ Experiment 设置
* 使用 ``nni.get_next_parameter()`` 来获取下一个系统配置。 * 使用 ``nni.get_next_parameter()`` 来获取下一个系统配置。
* 使用 ``nni.report_final_result(metric)`` 来返回测试结果。 * 使用 ``nni.report_final_result(metric)`` 来返回测试结果。
代码目录 :githublink:`example/trials/systems/rocksdb-fillrandom/main.py <examples/trials/systems/rocksdb-fillrandom/main.py>` :githublink:`代码文件 <examples/trials/systems_auto_tuning/rocksdb-fillrandom/main.py>`
配置文件 配置文件
^^^^^^^^^^^ ^^^^^^^^^^^
...@@ -63,11 +63,11 @@ Experiment 设置 ...@@ -63,11 +63,11 @@ Experiment 设置
这是使用 SMAC 算法调优 RocksDB 的示例: 这是使用 SMAC 算法调优 RocksDB 的示例:
代码目录 :githublink:`example/trials/systems/rocksdb-fillrandom/config_smac.yml <examples/trials/systems/rocksdb-fillrandom/config_smac.yml>` :githublink:`代码文件 <examples/trials/systems_auto_tuning/rocksdb-fillrandom/config_smac.yml>`
这是使用 TPE 算法调优 RocksDB 的示例: 这是使用 TPE 算法调优 RocksDB 的示例:
代码目录 :githublink:`example/trials/systems/rocksdb-fillrandom/config_tpe.yml <examples/trials/systems/rocksdb-fillrandom/config_tpe.yml>` :githublink:`代码文件 <examples/trials/systems_auto_tuning/rocksdb-fillrandom/config_tpe.yml>`
其它 Tuner 算法可以通过相同的方式来使用。 参考 `这里 <../Tuner/BuiltinTuner.rst>`__ 了解详情。 其它 Tuner 算法可以通过相同的方式来使用。 参考 `这里 <../Tuner/BuiltinTuner.rst>`__ 了解详情。
...@@ -97,7 +97,9 @@ Experiment 结果 ...@@ -97,7 +97,9 @@ Experiment 结果
详细的实验结果如下图所示。 水平轴是 Trial 的顺序。 垂直轴是指标,此例中为写入的 OPS。 蓝点表示使用的是 SMAC Tuner,橙色表示使用的是 TPE Tuner。 详细的实验结果如下图所示。 水平轴是 Trial 的顺序。 垂直轴是指标,此例中为写入的 OPS。 蓝点表示使用的是 SMAC Tuner,橙色表示使用的是 TPE Tuner。
.. image:: https://github.com/microsoft/nni/blob/v2.0/docs/img/rocksdb-fillrandom-plot.png?raw=true .. image:: ../../img/rocksdb-fillrandom-plot.png
:target: ../../img/rocksdb-fillrandom-plot.png
:alt: image
下表列出了两个 Tuner 获得的最佳 Trial 以及相应的参数和指标。 不出所料,两个 Tuner 都为 ``fillrandom`` 测试找到了一样的最佳配置。 下表列出了两个 Tuner 获得的最佳 Trial 以及相应的参数和指标。 不出所料,两个 Tuner 都为 ``fillrandom`` 测试找到了一样的最佳配置。
......
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
或手动下载 或手动下载
#. 在 https://rajpurkar.github.io/SQuAD-explorer/ 下载 "dev-v1.1.json""train-v1.1.json"。 #. 在 `这里 <https://rajpurkar.github.io/SQuAD-explorer/>`__ 下载 ``dev-v1.1.json````train-v1.1.json``
.. code-block:: bash .. code-block:: bash
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
wget https://rajpurkar.github.io/SQuAD-explorer/dataset/dev-v1.1.json wget https://rajpurkar.github.io/SQuAD-explorer/dataset/dev-v1.1.json
#. 在 https://nlp.stanford.edu/projects/glove/ 下载 "glove.840B.300d.txt"。 #. 在 `这里 <https://nlp.stanford.edu/projects/glove/>`__ 下载 ``glove.840B.300d.txt``
.. code-block:: bash .. code-block:: bash
...@@ -120,7 +120,7 @@ ...@@ -120,7 +120,7 @@
# 你的 nni_manager ip 地址 # 你的 nni_manager ip 地址
nniManagerIp: 10.10.10.10 nniManagerIp: 10.10.10.10
tuner: tuner:
codeDir: https://github.com/Microsoft/nni/tree/v1.9/examples/tuners/ga_customer_tuner codeDir: https://github.com/Microsoft/nni/tree/v2.0/examples/tuners/ga_customer_tuner
classFileName: customer_tuner.py classFileName: customer_tuner.py
className: CustomerTuner className: CustomerTuner
classArgs: classArgs:
......
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