From 12dd8d3a7379c264b337b308a320776127ed3ee4 Mon Sep 17 00:00:00 2001 From: Chi Song Date: Thu, 13 Jun 2019 23:18:21 +0800 Subject: [PATCH] Chinese translation and placeholder. (#2919) --- README_zh_CN.md | 70 +- contrib/pai_vscode/CHANGELOG_zh_CN.md | 15 +- contrib/pai_vscode/README_zh_CN.md | 195 ++- contrib/pai_vscode/VSCodeExt_zh_CN.md | 28 +- contrib/storage_plugin/README_zh_CN.MD | 114 -- contrib/storage_plugin/storagectl_zh_CN.md | 104 -- contrib/submit-nfs-job/README_zh_CN.md | 72 - contrib/submit-simple-job/README_zh_CN.md | 125 -- docs/zh_CN/alerting/exporter-metrics.md | 37 +- docs/zh_CN/alerting/watchdog-metrics.md | 8 + docs/zh_CN/documentation.md | 2 +- docs/zh_CN/frameworklauncher/README.md | 2 +- docs/zh_CN/job_tutorial.md | 69 +- docs/zh_CN/pai-job-protocol.yaml | 1 + .../pai-management/doc/distributed-deploy.md | 28 +- .../hbase/deploy/configmap-create.sh | 1 - .../deploy/hbase-configuration/hbase-env.sh | 1 - .../doc/how-to-congiure-service-config.md | 26 +- .../how-to-write-pai-service-configuration.md | 2 +- docs/zh_CN/paictl/paictl-manual.md | 12 - docs/zh_CN/rest-server/API.md | 1207 ++++++++++++----- docs/zh_CN/rest-server/runtime-exit-spec.md | 67 + docs/zh_CN/rest-server/runtime-exit-spec.png | Bin 0 -> 14015 bytes docs/zh_CN/upgrade/upgrade_to_v0.11.md | 16 +- docs/zh_CN/upgrade/upgrade_to_v0.12.md | 140 ++ docs/zh_CN/upgrade/upgrade_to_v0.13.md | 140 ++ docs/zh_CN/user/imgs/web_job_detail_retry.png | Bin 26055 -> 37012 bytes docs/zh_CN/user/imgs/web_job_detail_ssh.png | Bin 25731 -> 43058 bytes .../user/imgs/web_job_details_exitcode.png | Bin 29846 -> 45449 bytes .../user/imgs/web_job_details_loglink.png | Bin 27497 -> 41506 bytes .../user/imgs/web_job_details_logview.png | Bin 0 -> 102381 bytes .../user/imgs/web_job_details_metrics.png | Bin 27906 -> 41254 bytes .../zh_CN/user/imgs/web_job_details_over1.png | Bin 24137 -> 42775 bytes .../zh_CN/user/imgs/web_job_details_over2.png | Bin 63388 -> 92029 bytes .../user/imgs/web_job_details_ssh_info.png | Bin 32291 -> 32291 bytes docs/zh_CN/user/imgs/web_job_list_waiting.png | Bin 8958 -> 8958 bytes docs/zh_CN/user/storage.md | 201 +++ docs/zh_CN/user/training.md | 156 +-- docs/zh_CN/user/troubleshooting_job.md | 218 ++- .../autobuild_docker/README_zh_CN.md | 51 - examples/README_zh_CN.md | 83 -- examples/XGBoost/DOCKER_zh_CN.md | 54 - examples/XGBoost/README_zh_CN.md | 51 - examples/auto-test/readme_zh_CN.md | 89 -- .../DOCKER_zh_CN.md | 35 - .../README_zh_CN.md | 77 -- examples/caffe/DOCKER_zh_CN.md | 54 - examples/caffe/README_zh_CN.md | 51 - examples/caffe2/DOCKER_zh_CN.md | 60 - examples/caffe2/README_zh_CN.md | 51 - examples/chainer/DOCKER_zh_CN.md | 57 - examples/chainer/README_zh_CN.md | 55 - examples/cntk/DOCKER_zh_CN.md | 119 -- examples/cntk/README_zh_CN.md | 68 - .../DOCKER_zh_CN.md | 35 - .../README_zh_CN.md | 77 -- examples/horovod/README_zh_CN.md | 73 - examples/job-editor/README_zh_CN.md | 78 -- examples/jupyter/DOCKER_zh_CN.md | 45 - examples/jupyter/README_zh_CN.md | 62 - examples/kafka/DOCKER_zh_CN.md | 39 - examples/kafka/README_zh_CN.md | 35 - examples/keras/DOCKER_zh_CN.md | 80 -- examples/keras/README_zh_CN.md | 78 -- examples/mpi/DOCKER_zh_CN.md | 47 - examples/mpi/README_zh_CN.md | 85 -- examples/mxnet/DOCKER_zh_CN.md | 76 -- examples/mxnet/README_zh_CN.md | 88 -- examples/ocr-serving/README_zh_CN.md | 92 -- .../copied_file/request_ocr/README_zh_CN.md | 29 - examples/pytorch/DOCKER_zh_CN.md | 76 -- examples/pytorch/README_zh_CN.md | 86 -- examples/scikit-learn/DOCKER_zh_CN.md | 76 -- examples/scikit-learn/README_zh_CN.md | 88 -- examples/serving/DOCKER_zh_CN.md | 40 - examples/serving/README_zh_CN.md | 59 - examples/spark/README_zh_CN.md | 157 --- examples/tensorflow/DOCKER_zh_CN.md | 77 -- examples/tensorflow/README_zh_CN.md | 157 --- .../config/alert-manager_zh_CN.md | 56 - src/cleaner/config/cleaner_zh_CN.md | 56 - .../test/job/cleaner-test-job_zh_CN.md | 43 - src/cluster/config/cluster_zh_CN.md | 147 -- src/drivers/config/drivers_zh_CN.md | 69 - src/grafana/config/grafana_zh_CN.md | 55 - .../config/hadoop-data-node_zh_CN.md | 42 - .../config/hadoop-resource-manager_zh_CN.md | 79 -- src/job-exporter/config/job-exporter_zh_CN.md | 72 - .../config/node-exporter_zh_CN.md | 48 - src/prometheus/config/prometheus_zh_CN.md | 63 - src/pylon/README_zh_CN.md | 1 - src/pylon/config/pylon_zh_CN.md | 55 - src/rest-server/README_zh_CN.md | 1 - src/rest-server/config/rest-server_zh_CN.md | 110 -- src/webportal/README_zh_CN.md | 1 - src/webportal/config/webportal_zh_CN.md | 57 - .../config/yarn-frameworkerlauncher_zh_CN.md | 72 - src/zookeeper/config/zookeeper_zh_CN.md | 43 - subprojects/frameworklauncher/README_zh_CN.md | 36 - .../frameworklauncher/yarn/README_zh_CN.md | 96 -- .../yarn/doc/USERMANUAL_zh_CN.md | 1012 -------------- 101 files changed, 1891 insertions(+), 6170 deletions(-) delete mode 100644 contrib/storage_plugin/README_zh_CN.MD delete mode 100644 contrib/storage_plugin/storagectl_zh_CN.md delete mode 100644 contrib/submit-nfs-job/README_zh_CN.md delete mode 100644 contrib/submit-simple-job/README_zh_CN.md create mode 100644 docs/zh_CN/pai-job-protocol.yaml create mode 100644 docs/zh_CN/rest-server/runtime-exit-spec.md create mode 100644 docs/zh_CN/rest-server/runtime-exit-spec.png create mode 100644 docs/zh_CN/upgrade/upgrade_to_v0.12.md create mode 100644 docs/zh_CN/upgrade/upgrade_to_v0.13.md create mode 100644 docs/zh_CN/user/imgs/web_job_details_logview.png create mode 100644 docs/zh_CN/user/storage.md delete mode 100644 examples/Dockerfiles/autobuild_docker/README_zh_CN.md delete mode 100644 examples/README_zh_CN.md delete mode 100644 examples/XGBoost/DOCKER_zh_CN.md delete mode 100644 examples/XGBoost/README_zh_CN.md delete mode 100644 examples/auto-test/readme_zh_CN.md delete mode 100644 examples/azure-rdma-inte-mpi-benchmark-with-horovod-image/DOCKER_zh_CN.md delete mode 100644 examples/azure-rdma-inte-mpi-benchmark-with-horovod-image/README_zh_CN.md delete mode 100644 examples/caffe/DOCKER_zh_CN.md delete mode 100644 examples/caffe/README_zh_CN.md delete mode 100644 examples/caffe2/DOCKER_zh_CN.md delete mode 100644 examples/caffe2/README_zh_CN.md delete mode 100644 examples/chainer/DOCKER_zh_CN.md delete mode 100644 examples/chainer/README_zh_CN.md delete mode 100644 examples/cntk/DOCKER_zh_CN.md delete mode 100644 examples/cntk/README_zh_CN.md delete mode 100644 examples/horovod-with-azure-rdma-intel-mpi/DOCKER_zh_CN.md delete mode 100644 examples/horovod-with-azure-rdma-intel-mpi/README_zh_CN.md delete mode 100644 examples/horovod/README_zh_CN.md delete mode 100644 examples/job-editor/README_zh_CN.md delete mode 100644 examples/jupyter/DOCKER_zh_CN.md delete mode 100644 examples/jupyter/README_zh_CN.md delete mode 100644 examples/kafka/DOCKER_zh_CN.md delete mode 100644 examples/kafka/README_zh_CN.md delete mode 100644 examples/keras/DOCKER_zh_CN.md delete mode 100644 examples/keras/README_zh_CN.md delete mode 100644 examples/mpi/DOCKER_zh_CN.md delete mode 100644 examples/mpi/README_zh_CN.md delete mode 100644 examples/mxnet/DOCKER_zh_CN.md delete mode 100644 examples/mxnet/README_zh_CN.md delete mode 100644 examples/ocr-serving/README_zh_CN.md delete mode 100644 examples/ocr-serving/copied_file/request_ocr/README_zh_CN.md delete mode 100644 examples/pytorch/DOCKER_zh_CN.md delete mode 100644 examples/pytorch/README_zh_CN.md delete mode 100644 examples/scikit-learn/DOCKER_zh_CN.md delete mode 100644 examples/scikit-learn/README_zh_CN.md delete mode 100644 examples/serving/DOCKER_zh_CN.md delete mode 100644 examples/serving/README_zh_CN.md delete mode 100644 examples/spark/README_zh_CN.md delete mode 100644 examples/tensorflow/DOCKER_zh_CN.md delete mode 100644 examples/tensorflow/README_zh_CN.md delete mode 100644 src/alert-manager/config/alert-manager_zh_CN.md delete mode 100644 src/cleaner/config/cleaner_zh_CN.md delete mode 100644 src/cleaner/test/job/cleaner-test-job_zh_CN.md delete mode 100644 src/cluster/config/cluster_zh_CN.md delete mode 100644 src/drivers/config/drivers_zh_CN.md delete mode 100644 src/grafana/config/grafana_zh_CN.md delete mode 100644 src/hadoop-data-node/config/hadoop-data-node_zh_CN.md delete mode 100644 src/hadoop-resource-manager/config/hadoop-resource-manager_zh_CN.md delete mode 100644 src/job-exporter/config/job-exporter_zh_CN.md delete mode 100644 src/node-exporter/config/node-exporter_zh_CN.md delete mode 100644 src/prometheus/config/prometheus_zh_CN.md delete mode 100644 src/pylon/README_zh_CN.md delete mode 100644 src/pylon/config/pylon_zh_CN.md delete mode 100644 src/rest-server/README_zh_CN.md delete mode 100644 src/rest-server/config/rest-server_zh_CN.md delete mode 100644 src/webportal/README_zh_CN.md delete mode 100644 src/webportal/config/webportal_zh_CN.md delete mode 100644 src/yarn-frameworklauncher/config/yarn-frameworkerlauncher_zh_CN.md delete mode 100644 src/zookeeper/config/zookeeper_zh_CN.md delete mode 100644 subprojects/frameworklauncher/README_zh_CN.md delete mode 100644 subprojects/frameworklauncher/yarn/README_zh_CN.md delete mode 100644 subprojects/frameworklauncher/yarn/doc/USERMANUAL_zh_CN.md diff --git a/README_zh_CN.md b/README_zh_CN.md index ade64c561e..4cfb724914 100644 --- a/README_zh_CN.md +++ b/README_zh_CN.md @@ -1,9 +1,6 @@ # AI 开放平台(OpenPAI) ![alt text](./pailogo.jpg "OpenPAI") -[![生成状态](https://travis-ci.org/microsoft/pai.svg?branch=master)](https://travis-ci.org/microsoft/pai) -[![代码覆盖状态](https://coveralls.io/repos/github/microsoft/pai/badge.svg?branch=master)](https://coveralls.io/github/microsoft/pai?branch=master) -[![进入 https://gitter.im/Microsoft/pai 聊天室提问](https://badges.gitter.im/Microsoft/pai.svg)](https://gitter.im/Microsoft/pai?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![版本](https://img.shields.io/github/release/Microsoft/pai.svg)](https://github.com/Microsoft/pai/releases/latest) +[![生成状态](https://travis-ci.org/microsoft/pai.svg?branch=master)](https://travis-ci.org/microsoft/pai) [![代码覆盖状态](https://coveralls.io/repos/github/microsoft/pai/badge.svg?branch=master)](https://coveralls.io/github/microsoft/pai?branch=master) [![进入 https://gitter.im/Microsoft/pai 聊天室提问](https://badges.gitter.im/Microsoft/pai.svg)](https://gitter.im/Microsoft/pai?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![版本](https://img.shields.io/github/release/Microsoft/pai.svg)](https://github.com/Microsoft/pai/releases/latest) [English](README.md) @@ -25,37 +22,38 @@ OpenPAI 作为开源平台,提供了完整的 AI 模型训练和资源管理 1. 在团队间共享强大的 AI 计算资源(例如,GPU、FPGA 集群)。 2. 在组织内共享或重用 AI 资产(如模型、数据、运行环境等) 。 -3. 构建易于 IT 运维的 AI 计算平台。 +3. 构建易于 IT 运维管理的 AI 计算平台。 4. 在同一个环境中完成模型训练过程。 ## 特点 -OpenPAI 采用了成熟的设计,已在微软的大规模生产环境中,通过多年持续运行的验证。 +OpenPAI 的设计成熟可靠。在微软的大规模部署中,得到了多年持续运行的验证。 -### 易于本地部署 +### 易于部署 -OpenPAI 是全栈的解决方案。 OpenPAI 不仅支持本地、公有云及混合云中的部署,还支持单机部署,让用户便于试用。 +OpenPAI 是全栈的解决方案。 不仅支持本地、公有云及混合云中的部署,还支持单机试用的部署。 -### 支持流行的 AI 框架和异构硬件 +### 支持流行的 AI 框架以及异构的硬件 -OpenPAI 提供了预构建的支持主流 AI 框架的 Docker。 很容易增加异构的硬件。 支持分布式训练, 如分布式 TensorFlow。 +OpenPAI 提供了预构建的支持主流 AI 框架的 Docker。 支持添加异构硬件。 支持分布式训练, 如分布式 TensorFlow。 ### 全栈解决方案、易于扩展 -OpenPAI 是支持深度学习、虚拟集群,兼容 Hadoop/Kubernetes 生态系统的完整解决方案。 OpenPAI 支持可扩展组件:可根据需要接入扩展模块。 +OpenPAI 是一个支持深度学习,通过虚拟集群管理,兼容 Hadoop/Kubernetes 生态系统的完整解决方案。 OpenPAI 支持可扩展组件:可根据需要接入扩展模块。 ## 相关项目 -以探索先进技术和开放为目标,[Microsoft Research (MSR)](https://www.microsoft.com/en-us/research/group/systems-research-group-asia/) 还发布了一些相关的开源项目。 +聚焦于开放和最前沿的技术,[微软研究院(MSR)](https://www.microsoft.com/en-us/research/group/systems-research-group-asia/)和[微软互联网工程院](https://www.microsoft.com/en-us/ard/company/introduction.aspx)还发布了其它一些开源项目。 * [NNI](https://github.com/Microsoft/nni): 用于神经体系结构搜索和超参数调优的开源 AutoML 工具包。 我们鼓励研究人员和学生利用这些项目来加速 AI 开发和研究。 * [MMdnn](https://github.com/Microsoft/MMdnn):一个完整、跨框架的解决方案,能够转换、可视化、诊断深度神经网络模型。 MMdnn 中的 "MM" 表示 model management(模型管理),而 "dnn" 是 deep neural network(深度神经网络)的缩写。 +* [NeuronBlocks](https://github.com/Microsoft/NeuronBlocks):面向自然语言理解(NLP)的深度学习建模工具包,帮助工程师像搭建积木一样创建深度神经网络模型。 该工具包可减少自然语言理解建模时的开发成本,对于训练和推理阶段都适用。 ## 入门 -OpenPAI 用于管理计算资源,并对机器学习任务进行了优化。 通过 Docker 技术,硬件计算资源与软件相分离。这样,用户能轻松的进行分布式计算,在不同的深度学习框架间切换,也能在完全一致的环境中重复运行作业。 +OpenPAI 用于管理计算资源,并对机器学习任务进行了优化。 通过 Docker 技术,硬件计算资源与软件相分离。这样,用户能轻松的进行分布式计算,在不同的深度学习框架间切换,也能在完全一致的环境中重复运行 Job。 -作为平台,OpenPAI 需要[部署](#deploy-a-cluster)后才能使用。 OpenPAI 也支持单机部署。 +作为平台,OpenPAI 需要[部署](#部署)后才能使用。 OpenPAI 也支持单机部署。 部署完成后,可参考[训练模型](#训练模型)。 @@ -78,17 +76,17 @@ OpenPAI 用于管理计算资源,并对机器学习任务进行了优化。 ### 部署 -对于小于 50 台服务器的中小型集群,参考[使用默认设置部署](#Deploy-with-default-configuration),用最简单的方式来部署 OpoenPAI。 在默认配置的基础上,可针对不同的硬件环境和使用场景来定制优化部署方案。 +对于小于 50 台服务器的中小型集群,参考[使用默认设置部署](#使用默认配置部署),用最简单的方式来部署 OpoenPAI。 在默认配置的基础上,可针对不同的硬件环境和使用场景来定制优化部署方案。 #### 使用默认配置部署 对于小于 50 台服务器的中小型集群, 建议[使用默认配置部署](docs/zh_CN/pai-management/doc/distributed-deploy.md)。 如果只有一台高性能的计算服务器,参考[在单机上部署 OpenPAI](docs/zh_CN/pai-management/doc/single-box.md)。 -对于大型集群,仍需要根据此向导来生成默认配置,然后再[自定义部署配置](#customize-deployment)。 +对于大型集群,仍需要根据此向导来生成默认配置,然后再[自定义部署配置](#自定义部署)。 #### 自定义部署 -由于不同的硬件环境和使用场景,OpenPAI 的默认配置需要通过自定义来进行优化。 参考[自定义部署](docs/zh_CN/pai-management/doc/how-to-generate-cluster-config.md#Optional-Step-3.-Customize-configure-OpenPAI),了解详情。 +由于不同的硬件环境和使用场景,OpenPAI 的默认配置需要通过自定义来修改。 参考[自定义部署](docs/zh_CN/pai-management/doc/how-to-generate-cluster-config.md#Optional-Step-3.-Customize-configure-OpenPAI),了解详情。 ### 验证部署 @@ -96,47 +94,51 @@ OpenPAI 用于管理计算资源,并对机器学习任务进行了优化。 ### 培训用户 -OpenPAI 的一般用法是提交 Job 请求,等到 Job 获得计算资源后再开始执行。 这和每个人在自己的服务器上运行是不同的。 用户可能会觉得,与在自己的机器上训练相比,这样无法管理计算资源,而且还需要学习如何使用 OpenPAI。 但是,通过 OpenPAI 来共享资源能够提高资源利用率,并节省维护运行的时间。 +OpenPAI 的一般用法是提交 Job 请求,等到 Job 获得计算资源后再开始执行。 这和每个人在自己的服务器上运行是不同的。 用户可能会觉得,与在自己的机器上训练相比,这样无法管理计算资源,而且还需要学习如何使用 OpenPAI。 但通过 OpenPAI 来共享资源能够提高资源利用率,并显著节省维护运行的时间。 -对于 OpenPAI 的管理员来说,部署成功只是第一步,而第二步是让用户理解 OpenPAI 带来的好处,并学会使用它。 用户可以从[训练模型](#train-models)来开始学习。 下面的训练模型部分适用于多种场景,而用户可能不需要了解所有的内容。 因此,管理员可以根据用户场景来简化文档。 +对于 OpenPAI 的管理员来说,部署成功只是第一步,而第二步是让用户理解 OpenPAI 带来的好处,并学会使用它。 用户可从[训练模型](#训练模型)开始学习如何使用。 虽然下面训练模型的章节覆盖了各种场景下的方案,但用户通常不需要了解所有的方法。 因此,管理员可以根据用户的实际场景来创建更简单的文档。 ### 常见问答 如果在部署过程中遇到问题,先查看[这里](docs/zh_CN/faq.md#deploy-and-maintenance-related-faqs)。 -如果还不能解决问题,通过[这里](#get-involved)来讨论或者提交问题。 +如果还不能解决问题,通过[这里](#寻求帮助)来讨论或者提交问题。 ## 训练模型 -和所有机器学习平台一样,OpenPAI 是一个提高生产力的工具。 为了提高资源利用率,建议用户提交训练 Job,并让 OpenPAI 来分配资源并运行 Job。 如果 Job 太多,一些 Job 会排队并等待可用的资源。 这与在自己的服务器上运行代码不同,并且还需要学习一些在 OpenPAI 上提交并管理训练 Job 的知识。 +与所有计算平台一样,OpenPAI 是提高生产力的工具,最大限度地利用资源。 因此,在进行模型训练时,推荐直接将任务提交到 OpenPAI,并让其分配资源来运行。 如果 Job 太多,一些 Job 会排队等待资源。 这与在自己的服务器上运行代码不同,并且还需要学习一些在 OpenPAI 上提交并管理训练 Job 的知识。 -另外,除了 Job 队列,OpenPAI 也支持分配专用的资源。 用户可以像使用物理服务器一样,用 SSH 或 Jupyter 来连接并使用计算资源。参考[这里](examples/jupyter/README_zh_CN.md)了解详情。 虽然这样对资源的利用不会高效,但也节省了在物理服务器上配置管理环境的投入。 +注意,除了支持 Job 排队,OpenPAI 也支持分配专用的资源。 用户可以像使用物理服务器一样,用 SSH 或 Jupyter Notebook 来连接,详情参考[这里](examples/jupyter/README.md)。 虽然这样对资源的利用不高,但也节省了在物理服务器上配置管理环境的精力。 ### 提交训练作业 -参考[提交 hello-world Job](docs/zh_CN/user/training.md),来学习如何在 OpenPAI 上训练模型。 这是一个非常简单的 Job,可以帮助理解 OpenPAI 的 Job 配置,并熟悉 Web 界面。 +参考[提交 hello-world Job](docs/zh_CN/user/training.md),来学习如何在 OpenPAI 上训练模型。 这是使用 OpenPAI 的入门教程。 -### OpenPAI VS Code 客户端 +### 客户端 -[OpenPAI VS Code 客户端](contrib/pai_vscode/VSCodeExt_zh_CN.md)是 OpenPAI 易用的客户端工具。 它是 Visual Studio Code 的扩展。 通过它,能够提交 Job,在本地模拟运行 Job,管理多个 OpenPAI 环境等等。 +[OpenPAI VS Code Client](contrib/pai_vscode/VSCodeExt_zh_CN.md) 是推荐的 OpenPAI 客户端工具,其基于图形界面,易于使用。 它是 Visual Studio Code 的扩展。 支持提交 Job,在本地模拟运行 Job,管理多个 OpenPAI 环境等等。 ### 调研 Job 错误 Web 界面和 Job 日志有助于分析错误,OpenPAI 也支持通过 SSH 登录来调试。 -有关调研 Job 错误的详细信息参考[这里](docs/zh_CN/user/troubleshooting_job.md)。 建议在本地能正常运行代码之后,再提交到 OpenPAI。 这样能减少远程调试的可能性。 +有关调研 Job 错误的详细信息参考[这里](docs/zh_CN/user/troubleshooting_job.md)。 ## 运维管理 -* [使用 paictl 管理集群](docs/paictl/paictl-manual.md) -* [监测](./docs/webportal/README.md) -* [升级](./docs/upgrade/upgrade_to_v0.13.md) +* [使用 paictl 管理集群](docs/zh_CN/paictl/paictl-manual.md) +* [监测](./docs/zh_CN/webportal/README.md) +* [升级](./docs/zh_CN/upgrade/upgrade_to_v0.13.md) ## 参考手册 -* [Job 配置](docs/job_tutorial.md) -* [RESTful API](docs/rest-server/API.md) -* 可以在[这里](docs)查看设计文档。 +### 用户 + +* [客户端](contrib/pai_vscode/VSCodeExt_zh_CN.md) +* [使用存储](docs/zh_CN/user/storage.md) +* [Job 配置](docs/zh_CN/job_tutorial.md) +* [RESTful API](docs/zh_CN/rest-server/API.md) +* [设计文档](docs)可帮助了解 OpenPAI 的设计和架构。 ## 寻求帮助 @@ -161,7 +163,7 @@ Web 界面和 Job 日志有助于分析错误,OpenPAI 也支持通过 SSH 登 * OpenPAI 虚拟集群设计。 [Issue 1754](https://github.com/Microsoft/pai/issues/1754) * OpenPAI 协议设计。 [Issue 2007](https://github.com/Microsoft/pai/issues/2007) -### 谁应该考虑为 OpenPAI 做贡献 +### 考虑为 OpenPAI 做贡献 * 希望添加对其它机器学习或深度学习框架的支持 * 希望 OpenPAI 成为更强大的 AI 平台(例如,支持更多的机器学习流程,超参调优) @@ -171,4 +173,4 @@ Web 界面和 Job 日志有助于分析错误,OpenPAI 也支持通过 SSH 登 OpenPAI 的一个重要目标是支持学术界和工业界非常多样化的需求。 OpenPAI 是完全开放的:它采用了 MIT 许可证。 这使得 PAI 特别适合用来探索各种研究想法,例如[这些模块](./docs/zh_CN/research_education.md)。 -OpenPAI 采用开放的形式来合作。 它最初由微软研究院和微软互联网工程院 AI 平台团队联合开发。 很高兴能有北京大学、西安交通大学、浙江大学、中国科学技术大学等高校加入平台开发。 无论是来自从学术界还是工业界的贡献,都非常欢迎。 +OpenPAI 采用开放的形式来合作。 由[微软研究院(MSR)](https://www.microsoft.com/en-us/research/group/systems-research-group-asia/)和[微软互联网工程院](https://www.microsoft.com/en-us/ard/company/introduction.aspx) AI 平台团队联合设计开发。 很高兴能有北京大学、西安交通大学、浙江大学、中国科学技术大学等高校加入平台开发。 无论是来自从学术界还是工业界的贡献,都非常欢迎。 diff --git a/contrib/pai_vscode/CHANGELOG_zh_CN.md b/contrib/pai_vscode/CHANGELOG_zh_CN.md index f9927c4c0e..954e145574 100644 --- a/contrib/pai_vscode/CHANGELOG_zh_CN.md +++ b/contrib/pai_vscode/CHANGELOG_zh_CN.md @@ -4,10 +4,21 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [0.0.1] - 2018-01-09 +## [0.1.0] - 2019-01 ### Added - Open job pages and dashboard pages in VS Code - Submit job to PAI cluster from VS Code -- Open PAI's hdfs as a workspace folder \ No newline at end of file +- Open PAI's hdfs as a workspace folder + +## [0.2.0] - 2019-03 + +### Added + +- Generate jsonc job config by default +- Add a PAI view container (sidebar), includes + - Job list view + - Auto refresh enabled + - HDFS explorer + - You can choose where hdfs explorer will be shown (view container or workspace folder) \ No newline at end of file diff --git a/contrib/pai_vscode/README_zh_CN.md b/contrib/pai_vscode/README_zh_CN.md index fd5fcf1a40..05a44502ab 100644 --- a/contrib/pai_vscode/README_zh_CN.md +++ b/contrib/pai_vscode/README_zh_CN.md @@ -1,96 +1,159 @@ # OpenPAI VS Code Client -OpenPAI Client is an extension to connect PAI clusters, submit AI jobs, and manage files on HDFS. +OpenPAI VS Code Client 是一个 Visual Studio Code 的扩展组件,可以连接 OpenPAI 集群,提交 Job,在本地模拟运行 Job,管理文件等等。 -## Get Started +- [OpenPAI VS Code Client](#openpai-vs-code-client) + - [连接到 OpenPAI 集群](#连接到-openpai-群集) + - [提交 Job](#提交-job) + - [本机模拟](#本机模拟) + - [先决条件](#先决条件) + - [步骤](#步骤) + - [局限性](#局限性) + - [参考](#参考) + - [GUI](#gui) + - [Command Palette](#command-palette) + - [PAI Cluster Explorer](#pai-cluster-explorer) + - [Settings](#settings) + - [问题和建议](#问题和建议) + - [贡献](#贡献) + - [许可证](#许可证) -1. Run command 'PAI: Add PAI Cluster' from command palette (Ctrl+Shift+P) -2. Fill in username, password and other fields and press "finish" button. +## 连接到 OpenPAI 群集 -![](https://raw.githubusercontent.com/Microsoft/pai/master/contrib/pai_vscode/assets/add-cluster-finish.png) +使用 OpenPAI VS Code Client 之前,按照以下步骤连接到 OpenPAI 集群。 -3. Your cluster will be shown in PAI CLUSTER EXPLORER (at the bottom of VS Code's file explorer by default) -4. Expand the tree node and double click the command you like. +注意, OpenPAI 集群的版本必须大于或等于 0.8.0。 -## Submit Job +1. 使用快捷键 Ctrl+Shift+P 打开命令面板。 +2. 如下输入并查找 *PAI: Add PAI Cluster*。 + + ![添加集群](https://raw.githubusercontent.com/Microsoft/pai/master/contrib/pai_vscode/assets/add_cluster.png) + -The extension uses a job config file (in json format) to describe a traing job. You can create multiple job config files for your code so that you can choose proper settings upon job submission. +3. 按下 Enter,并输入 OpenPAI 集群的地址。 可以是域名或者 IP 地址。 然后,再次按下 Enter。 + + ![添加集群](https://raw.githubusercontent.com/Microsoft/pai/master/contrib/pai_vscode/assets/add_cluster.png) + -1. Generate a PAI job config file by: - - - Double click "Create Job Config..." - - or - - - Right click a source code file and click "Create PAI Job Config JSON" -2. Fill the created PAI job config JSON's command and job name fields. -3. Right click the created JSON file and select "Submit Job to PAI Cluster" -4. The job will be submitted to PAI cluster +4. 配置文件将会被打开,至少需要填入 username 和 password 字段。 完成后,点击右下角的 *Finish* 按钮。 注意,如果直接保存并关闭文件,则无法生效。 + + ![添加集群配置](https://raw.githubusercontent.com/Microsoft/pai/master/contrib/pai_vscode/assets/add-cluster-finish.png) + -![](https://raw.githubusercontent.com/Microsoft/pai/master/contrib/pai_vscode/assets/submit-job.gif) +如果有多个 OpenPAI 群集,可以多次按照上述步骤进行。 -## Simulate Job Running +## 提交 Job -The extension has a useful feature called "Simulate Job Running". It enables the users to run and debug their AI jobs in local environment without really submitting the job to PAI cluster. This is helpful when the users want to verify the docker image, start up command, and the code quickly. +添加完集群配置后,可以在*PAI CLUSTER EXPLORER* 面板找到该集群。 -1. Right click a job config file and click "Simulate PAI Job Running" The extension will prepare necessary files and create a docker file in local folder for later use. -2. A message box pops up, users have two options: - - - Simulate first task in VS Code terminal - - This will execute the simulation command within VS Code terminal window. - - - Reveal in Explorer - - This will pops up the OS's file explorer and navigates to the simulation folder. Users can manually execute the simulation command. (run-docker.cmd on Windows, or run-docker.sh on Linux). +![pai cluster explorer](https://raw.githubusercontent.com/Microsoft/pai/master/contrib/pai_vscode/assets/pai_cluster_explorer.png) -![](https://raw.githubusercontent.com/Microsoft/pai/master/contrib/pai_vscode/assets/simulate-job.gif) +可通过以下步骤创建 Job 配置,并提交到 OpenPAI。 -## Commands +1. Double click *Create Job Config...* in OpenPAI cluster Explorer, and then specify file name and location to create a job configuration file. +2. Update job configuration as needed. If you are not familiar with this configuration file, learn from [here](https://github.com/Microsoft/pai/blob/master/docs/user/training.md#learn-hello-world-job). +3. Right click on the created job configuration file, then click on *Submit Job to PAI Cluster*. The client will upload files to OpenPAI and create a job. Once it's done, there is a notification at right bottom corner, you can click to open the job detail page. + + If there are multiple OpenPAI clusters, you need to choose one. + + This animation shows above steps. + ![submit job](https://raw.githubusercontent.com/Microsoft/pai/master/contrib/pai_vscode/assets/submit-job.gif) + -### Command Pallete +## 本机模拟 -| Name | Description | -| ------------------------------- | --------------------------------------------------------- | -| PAI: Add PAI Cluster | Add a new cluster to PAI Cluster Explorer | -| PAI: Open Dashboard | Open dashboard pages in VS Code | -| PAI: Submit Job to PAI Cluster | Select a PAI job config file and submit it to PAI cluster | -| PAI: Create PAI Job Config File | Create an empty PAI job config file | -| PAI: Simulate PAI Job Running | Generate Dockerfile to simulate PAI job running | +As it needs sometime to wait job starting in OpenPAI cluster, local simulation can help identifying and debugging most code, environment and configuration issues quickly. -### PAI Cluster Explorer +### 先决条件 + +[Docker](https://docs.docker.com/install/) MUST be installed to use local simulation. + +### 步骤 + +1. As submit a job, you can right click a configuration file to find local simulation. +2. Click *Simulate PAI Job Running*, after a while below notification shows. + + ![simulate running](https://raw.githubusercontent.com/Microsoft/pai/master/contrib/pai_vscode/assets/simulate_running.png) + + +3. you can click on *Simulate first task in VS Code terminal* to simulate directly, or *Reveal in Explorer* to view created docker files and start simulation manually. + +This animation shows above steps. ![simulate job](https://raw.githubusercontent.com/Microsoft/pai/master/contrib/pai_vscode/assets/simulate-job.gif) + +### 局限性 + +As local simulation is a close but still different environment with OpenPAI cluster, there are some issues cannot be found by simulation. Some examples, + +- The job may need much more memory or distributed environments. It cannot be simulated locally. +- The job may need GPU, but local computer may not have one. It may need code logic to handle this situation. It also needs a different docker image if you are using TensorFlow. As TensorFlow has different package for GPU and non-GPU runtime. +- The job may run much more time locally. In most case, the computing power of local computer is much lower than servers in the OpenPAI cluster. If you need to simulate a job end-to-end, it may need to reduce iterations to get result faster. +- Local machine may not be able to access some storage. The OpenPAI cluster may be deployed in a private environment, so that local computer may not able to access resource of cluster. + +## 参考 -| Name | Description | -| ----------------------- | ---------------------------------------------------------------------- | -| Open Web Portal... | Open PAI's web portal page in VS Code (right click to open in browser) | -| List Jobs... | Open PAI's job list page in VS Code (right click to open in browser) | -| Create Job Config... | Create an empty PAI job config file | -| Submit Job... | Submit job to selected cluster | -| Simulate Job Running... | Generate Dockerfile to simulate PAI job running | -| Edit Configuration... | Edit cluster configuration | -| Open HDFS... | Open selected cluster's HDFS as a VS Code workspace folder | +### GUI -## Settings +The client has two GUI parts. First is the *PAI CLUSTER EXPLORER* in explorer and used in above introduction. Second can be opened by the icon in activity bar. + +![activity bar](https://raw.githubusercontent.com/Microsoft/pai/master/contrib/pai_vscode/assets/activity_bar.png) + +There are two parts in the side bar. + +- HDFS Explorer + + You can view, upload and download folder and files of the OpenPAI cluster storage. + + +- Job List + + You can view jobs in OpenPAI cluster. The lists refresh periodically, and the icon shows the status of each job. You can open a job in browser with double clicking it. + + +![job list](https://raw.githubusercontent.com/Microsoft/pai/master/contrib/pai_vscode/assets/job-list.png) + +### Command Palette + +| Name | Description | +| ------------------------------- | ----------------------------------------- | +| PAI: Add PAI Cluster | Add a new OpenPAI cluster | +| PAI: Open Dashboard | View OpenPAI cluster in browser | +| PAI: Submit Job to PAI Cluster | Submit an OpenPAI job | +| PAI: Create PAI Job Config File | Create an OpenPAI configuration file | +| PAI: Simulate PAI Job Running | Generate Docker file for local simulation | + +### PAI Cluster Explorer -| ID | Description | -| ------------------------------- | -------------------------------------------------------------------------------------------------------- | -| pai.job.upload.enabled | Controls whether the extension will upload your project files to PAI job config's code dir automatically | -| pai.job.upload.exclude | Glob pattern for excluding files and folders | -| pai.job.upload.include | Glob pattern for including files and folders | -| pai.job.generateJobName.enabled | Controls whether the extension will add a random suffix to your job name when submitting job | +| Name | Description | +| ----------------------- | --------------------------------------------- | +| Open Web Portal... | Browse to OpenPAI's web portal | +| List Jobs... | Open PAI's job list page in VS Code | +| Create Job Config... | Create an OpenPAI configuration file | +| Submit Job... | Submit an OpenPAI job | +| Simulate Job Running... | Generate Docker file for local simulation | +| Edit Configuration... | Edit OpenPAI cluster configuration | +| Open HDFS... | Open HDFS storage explorer of OpenPAI cluster | -## Requirements +### Settings -PAI Cluster Version >= 0.8.0 +| 标识 | 说明 | +| -------------------------------- | ------------------------------------------------------- | +| pai.job.upload.enabled | Whether will upload files to codeDir of configuration | +| pai.job.upload.exclude | Excluded files and folders for uploading | +| pai.job.upload.include | Included files and folders for uploading | +| pai.job.generateJobName.enabled | Whether add a random suffix to job name when submitting | +| pai.job.jobList.recentJobsLength | The number in *Recent Submitted Jobs from VS Code* | +| pai.job.jobList.allJobsPageSize | The page size of the *All Jobs* list | +| pai.job.jobList.refreshInterval | The refresh interval of job list (in seconds) | +| pai.hdfs.location | Where HDFS storage will be shown | -## Contributing +## 问题和建议 -https://github.com/Microsoft/pai#how-to-contribute +提交到 [GitHub](https://github.com/Microsoft/pai/issues) -**Report an issue**: +## 贡献 -If you have issue/ bug/ new feature request, please submit it at [GitHub](https://github.com/Microsoft/pai/issues) +https://github.com/microsoft/pai/blob/master/README_zh_CN.md#参与贡献 -## License +## 许可证 MIT \ No newline at end of file diff --git a/contrib/pai_vscode/VSCodeExt_zh_CN.md b/contrib/pai_vscode/VSCodeExt_zh_CN.md index 4413316fe8..264cf2851f 100644 --- a/contrib/pai_vscode/VSCodeExt_zh_CN.md +++ b/contrib/pai_vscode/VSCodeExt_zh_CN.md @@ -1,23 +1,21 @@ -# OpenPAI VS Code Client +# OpenPAI VS Code 客户端 -OpenPAI VS Code Client can submit AI jobs, simulate job running locally, manage HDFS files, and etc. It's an extension of Visual Studio Code. +OpenPAI VS Code Client 是专用于 OpenPAI 的客户端工具。 它是 [Visual Studio Code](https://code.visualstudio.com/) 的扩展组件。 Visual Studio Code 是一个轻量级但功能强大的源代码编辑器,可在主流桌面平台上运行,支持 Windows,macOS 和 Linux。 -Visual Studio Code is a popular, free, lightweight but powerful source code editor which runs on your desktop and is available for Windows, macOS and Linux. +With OpenPAI VS Code Client, you can submit jobs, simulate jobs locally, manage files, and etc. OpenPAI VS Code Client supports Windows, macOS, and Linux like Visual Studio Code. -## Installation +## 安装 -1. Download and install [Visual Studio Code](https://code.visualstudio.com/) by several clicks. - -2. Install **OpenPAI Client**. +1. 安装并运行 [Visual Studio Code](https://code.visualstudio.com)。 Click green button to download and install Visual Studio Code if it's not installed yet. - 1. Launch VS Code. - 2. Click the "Extensions" icon in Activity Bar or press **Ctrl+Shift+X** to bring up the Extensions view. - 3. Input **openpai** in the text box, the OpenPAI VS Code Client will appear in the result list. - 4. Click the **Install** button. The extension will be installed. - 5. After a successful installation, you will see an introduction page. Follow the instructions there and try the PAI client. + ![下载 VS Code](assets/download_vscode.png) + +2. 启动 Visual Studio Code 后,单击左侧的 *Extensions* 图标。 并输入 *openpai* 来搜索 OpenPAI VS Code Client。 - ![Extension](./assets/ext-install-1.png) + ![扩展](assets/ext-install-1.png) + +3. 点击 **Install** 按钮,并等待完成安装。 -## Next step +## How-to -Learn how to [use OpenPAI VS Code Client](./README.md) \ No newline at end of file +Learn how to [use OpenPAI VS Code Client](./README.md). \ No newline at end of file diff --git a/contrib/storage_plugin/README_zh_CN.MD b/contrib/storage_plugin/README_zh_CN.MD deleted file mode 100644 index 3737cdb72d..0000000000 --- a/contrib/storage_plugin/README_zh_CN.MD +++ /dev/null @@ -1,114 +0,0 @@ -# Team wise storage - -A tool to manage external storage in PAI. - -## Index -- [ Storage data structure ](#Data_structure) - - [ Server data structure ](#Server_data) - - [ User data structure ](#User_data) -- [ Team wise storage usages ](#Usages) - - [ Setup NFS server ](#Usages_nfs) - - [ Create server config in PAI storage plugin ](#Usages_server) - - [ Create user config in PAI storage plugin ](#Usages_user) - - [ Use Storage info in job container ](#Usages_job) - - -## Team wise storage data structures - -### Server data structure -```json -{ - "type": "nfs", - "title": "default nfs", - "address": "10.0.0.1", - "rootPath": "/mnt", - "sharedFolders": ["data"], - "privateFolders": ["users"] -} -``` - -- type: Remote server type, currently support nfs. -- title: Shown name on server selection. -- address: Remote server address. -- rootPath: The root share folder on remote server. -- sharedFolders: The shared folders under root path. Remote server will create folders like [rootPath]/[sharedFolder]. -- privateFolders: The private folders for users. The value is the parent folder before user name. Remote server will create folders like [rootPath]/[privateFolder]/[userName] - - -### User data structure -```json -{ - "defaultStorage": "storage name", - "externalStorages": [ - "storage name", - "storage name2" - ] -} -``` - -- defaultStorage: The default storage config used for user. -- externalStorages: User will have permission and his own private folders on all servers in externamStorages according to storage settings. - - -## Team wise storage usages - -### Setup NFS server -- Remote server: 10.0.0.1 -- Root folder: /share/teamA - -Edit /etc/exports, export /share/teamA -``` -/share/teamA (rw, sync, no_root_squash) -``` -no_root_squash is needed for storage plugin to creae folders. - - -### Create server config in PAI storage plugin -In PAI dev-box, swith to folder contrib/storage-plugin - -Create server config using command: -``` -python storagectl.py server set teamA nfs 10.0.0.1 /share/teamA --sharedfolders data --privatefolders users -``` - -- This will do the following things: - - Update k8s configmap, save server config - - Check remote nfs exports - - Create temp folder, mount remote folder, - Check and create /share/teamA/data on server as public folder if needed - Create private folder /share/teamA/users/[user name] for all users who have access to the server - - Unmount and delete temp folder - - -### Create user config in PAI storage plugin -In PAI dev-box, swith to folder contrib/storage-plugin - -Create user config using command: -``` -python storagectl.py user setdefault user1 teamA -``` - -- This will do the following things: - - Set server teamA as user1's default external storage server - - Add teamA in to user1's available storage servers - - Create user1's private folder on teamA server - - -### Use Storage info in job container -On webportal, we can get all server info and user info through URL: -```TypeScript -storageExternalUrl = `${api}/api/v1/kubernetes/api/v1/namespaces/default/configmaps/storage-external`; -storageUserUrl = `${api}/api/v1/kubernetes/api/v1/namespaces/default/configmaps/storage-user`; - -fetch(storageExternalUrl).then(responseToData); -fetch(storageUserUrl).then(responseToData); -``` - -Then we can get user's default storage config through user name, and get the server detail. -```TypeScript -const content = storageUserData[`${user}.json`]; -const { defaultStorage } = JSON.parse(content); -storageKey = defaultStorage; -const storageContent = storageExternalData[storageKey]; -const { type, address, rootPath } = JSON.parse(storageContent); -``` diff --git a/contrib/storage_plugin/storagectl_zh_CN.md b/contrib/storage_plugin/storagectl_zh_CN.md deleted file mode 100644 index 7506210482..0000000000 --- a/contrib/storage_plugin/storagectl_zh_CN.md +++ /dev/null @@ -1,104 +0,0 @@ -# storagectl - -A tool to manage your storage config. - -## Index - -- [ Init storage settings ](#Init) - - - [Init with no default external storage](#Init_None) - - [Init with a nfs server as default external storage](#Init_Nfs) - -- [ Manage Server Config ](#Server_config) - - - [ Set server config for nfs ](#Server_set) - - [ List server config ](#Server_list) - - [ Create path for server ](#Server_createpath) - -- [ Manage user config ](#User_config) - - - [ Set user default server ](#User_setdefault) - - [ List user config ](#User_list) - -- [ Push storage settings ](#Push) - - - [ Push server settings ](#Push_server) - - [ Push user settings ](#Push_user) - -## Init storage settings - -### Init with no default external storage - - python storagectl.py init [-f] none - - -- Create default.json with no storage server. - - If -f was specified, it will override existing default.json on k8s server settings, else it will exit if default.json already exists. - - Create default user storage settings for all PAI users as well - -### Init with a nfs server as default external storage - - python storagectl.py init [-f] nfs address rootpath - - -- Create default.json with nfs server. - - If -f was specified, it will override existing default.json on k8s server settings, else it will exit if default.json already exists. - - Create default user storage settings for all PAI users as well - -## Manage Server Config - -### Set server config for nfs - - python storagectl.py server set SERVER_NAME nfs ADDRESS ROOT_PATH [--sharedfolders SHARED_FOLDERS [SHARED_FOLDERS ...]] [--privatefolders PRIVATE_FOLDERS [PRIVATE_FOLDERS ...]] - - -- Create or modify server config -- If '--sharedfolders' is set, create shared folders ROOT_PATH/SHARED_FOLDERS on remote server. -- If '--privatefolders' is set, create user private folders ROOT_PATH/PRIVATE_FOLDERS/USER_NAME for every user associated with the server on remote server. - -### List server config - - python storagectl.py server list - - -- List all servers - -### Create path for server - - python storagectl.py server createpath SERVER_NAME - - -- Check and create path for server if needed - -## Manage User Config - -### Set user default server - - python storagectl.py user setdefault USER_NAME SERVER_NAME - - -- Set default server for user - - If privatefolders was defined on server, create privae folders for user on ROOT_PATH/PRIVATE_FOLDERS/USER_NAME - -### List user config - - python storagectl.py user list - - -- List all users - -## Push storage settings - -### Push server settings - - python storagectl.py push server /path/to/server-config/dir/or/file - - -- Create or update server config - -### Push user settings - - python storagectl.py push user /path/to/user-config/dir/or/file - - -- Create or update user storage config \ No newline at end of file diff --git a/contrib/submit-nfs-job/README_zh_CN.md b/contrib/submit-nfs-job/README_zh_CN.md deleted file mode 100644 index 54f9a7fb3b..0000000000 --- a/contrib/submit-nfs-job/README_zh_CN.md +++ /dev/null @@ -1,72 +0,0 @@ -# Submit NFS Job Plugin - -A web portal plugin to submit job with data on NFS. - -## Build - -```bash -git clone https://github.com/Microsoft/pai.git -cd pai/contrib/submit-nfs-job -yarn -yarn build -``` - -The built file will be located in `dist/plugin.js`. - -## Deploy - -Put the built plugin file to a static file server that is accessible by the user. - -Read [PLUGINS](../../docs/webportal/PLUGINS.md#publish) for details. - -## Install - -Append the following plugin configuration to the `webportal.plugins` section of `service-configuration.yaml` file. - -```yaml -webportal: - plugins: - - id: submit-nfs-job - title: Submit NFS Job - uri: # URL of the deployed plugin file. -``` - -## Storage Preparation - -See - -## Develop - -```bash -git clone https://github.com/Microsoft/pai.git -cd pai/contrib/submit-nfs-job -yarn -yarn start -``` - -Configure the plugin of webportal env file with the uri `http://localhost:8080/plugin.js`. - -## License - - Copyright (c) Microsoft Corporation - All rights reserved. - - MIT License - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. \ No newline at end of file diff --git a/contrib/submit-simple-job/README_zh_CN.md b/contrib/submit-simple-job/README_zh_CN.md deleted file mode 100644 index dcc6ff8b5e..0000000000 --- a/contrib/submit-simple-job/README_zh_CN.md +++ /dev/null @@ -1,125 +0,0 @@ -# Submit Simple Job - -## Background - -"Submit Simple Job" is released to be a [PAI web portal plugin](../../docs/webportal/PLUGINS.md) with a UI similar to [DLWorkspace](https://github.com/Microsoft/DLWorkspace) that makes DLWorkspace users familiar with OpenPAI quickly. It includes the following features: - -- Caffe / Tensorflow / Pytorch job templates -- Multilined command support -- One-click tensorboard support -- Customize the running user (root / current user) -- NFS mount (Extra configuration needed) -- HyperParameter training - -## User's Guide - -### Entrance - -The plugin could be accessed by the link in the "plugins" section of sidebar menu, with title customized by the system administrator. If you do not know which one is the plugin, ask your system administrator. - -### Usage - -#### Main Section - -![Main Section](docs/main-section.png) - -- **Job Template**: shortcut of customizing the job. - - ![Job Template](docs/job-template.png) - -- **Job Name**: the name of the job, similar to PAI - -- **Job Type**: WIP, now regular job only. -- **Number of GPUs**: setting how many GPUs used in *each* task. -- **Docker Image**: the base Docker image of the job, private docker registry is supported only if the system administrator is configured the authentication file. -- **Command**: the command to run the job, will be running in root if the followed "Launch container as root user" is checked. -- **Virtual Cluster**: which virtual cluster the job will running on. -- **Interactive Job**: checked if the job could publish network interfaces, and then the specific ports could be customized. ![Interactive Job](docs/interactive-job.png) -- **Enable Tensorboard**: checked if a tensorboard task will be run. A model path could be customized. ![Tensorboard](docs/tensorboard.png) -- **Launch container as root user**: if checked, the *Command* will be run in root user, otherwise it will be run in the current user. - -#### Advanced Section - -- **Mount Directories**: Mount NFS directories to the job container. This option could be displayed only if the NFS option of the plugin is fully configured. ![Mount Directories](docs/mount-directories.png) -- **HyperParameter Training**: Enable hyper parameter training. ![Hyper Parameter](docs/hyper-parameter.png) -- **Environment Variables**: Customize environment variables. ![Environment Variables](docs/environment-variables.png) -- **Privileged Docker**: Customize CPU and memory requirements of the job, other options are under development. ![Prvileged Docker](docs/privileged-docker.png) - -#### Database Operation - -![Database Operation](docs/database-operation.png) - -- Download JSON: export the current form to a JSON file. -- Upload JSON: import the JSON file exported from this plugin of DLWorkspace to the form. - -## System Administrator's Guide - -### Build - - npm install - npm run build - - -The build file is located in `./dist/plugin.js` - -### Deploy - -Deploy the build file to any server accessible by web portal users. Write down the public URL of the file for configuration. - -### Install - -Config your `service-configuration.yaml` add/update the following fields to `webportal` section - -```YAML -webportal: - # ... other configs - plugins: - - title: Submit Simple Job - uri: "[plugin public url]?nfs=[NFS host]:[NFS root]&auth-file=hdfs:[hdfs uri]" -``` - -### Configure - -According to the YAML config in [Install section](#install), there are two config fields available, in query string syntax appended to the plugin file URL: **(Don't forget to do character encoding)** - -- `nfs` the NFS host and root directory, in `[host]:[root]` format, for example `nfs=10.0.0.1%3A%2Fusers`. -- `auth-file` the docker registry authorization file path in HDFS, in `hdfs:[path]` format, for example `auth-file=hdfs%3A%2F%2F10.0.0.1%3A8020%2Fauth.txt`. - -## Developer's Guide - -### Contribute - -Start the local web portal server with .env settings: - - WEBPORTAL_PLUGINS=[{"title":"Submit Simple Job", "uri": "/scripts/plugins/submit-simple-job.js"}] - - -And then run the builder within the plugin directory. - - npm install - npm run watch - - -## License - - MIT License - - Copyright (c) Microsoft Corporation. All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE \ No newline at end of file diff --git a/docs/zh_CN/alerting/exporter-metrics.md b/docs/zh_CN/alerting/exporter-metrics.md index 8b8a7bb299..3288040f7a 100644 --- a/docs/zh_CN/alerting/exporter-metrics.md +++ b/docs/zh_CN/alerting/exporter-metrics.md @@ -5,29 +5,30 @@ Some important metrics are listed below. | Metrics Name | By | Description | | ------------------------------ | --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `configured_gpu_count` | `job_exporter` | number of gpu configured by user | -| `nvidiasmi_utilization_gpu` | `job_exporter` | GPU utilization detectived by nvidiasmi | -| `nvidiasmi_utilization_memory` | `job_exporter` | GPU memory utilization detectiving by nvidiasmi | +| `nvidiasmi_utilization_gpu` | `job_exporter` | GPU utilization detected by nvidiasmi | +| `nvidiasmi_utilization_memory` | `job_exporter` | GPU memory utilization detected by nvidiasmi | +| `nvidiasmi_temperature` | `job_exporter` | GPU temperature detected by nvidiasmi | | `task_gpu_percent` | `job_exporter` | GPU utilization by specified job container | | `task_gpu_mem_percent` | `job_exporter` | GPU memory utilization by specified job container | -| `task_cpu_percent` | `job_exporter` | CPU utilization by job detectived by docker stats | -| `task_mem_usage_byte` | `job_exporter` | Memory usage by job detectived by docker stats (byte) | -| `task_mem_limit_byte` | `job_exporter` | Memory limit by job detectived by docker stats (byte) | -| `task_mem_usage_percent` | `job_exporter` | Memory utilization by job detectived by docker stats | -| `task_net_in_byte` | `job_exporter` | Network in traffic by job detectived by docker stats (byte) | -| `task_net_out_byte` | `job_exporter` | Network out traffic by job detectived by docker stats (byte) | -| `task_block_in_byte` | `job_exporter` | Block io in traffic by job detectived by docker stats (byte) | -| `task_block_out_byte` | `job_exporter` | Block io out traffic by job detectived by docker stats (byte) | +| `task_cpu_percent` | `job_exporter` | CPU utilization by job detected by docker stats | +| `task_mem_usage_byte` | `job_exporter` | Memory usage by job detected by docker stats (byte) | +| `task_mem_limit_byte` | `job_exporter` | Memory limit by job detected by docker stats (byte) | +| `task_mem_usage_percent` | `job_exporter` | Memory utilization by job detected by docker stats | +| `task_net_in_byte` | `job_exporter` | Network in traffic by job detected by docker stats (byte) | +| `task_net_out_byte` | `job_exporter` | Network out traffic by job detected by docker stats (byte) | +| `task_block_in_byte` | `job_exporter` | Block io in traffic by job detected by docker stats (byte) | +| `task_block_out_byte` | `job_exporter` | Block io out traffic by job detected by docker stats (byte) | | `node_filefd_allocated` | `node_exporter` | Number of file descriptor allocated in node | | `node_disk_read_time_ms` | `node_exporter` | Node disk read time (ms) | | `node_disk_write_time_ms` | `node_exporter` | Node disk write time (ms) | | `node_load1` | `node_exporter` | Node load in past 1 minute | | `node_filesystem_free` | `node_exporter` | Node filesystem free space (byte) | -| `service_cpu_percent` | `job_exporter` | CPU utilization by pai service detectived by docker stats | -| `service_mem_usage_byte` | `job_exporter` | Memory usage by pai service detectived by docker stats (byte) | -| `service_mem_limit_byte` | `job_exporter` | Memory limit by pai service detectived by docker stats (byte) | -| `service_mem_usage_percent` | `job_exporter` | Memory utilization by pai service detectived by docker stats | -| `service_net_in_byte` | `job_exporter` | Network in traffic by pai service detectived by docker stats (byte) | -| `service_net_out_byte` | `job_exporter` | Network out traffic by pai service detectived by docker stats (byte) | -| `service_block_in_byte` | `job_exporter` | Block io in traffic by pai service detectived by docker stats (byte) | -| `service_block_out_byte` | `job_exporter` | Block io out traffic by pai service detectived by docker stats (byte) | +| `service_cpu_percent` | `job_exporter` | CPU utilization by pai service detected by docker stats | +| `service_mem_usage_byte` | `job_exporter` | Memory usage by pai service detected by docker stats (byte) | +| `service_mem_limit_byte` | `job_exporter` | Memory limit by pai service detected by docker stats (byte) | +| `service_mem_usage_percent` | `job_exporter` | Memory utilization by pai service detected by docker stats | +| `service_net_in_byte` | `job_exporter` | Network in traffic by pai service detected by docker stats (byte) | +| `service_net_out_byte` | `job_exporter` | Network out traffic by pai service detected by docker stats (byte) | +| `service_block_in_byte` | `job_exporter` | Block io in traffic by pai service detected by docker stats (byte) | +| `service_block_out_byte` | `job_exporter` | Block io out traffic by pai service detected by docker stats (byte) | | `docker_daemon_count` | `job_exporter` | Used to summary the count of docker daemon, value of this metric is always 1, use "error" label to mark if daemon is healthy or not, admin can use `sum(docker_daemon_count{"error"!="ok"})` to get the count of unhealthy docker daemon in cluster | \ No newline at end of file diff --git a/docs/zh_CN/alerting/watchdog-metrics.md b/docs/zh_CN/alerting/watchdog-metrics.md index 392353dff1..ae40346fb7 100644 --- a/docs/zh_CN/alerting/watchdog-metrics.md +++ b/docs/zh_CN/alerting/watchdog-metrics.md @@ -65,6 +65,14 @@ vi watchdog-xx.log | ---------------------- | ------------------------------------------------------------------------------------------------------------ | | k8s_api_server_count | use label `error` to represent status, if `error` != "ok", means k8s api server is not functioning correctly | +## K8s resource Metrics + +| Metric name | Description | +| ------------------------ | ---------------------------------------------------------------------------------------------------- | +| k8s_node_gpu_total | Total Gpu | +| k8s_node_gpu_available | Total gpu count - used gpu count | +| k8s_node_gpu_reserved | If node is marked as unschedulable via `kubectl cordon $node` all unused gpus are deemed as reserved | + ## Other Metrics | Metric name | Description | diff --git a/docs/zh_CN/documentation.md b/docs/zh_CN/documentation.md index c1e187da51..2ca7b5b8c4 100644 --- a/docs/zh_CN/documentation.md +++ b/docs/zh_CN/documentation.md @@ -9,7 +9,7 @@ ### Configuration and API - [Configuration: customize OpenPAI via its configuration](./pai-management/doc/customized-configuration.md) -- [OpenPAI Programming Guides](../../examples/README_zh_CN.md) +- [OpenPAI Programming Guides](../../examples/README.md) - [Restful API Docs](rest-server/API.md) ### [FAQs](./faq.md) \ No newline at end of file diff --git a/docs/zh_CN/frameworklauncher/README.md b/docs/zh_CN/frameworklauncher/README.md index 64d1cccf07..5faad58b9c 100644 --- a/docs/zh_CN/frameworklauncher/README.md +++ b/docs/zh_CN/frameworklauncher/README.md @@ -19,4 +19,4 @@ # Microsoft FrameworkLauncher -参考 [FrameworkLauncher](../../../subprojects/frameworklauncher/README_zh_CN.md) 文档。 \ No newline at end of file +参考 [FrameworkLauncher](../../../subprojects/frameworklauncher/README.md) 文档。 \ No newline at end of file diff --git a/docs/zh_CN/job_tutorial.md b/docs/zh_CN/job_tutorial.md index fc1c308887..cc1f535f26 100644 --- a/docs/zh_CN/job_tutorial.md +++ b/docs/zh_CN/job_tutorial.md @@ -28,6 +28,7 @@ OpenPAI supports major deep learning frameworks, including CNTK and TensorFlow, - [Environment variables](#environment-variables) - [A complete example](#a-complete-example) - [Learn more job examples](#learn-more-job-examples) + - [Job exit spec](#job-exit-spec) ## Quick start: submit a hello-world job @@ -85,37 +86,37 @@ A json file describe detailed configuration required for a job submission. The d Below please find the detailed explanation for each of the parameters in the config file: -| Field Name | Schema | Description | -|:-------------------------------- |:------------------------------------------------- |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `jobName` | String in `^[A-Za-z0-9\-._~]+$` format, required | Name for the job, need to be unique | -| `image` | String, required | URL pointing to the Docker image for all tasks in the job | -| `authFile` | String, optional, HDFS URI | Docker registry authentication file existing on HDFS | -| `dataDir` | String, optional, HDFS URI | Data directory existing on HDFS | -| `outputDir` | String, optional, HDFS URI | Output directory on HDFS, `$PAI_DEFAULT_FS_URI/Output/$jobName` will be used if not specified | -| `codeDir` | String, optional, HDFS URI | Code directory existing on HDFS, should not contain any data and should be less than 200MB. codeDir will created to your job container local environment and could be accessed inner job container. NOTE: this folder is readonly | -| `virtualCluster` | String, optional | The virtual cluster job runs on. If omitted, the job will run on `default` virtual cluster | -| `taskRoles` | List, required | List of `taskRole`, one task role at least | -| `taskRole.name` | String in `^[A-Za-z0-9._~]+$` format, required | Name for the task role, need to be unique with other roles | -| `taskRole.taskNumber` | Integer, required | Number of tasks for the task role, no less than 1 | -| `taskRole.cpuNumber` | Integer, required | CPU number for one task in the task role, no less than 1 | -| `taskRole.memoryMB` | Integer, required | Memory for one task in the task role, no less than 100 | -| `taskRole.shmMB` | Integer, optional | Shared memory for one task in the task role, no more than memory size. The default value is 64MB | -| `taskRole.gpuNumber` | Integer, required | GPU number for one task in the task role, no less than 0 | -| `taskRole.portList` | List, optional | List of `portType` to use | -| `taskRole.portType.label` | String in `^[A-Za-z0-9._~]+$` format, required | Label name for the port type | -| `taskRole.portType.beginAt` | Integer, required | The port to begin with in the port type, 0 for random selection | -| `taskRole.portType.portNumber` | Integer, required | Number of ports for the specific type | -| `taskRole.command` | String, required | Executable command for tasks in the task role, can not be empty | -| `taskRole.minFailedTaskCount` | Integer, optional | Number of failed tasks to fail the entire job, null or no less than 1, if set to null means the job will always succeed regardless any task failure. 参考 [FrameworkLauncher 用户文档](../../subprojects/frameworklauncher/yarn/doc/USERMANUAL_zh_CN.md#ApplicationCompletionPolicy)了解详情 | -| `taskRole.minSucceededTaskCount` | Integer, optional | Number of succeeded tasks to succeed the entire job, null or no less than 1, if set to null means the job will only succeed until all tasks are completed and minFailedTaskCount is not triggered. 参考 [FrameworkLauncher 用户文档](../../subprojects/frameworklauncher/yarn/doc/USERMANUAL_zh_CN.md#ApplicationCompletionPolicy)了解详情 | -| `gpuType` | String, optional | Specify the GPU type to be used in the tasks. If omitted, the job will run on any gpu type | -| `retryCount` | Integer, optional | Job retry count, no less than 0 | -| `jobEnvs` | Object, optional | Job env parameters, key-value pairs, available in job container and **no substitution allowed** | -| `jobEnvs.paiAzRDMA` | Boolean, optional | If you cluster is azure rdma capable, you could specify the parameter to make your container azure rdma capable. How to use azure rdma? 参考 [Job 样例](../../examples/azure-rdma-inte-mpi-benchmark-with-horovod-image) | -| `jobEnvs.isDebug` | Boolean, optional | after this flag is set as ```true```, if user's command exits with a none-zero value, the failed container will be reserved for job debugging. [More detail](user/troubleshooting_job.md#reserve-failed-docker-for-debugging) | -| `extras` | Object, optional | Extra parameters, key-value pairs, save any information that job may use | - -更多详情,参考 [FrameworkLauncher 用户手册](../../subprojects/frameworklauncher/yarn/doc/USERMANUAL_zh_CN.md)。 +| Field Name | Schema | Description | +|:-------------------------------- |:------------------------------------------------- |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `jobName` | String in `^[A-Za-z0-9\-._~]+$` format, required | Name for the job, need to be unique | +| `image` | String, required | URL pointing to the Docker image for all tasks in the job | +| `authFile` | String, optional, HDFS URI | Docker registry authentication file existing on HDFS | +| `dataDir` | String, optional, HDFS URI | Data directory existing on HDFS | +| `outputDir` | String, optional, HDFS URI | Output directory on HDFS, `$PAI_DEFAULT_FS_URI/Output/$jobName` will be used if not specified | +| `codeDir` | String, optional, HDFS URI | Code directory existing on HDFS, should not contain any data and should be less than 200MB. codeDir will created to your job container local environment and could be accessed inner job container. NOTE: this folder is readonly | +| `virtualCluster` | String, optional | The virtual cluster job runs on. If omitted, the job will run on `default` virtual cluster | +| `taskRoles` | List, required | List of `taskRole`, one task role at least | +| `taskRole.name` | String in `^[A-Za-z0-9._~]+$` format, required | Name for the task role, need to be unique with other roles | +| `taskRole.taskNumber` | Integer, required | Number of tasks for the task role, no less than 1 | +| `taskRole.cpuNumber` | Integer, required | CPU number for one task in the task role, no less than 1 | +| `taskRole.memoryMB` | Integer, required | Memory for one task in the task role, no less than 100 | +| `taskRole.shmMB` | Integer, optional | Shared memory for one task in the task role, no more than memory size. The default value is 64MB | +| `taskRole.gpuNumber` | Integer, required | GPU number for one task in the task role, no less than 0 | +| `taskRole.portList` | List, optional | List of `portType` to use | +| `taskRole.portType.label` | String in `^[A-Za-z0-9._~]+$` format, required | Label name for the port type | +| `taskRole.portType.beginAt` | Integer, required | The port to begin with in the port type, 0 for random selection | +| `taskRole.portType.portNumber` | Integer, required | Number of ports for the specific type | +| `taskRole.command` | String, required | Executable command for tasks in the task role, can not be empty | +| `taskRole.minFailedTaskCount` | Integer, optional | Number of failed tasks to fail the entire job, null or no less than 1, if set to null means the job will always succeed regardless any task failure. 参考 [FrameworkLauncher 用户文档](../../subprojects/frameworklauncher/yarn/doc/USERMANUAL.md#ApplicationCompletionPolicy)了解详情 | +| `taskRole.minSucceededTaskCount` | Integer, optional | Number of succeeded tasks to succeed the entire job, null or no less than 1, if set to null means the job will only succeed until all tasks are completed and minFailedTaskCount is not triggered. 参考 [FrameworkLauncher 用户文档](../../subprojects/frameworklauncher/yarn/doc/USERMANUAL.md#ApplicationCompletionPolicy)了解详情 | +| `gpuType` | String, optional | Specify the GPU type to be used in the tasks. If omitted, the job will run on any gpu type | +| `retryCount` | Integer, optional | Job retry count, no less than 0 | +| `jobEnvs` | Object, optional | Job env parameters, key-value pairs, available in job container and **no substitution allowed** | +| `jobEnvs.paiAzRDMA` | Boolean, optional | If you cluster is azure rdma capable, you could specify the parameter to make your container azure rdma capable. How to use azure rdma? 参考 [Job 样例](../../examples/azure-rdma-inte-mpi-benchmark-with-horovod-image) | +| `jobEnvs.isDebug` | Boolean, optional | after this flag is set as ```true```, if user's command exits with a none-zero value, the failed container will be reserved for job debugging. [More detail](user/troubleshooting_job.md#reserve-failed-docker-for-debugging) | +| `extras` | Object, optional | Extra parameters, key-value pairs, save any information that job may use | + +更多详情,参考 [FrameworkLauncher 用户手册](../../subprojects/frameworklauncher/yarn/doc/USERMANUAL.md)。 If you're using a private Docker registry which needs authentication for image pull and is different from the registry used during deployment, please create an authentication file in the following format, upload it to HDFS and specify the path in `authFile` parameter in config file. @@ -230,4 +231,8 @@ A distributed TensorFlow job is listed below as an example: ## Learn more job examples -For more examples, please refer to [job examples directory](../../examples). \ No newline at end of file +For more examples, please refer to [job examples directory](../../examples). + +## Job exit spec + +For the **specification of each job exitcode**, please refer to [PAI Job Exit Spec User Manual](../../src/job-exit-spec/config/user-manual.md). \ No newline at end of file diff --git a/docs/zh_CN/pai-job-protocol.yaml b/docs/zh_CN/pai-job-protocol.yaml new file mode 100644 index 0000000000..ed97d539c0 --- /dev/null +++ b/docs/zh_CN/pai-job-protocol.yaml @@ -0,0 +1 @@ +--- diff --git a/docs/zh_CN/pai-management/doc/distributed-deploy.md b/docs/zh_CN/pai-management/doc/distributed-deploy.md index f82886f36d..55c080450f 100644 --- a/docs/zh_CN/pai-management/doc/distributed-deploy.md +++ b/docs/zh_CN/pai-management/doc/distributed-deploy.md @@ -22,34 +22,34 @@ ### Index - [Step 1. Prepare Deployment Environment](#c-step-1) -- [Step 2. Prepare configuration](#c-step-2) -- [Step 3. Boot up Kubernetes](#c-step-3) -- [Step 4. Update cluster configuration into kubernetes](#c-step-4) +- [Step 2. Prepare Configuration](#c-step-2) +- [Step 3. Deploy Kubernetes](#c-step-3) +- [Step 4. Update cluster configuration into Kubernetes](#c-step-4) - [Step 5. Start all OpenPAI services](#c-step-5) -- [appendix. Validate deployment](#appendix) -- [appendix. Azure RDMA](#az_rdma) +- [Appendix. Validate deployment](#appendix) +- [Appendix. Azure RDMA](#az_rdma) * * * ### Step 1. Prepare Deployment Environment -- [Option A. Start Dev-box contianer as the environemnt.](./how-to-setup-dev-box.md) +- [Option A. Start Dev-box contianer as the environment.](./how-to-setup-dev-box.md) - [Option B. Install necessary dependency software on your host.](./how-to-install-depdencey.md) -Note 1: If you wanna manage the cluster in a machine belonging to OpenPAI, please choose option B. Otherwise, option A is highly recommended. +Note 1: If you wanna manage the cluster in a machine belonging to OpenPAI, please choose Option B. Otherwise, Option A is highly recommended. * * * -### Step 2. Prepare Configuraiton +### Step 2. Prepare Configuration - [Option A. Generate the Cluster Configuration from template](./how-to-generate-cluster-config.md) - [Option B. Write your own Cluster Configuration](./customized-configuration.md) -If this the first time for you to deploy OpenPAI, Option A is highly recommended. +If this is the first time for you to deploy OpenPAI, Option A is highly recommended. If you wanna customize the configuration, you could firstly follow the Option A to generate a rough cluster configuration. And then you can follow Option B to customize your configuration according to your requirements. -If you are very familiar with OpenPAI, you could directly write your configuraiton based on the Option B. +If you are very familiar with OpenPAI, you could directly write your configuration based on the Option B. * * * @@ -57,11 +57,11 @@ If you are very familiar with OpenPAI, you could directly write your configurait If your cluster is deployed in Azure, and there are azure rdma capable machines. Please go to this [section](#az_rdma) first. -- [A Guide to deploy kubenretes with paictl](./how-to-bootup-k8s.md) +- [A Guide to deploy Kubernetes with paictl](./how-to-bootup-k8s.md) * * * -### Step 4. Update cluster configuration into kubernetes +### Step 4. Update cluster configuration into Kubernetes - [A Guide to update configuration](./push-cfg-and-set-id.md) @@ -73,12 +73,12 @@ If your cluster is deployed in Azure, and there are azure rdma capable machines. * * * -### appendix. Validate deployment +### Appendix. Validate deployment - [A Guide to validate deployment](./validate-deployment.md) * * * -### appendix. Azure RDMA +### Appendix. Azure RDMA - [A Guide to Enable Azure RDMA](./azure/enable-az-rdma.md) \ No newline at end of file diff --git a/docs/zh_CN/pai-management/doc/example/add-service/hbase/deploy/configmap-create.sh b/docs/zh_CN/pai-management/doc/example/add-service/hbase/deploy/configmap-create.sh index b9870adc4c..4d9037f2fa 100644 --- a/docs/zh_CN/pai-management/doc/example/add-service/hbase/deploy/configmap-create.sh +++ b/docs/zh_CN/pai-management/doc/example/add-service/hbase/deploy/configmap-create.sh @@ -16,4 +16,3 @@ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/docs/zh_CN/pai-management/doc/example/add-service/hbase/deploy/hbase-configuration/hbase-env.sh b/docs/zh_CN/pai-management/doc/example/add-service/hbase/deploy/hbase-configuration/hbase-env.sh index 7438369575..406580fa5c 100644 --- a/docs/zh_CN/pai-management/doc/example/add-service/hbase/deploy/hbase-configuration/hbase-env.sh +++ b/docs/zh_CN/pai-management/doc/example/add-service/hbase/deploy/hbase-configuration/hbase-env.sh @@ -131,4 +131,3 @@ # HBASE_ROOT_LOGGER=INFO,DRFA # The reason for changing default to RFA is to avoid the boundary case of filling out disk space as # DRFA doesn't put any cap on the log size. Please refer to HBase-5655 for more context. - diff --git a/docs/zh_CN/pai-management/doc/how-to-congiure-service-config.md b/docs/zh_CN/pai-management/doc/how-to-congiure-service-config.md index 4b9358b612..441b34d2dc 100644 --- a/docs/zh_CN/pai-management/doc/how-to-congiure-service-config.md +++ b/docs/zh_CN/pai-management/doc/how-to-congiure-service-config.md @@ -58,16 +58,16 @@ Besides the default cofiguration to make OpenPAI start, admin could customize ea According to your requirements, choose the component which you wanna customized. Please read the table and the link in the table carefully. -| Service | Description | Tutorial | -| ------------------------------------------------------------ | ------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | -| cluster | Configure data-path, cluster-id, azure rdma switch and docker-registry to pull image. | [Link](../../../../src/cluster/config/cluster_zh_CN.md) | -| drivers | Configure drivers version and nvidia runtime. | [Link](../../../../src/drivers/config/drivers_zh_CN.md) | -| hadoop-resource-manager | yarn exporter port and default vc configuration | [Link](../../../../src/hadoop-resource-manager/config/hadoop-resource-manager_zh_CN.md) | -| yarn-frameworklauncher | frameworklauncher port configuration | [Link](../../../../src/yarn-frameworklauncher/config/yarn-frameworkerlauncher_zh_CN.md) | -| rest-server | admin account, github for marketplace, jwt-secret | [Link](../../../../src/rest-server/config/rest-server_zh_CN.md) | -| webportal | webportal port configuration | [Link](../../../../src/webportal/config/webportal_zh_CN.md) | -| grafana | grafana port configuration | [Link](../../../../src/grafana/config/grafana_zh_CN.md) | -| node-exporter | node-exporter port configuration | [Link](../../../../src/node-exporter/config/node-exporter_zh_CN.md) | -| alert-manager | port configuration and alerts email configuration | [Link](../../../../src/alert-manager/config/alert-manager_zh_CN.md) | -| prometheus | port configuration and scrape interval configuration | [Link](../../../../src/prometheus/config/prometheus_zh_CN.md) | -| pylon | port configuration | [Link](../../../../src/pylon/config/pylon_zh_CN.md) | \ No newline at end of file +| Service | Description | Tutorial | +| ------------------------------------------------------------ | ------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- | +| cluster | Configure data-path, cluster-id, azure rdma switch and docker-registry to pull image. | [Link](../../../../src/cluster/config/cluster.md) | +| drivers | Configure drivers version and nvidia runtime. | [Link](../../../../src/drivers/config/drivers.md) | +| hadoop-resource-manager | yarn exporter port and default vc configuration | [Link](../../../../src/hadoop-resource-manager/config/hadoop-resource-manager.md) | +| yarn-frameworklauncher | frameworklauncher port configuration | [Link](../../../../src/yarn-frameworklauncher/config/yarn-frameworkerlauncher.md) | +| rest-server | admin account, github for marketplace, jwt-secret | [Link](../../../../src/rest-server/config/rest-server.md) | +| webportal | webportal port configuration | [Link](../../../../src/webportal/config/webportal.md) | +| grafana | grafana port configuration | [Link](../../../../src/grafana/config/grafana.md) | +| node-exporter | node-exporter port configuration | [Link](../../../../src/node-exporter/config/node-exporter.md) | +| alert-manager | port configuration and alerts email configuration | [Link](../../../../src/alert-manager/config/alert-manager.md) | +| prometheus | port configuration and scrape interval configuration | [Link](../../../../src/prometheus/config/prometheus.md) | +| pylon | port configuration | [Link](../../../../src/pylon/config/pylon.md) | \ No newline at end of file diff --git a/docs/zh_CN/pai-management/doc/how-to-write-pai-service-configuration.md b/docs/zh_CN/pai-management/doc/how-to-write-pai-service-configuration.md index aa32bafd5e..34e1925d35 100644 --- a/docs/zh_CN/pai-management/doc/how-to-write-pai-service-configuration.md +++ b/docs/zh_CN/pai-management/doc/how-to-write-pai-service-configuration.md @@ -38,7 +38,7 @@ User could customize Pylon startup configuration at OpenPAI's [folder / file](.. ## Configure FrameworkLauncher -用户可以自定义 FrameworkLauncher [folder / file](../../../../subprojects/frameworklauncher/yarn/doc/USERMANUAL_zh_CN.md#Configuration) +用户可以自定义 FrameworkLauncher [folder / file](../../../../subprojects/frameworklauncher/yarn/doc/USERMANUAL.md#Configuration) User could customize FrameworkLauncher startup configuration at OpenPAI's [folder / file](../../../../src/yarn-frameworklauncher/deploy/yarn-frameworklauncher.yaml.template) diff --git a/docs/zh_CN/paictl/paictl-manual.md b/docs/zh_CN/paictl/paictl-manual.md index ef0ed0148d..6911470ac4 100644 --- a/docs/zh_CN/paictl/paictl-manual.md +++ b/docs/zh_CN/paictl/paictl-manual.md @@ -13,7 +13,6 @@ A tool to manage your pai cluster. - [ Maintain machines ](#Machine) - [ Add machines to the cluster ](#Machine_Add) - [ Remove machines from the cluster ](#Machine_Remove) - - [ Add new machine, remove old machine ](#Machine_Update) - [ Fix crashed etcd node](#etcd_fix) - [ Maintain your service ](#Service) - [ Start service(s) ](#Service_Start) @@ -126,17 +125,6 @@ paictl.py config get-id [-c kube-config] - See an example of the machine list [here](#Machine_Nodelist_Example). -### Add new machine, remove old machine - -- Step1: update your machinelist in the cluster configuration - - Remove the machine you wanna remove in the list. - - Add the machine into the machine list. - - Update cluster configuration with the this [command](#Config_Push). -- Step2: Execute the machine update command following. - - python paictl.py machine update [-c /path/to/kubeconfig] - - ### Fix crashed etcd node python paictl.py machine etcd-fix -p /path/to/cluster-configuration/dir -l machine-list.yaml diff --git a/docs/zh_CN/rest-server/API.md b/docs/zh_CN/rest-server/API.md index cd16ef0443..28ea260fe1 100644 --- a/docs/zh_CN/rest-server/API.md +++ b/docs/zh_CN/rest-server/API.md @@ -68,660 +68,1195 @@ *Request* - -POST /api/v1/token - -
*Parameters* + ```json + POST /api/v1/token -{ "username": "your username", "password": "your password", "expiration": "expiration time in seconds" } +*Parameters* -
*Response if succeeded* - +```json +{ + "username": "your username", + "password": "your password", + "expiration": "expiration time in seconds" +} +``` + +*Response if succeeded* +```json Status: 200 -{ "token": "your access token", "user": "username", "admin": true if user is admin } +{ + "token": "your access token", + "user": "username", + "admin": true if user is admin +} +``` -
*Response if user does not exist* - +*Response if user does not exist* +```json Status: 400 -{ "code": "NoUserError", "message": "User $username is not found." } +{ + "code": "NoUserError", + "message": "User $username is not found." +} +``` -
*Response if password is incorrect* - +*Response if password is incorrect* +```json Status: 400 -{ "code": "IncorrectPassworkError", "message": "Password is incorrect." } +{ + "code": "IncorrectPassworkError", + "message": "Password is incorrect." +} +``` -
*Response if a server error occured* - +*Response if a server error occurred* +```json Status: 500 -{ "code": "UnknownError", "message": "*Upstream error messages*" } +{ + "code": "UnknownError", + "message": "*Upstream error messages*" +} +``` -
### `PUT user` - - Update a user in the system. - Administrator can add user or change other user's password; user can change his own password. - - *Request* - +### `PUT user` -PUT /api/v1/user Authorization: Bearer +Update a user in the system. Administrator can add user or change other user's password; user can change his own password. -
*Parameters* - +*Request* -{ "username": "username in [_A-Za-z0-9]+ format", "password": "password at least 6 characters", "admin": true | false, "modify": true | false } +```json +PUT /api/v1/user +Authorization: Bearer +``` -
*Response if succeeded* - +*Parameters* + +```json +{ + "username": "username in [_A-Za-z0-9]+ format", + "password": "password at least 6 characters", + "admin": true | false, + "modify": true | false +} +``` +*Response if succeeded* + +```json Status: 201 -{ "message": "update successfully" } +{ + "message": "update successfully" +} +``` -
*Response if not authorized* - +*Response if not authorized* +```json Status: 401 -{ "code": "UnauthorizedUserError", "message": "Guest is not allowed to do this operation." } +{ + "code": "UnauthorizedUserError", + "message": "Guest is not allowed to do this operation." +} +``` -
*Response if current user has no permission* - +*Response if current user has no permission* +```json Status: 403 -{ "code": "ForbiddenUserError", "message": "Non-admin is not allow to do this operation." } +{ + "code": "ForbiddenUserError", + "message": "Non-admin is not allow to do this operation." +} +``` -
*Response if updated user does not exist* - +*Response if updated user does not exist* +```json Status: 404 -{ "code": "NoUserError", "message": "User $username is not found." } +{ + "code": "NoUserError", + "message": "User $username is not found." +} +``` -
*Response if created user has a duplicate name* - +*Response if created user has a duplicate name* +```json Status: 409 -{ "code": "ConflictUserError", "message": "User name $username already exists." } +{ + "code": "ConflictUserError", + "message": "User name $username already exists." +} +``` -
*Response if a server error occured* - +*Response if a server error occurred* +```json Status: 500 -{ "code": "UnknownError", "message": "*Upstream error messages*" } +{ + "code": "UnknownError", + "message": "*Upstream error messages*" +} +``` -
### `DELETE user` (administrator only) - - Remove a user in the system. - - *Request* - +### `DELETE user` (administrator only) -DELETE /api/v1/user Authorization: Bearer +Remove a user in the system. -
*Parameters* - +*Request* -{ "username": "username to be removed" } +```json +DELETE /api/v1/user +Authorization: Bearer +``` -
*Response if succeeded* - +*Parameters* + +```json +{ + "username": "username to be removed" +} +``` + +*Response if succeeded* +```json Status: 200 -{ "message": "remove successfully" } +{ + "message": "remove successfully" +} +``` -
*Response if not authorized* - +*Response if not authorized* +```json Status: 401 -{ "code": "UnauthorizedUserError", "message": "Guest is not allowed to do this operation." } +{ + "code": "UnauthorizedUserError", + "message": "Guest is not allowed to do this operation." +} +``` -
*Response if user has no permission* - +*Response if user has no permission* +```json Status: 403 -{ "code": "ForbiddenUserError", "message": "Non-admin is not allow to do this operation." } +{ + "code": "ForbiddenUserError", + "message": "Non-admin is not allow to do this operation." +} +``` -
*Response if an admin will be removed* - +*Response if an admin will be removed* +```json Status: 403 -{ "code": "RemoveAdminError", "message": "Admin $username is not allowed to remove." } +{ + "code": "RemoveAdminError", + "message": "Admin $username is not allowed to remove." +} +``` -
*Response if updated user does not exist* - +*Response if updated user does not exist* +```json Status: 404 -{ "code": "NoUserError", "message": "User $username is not found." } +{ + "code": "NoUserError", + "message": "User $username is not found." +} +``` -
*Response if a server error occured* - +*Response if a server error occurred* +```json Status: 500 -{ "code": "UnknownError", "message": "*Upstream error messages*" } +{ + "code": "UnknownError", + "message": "*Upstream error messages*" +} +``` -
### `PUT user/:username/virtualClusters` (administrator only) - - Administrators can update user's virtual cluster. Administrators can access all virtual clusters, all users can access default virtual cluster. - - *Request* - +### `PUT user/:username/virtualClusters` (administrator only) -PUT /api/v1/user/:username/virtualClusters Authorization: Bearer +Administrators can update user's virtual cluster. Administrators can access all virtual clusters, all users can access default virtual cluster. -
*Parameters* - +*Request* -{ "virtualClusters": "virtual cluster list separated by commas (e.g. vc1,vc2)" } +```json +PUT /api/v1/user/:username/virtualClusters +Authorization: Bearer +``` -
*Response if succeeded* - +*Parameters* +```json +{ + "virtualClusters": "virtual cluster list separated by commas (e.g. vc1,vc2)" +} +``` + +*Response if succeeded* + +```json Status: 201 -{ "message": "update user virtual clusters successfully" } +{ + "message": "update user virtual clusters successfully" +} +``` -
*Response if the virtual cluster does not exist.* - +*Response if the virtual cluster does not exist.* +```json Status: 400 -{ "code": "NoVirtualClusterError", "message": "Virtual cluster $vcname is not found." } +{ + "code": "NoVirtualClusterError", + "message": "Virtual cluster $vcname is not found." +} +``` -
*Response if not authorized* - +*Response if not authorized* +```json Status: 401 -{ "code": "UnauthorizedUserError", "message": "Guest is not allowed to do this operation." } +{ + "code": "UnauthorizedUserError", + "message": "Guest is not allowed to do this operation." +} +``` -
*Response if user has no permission* - +*Response if user has no permission* +```json Status: 403 -{ "code": "ForbiddenUserError", "message": "Non-admin is not allow to do this operation." } +{ + "code": "ForbiddenUserError", + "message": "Non-admin is not allow to do this operation." +} +``` -
*Response if user does not exist.* - +*Response if user does not exist.* +```json Status: 404 -{ "code": "NoUserError", "message": "User $username is not found." } +{ + "code": "NoUserError", + "message": "User $username is not found." +} +``` -
*Response if a server error occured* - +*Response if a server error occurred* +```json Status: 500 -{ "code": "UnknownError", "message": "*Upstream error messages*" } +{ + "code": "UnknownError", + "message": "*Upstream error messages*" +} +``` -
### `GET jobs` - - Get the list of jobs. - - *Request* - +### `GET jobs` + +Get the list of jobs. +*Request* + +```json GET /api/v1/jobs +``` -
*Parameters* - +*Parameters* -{ "username": "filter jobs with username" } +```json +{ + "username": "filter jobs with username" +} +``` -
*Response if succeeded* - +*Response if succeeded* +```json Status: 200 -{ [ ... ] } +{ + [ ... ] +} +``` -
*Response if a server error occured* - +*Response if a server error occurred* +```json Status: 500 -{ "code": "UnknownError", "message": "*Upstream error messages*" } +{ + "code": "UnknownError", + "message": "*Upstream error messages*" +} +``` -
### `GET user/:username/jobs` - - Get the list of jobs of user. - - *Request* - +### `GET user/:username/jobs` + +Get the list of jobs of user. +*Request* + +```json GET /api/v1/user/:username/jobs +``` -
*Response if succeeded* - +*Response if succeeded* +```json Status: 200 -{ [ ... ] } +{ + [ ... ] +} +``` -
*Response if a server error occured* - +*Response if a server error occurred* +```json Status: 500 -{ "code": "UnknownError", "message": "*Upstream error messages*" } +{ + "code": "UnknownError", + "message": "*Upstream error messages*" +} +``` -
### `GET user/:username/jobs/:jobName` - - Get job status in the system. - - *Request* - +### `GET user/:username/jobs/:jobName` -GET /api/v1/user/:username/jobs/:jobName +Get job status in the system. -
*Response if succeeded* - +*Request* -Status: 200 +```json +GET /api/v1/user/:username/jobs/:jobName +``` -{ name: "jobName", jobStatus: { username: "username", virtualCluster: "virtualCluster", state: "jobState", // raw frameworkState from frameworklauncher subState: "frameworkState", createdTime: "createdTimestamp", completedTime: "completedTimestamp", executionType: "executionType", // Sum of succeededRetriedCount, transientNormalRetriedCount, // transientConflictRetriedCount, nonTransientRetriedCount, // and unKnownRetriedCount retries: retriedCount, appId: "applicationId", appProgress: "applicationProgress", appTrackingUrl: "applicationTrackingUrl", appLaunchedTime: "applicationLaunchedTimestamp", appCompletedTime: "applicationCompletedTimestamp", appExitCode: applicationExitCode, appExitDiagnostics: "applicationExitDiagnostics" appExitType: "applicationExitType" }, taskRoles: { // Name-details map "taskRoleName": { taskRoleStatus: { name: "taskRoleName" }, taskStatuses: { taskIndex: taskIndex, containerId: "containerId", containerIp: "containerIp", containerPorts: { // Protocol-port map "protocol": "portNumber" }, containerGpus: containerGpus, containerLog: containerLogHttpAddress, } }, ... } } +*Response if succeeded* -
*Response if the job does not exist* - +```json +Status: 200 +{ + name: "jobName", + jobStatus: { + username: "username", + virtualCluster: "virtualCluster", + state: "jobState", + // raw frameworkState from frameworklauncher + subState: "frameworkState", + createdTime: "createdTimestamp", + completedTime: "completedTimestamp", + executionType: "executionType", + // sum of retries + retries: retries, + retryDetails: { + // Job failed due to user or unknown error + user: userRetries, + // Job failed due to platform error + platform: platformRetries, + // Job cannot get required resource to run within timeout + resource: resourceRetries, + }, + appId: "applicationId", + appProgress: "applicationProgress", + appTrackingUrl: "applicationTrackingUrl", + appLaunchedTime: "applicationLaunchedTimestamp", + appCompletedTime: "applicationCompletedTimestamp", + appExitCode: applicationExitCode, + // please check https://github.com/Microsoft/pai/blob/master/src/job-exit-spec/config/job-exit-spec.md for more information + appExitSpec: exitSpecObject, + appExitTriggerMessage: "applicationExitTriggerMessage", + appExitTriggerTaskRoleName: "applicationExitTriggerTaskRoleName", + appExitTriggerTaskIndex: "applicationExitTriggerTaskIndex", + appExitDiagnostics: "applicationExitDiagnostics", + // exit messages extracted from exitDiagnostics + appExitMessages: { + contaier: "containerStderr", + // please check https://github.com/Microsoft/pai/blob/master/docs/rest-server/runtime-exit-spec.md for more information + runtime: runtimeScriptErrorObject, + launcher: "launcherExitMessage" + }, + // appExitType is deprecated, please use appExitSpec instead. + appExitType: "applicationExitType", + }, + taskRoles: { + // Name-details map + "taskRoleName": { + taskRoleStatus: { + name: "taskRoleName" + }, + taskStatuses: { + taskIndex: taskIndex, + taskState: taskState, + containerId: "containerId", + containerIp: "containerIp", + containerPorts: { + // Protocol-port map + "protocol": "portNumber" + }, + containerGpus: containerGpus, + containerLog: containerLogHttpAddress, + } + }, + ... + } +} +``` + +*Response if the job does not exist* + +```json Status: 404 -{ "code": "NoJobError", "message": "Job $jobname is not found." } +{ + "code": "NoJobError", + "message": "Job $jobname is not found." +} +``` -
*Response if a server error occured* - +*Response if a server error occurred* +```json Status: 500 -{ "code": "UnknownError", "message": "*Upstream error messages*" } +{ + "code": "UnknownError", + "message": "*Upstream error messages*" +} +``` -
### `POST user/:username/jobs` - - Submit a job in the system. - - *Request* - +### `POST user/:username/jobs` -POST /api/v1/user/:username/jobs Authorization: Bearer +Submit a job in the system. -
*Parameters* - - [job config json](../job_tutorial.md) - - *Response if succeeded* - +*Request* + +```json +POST /api/v1/user/:username/jobs +Authorization: Bearer +``` + +*Parameters* + +[job config json](../job_tutorial.md) +*Response if succeeded* + +```json Status: 202 -{ "message": "update job $jobName successfully" } +{ + "message": "update job $jobName successfully" +} +``` -
*Response if the virtual cluster does not exist.* - +*Response if the virtual cluster does not exist.* +```json Status: 400 -{ "code": "NoVirtualClusterError", "message": "Virtual cluster $vcname is not found." } +{ + "code": "NoVirtualClusterError", + "message": "Virtual cluster $vcname is not found." +} +``` -
*Response if user has no permission* - +*Response if user has no permission* +```json Status: 403 -{ "code": "ForbiddenUserError", "message": "User $username is not allowed to add job to $vcname } +{ + "code": "ForbiddenUserError", + "message": "User $username is not allowed to add job to $vcname +} +``` -
*Response if there is a duplicated job submission* - +*Response if there is a duplicated job submission* +```json Status: 409 -{ "code": "ConflictJobError", "message": "Job name $jobname already exists." } +{ + "code": "ConflictJobError", + "message": "Job name $jobname already exists." +} +``` -
*Response if a server error occured* - +*Response if a server error occurred* +```json Status: 500 -{ "code": "UnknownError", "message": "*Upstream error messages*" } +{ + "code": "UnknownError", + "message": "*Upstream error messages*" +} +``` -
### `GET user/:username/jobs/:jobName/config` - - Get job config JSON content. - - *Request* - +### `GET user/:username/jobs/:jobName/config` + +Get job config JSON content. + +*Request* +```json GET /api/v1/user/:username/jobs/:jobName/config +``` -
*Response if succeeded* - +*Response if succeeded* +```json Status: 200 -{ "jobName": "test", "image": "pai.run.tensorflow", ... } +{ + "jobName": "test", + "image": "pai.run.tensorflow", + ... +} +``` -
*Response if the job does not exist* - +*Response if the job does not exist* +```json Status: 404 -{ "code": "NoJobError", "message": "Job $jobname is not found." } +{ + "code": "NoJobError", + "message": "Job $jobname is not found." +} +``` -
*Response if the job config does not exist* - +*Response if the job config does not exist* +```json Status: 404 -{ "code": "NoJobConfigError", "message": "Config of job $jobname is not found." } +{ + "code": "NoJobConfigError", + "message": "Config of job $jobname is not found." +} +``` -
*Response if a server error occured* - +*Response if a server error occurred* +```json Status: 500 -{ "code": "UnknownError", "message": "*Upstream error messages*" } +{ + "code": "UnknownError", + "message": "*Upstream error messages*" +} +``` -
### `GET user/:username/jobs/:jobName/ssh` - - Get job SSH info. - - *Request* - +### `GET user/:username/jobs/:jobName/ssh` -GET /api/v1/user/:username/jobs/:jobName/ssh +Get job SSH info. -
*Response if succeeded* - +*Request* -Status: 200 +```json +GET /api/v1/user/:username/jobs/:jobName/ssh +``` -{ "containers": [ { "id": "", "sshIp": "", "sshPort": "" }, ... ], "keyPair": { "folderPath": "HDFS path to the job's ssh folder", "publicKeyFileName": "file name of the public key file", "privateKeyFileName": "file name of the private key file", "privateKeyDirectDownloadLink": "HTTP URL to download the private key file" } } +*Response if succeeded* -
*Response if the job does not exist* - +```json +Status: 200 +{ + "containers": [ + { + "id": "", + "sshIp": "", + "sshPort": "" + }, + ... + ], + "keyPair": { + "folderPath": "HDFS path to the job's ssh folder", + "publicKeyFileName": "file name of the public key file", + "privateKeyFileName": "file name of the private key file", + "privateKeyDirectDownloadLink": "HTTP URL to download the private key file" + } +} +``` + +*Response if the job does not exist* + +```json Status: 404 -{ "code": "NoJobError", "message": "Job $jobname is not found." } +{ + "code": "NoJobError", + "message": "Job $jobname is not found." +} +``` -
*Response if the job SSH info does not exist* - +*Response if the job SSH info does not exist* +```json Status: 404 -{ "code": "NoJobSshInfoError", "message": "SSH info of job $jobname is not found." } +{ + "code": "NoJobSshInfoError", + "message": "SSH info of job $jobname is not found." +} +``` -
*Response if a server error occured* - +*Response if a server error occurred* +```json Status: 500 -{ "code": "UnknownError", "message": "*Upstream error messages*" } +{ + "code": "UnknownError", + "message": "*Upstream error messages*" +} +``` -
### `PUT user/:username/jobs/:jobName/executionType` - - Start or stop a job. - - *Request* - +### `PUT user/:username/jobs/:jobName/executionType` -PUT /api/v1/user/:username/jobs/:jobName/executionType Authorization: Bearer +Start or stop a job. -
*Parameters* - +*Request* -{ "value": "START" | "STOP" } +```json +PUT /api/v1/user/:username/jobs/:jobName/executionType +Authorization: Bearer +``` -
*Response if succeeded* - +*Parameters* + +```json +{ + "value": "START" | "STOP" +} +``` + +*Response if succeeded* +```json Status: 200 -{ "message": "execute job $jobName successfully" } +{ + "message": "execute job $jobName successfully" +} +``` -
*Response if the job does not exist* - +*Response if the job does not exist* +```json Status: 404 -{ "code": "NoJobError", "message": "Job $jobname is not found." } +{ + "code": "NoJobError", + "message": "Job $jobname is not found." +} +``` -
*Response if a server error occured* - +*Response if a server error occurred* +```json Status: 500 -{ "code": "UnknownError", "message": "*Upstream error messages*" } +{ + "code": "UnknownError", + "message": "*Upstream error messages*" +} +``` -
### `GET virtual-clusters` - - Get the list of virtual clusters. - - *Request* - +### `GET virtual-clusters` + +Get the list of virtual clusters. +*Request* + +```json GET /api/v1/virtual-clusters +``` -
*Response if succeeded* - +*Response if succeeded* +```json Status: 200 -{ "vc1": { } ... } +{ + "vc1": + { + } + ... +} +``` -
*Response if a server error occured* - +*Response if a server error occurred* +```json Status: 500 -{ "code": "UnknownError", "message": "*Upstream error messages*" } +{ + "code": "UnknownError", + "message": "*Upstream error messages*" +} +``` -
### `GET virtual-clusters/:vcName` - - Get virtual cluster status in the system. - - *Request* - +### `GET virtual-clusters/:vcName` -GET /api/v1/virtual-clusters/:vcName +Get virtual cluster status in the system. -
*Response if succeeded* - +*Request* -Status: 200 +```json +GET /api/v1/virtual-clusters/:vcName +``` -{ //capacity percentage this virtual cluster can use of entire cluster "capacity":50, //max capacity percentage this virtual cluster can use of entire cluster "maxCapacity":100, // used capacity percentage this virtual cluster can use of entire cluster "usedCapacity":0, "numActiveJobs":0, "numJobs":0, "numPendingJobs":0, "resourcesUsed":{ "memory":0, "vCores":0, "GPUs":0 }, "state":"running" } +*Response if succeeded* -
*Response if the virtual cluster does not exist* - +```json +Status: 200 +{ + //capacity percentage this virtual cluster can use of entire cluster + "capacity":50, + //max capacity percentage this virtual cluster can use of entire cluster + "maxCapacity":100, + // used capacity percentage this virtual cluster can use of entire cluster + "usedCapacity":0, + "numActiveJobs":0, + "numJobs":0, + "numPendingJobs":0, + "resourcesUsed":{ + "memory":0, + "vCores":0, + "GPUs":0 + }, + "state":"running" +} +``` + +*Response if the virtual cluster does not exist* + +```json Status: 404 -{ "code": "NoVirtualClusterError", "message": "Virtual cluster $vcname is not found." } +{ + "code": "NoVirtualClusterError", + "message": "Virtual cluster $vcname is not found." +} +``` -
*Response if a server error occured* - +*Response if a server error occurred* +```json Status: 500 -{ "code": "UnknownError", "message": "*Upstream error messages*" } +{ + "code": "UnknownError", + "message": "*Upstream error messages*" +} +``` -
### `PUT virtual-clusters/:vcName` (administrator only) - - Add or update virtual cluster quota in the system, don't allow to operate "default" vc. - - *Request* - +### `PUT virtual-clusters/:vcName` (administrator only) -PUT /api/v1/virtual-clusters/:vcName Authorization: Bearer +Add or update virtual cluster quota in the system, don't allow to operate "default" vc. -
*Parameters* - +*Request* -{ "vcCapacity": new capacity, "vcMaxCapacity": new max capacity, range of [vcCapacity, 100] } +```json +PUT /api/v1/virtual-clusters/:vcName +Authorization: Bearer +``` -
*Response if succeeded* - +*Parameters* + +```json +{ + "vcCapacity": new capacity, + "vcMaxCapacity": new max capacity, range of [vcCapacity, 100] +} +``` +*Response if succeeded* + +```json Status: 201 -{ "message": "Update vc: $vcName to capacity: $vcCapacity successfully." } +{ + "message": "Update vc: $vcName to capacity: $vcCapacity successfully." +} +``` -
*Response if try to update "default" vc* - +*Response if try to update "default" vc* +```json Status: 403 -{ "code": "ForbiddenUserError", "message": "Don't allow to update default vc" } +{ + "code": "ForbiddenUserError", + "message": "Don't allow to update default vc" +} +``` -
*Response if current user has no permission* - +*Response if current user has no permission* +```json Status: 403 -{ "code": "ForbiddenUserError", "message": "Non-admin is not allow to do this operation." } +{ + "code": "ForbiddenUserError", + "message": "Non-admin is not allow to do this operation." +} +``` -
*Response if no enough quota* - +*Response if no enough quota* +```json Status: 403 -{ "code": "NoEnoughQuotaError", "message": "No enough quota in default vc." } +{ + "code": "NoEnoughQuotaError", + "message": "No enough quota in default vc." +} +``` -
*Response if "default" virtual cluster does not exist* - +*Response if "default" virtual cluster does not exist* +```json Status: 404 -{ "code": "NoVirtualClusterError", "message": "Default virtual cluster is not found, can't allocate or free resource." } +{ + "code": "NoVirtualClusterError", + "message": "Default virtual cluster is not found, can't allocate or free resource." +} +``` -
*Response if a server error occured* - +*Response if a server error occurred* +```json Status: 500 -{ "code": "UnknownError", "message": "*Upstream error messages*" } +{ + "code": "UnknownError", + "message": "*Upstream error messages*" +} +``` -
### `DELETE virtual-clusters/:vcName` (administrator only) - - remove virtual cluster in the system, don't allow to operate "default" vc. - - *Request* - +### `DELETE virtual-clusters/:vcName` (administrator only) -DELETE /api/v1/virtual-clusters/:vcName Authorization: Bearer +remove virtual cluster in the system, don't allow to operate "default" vc. -
*Response if succeeded* - +*Request* +```json +DELETE /api/v1/virtual-clusters/:vcName +Authorization: Bearer +``` + +*Response if succeeded* + +```json Status: 201 -{ "message": "Remove vc: $vcName successfully." } +{ + "message": "Remove vc: $vcName successfully." +} +``` -
*Response if current user has no permission* - +*Response if current user has no permission* +```json Status: 403 -{ "code": "ForbiddenUserError", "message": "Non-admin is not allow to do this operation." } +{ + "code": "ForbiddenUserError", + "message": "Non-admin is not allow to do this operation." +} +``` -
*Response if try to update "default" vc* - +*Response if try to update "default" vc* +```json Status: 403 -{ "code": "ForbiddenUserError", "message": "Don't allow to remove default vc." } +{ + "code": "ForbiddenUserError", + "message": "Don't allow to remove default vc." +} +``` -
*Response if the virtual cluster does not exist* - +*Response if the virtual cluster does not exist* +```json Status: 404 -{ "code": "NoVirtualClusterError", "message": "Virtual cluster $vcname is not found." } +{ + "code": "NoVirtualClusterError", + "message": "Virtual cluster $vcname is not found." +} +``` -
*Response if "default" virtual cluster does not exist* - +*Response if "default" virtual cluster does not exist* +```json Status: 404 -{ "code": "NoVirtualClusterError", "message": "Default virtual cluster is not found, can't allocate or free resource." } +{ + "code": "NoVirtualClusterError", + "message": "Default virtual cluster is not found, can't allocate or free resource." +} +``` -
*Response if a server error occured* - +*Response if a server error occurred* +```json Status: 500 -{ "code": "UnknownError", "message": "*Upstream error messages*" } +{ + "code": "UnknownError", + "message": "*Upstream error messages*" +} +``` -
### `PUT virtual-clusters/:vcName/status` (administrator only) - - Change virtual cluster status, don't allow to operate "default" vc. - - *Request* - +### `PUT virtual-clusters/:vcName/status` (administrator only) -PUT /api/v1/virtual-clusters/:vcName/status Authorization: Bearer +Change virtual cluster status, don't allow to operate "default" vc. -
*Parameters* - +*Request* -{ "vcStatus": "running" | "stopped" } +```json +PUT /api/v1/virtual-clusters/:vcName/status +Authorization: Bearer +``` -
*Response if succeeded* - +*Parameters* + +```json +{ + "vcStatus": "running" | "stopped" +} +``` +*Response if succeeded* + +```json Status: 201 -{ "message": "Update vc: $vcName to status: $vcStatus successfully." } +{ + "message": "Update vc: $vcName to status: $vcStatus successfully." +} +``` -
*Response if try to update "default" vc* - +*Response if try to update "default" vc* +```json Status: 403 -{ "code": "ForbiddenUserError", "message": "Don't allow to update default vc" } +{ + "code": "ForbiddenUserError", + "message": "Don't allow to update default vc" +} +``` -
*Response if current user has no permission* - +*Response if current user has no permission* +```json Status: 403 -{ "code": "ForbiddenUserError", "message": "Non-admin is not allow to do this operation." } +{ + "code": "ForbiddenUserError", + "message": "Non-admin is not allow to do this operation." +} +``` -
*Response if the virtual cluster does not exist* - +*Response if the virtual cluster does not exist* +```json Status: 404 -{ "code": "NoVirtualClusterError", "message": "Virtual cluster $vcname is not found." } +{ + "code": "NoVirtualClusterError", + "message": "Virtual cluster $vcname is not found." +} +``` + +*Response if a server error occurred* + +```json +Status: 500 + +{ + "code": "UnknownError", + "message": "*Upstream error messages*" +} +``` + +## API v2 + +### `POST jobs` + +Submit a job v2 in the system. + +*Request* + +```json +POST /api/v2/jobs +Content-Type: text/yaml +Authorization: Bearer +``` + +*Parameters* + +[job protocol yaml](../pai-job-protocol.yaml) + +*Response if succeeded* + +```json +Status: 202 + +{ + "message": "update job $jobName successfully" +} +``` + +*Response if the virtual cluster does not exist.* + +```json +Status: 400 + +{ + "code": "NoVirtualClusterError", + "message": "Virtual cluster $vcname is not found." +} +``` + +*Response if user has no permission* -
*Response if a server error occured* + Status: 403 + { + "code": "ForbiddenUserError", + "message": "User $username is not allowed to add job to $vcname + } + + +*Response if there is a duplicated job submission* + +```json +Status: 409 + +{ + "code": "ConflictJobError", + "message": "Job name $jobname already exists." +} +``` + +*Response if a server error occurred* + +```json +Status: 500 + +{ + "code": "UnknownError", + "message": "*Upstream error messages*" +} +``` + +### `GET jobs/:frameworkName/config` + +Get job config JSON or YAML content. + +*Request* + +```json +GET /api/v2/jobs/:frameworkName/config +Accept: json (for v1 jobs) +Accept: yaml (for v2 jobs) +``` + +*Response if succeeded* + +```json +Status: 200 + +{ + "jobName": "test", + "image": "pai.run.tensorflow", + ... +} + +or + +jobName: test +protocolVersion: 2 +... +``` + +*Response if the job does not exist* + +```json +Status: 404 + +{ + "code": "NoJobError", + "message": "Job $jobname is not found." +} +``` + +*Response if the job config does not exist* + +```json +Status: 404 + +{ + "code": "NoJobConfigError", + "message": "Config of job $jobname is not found." +} +``` + +*Response if a server error occurred* +```json Status: 500 -{ "code": "UnknownError", "message": "*Upstream error messages*" } ``` +{ + "code": "UnknownError", + "message": "*Upstream error messages*" +} +``` ## About legacy jobs -从此版本开始,会启用 [Framework ACL](../../../subprojects/frameworklauncher/yarn/doc/USERMANUAL_zh_CN.md#Framework_ACL) ,Job 的命名空间会包含创建者的用户名。 jobs will have a namespace with job-creater's username. However there were still some jobs created before the version upgrade, which has no namespaces. They are called "legacy jobs", which can be retrieved, stopped, but cannot be created. To figure out them, there is a "legacy: true" field of them in list apis. +从此版本开始,会启用 [Framework ACL](../../../subprojects/frameworklauncher/yarn/doc/USERMANUAL.md#Framework_ACL) ,Job 的命名空间会包含创建者的用户名。 However there were still some jobs created before the version upgrade, which has no namespaces. They are called "legacy jobs", which can be retrieved, stopped, but cannot be created. To figure out them, there is a "legacy: true" field of them in list apis. In the next versions, all operations of legacy jobs may be disabled, so please re-create them as namespaced job as soon as possible. \ No newline at end of file diff --git a/docs/zh_CN/rest-server/runtime-exit-spec.md b/docs/zh_CN/rest-server/runtime-exit-spec.md new file mode 100644 index 0000000000..f7c72669d5 --- /dev/null +++ b/docs/zh_CN/rest-server/runtime-exit-spec.md @@ -0,0 +1,67 @@ +# PAI Runtime Exit Spec + +1. It is **PAI Dynamic Exit Info**, see **PAI Static Exit Info** in [PAI Job Exit Spec User Manual](../../../src/job-exit-spec/config/user-manual.md) + +## PAI Runtime as Error Funnel + +PAI Runtime is the **only interface** to interact with PAI Container. + +So, it is also **the one and the only one to produce** the **right** and **final** PAI Container ExitCode and Dynamic ExitInfo. + +(*Upper layer centralized service generally should not do the error detection based on Runtime's return, to produce another ExitCode, anymore*) + +For example, + +if other components need to kill Container, it need to **notify Runtime to kill** the Container along with the **kill reason, etc, instead if kill the Container by itself.** + +Similarly, Runtime need to **take the responsibility to execute the kill action**, and then **forward the kill reason (see below)** to YARN by Dynamic ExitInfo, **instead of forwarding all local error logs as reason (see below)** to YARN. + +However, it will also **try best to forward all local error logs as attachment**, and given **limited total size for Dynamic ExitInfo** (such as 4KB), it is **the only dictator to decide which error log file forward more, which forward less, forward which part of error log, tail or middle, etc**. + +(*Such as during Runtime killing Container, the container itself may produce exiting error messaging which is generally not very helpful to explain error reason, so it is a good candidate to sacrifice for other error log*) + +(*This cannot be achieved by change YARN code which only can collect all error log tail evenly, because YARN is not aware which error, so cannot decide which error log should forward more.*) + +

+ Architecture +

+ +## Design + +1. Write in User Understandable way +2. Write into `runtime.pai.agg.error` file which only contains the YAML object of Dynamic ExitInfo +3. Limit the size of `runtime.pai.agg.error` file +4. Write landmark lines around the schema object string, to help RestServer locate it + + [PAI_RUNTIME_ERROR_START] + YAML String of PAI Runtime Exit Info + [PAI_RUNTIME_ERROR_END] + ``` + + + ## PAI Runtime Exit Info Schema + + +exitcode: reason: solution: trigger: originalUserExitCode: caughtSignal: caughtException: matchedUserLogString: dockerStatus: errorLogs: user: runtime: diskCleaner: ``` + +| field | description | example | +| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **exitcode** | PAI ExitCode | 198, i.e. [CONTAINER_OOD_KILLED_BY_DISKCLEANER](../../../src/job-exit-spec/config/job-exit-spec.md) | +| **reason** | Dynamic Reason | Current Container is killed due to it used most disk space and all container disk usage exceeded platform limit. +Current Container Disk Usage 30% (30GB), All Container Disk Usage 91% (91GB), Platform Disk Limit 90% (90GB). | +| **solution** | Dynamic Solution | All Container overused 1GB disk, but current container only use 30% disk, please retry on another node later. | +| **trigger** | Which error pattern triggered the error: +Should be one of below field name | diskCleanerErrorLog | +| **originalUserExitCode** | Original user process exitcode +Only for showing to user. Preserve it here instead of exit with it, in case it conflicts with Runtime's own ExitCode Spec. | 1 | +| **caughtSignal** | Caught Signal | SIGKILL | +| **caughtException** | Caught Exception | TensorFlow StackTrace:... | +| **matchedUserLogString** | Matched user log string | RunScripts.sh: line 58: [: -gt: unary operator expected | +| **dockerStatus** | Docker Status | KILLED | +| **errorLogs** | Runtime collect all local *.pai.error and error files, and redirect it to here. (This is best effort, because we have limit runtime.pai.agg.error file size) | | +| **errorLogs.user** | From user stderr | 234346457 ERROR "get: `/dgfdg': No such file or directory" +234346458 ERROR "Tensorflow failed to init, exiting…" | +| **errorLogs.runtime** | From runtime.pai.error | 234346457 ERROR REASON "get: `/{user code dir}': No such file or directory" | +| **errorLogs.diskCleaner** | From diskCleaner.pai.error | 234346457 ERROR ACTION "KILL" +234346457 ERROR REASON "Current Container is killed due to it used most disk space and all container disk usage exceeded platform limit. Current Container Disk Usage 30% (30GB), All Container Disk Usage 91% (91GB), Platform Disk Limit 90% (90GB)." +234346457 ERROR SOLUTION "All Container overused 1GB disk, but current container only use 30% disk, please retry on another node later." | \ No newline at end of file diff --git a/docs/zh_CN/rest-server/runtime-exit-spec.png b/docs/zh_CN/rest-server/runtime-exit-spec.png new file mode 100644 index 0000000000000000000000000000000000000000..da7caed7549e66ca29dcacb7d315775c2398b39f GIT binary patch literal 14015 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 literal 0 HcmV?d00001 diff --git a/docs/zh_CN/upgrade/upgrade_to_v0.11.md b/docs/zh_CN/upgrade/upgrade_to_v0.11.md index 8f36107fcf..cfdb21303f 100644 --- a/docs/zh_CN/upgrade/upgrade_to_v0.11.md +++ b/docs/zh_CN/upgrade/upgrade_to_v0.11.md @@ -23,6 +23,7 @@ sudo docker run -itd \ -e COLUMNS=$COLUMNS -e LINES=$LINES -e TERM=$TERM \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /pathConfiguration:/cluster-configuration \ + -v /hadoop-binary:/hadoop-binary \ --pid=host \ --privileged=true \ --net=host \ @@ -32,6 +33,10 @@ sudo docker run -itd \ # Working in your dev-box sudo docker exec -it dev-box /bin/bash cd /pai + +# setup kubernetes environments +./paictl.py cluster k8s-set-env +# then input master node ip ``` ### Check PAI cluster version @@ -71,11 +76,14 @@ Usage: `./deployment/tools/configMigration.py path_to_backup_your_config path_to_output_new_style_config` -Then you could customzie the generate config under the directory `path_to_output_new_style_config` per need. +Then you could customize the generate config under the directory `path_to_output_new_style_config` per need. + +If you are using webportal plug-in before v0.11 (confirmed that if `webportal.plugins` in `services-configuration.yaml`), you need to run an extra script after above command: +`./deployment/tools/pluginIdMigration.py path_to_output_new_style_config path_to_output_new_style_config` -### Validata Cluster Configuration +### Validate Cluster Configuration -PAI provide an `check` command for validatng configuration, usage as below: +PAI provide an `check` command for validating configuration, usage as below: `./paictl.py check -p path_to_output_new_style_config` @@ -102,7 +110,7 @@ Data won't lost during the upgrade, the backup is optional but recommended. Now please login onto the master node, and backup the data for ETCD, Zookeeper and etc. Below is a list of directories should take care (please backup them): 1. PAI common data path, check the `service-configuration.yaml`, there is a config `cluster.common.data-path`. Please don't change it unless you know excatly what you are doing. -2. Etcd data path, check the `kubernetes-configuration.yaml.yaml`, there is a config `kubernetes.ectd-data-path`. +2. Etcd data path, check the `kubernetes-configuration.yaml`, there is a config `kubernetes.ectd-data-path`. ## Destroy Kubernetes Cluster diff --git a/docs/zh_CN/upgrade/upgrade_to_v0.12.md b/docs/zh_CN/upgrade/upgrade_to_v0.12.md new file mode 100644 index 0000000000..68f25717ff --- /dev/null +++ b/docs/zh_CN/upgrade/upgrade_to_v0.12.md @@ -0,0 +1,140 @@ +# Upgrade to v0.12 + +We have test the upgrade process against v0.8 and later. It takes hours or more, depends on the number of nodes in the cluster and the internet network speed. During the upgrade, running jobs will fail. And jobs will automatically retry after the upgrade have done. + +Table of Contents + +1. [Prepare](#Prepare) +2. [Stop Services and Backup Data](#Stop-Services-and-Backup-Data) +3. [Destroy Kubernetes Cluster](#Destroy-Kubernetes-Cluster) +4. [Install Kubernetes Cluster](#Install-Kubernetes-Cluster) +5. [Run Migration Scripts And Start Services](#Run-Migration-Scripts-And-Start-Services) +6. [It's Done](#It's-Done) + +## Prepare + +### Setup a dev-box + +All the commands in the document excuted in dev-box. You will need to prepare a dev-box first. Run the fellow command to create one and work in it: + +```bash +# create dev-box +sudo docker run -itd \ + -e COLUMNS=$COLUMNS -e LINES=$LINES -e TERM=$TERM \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v /pathConfiguration:/cluster-configuration \ + -v /hadoop-binary:/hadoop-binary \ + --pid=host \ + --privileged=true \ + --net=host \ + --name=dev-box \ + docker.io/openpai/dev-box:v0.12.0 + +# Working in your dev-box +sudo docker exec -it dev-box /bin/bash +cd /pai + +# setup kubernetes environments +./paictl.py cluster k8s-set-env +# then input master node ip +``` + +### Check PAI cluster version + +You could check version from the cluster configuration file `service-configuration.yaml`. + +It looks like: + +```yaml +cluster: +... + docker-registry: + namespace: openpai + domain: docker.io + tag: v0.8.3 # It's your cluster version + ... +``` + +### Backup PAI cluster configuration + +If you cluster is v0.9 and later, you could fetch the config from the cluster via paictl: + +`./paictl.py config pull -o path_to_backup_your_config` + +There should be four files under the `path_to_backup_your_config`: + +1. `layout.yaml` (or `cluster-configuration.yaml` in version 0.8/0.9) +2. `k8s-role-definition.yaml` +3. `kubernetes-configuration.yaml` +4. `services-configuration.yaml` + +### Convert and customize cluster configuration + +PAI provide a script tools to convert configuration from old style. + +Usage: + +`./deployment/tools/configMigration.py path_to_backup_your_config path_to_output_new_style_config` + +Then you could customize the generate config under the directory `path_to_output_new_style_config` per need. + +If you are using webportal plug-in before v0.11 (confirmed that if `webportal.plugins` in `services-configuration.yaml`), you need to run an extra script after above command: `./deployment/tools/pluginIdMigration.py path_to_output_new_style_config path_to_output_new_style_config` + +### Validate Cluster Configuration + +PAI provide an `check` command for validating configuration, usage as below: + +`./paictl.py check -p path_to_output_new_style_config` + +## Stop Services and Backup Data + +### Push The Converted Configuration To Cluster + +Notices: the configuration pushed to cluster won't take effect until we restart the PAI Services. Use the command like below: + +`./paictl.py config push -p path_to_output_new_style_config` + +### Stop PAI Services + +We stop all PAI Services: + +`./paictl.py service stop` + +Now the PAI is down, won't be able to access the PAI dashboard. + +### Backup Data + +Data won't lost during the upgrade, the backup is optional but recommended. + +Now please login onto the master node, and backup the data for ETCD, Zookeeper and etc. Below is a list of directories should take care (please backup them): + +1. PAI common data path, check the `service-configuration.yaml`, there is a config `cluster.common.data-path`. Please don't change it unless you know excatly what you are doing. +2. Etcd data path, check the `kubernetes-configuration.yaml`, there is a config `kubernetes.ectd-data-path`. + +## Destroy Kubernetes Cluster + +We will reinstall it with new configuration, destroy it first: + +`./paictl.py cluster k8s-clean -p path_to_output_new_style_config` + +Now the Kubernetes cluster is down. + +## Install Kubernetes Cluster + +Install the Kubernetes cluster: + +`./paictl.py cluster k8s-bootup -p path_to_output_new_style_config` + +Now the Kubernetes cluster is up, you can check the Kubernetes dashboard. + +## Run Migration Scripts And Start Services + +During the Service starting up, migrate script will be automatically called: + +`./paictl.py service start` + +Now the PAI is up, you can visit the PAI dashboard. + +## It's Done + +Now you have PAI upgraded, please check the release-notes for new features. \ No newline at end of file diff --git a/docs/zh_CN/upgrade/upgrade_to_v0.13.md b/docs/zh_CN/upgrade/upgrade_to_v0.13.md new file mode 100644 index 0000000000..fead8b85a2 --- /dev/null +++ b/docs/zh_CN/upgrade/upgrade_to_v0.13.md @@ -0,0 +1,140 @@ +# Upgrade to v0.13 + +We have test the upgrade process against v0.8 and later. It takes hours or more, depends on the number of nodes in the cluster and the internet network speed. During the upgrade, running jobs will fail. And jobs will automatically retry after the upgrade have done. + +Table of Contents + +1. [Prepare](#Prepare) +2. [Stop Services and Backup Data](#Stop-Services-and-Backup-Data) +3. [Destroy Kubernetes Cluster](#Destroy-Kubernetes-Cluster) +4. [Install Kubernetes Cluster](#Install-Kubernetes-Cluster) +5. [Run Migration Scripts And Start Services](#Run-Migration-Scripts-And-Start-Services) +6. [It's Done](#It's-Done) + +## Prepare + +### Setup a dev-box + +All the commands in the document excuted in dev-box. You will need to prepare a dev-box first. Run the fellow command to create one and work in it: + +```bash +# create dev-box +sudo docker run -itd \ + -e COLUMNS=$COLUMNS -e LINES=$LINES -e TERM=$TERM \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v /pathConfiguration:/cluster-configuration \ + -v /hadoop-binary:/hadoop-binary \ + --pid=host \ + --privileged=true \ + --net=host \ + --name=dev-box \ + docker.io/openpai/dev-box:v0.13.0 + +# Working in your dev-box +sudo docker exec -it dev-box /bin/bash +cd /pai + +# setup kubernetes environments +./paictl.py cluster k8s-set-env +# then input master node ip +``` + +### Check PAI cluster version + +You could check version from the cluster configuration file `service-configuration.yaml`. + +It looks like: + +```yaml +cluster: +... + docker-registry: + namespace: openpai + domain: docker.io + tag: v0.8.3 # It's your cluster version + ... +``` + +### Backup PAI cluster configuration + +If you cluster is v0.9 and later, you could fetch the config from the cluster via paictl: + +`./paictl.py config pull -o path_to_backup_your_config` + +There should be four files under the `path_to_backup_your_config`: + +1. `layout.yaml` (or `cluster-configuration.yaml` in version 0.8/0.9) +2. `k8s-role-definition.yaml` +3. `kubernetes-configuration.yaml` +4. `services-configuration.yaml` + +### Convert and customize cluster configuration + +PAI provide a script tools to convert configuration from old style. + +Usage: + +`./deployment/tools/configMigration.py path_to_backup_your_config path_to_output_new_style_config` + +Then you could customize the generate config under the directory `path_to_output_new_style_config` per need. + +If you are using webportal plug-in before v0.11 (confirmed that if `webportal.plugins` in `services-configuration.yaml`), you need to run an extra script after above command: `./deployment/tools/pluginIdMigration.py path_to_output_new_style_config path_to_output_new_style_config` + +### Validate Cluster Configuration + +PAI provide an `check` command for validating configuration, usage as below: + +`./paictl.py check -p path_to_output_new_style_config` + +## Stop Services and Backup Data + +### Push The Converted Configuration To Cluster + +Notices: the configuration pushed to cluster won't take effect until we restart the PAI Services. Use the command like below: + +`./paictl.py config push -p path_to_output_new_style_config` + +### Stop PAI Services + +We stop all PAI Services: + +`./paictl.py service stop` + +Now the PAI is down, won't be able to access the PAI dashboard. + +### Backup Data + +Data won't lost during the upgrade, the backup is optional but recommended. + +Now please login onto the master node, and backup the data for ETCD, Zookeeper and etc. Below is a list of directories should take care (please backup them): + +1. PAI common data path, check the `service-configuration.yaml`, there is a config `cluster.common.data-path`. Please don't change it unless you know excatly what you are doing. +2. Etcd data path, check the `kubernetes-configuration.yaml`, there is a config `kubernetes.ectd-data-path`. + +## Destroy Kubernetes Cluster + +We will reinstall it with new configuration, destroy it first: + +`./paictl.py cluster k8s-clean -p path_to_output_new_style_config` + +Now the Kubernetes cluster is down. + +## Install Kubernetes Cluster + +Install the Kubernetes cluster: + +`./paictl.py cluster k8s-bootup -p path_to_output_new_style_config` + +Now the Kubernetes cluster is up, you can check the Kubernetes dashboard. + +## Run Migration Scripts And Start Services + +During the Service starting up, migrate script will be automatically called: + +`./paictl.py service start` + +Now the PAI is up, you can visit the PAI dashboard. + +## It's Done + +Now you have PAI upgraded, please check the release-notes for new features. \ No newline at end of file diff --git a/docs/zh_CN/user/imgs/web_job_detail_retry.png b/docs/zh_CN/user/imgs/web_job_detail_retry.png index 6163830eb5f135f691d5f7e2b22861225bbdb5c4..6217935b673a41034a05f19b33a68fabf82b8bd9 100644 GIT binary patch literal 37012 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

|1E5BsWNUkBo;dD_8 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%0Af*%= zbw$Nn?7yCl{`yaD1!t9jT^Y7+NWj}(cQ`P8U$_hyFZ$21`p1y}r^x+r!U*!-1_tlv z^!Td!x$pCPbcbHuj~T?AU-!EWjA=N1sr1WnI$7p=Ak(&@ib}J85>56O-!v@UYWbZKD}X!xSKG#_A6`no(> zYo)TN1oHJ{wKZ$d5OemfR*f(Wuh0*toot{@621lal5^v&X|g|7p9{@UO+EQ4gq)gY zrt5!k_nu)*c2B=3Hj0R#*Z}DYB29WPic+L0D7}jG-U(GiL8W&oAt2JEm(W5LkrD_c zkN^Q9QbG%nP(u>3Hzu&e`h|*B$PatTwY|<~P6DQWo<2Nq#w;_I({x zxB9e5khuyZr}?&xr`&I&Q6iGLCPL8CPrm-e+PoQ04&ydSGO%zjNX3nb=(GGc6tfZrpe?Xz^Gt!-4WP;zI7IH=xNUH%L9N`ozw zz&g?aUBt?_qya~0)&jma^)enf--|zF7SHfj1by4MO~6*!H(*VBkqxMP9UUL!5AVTd zIx*j$EVaXi!}+{wYp(!~A6M4e&a?%vNvYU2+`JKo$bS^WNISrI7YP_MT%F7@^0D`t z8q=yt)8+gA9na{);`8>k?FW)M zzDvA03K&kp&iA9$4a)3Y!)}ZF6nqqNs4*@~`}BwZiU+1qhBG@jyDCjL(!)l#D}##? zUNYiWI@N+HIElBy&&WDoO6>pEDGT_Rv1yBWZVUmO!|~&azykxWBzG0k|WwE@J zJRd8j`zm>*G`WDIzS->!tF&l-{&L5X50{+5_7%HEgT|)V`4eyWW1rNQp&IYA0bapeOe% zz{Kf1m$PV&!uJuP`A`5?^mOja3yoh|$Y#>^rGo*)Jz=NUdAonqo$om1U}n+2dFDQO zrsIXq1?TgqFg$8@)BG=7tb*jDb6K#a1I91!*o7Cf8kU65?g`zty#t62fYVG;gJTbl zm8A6CuDzR5ZH&=dbgbtd(wBa~p4eF}?PB3z>G=9-sno642ws-`@*G4^;@tPI%0Wr7 zH?+8>3pWz`(^x}1I-g07MtZD{B}hmjzeQtJ5nh=3;b7<^Rgim199D%fP_D{we*JeRTG5k@~R3qmpY=^gThT zVFFIj22>K%!BKE^@>B(QRD3H}jQsWKX@`YYQ^i~FLGN>C%yGwe8@5eNhpSLERkI1b z+Fc_)YQ;AXG#)oNkEBSj9a@^BWo~Y`4}S^L{!I=) zS%=&;9sXJ+1}^&V43h_UTt|cT>pQTpU~Q+mh^}adv)#5DKX2u1>cmtPwefLhDD=)_ zO6>HHaU*q;JUtjG#W6N^4;xO~a)qq*hj5V`x8`8G-0Ls=_ujC+IHY~0KQ}Am=Kjuq z;&y+kmTpv;oaI|$;aZN8!^+tHgt3MyNXq8xHmh5mtmt7EZf8r_>BF`8b*3L~G#$@g zzh(Ujd?rAso$g3Y=V)znK$kbpWd!Y|D-_Igx}(C}^=n}j=9OxT4!-^q%N{v<#bOPC z6S5l=slCwOAFPgwRsC|L*r=>OgxHAVr}mlf`BHb=4g7RL4>Lm;Ri8t`wrc=DOM3sLJdpHh%Ln z;(-hl8ENqZ&C z`P4D#CI4iZrf6=-44}zqc%**1rk88pwrcIns})0URt^9oP;TP&Y;Uk(SQWx|w0iYh zEu>`or+m^!i6nqbh&SnyXfs~-m)upA8*(?VDx{OtQFAuS_LFd`R90^>kLPQ)s~z4?q4tpJp!CFKCvxd`x_#=;Ka1d3W!T z^Y}e$>(|YYmNquxPpdke+&j1Arxjyqqxer9B&f4Rb4Qmd6DZCt9^?TDPy}T-#CYx()uv!V+D4IfpW}Qy(c%kbvLmDP9=FJy}~?KdSKeXZxO?5pKo)( zkLWsdk8AzDoebk)kGI~MUE}mR`-&_6uXy7DuopShjFtQnk6W4aX3iq{2SJ(FYBQr4 z&fA4Sqe!)?lgl{n!TqCZX00QmwvN1@EO^&e8Q%P*(nfFv{6=N-P1FRJ-hJ$Ck#Xth z_QzhX)1y~jP_e0t>;@&0&Tq>EGE{HeFS^-dVp&YhX)C*;|~y$rOUO`j&tD?_pZNdvF`ZUpTDP5SSj!kgVya zdIfEir{;(1&7{E1wzTGh2tu#!t_@$*eKab-OzapV?3l%tcM8kqyJ@rDbQ5J0#9gnJ zY30PWcx)6(YD7sO*%}~VIjuhr*B!PRdQhxwsyEz@KJBP}@;b6u7?k0mGst|zRNkIE zSPQEUGdikMT4+Fee)8`H$pGF@XFT$WpyDx~5x-M`pV&fy6Kj*at%5QXVOcnXlxu*Y4kU!+AA+(hWB`JRcvm9LU zZHWc^P1ZaIIV3sdroXY)P`cV3aVrqBP-=pjC|GVo zgxg9KkHCY13Nl7N1c+3XBC8v9{qNCs_-*;f3^zGB?R`y{A zqvGf2<>?0dUHSbstMOP7xu58j`sd8 z9F-=ndYBvsqMgw;hlF`<`u=LmREeZH(1JItegSG?plqkleGi0R<U4hW-~mxx3*1`P|bb>F+=PZR{-nw~*5PFIMu0 z&G8})7>ir6KL!SS7Vy=7;YS{9$mrj&;eW@#{&)HKo;;#uVqdv*#;4wvM*k*JkUD#B zO5gnN(EI%pQtCt<|CVJFTzI{QWrHbkSq5oSp76y-E^0kiYpIBl3D1#IsMv2oy9j!d z*F83NI<7CAF+Y6V)&VdV&q?=h-?JedUZZH#SOdPZ8GEkQb5m7qsC@Ckmq(F%jh&KX zmzcO0pPW=H-`k^otW8uLzidD?IdKV3cKg`@fzx6e3foR>ex-XhJ!0m2ZuQ%WQd(Xx z(s=leL#nFN@n!*Re+7kKi#KX7qv8o7fmWLxrnSvoLgHQ-J*0F(7-SLf@>B4Kd`uqV zU~sOK8~WV&#a9h{RAbJEux@&1PP!N&w~dLr(GJEMK1rfF@&)HZV077c2}f0XMv`N4 zk*KMcI26J_m@W8YI2zNFwjcO1aw~77!-x^Qs0Q?>oPz+L53JB{EZhpZwn>nzlP&4VH7`(H6=}Go}z~Kz!6ae^LLCFeMn-QK)yT3rIm!{C& zWe)Q%mDAcS^>29bk0T?^g7vVW>M~#6WvHg}yt_k%5b5&z>+9v>5c1X8{E_${n#DKo zqE_Y-IajMeTZ)RczGXwOix~ccM^VnT9-NENTuOd^<0|n)DG?yyyLMr+vG4ip%VsE` zZ#kaX5jk;rQmV0xFwfFPI7D$s)411keGNCH+ZeY`&hQRgeA=K}3$ga9&8DfMt+UOL zQ-Ln*ZRU-3q~E4eA~sxqfjscB$qr1_ShL^)7e`-E`m?SeOX|p078r0W+sm1o;DM^W zHaGiKj%dD}1yGqA{zE^2KgoWcJW!kKn!3L?S`zUV<)5!W=k{xw)BD%2&={a)=TRTzL!RJh^invzk z2VqSy2EkN>tR>XZ@F?E#gL#*VlES+m4p0OC9FLNmz1YoQpcQhAP4iJx5UEvMnudkT zOx{|PT<*G%GRfhTUW*e#9{f?tI=7_91;b9hc}RR+o`P2PeRh%v&&##Py!1b<8D*6a z?Oi#;`Fi!|xvq!CDh8Ku69_i;WOf8PlHp36_~ zEopb`gIkU`R0eB~SVM+mpx3bzGSyG^eq3o2OLC%f+e7t^%_QG&lR7W!xmj4I{XArk z;V^tY_kLeoaQc?)PGW(9>ebLHc#FDR|8Le3pWiqPJW( zPQ=Ad;iZ}Xd6V=rw)>aN#ULNgI{zTLbRR7Ia`dw6O3ght!*ODn^=B+dzE-pSeXYYF zK5o}CQXIX(i~3F;71sYrKPTn)bY-CKc`kaR_eoB^>Oi7tDg1}BFr;C^Wpkk;wV z4`;51%`5Z{L{~cuJv84)(2V%n`IEo7Kr4hb$MB8VmVMjgNO8-UuVSlM=hq{S#pQU+ z%rX})YRaI1krZi`F2aj>_e(-Ngmh6&@O(G-23gy6sfBAIx%YJI7LtEM1}3x9K0AP> z3sQm#+oOJB=6`n=ECGhNKo}2826Lo5lK;+vUT&h4?MFnoVPc?k2d4Y;){TKSArV}x z7ii|HXHrkC-c|ke=8tJ|-;a9h$UHlQkoDm2dHm)2kx2!mhq7~k&bAfvl~M1@?wv_c zYgNGA0N~q!;y;1ly(e^N^762L{gJs`^&>R1KANQ-@0mOv&gLfq{*mh4r^ee0Y*6r+XqhtNFiwn!&5I%e0$vrIyUWO2ExLV$`ZSs%7&8mJS)e^gEP($>31g6x1;gy zX+5ZG(cG0jHPMzBiTakhOz_!| zNz~Z=Uvyl$TLNU0Ea+6-z>Z1o5yGjTux`=sYd%|CY_(x}d{jQ|oxElDGgu*cX0sUL zWIlphe=@iRB3k>%-#lv}j3fXz8qof}sdpmvuZHCD{b8k_Z%^)Y*2(7VKU_W{hw2;^ zLst64x07?L#p9$+e0;iFyX)M$6@CRN@caE58KIC>7D}>d!;7VJe5OdHv~F0(!PLFW zS;O((u_ou{8+{W8r;DJ3O(oS)@#DI)b#!Ct`8~zt-n)wp#^=7lhTYAH_U3(3O+l{QT=K!l%@d3U{l2oo#W;Kx4W41bAI*etvjGTHL889~Ap68hL` zO(B(zm2HLHlA1pKU!uc4BoA7EmVb6U5jgN$01!F*l7?IPQa51U?&%`T%2%S&84wD+-xRhZ(V{{x z2j^1!-w&R90#khQH2%RZS4`*DF~Y~6%c7|mA+u&uGmjgAs@mXY1Lhk&M5UFGmbWpb>UJXX%nPbR;rUUR z8dgbC1ALi2YXcvbWhzT4kN2>?R@4^FA>!=*;Yf z>!()}H2#+uGmd@>8P9@tWu5Ig{atsc*T>I?k%#p!px6B-0K0K&YEde-0wdw3lU_n8 z?`ug0Yv=`ARWVYk9(hc(V2yDxoiOH=RavSg&gh(w)+Docm(qP|Z>ZStWX+I}Dx&P$ zI0A6YA?@@EuPm1d4mo(YF)z1--z2+7>#@HO64&RvTO6ruYZCdZCQPo)>!&1O+cxmn z3E;6IX@2Ov_6niXcmZU~djul`J5Iu*6VeJ=n zog20K0XR1%Vde>bU*>AK_2@yHo2-tV%oCPVGsr-e{+teyWo%#fZe=pcLp^w7n<>{~ z^kTr#d8Y&1^NmF%zX0ed*~TDoVo+beWfb|V_)x`B+qUujVMg3}9;IWEGF-=Zh3H=* z-lEXRUVwEduuQX(^;O>*?ec5Kav>%!tsl(L5dO;`ewGrEqy zblkczo|qlnCdTPg5b%HkgUspE2{JLq#$KQvq3wMsG&jo#f2c;GhW6ZyC#_b;^Jk_A zrre;Q@t%_2T9Bu|jhD}))sJr97qQGZwyPgnw-3Fdm+iydl(<#83g~4y;L8DRu-n0l z^Dm^Hu_}5iJ!1{M#Ha*Q7SD91Y%c5WLZb}iwY%L zjVqH9@H=Wa5yG(=I^*c<^O*p`&XM5Y^-jnT0Nt+d1+iM$n>>0Ve*Ngwv8ZEz=o#Qw zZ{F$`F6)&ls>1r-^38GeQ*iZ0^`n9KmF8LTq3>D(+LUD5%(oElES)Emy0}XUoE7m!dF6<{b z^tFo*R})!#@YVhE3Y|SLzNR(itBL-*Vo5QUl<{m;FWh;~>cSfTiB{s94k6Cb{+PBu zK^F(uNeQ*I@qLziy~4%TiSdLbl|C`e11VUccuNnLj&&sJLyJF)FwbqSeOI2MGc{%p zC#}C+HwVYA#j~&b+w?0XDT1wmg%zwm@VQS5VYY&u?U0AE)ofc+eg`l2j@)T~d2qJB zTP^eg-VJ9AP~ex=M#66={Iw1#kKD%HEk5UvxBa^x4}fMHHxJ2m>=RTw5bY{8!>*t7N8P?q zO0c?ZW72}W)XOvdFjUZwwX}I}VtLEUJJFh`bG}<$|G1+%&yn|gvVR$L*0;3wB~)x~ z*Zs&@a$3doo$@AU-1($l8Mt_=C(AG{qy|j8;9qbgf&IMY?Ge%E>L8z_1>~>Q`Wk*U zZh>yqBA7#dl%Kj&lUuzc#`J^KUx3d0cGrq;`RRklAhkxWhv z?FgIhs)0jeGDox8O?sHN=&KcaH!DSMzDJ*4DeT6yBt3=38Q3IL()uQZbNKm>81pL^ zNM;`7q!9A51H-@djZzB`SbP*)fJsuKM8cL6C$VI!Q{TrcpW;v6Npq$Y6h)jwiDeS8 zz7nSO3ul>zn~@=}dNACb?x(h*7mB-u(4^8XO`TKFh^1hXIovX_*?OgeH+a}Vyz@Te zPUoX$Qg=9DGUFCda;6+au?n9`i|R+PBMAG3NeJ zj|bf$HP@Pf{nGn6el_IseYkN4?8;GqDE_^eZR|dEG1o%I2;BTdrFO?UKexd`O4h;$ zeiGsD+cd#6o|8T8^(`v>yw3HCq4ScI!d!V;HCES>K+w0&wwYrw`aN0*tVpFb^60d_ z55E6K+p&Luk8>P=2@mA6S2gC-X#xz82MJlY1 zKrfDP&5K(eawp6sl`UL*n8ljE*HLx&Ojje9z1$vGbPH@cN^$^eZPmGr#L9U7^2?Sm zqBF05FEh(hDD!$tPQJ3&JKI*&PFRKAtQu~J;y`#_#U#FMuTM5*u1a{BI9XF+v6mXL z5X{PuHSMHoK(!VjnMJivd_^FE35o1q|AeieK$KnGHmF%#q2@WxnBoSvtD0V#Jopp3 z1IQ^KL}gyk4Q=2_J?ws6dM~OGqhVeR?s@~9EY*T0jW>9c=ZW!6p06;JXJAlrC-;RZ zUNym{5fk_w>hcfE6@gb(e&2&mKm8iG-!QibM)@XM(8dqC%0f{q(OTQ#Tj2r)9J^HL zNa>XDYm!FsN(b0~1tLe$UK24F!c|8ZE=EK|UsLXy#7G?KuI9C2bPl3MB|s5|s*B_{ z((-|V(X->W{OmBG6}uMQvjwqkgPP4&qZ_A(`h=PGgzB_pq)3LGnyYBh_s$0V?pgCc zClC{h?v}_Bk5tokF}?pj?ETPue;l=6`sZh&-3kZoAU^_M2Ur|0SpVG z_9e_0d|MOPe={g|)T^&`oHEZshz@`wHBicX+poi;ayF|KoTzqbJrAW?2{6+P~%!7FY;M3qAHTEuGLR;C? z&Ic&?K!5DG#ANRrw>Qb`M@0VO#g0u9_Dxl{Xlj)0IUgs+jIc^CY#W!7bb;Nwq|W0~^HL*TUnqo!di>Nh>4;Q4}|NV)tU@W=jCfmF=Ed_QMTL%VkO3KGp06fo8{xTAc}1l#=~ zpS{q8Nh=O4x?B;-@^BZH0Ld{E7QIjI&&^^oV=NL5GLc(&V+0A>k`tvvDq^d3Ze&$4V zr;Gt|zSmB3<&a$*jwQ`Hk3+>SlOu7X(DtD~4jFm-?kzb`u3Js~!G~PT^Wo!26wz`C zH@mD<8{CaK0{%Lw99j<5!O3-?KaLeXjCoByIe?jwnmY(zGTfYBw1g?@H+ZDV*@{e; zzo<*Uhh2y&#zyx<6vv+LboZu;3bYKH6^asODoq5M z96~rxW}v?1wYDb#b#S}dvG(_6MF^TM7|@NQ*u z&h8-$rbryI&AV(Cs4aFV(jt=_b5jXwk%#-C-R(l?$-R+V`}-w|%omO}l}Qqw6DyLV zDeOdRm7A|OgfSz3<)~iXo?3fqr;6~~;9u#2V;w#=gO16%3rk*np{yf>$Ac0hC)QGc ze1h4pBNb@L{FoW;iR#*g#9&H->Uex@}EzxHL>FWY%>$#nwqlOTYQn1OV`EW2=o z@qrmyXvD>20j)`6P5!YWx5XN&2OlfT1Q#cFqy|a zkU>bi*bZ#W=G|-)QpUvsH5@9iryE(qkIoV80aV9BJzRBDKdt8^L@lo;JiMFxnr&oK z!x+L&+|mW`5aVxFvtRn;9cf3Da-8X1wSm|zkCEAdL_J<`1_qSVj|x7Ax=7$X*PG=~ zR>`)!pk#h@Y=l5f#~B)RDZlk`UT1pnM4P{}^S$=9JecL{Q#rvQ-G97Nto4OC0sk`! zz%E7~FQ6%Y`A`>kUYy=7f|}C$m|1f!{Oo|ssWd$YJ-cA(D(+@#>lxs^Gq;89R%p#8 z=FQI3Sv&u@L_&h*fO%hBJBfnq24u|Nu!Z8=xqr_7M-oj&l^`x^`-{XS(x3vH(y*z{=w#}Jh>g0Tla|?CXDOs z1e<>t7ZALvp>Ib0{5-Edomm?BIDkz3&LRPkP1C-AA|;A$-x2!IS_YK#`0X>fGGb2A zxijK#O5@3_R84q#<#rXv+d8J0HTr+zfz(IWsqg;#_is(6(e@$%kG{hHdP390_y1b1 z>WhQef4VBy3K;oMc`O>H|62-SeaTQEUIzNb{>3=_Z3hXt{|9P${V&nY|H1&v{?E+5 z|F2gI`*)`PAIW+pe^WsVBVR@cRmL9;M|qQ<%D(uxE#VCWAxvtvvjx!54c^Yt2mih~ zKKXA%j{Z9zL(-sD|7scqp+i^$I}er%L!RPb6>DTxzwKw49+nW(g0L;&4PQ@Yf{uZl zt9KN`zdg8I`5sd@O1)=%x-028ep@I|lVhHWF?7LStq9OuQsj$@I*`gaIf8%v<$QDK z$X_y_rpiqis}!6G^@C+AsBQ7uQo`Qrg|K=QZNreSplM8qWMm%G3KGpL#HsJTo5jDk^ zRLY#B~a{ssAAn#QAG@a=(-{33t~ z=BBp7HevuZ4Y<UR>pSDuHD}i&`=z65glEAIAp6F2c{h4=ff)(6F9A@xSE}_)E zEP>fDe(BL=@0!BR#@feXJ9id&DXT=UV@|>xKur9ob#MD7;v3y~RE$!7PVg zcz$EcbP(8??`r=PlbG_Bk z*i8B0hjS#2oz8a|%Xi&748A>(l%LU*gw3x%2IFQlgSZuT62RdcYP*b@ai1_!{|tpj z^ic>6V*2gb`ow=W*UO);<@xVZ`HI<$?(`e*)Z^17hqxjW1ZNQa{mbsSz<72T8k} z*|f%$ZddfCe|aWbod2r{scn4Z$;F;_3vHfeh9-tBX?{DE6V*o-5%S&~8yKgjLnAp? z&Vrg7N{qMX8g>zHtUqG_Q;QWkn+&a4HDYP=%H04*9T*isz8ChiaT&Kf$Qt2=*cs@)~` zOU~yT{Bd+-jZ;`X-xDLdt^zfcXaV}4ba`y!28o|c22j5%MlIpeKXT8qEivp^)N(L> z-94!ZjzRT0U1}P7Yvt@_l%Fn8oWz|v4Jz7AjG)(=TCPfdUDDIM*KjACgHUz7nf`COos$HbL zw(@RzN4d=~tJCkXSX);dwFa9TQ&+?j!?vxw)MPP5eYL*`bLz@Tz8q>d)m>)pY0p>R zKFmh;Pe(mBo@^bxa%t!iQ`d$AxnPa{(d&d%HmL@8gw-?;_N|`KpP=>YEq{V6pM)Ms zbT6?n-_QL0e(`dLvZUl)DOiv($JG0rBAIt`*9JV23Tx(U=Zs5_6!=&{Cy!MXH#;^k z>ox>jSyzfneGK~K&BrcI?|y;G4o*-PoubMd;r(6mWJyu)I8f>79Z0eva46c?@$bpx zcoDC@O@)dZ)HsQOqlU2iZaO{@r;)Bzz(JbQAW%e6B=euBNuJRJ$OGSqVWXFN16q3rbn9$9)3qPD{V zt)As>sJbH0?}u5xQ-VxD*haorJwg%tR)Q>fF7Wdkk^ zYy0A9qz`~@^lDpU{n^*i?B93rE~q*kFIL&Y;(U;Qv@&sd$4}>FCh66pmLGPkS%(55 zYj^=$EKkj*b#^Gb@A2vRUe&TR|BClF2>!n&;J^EU%A{WIN3nMvM6`PTH%kGd*8iW2 zr`}s#pC~TNxBqwcY1BD6l|#R?H9Y_CY_0#(1!2Dk+eQZ4vo;+2Xsa?jEr8-#1C-Cm1sDWQg88z zch(50lGoD;H33u(gSCriKGZmM4Q1J8E3#I*$B(=AI^_E9v8H)r3in9j!C17B z-*cbGJ^PZnzA(Z)cv*CN5rqbfAt;O7PuG>IU$%!6P1j!SCEZ+Yf!?b+LsNKyCML|E z?p!9!v(csTMoby5mYHHxIL|*{a@b2hMM|U{^xb>-{S@C<=9L{BD3Zt}`T1m`b zO*lhClAe&YuWdGn6gNl+cZT@Q8h+XJ$#~gBCZ~p# zAZFet&rFlkyO)#n7W5g3X9hPSM6y3*o5>`)8XGQv*P+G8D57 z3xGP}QKFaryI;j3S1=gDe64P0H@8h5uZK;6rx&J3O%dMLo&EU~{opH=bK(?ZVqZ2hW-ySsg(<~*E+@5=Dn~f?U_3ra*{=~WCVCX7QeaS$;xz0r zfbL=$3)Iuk1PMg$UmOh!tN<>&m>!U^UZ`oIR^)VP=k#|ZkAJg1j%jadA?)zuEeRC| z+CL^iAFX>%py0z|f!fm-HIYj#MS^Gd2opO2dktJAjHIrDkVu}ZAyWq2F9CN}h~hWm zNiWLCn<$vl==@Ek6=3Cw_C7HusNF0$2N=-E#l*;9m-ihTrRZ9mjI&+!GHtn0L3GK1 zkEr)6HSiArL1cmpSkE^9ILm5_bSM@4867%8_EgzT&T8q{JGoaCd%)=ZQMnMlIrF18 zCt}6TjYLCZH%r3v<6)dg{M4niZ+^4htNoQVnU(r%1~GQUQHy0i9aec)RgDqoU8b-T z=I#o8D;540=rkT~IvQ3=DyVTB7~o1(Ex@0GVWtx!KLR*N# z{yiFI2%fS^ACv(`aIVQ3+Lh^Y`>QNoJvT+e(p}0y&BoW7{eG_GW9w!a-Wapvd}3#; z4u6EGhB3%2yR{vD3w}Lt^RT=>JhB4gn|a#eR)}yVHtmZV4-zZp3mo+&PoP*eR)D+p z1NjhQx9d`Mrtf6GzH_GPW|$ul;yt7kjdhwNpONz%(K$hT-6Xig32Ji)ETiy!J*3Ii z&HTz@)vEzSy*ksjNlq|9~=~ir-ziE_}EHY!`61BlSfSFK!7chR^Xae(u5KZhd z-dKxc@D4U?yk#zcmX8tDJ&O#01~d)2(w)d{h-Ph~A`3~ttOc8Ax4}x)0Sev8{*pn!yAj{d%`@O{q)7wapWxoa zUHdlT{yTo+To3r=76eO`B$s$OO|QOrk`|)0*5F=y-!to%+lGIs%+-|0B%vX}7dvqF z2;J4WSAye~*@9Hcx$qi?6SO-fuS5+p2N+nzein|Vsj@soCdJrxnk-J1iRpJ0F);QW z&E2y;$;WjLouR2VWM%%Is{xj66;B@Ihq4zrN*IPYnegr;)fLDbOs9!UR?U5%z?o=@ z%_BtU2XxQXbz@mY?2sb&`gIs>Eg-Xy&i(86>X6w_3CmGkGm7qysLE2h{oZvNw-+}) z^hY*XKoiCWndyJXn)+G|{J3jWa;>r0Z-#uTh1&bV~uhO;2< z)2sY3P6es)i7Vpn2_Iu*uiL#43wzA9D?MT>jLSvS=Rd&87Ogn9ppw&HTMM^zvmgpw z;xWoy-WRX(a&p|t0|m_OO$11691b@83UIglu%K%C`@Z9V)?#`iImEo$WeIxmmmsxl zbn{2|mf(zI2VJV}D_4RLzKt71=(BnLj{gY8R-kv!TaRrTLqE~DoZWUGJE_F*pIpCmF?caHijHN;c9Wmya( zv8S~XhKIKo{HZyq*eAsA&9t+c5giLvCaAL46wBJCVr^Sp7^jsE^BSP-JwW7sGw`v1 z-}MNsi>NtvQL4GRt|N8p7>qgkur1%+e8H}I=$ZfQ7Q6OQGawsCw%jNND*TzbON|Q_ z>u?|FLi}gc*+dJPRe+^q`x1VY#|gJSdS|6-pq{E4;bXWjUTQYbt!!JZ&D0<#N^n$-9JZOU zha@p}U`Q{Wn-wg(vL>y?+>o}REgKGLHA9o#Vn={gRJ%>walInD4~8{4j+ZxAaU^4H}3%n{@4 z!Bxq}p#_SloQpKgTq>dR8i~}p?f<&h3hiA);T3cP!-!>^`EqtMQBX*cJT_@EXTE&k zxx5R;XV=0Skr-tu_R-N`^qLfR+pG@8Fr1v<@SHvmoCw#xT24E z^gx0CPmkoFQ^U4;GL;2vVO!zgy~n9rr-y2Nm(F<`epiQ6>zN&+A?=O3Ds%aF**vMx zK3SELu;Cm;ovdde?wq>hm3RO6I1Aqca3LSVaXl^h^@X-U=68@~riF4hpVusk@P$F)7&WRNVlwz=ji98mdtB=hLp{2xRFtbdtQKoMwfuCJKVax z^eYr;6gs%!*{;|<{^xT3yz_-YFm_?b6P6L_DK0p3Nt*9JbOB8d)RaC8MpZ@jvNZ-8 zC|G;Bso8WXgDvkHgo|A-3mO&_R1GMV?P#3KcelX|ntP7byOp>-le$}y$U1-NG_%K+ zvjM#jf%mUm!ydAh_#IC@bhj{`k|;?J&>c$g@(k4u%_}hRw5pCkHF|oxw`Nn>Of4S% zYM%=T2YM*gKX2w1&(s$@y&t94)thrQz@5mDh9)3kx8B4){?`C_b7L(wB6|>)u9RQ@ zvk2SZhBabRbnBV8sJyvM5yEKWnlU;NV0~im$7+1?a^5OAJ@2*k0jOmEhb>TOG_EwA z)r>;1AO)MNJQl7$s}#+3K`5~P*~z_doNPo@Qb|)xMRVDldDH>uRK@{;hL5z$^7?q? zF|O>(+NMM2tc8Hallg7Z-gJhXDdGl^P9@JF8A14skI7XAP=jFx1;A5^+D^hoE1(UY z-yLVj*^ql-+-@gZ@Mv(+7*cKO&|(^94yn8&x_Svfth^3WY93G&&)}F#4*W?Yeg41p z7!NaNhvn(B&Ox?Da@F2#oph-xi=qt^t>9O0EWzoxvaX8%u4n#Bjk%YM960)o3>&}cBHKjeUyT>>ktnqClg1wZp!I9>)^rL|rgyUoN~xUiDXqh}tzUy3>gElf&) z6Gw}=$f17NZobWm@JV{WBmw2dw2hV!6P=Dt?NsL zT8qb1v|&JmL$$GWnbxp)jSD=`M$s@h zl+TrxXK*3g&EIP8(~;TN??<*|p!RnR2evU1b6J{mCkTn1dhug8exfvN?D>+o97Qk< zxs`6Y^QoEpCqE(*sC_d1evOUn2}C<2tK0x9r)aZl<<;uK@m<87J>U(UCc-9hr(si9 z4YIXj;OzDcCyPt|-$W z5NV#OVf8ldXc$0XZ1H0hv3Y^M(}>Qh#lw=3sAVZYZPjqj)jV1QnK$2{JEg0^-9&2w z9xAR;Do3kt%4C2Dg6z!MdV(prN=;5!yXuD|7_o@Z>5P2Q<~f*y$3w3BJwo08pkZvF zHkC|u_ka!VK!S8!T`M{$r^LxdXG6f@tTV8}#r3M_=K$>7^f2?$Vp#2-0sPBW(fgL` z!X{>fBMJ#b;cs*ry~wcR!e!eX8Nrjh72@PnDkUS?q8?7fwkYAI_Mx_?leuNYld`B2 zLFZ4Ra{)j~aumrSN7~iMuH9B~OUHdE?Jn%IJ~|8wM!sJ9{vL4@un?ez2sA!X+EHFW z#*25k0H29JBAtFt#$H zN(ak~2J2r=e3LD#(ZP5JdfD8wWN9O5#W6y)5zM2muF%$FKVr0D;01S5Qd^q~mtBEN zS69|HKL}pw%Bi}*lOCiy?lG=?e>7M+7Fs3#tp}^(Ff><)-XPBCM{)vhf4igLNAB8L zvR4`SdrVan)6G==PATXif1s|WJgA{plM`2ty11!x_;v$Clu*85ztT?VK6WP|7c;eO zDajb!o$tVwzS~qY42&+Szqd0`UFl0mWsf!o1+DbQT4gs9?m4bL#wk}Z46_^Ko8;9u zTMGcwuu8LROxWV=aL4nH2^%(zzV5Vsedjd>*d^<6un)VIQk<@EXk<*`3^G&vz0CkW zf-kNO+B><`EE|`hX&J>_U*?f&82ooCHsqEA-DBMrYkU(9ka2lH?Jz!WLXU0ELQ?-q z2VZgHkVWH2r7m5|=%ZIKa;l}oR%4Q1>wcrvMxDNvWUcGTJgInh5j~&AD`H;B!HF!o zJG5;NW<>#wLI!=ZIz<OMf-eT0(;*`shx*upIQVCN*gu3~lmiF?!#Q?OhF+rPHJiMy2|=%qwha8Zt>aXPJ-3w@#p zLanSE$41%|Gvq4SVM;^M%K9z+FJ8Ri#w6bo;u;C@tMghRgfsG&2NLnIsu!;3ATyBa z5W!$WhXn)zdN^ynkgtB8I13%LXazm&vh_Z5=FG>d)_jSWG^owql%UoodcCY|^)T8- z&`9cs@&%KY2Lx! zRH9}{YFOxfD}T8jVI6Zxtk}%j;-(T9sdU<*06G%n$8m^GIDsb%8Dp%mS+&o`ZWNP5 z(@M1@OlxfYE$)1@(cOAcA)#-U2VSQN-EUCOQg2}Ttk}0auw#Pw_1O1GsyW0a`-)@3 zjBD(?nGV_e^$;@1RukC~*|KBk*{;wR!ivzwB#JvSN5_EnK1(@|KNWsaQJv>ES~MhJ z6uEw^@`r!q%F|Zr9=&X@-IUxJK#ZW@1vzS1M3#FOGYO`meleCNEozBfHUl_8P)F+@ zPXSt|;FIK8%iW~Y!jR~%9|bFX>vTv^s!ybt7{9oD-$P|RC@^Gd?b z5}EJ#M?jkC>) zY#^E;uvr_iDR&mMNoA-@sTW{^9B(%#MVgi=rhsxVam5Qnse)S1m<%IxtUh6)w}AE%wpM7-2ThU zMVM;sU1EwuQcaL~tvlhpP<($Qy3Tk2XA)z%{J{v5_AJ<5v|HL{K=O+Z?e3ZpYPe25cMt!>`rE@Rf?n3je>3fk`#jKbE6a=@}GPlk_O%{~co*h`wWmf9_B>5JS?g?MA{}&}(RyQG=wZ6`FcUd%f7z;=90(|nm6j98Kqj|+7^P8o?N_^m>Jtr06F>hC>%inwD z`+<2C8$5S;Bzw7CA0URs{1NC;bDzriReyPNfhl}a5GRNoQoON#zpKdJ!VGbw3T=lA z?@DR!b>hCK8+40=u3D>jNsPBJRmUDN=#p4s&UdqDe~MWt#t<75NyMjm9&IIFgmRjp zwz96u`q>E1Xz$(R(;iPCexQ$x-up~~hsx$sazdW59L1J!Pap8Sc8lxkW67~2oV#0h zY?KcIL_5^gm5W}-e7osTsx(3!ed4;2{=x_#rRH+RMApHD2o3T%9(vkO0IZ|$e$?Ti zI5F7TD7FB-xusk2*J-Si;*j#1CA)a1@I95rE=eF z=IkZPigTPLjeEe$DY$)}GgWEz7V4*#(t4?)IveQPxB z)WhjW5a8~a?}L!8(2>xg3s?uE-hRacMN6M5jL&H;*9`(m9#tu0vQPSq-wSCm4Brzu zRlj1AF#3?968n4jk-zkg?waYpJ8r+}LYV*QP3TQqlpp&mC%q4FWR1`=0R7?R8QZV0 z{zTBXgNR*ONz1E#V+U#VQ@$n)t@fA`?*gi9A5iA)@(~05xX0ASK?172DHsqR%Q3Cr zMnagSXBdcgJ?e164Kd~)$#e*>H*j{QMKfD*jg+F+?EoRygmuZm(iAdchVKb(oOAxO z5fteg*f9lJ6`LRUeQm6}wMb=;j9-+=yORj^H@+-}ht!!ox#d_YMPI+tP-oCE&b$Pw zxAO!D8-*Pf$3uEv+9r5C5X*Avc7YOe&%{?Q213X+c{d|Bi;DUkp}DNFZcwCVJ@Z?M zB<;p77*zo}kQKvs-4y&NEPgd^F*#nT5E?polNzR(r$jqe$Sa}fA{zp|^K;vwiOyk_M|>XG#>{U8D_ia6 z9-kCUe)3Xm;Y$&ILqbFQ@?K?^34)L{c59-@NGb9|%zOVtEdO@5%nmo0z_VEC9pHF9 z%f0-095E{ET_TIx2uif8d4TbOwYKC_00=ZjTn1iJBa2U+fjw_Ie7CL{_Q&bcB25** z=Q_J!fa-nDg10#l1@3!{gla-KtU=K3K5jY z-x|zFh_963Dlp3V_a{2TB57&P-6?AVv_Ms+7r9v`1E6(te@Ei&4w!J>)h3|%7s1U{rPr&k_hu52$AlB{hb#{-w`i8 zElV-|dWQGK@Z1g`sMd3ywWVs*#95iLK!0x;Xdz|S!5Iz->`a>FyCxP;1A(e_C}A+K zXxA-ZJj@&t>N4Q_z5O-+z&h1qQNHGi8+_Ybc^{UraMIo`uwe7()AKvnt~FolQNr@Q zm&sbr-FF@uHjJm%oc;UAYA1Jp?zHv(TtS(}5l%ui_}eo4nm6M$ES4ASnE&047R_+P z9s6a7BwFnH0`1lO;o0%iQk^=xk?urvq4tShGPUc}LrGdZdK<#G{=TY-bkr}D3~bKqw6eX>2(Ff|pzYxeF-?B4i7ZIry1q_+`pkgBc~ zX6FHY(Jk2TYg5p45%4$a11|D#_ujCB)OPaTNrmHqnhC6HbFy>DZAf4|TrNoQ(=xu= zm|*M|@*{8}mPs5Fi?Iqj8tRR6jOEI#c#iZm@U!9>CRvZsM0 zq^3e^-=ddY;QiDwH7f}>j&dp?W2XOjAi667*TET>5Rt5J<YAp^-S z{zLY!d~ws+Q0iwZwSzI1=jT4xn0(J6DO?r5Uf%gEz$;epX@CtRk%|y1H)3;qfl%$f zwr5(M>AL8Zi?!U`6Qktn7Y)ieUyZ#F1;tmhs;}ku%be~a(fIO;L;z1-xh13ooM5C5 z-tER|gIbuV+S^~}=fh#tmDss1SwQ3T8!X1Yd*-E`iJ)M_MOeZ9vnOu4^dyv!=$mSi zhJ(BMxcM1HEgk4auw{OECU}g9bLDg^jmJX2HYwT0Fq^!GIA*;~>@E!WX+A4Az-?Rf z66@{&g#-!$3GemCcso`s= zs?ffL(3n#_-yZO%DKF#|0f-O6H=dRVGm26gL{Au9yG7!>B_c-$v#&%?wdPUa zW+SWf0jHx(rOMrWkV}o{V#WvX)ahls_3=Xalah_LV9?2)Z`BHgl)W#>2`_mQDJzf2 zHmxoe*r8alTTN<>o5@&EVKlhc9jo??@+g7Ylah?=kAPK9Vul%rt|SFo^ZjsL*kfcr zLh)4)hL`)&k9UE?t(uoLYW-9(P@$eJzE!?K^%(?Zn07S{oZy=pHEh~>aV{GthsB$I z2Rub}9>aWZFY8`Nz8N#(hb5Uz09I4@D$55iL|c?;K4-nkF$4#O9g*d4U4XI}+Gn}N zKGm*w;&zxvgJXB_?)pBH?vY0Z>^PY0hcpv^I-(R@=Vtr|tv59cSLrgr@&i6Bp_iJz z%Qtq&>+h%{v&nUCA_3iqwr4lzZCNC!kh0hxk(@DuSkr|3wG+tN>mALMsnHkry|*jp zCb!R&pTRPVa$NOmP-#!chlo#&CAh~X4cRZUrs@urhw0T^M`QcO%S`12=xss5yKGU9 zD3VJ>S;*q!p3XNpSp6K5&&!*A$5_%lQvg{*rHCm@h7Ez<1*K)7A3C}G^)YI#s*x^kY*Q|$Xe6LRoOolwg@RPT|-TdA3W+3!2Y&_zNMaq3< z;hjp*$*zqLBiBZPOCdQEduxG}g-v>bg|0i9I$xy4P&sc{IyX>o`q%w2f8SEvvTOxd zd=na5D=Y`l#(HR=#BS|WtRaqw>)UYG)#Eq*8?}w~%y+R=mQ%ktjJ)zk28J)8t)t)L z1tUdV5yREU?COGSiTgvh!>B`zgqaj>?A+$vNDK(VIAJhu3;YOr5Fkm7-Me@*x+JQ9qfbWidQf7hQAy zji0ch!cQnR(9$(SIxFXzPd@%?UWj;Rs4wHduc6jow_OciEtkZ>Y#n2{QKGs>UEk6a zdauX~kGupZn%M!XOJ9~WD;jN!^Oz{`7_V*L@rR5Ry8>EBI&D+1!3>Uj-Zmp|%@(y3 zZwRT7o1cBBvL(ZV1(Pw5OWms}^CnLxB$=~IQ{YfKXU5VkajEyBfXp0|= z$|EvXv_lOB`i@~Sk{1tje&zb{RpJ-z_a>y?Pru@B^2n6`Q5NalEs~Okt~d34 z_I-ohmrajO#Qgl1c_;VbIsL7a}F+noM?=M1@lZ63M zHq>O%{sWB2^J&$|)$4`ofrFCONjSu<&5!hpmRDtE^< zP3f!w`1j@j;;kZ)x#7&Z1#mIa2N!Y8fiqgDo<*E#bsb}GTAzOWb-9}U1naS0b|RR0 z=oexGIiTM-aK~yKY#usx-d}_@`cup{D*A3qA;WO{(bTACxV72`k9B(N%_(qR+;0^> zIU-ND{X_A!J-#TfaeExXoI@VxzctN17C?*i{U~q;k34=sS?rrLo`-J<&py`oHqw{g z%=9(8YNAxS#_9c4mf&Aci`r`EmzN;})z81V7Y@fACY}yaXWy?exr41~*_c&43pzxE z7`tk@yqfp+3c4;Qm%s0qq>TL0GSfe=cthF;rkO-6fstW;6#`(#iHrNa#M;+CI|j*V z>i!3CtWdM_Bk!cAHXLCp4{#rU4TISD=hH0)t>!Q!&{k;E76-WRbkucf8*BpKM; zqN;N@)Kfd+2e4~<99mb}X}xk}gC8)~X{_?Z&Ytt%d5^RKN#LN#y*b(YxY=P3gbG z4|txKZ8!ZoYiG_`y$g%J$Efb4@N=Y>$Se zr{GJ!9`n^|wz7TtF6f`)DBBZWfL0m$m~}v=XPNZx2)A~C;wtGd&r}JgWf!ZWCRv9NjNXxuf!IKYB z>(BR?di8#S&QnYV#$ftZg#lW^|OyEv!J*u4fNFs}BCC6J{{;Ir?Un z#o)q)fTcDm({^&sYXPiuS0`$aHT*Y?UAbzuD(&{tJZg2g)pL4pslr9El~Uo<>=~hv zhIujKNtnKd&!vUO&%)ScFr4V^a`AKIYvzYFg1xzp^m=NPGxrY-{f5!<>WPn;p&e=X z&=?Dvs)o#-p+6a4wkL{G@e?|`593lu5rcNFZ0n*#Q5e&y<3>cah#b^Vvir~GLsG78q&3Q`i1=inSK4Z&iNX6)E{1Ig@(&@uS&^7ZIvcNw^|a|CI2X) zj=bD{ci^=^^(Wg5qOcZsr9>+FGSjj98ywoIQW)FjFEi`^ikh~69KBlb=jx-H>|+P> z8xZ8)Ko+e;U%N1I&3K*n#(FtEOCtncOu)NPig{$Fr)WKeO)dy`UdSnZX5=xGVRWr# z+RA%htUKm%!_bBP9)4J6hD-r|Q`d!mITV@x7^(bHyRZEGhZ2wSxd>0gzXjwKym9{* z@&IT?j#rp{Giaf5%>vb?ZMyD>=*N#YGQ2v-8?$E)db^(>MVdcj1odVe)8-_+TwQ}Q zI<~*Eq#VIlI?jj7c!TApHk7bAv3niIJiHVCBakeBS{rB z4n+&L>Ol8IhR~+X#g9(pK)+MO+0n!&i?=c($|~- literal 25731 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 literal 29846 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 Vj#qO!`sXjOKksDo;wN9szW}jj^j-h} literal 27497 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 diff --git a/docs/zh_CN/user/imgs/web_job_details_logview.png b/docs/zh_CN/user/imgs/web_job_details_logview.png new file mode 100644 index 0000000000000000000000000000000000000000..1ff280a4a54a0c52a10895fec18557ab71eac4fc GIT binary patch literal 102381 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

ij0i<7OO(iAo64?u@ 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 Hkc|HYp)Wfw literal 27906 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 diff --git a/docs/zh_CN/user/imgs/web_job_details_over1.png b/docs/zh_CN/user/imgs/web_job_details_over1.png index dfa83efd9e4f28198269650fc7fb390785c2d280..d114d0dc34ff9dade405591caef3432098779b80 100644 GIT binary patch literal 42775 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

gcs%~1HwrgUQ+Zio2~;A!2<|G&yu; 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 literal 24137 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 ar~;nFVCk&YrNV*@OdoC@oy9-5=)V9wh2w_+ diff --git a/docs/zh_CN/user/imgs/web_job_details_over2.png b/docs/zh_CN/user/imgs/web_job_details_over2.png index 6cb39ab7b528d9d05dfee4231c030891a8d7f1e4..5d8e45065a7c17ba1666693bb683f26c1379ab1e 100644 GIT binary patch literal 92029 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%0D8lA@CRs=m*kfjaDQ$Nfh9g@<5+gd?|b!L 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 NH6?Au5(SHg{|5-3+v@-T literal 63388 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 CIXR&K literal 32291 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 diff --git a/docs/zh_CN/user/imgs/web_job_list_waiting.png b/docs/zh_CN/user/imgs/web_job_list_waiting.png index a702a24c0cb86683eb2dee1489b70565bb39c00e..212dc446d241bdf5aec0c7e38a5cf8f6f3336a47 100644 GIT binary patch delta 6233 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 XB*c+**-t}On^Ew>%tn3II_m!d17(W2 diff --git a/docs/zh_CN/user/storage.md b/docs/zh_CN/user/storage.md new file mode 100644 index 0000000000..0668dfc8dd --- /dev/null +++ b/docs/zh_CN/user/storage.md @@ -0,0 +1,201 @@ +# 如何使用存储 + +- [如何使用存储](#如何使用的存储) + - [为什么要关注存储](#为什么要关注存储) + - [通用流程](#通用流程) + - [主要方法](#主要方法) + - [共享路径](#共享路径) + - [复制](#复制) + - [Docker 内置](#docker-内置) + - [云服务存储(Azure)](#云服务存储(Azure)) + - [大量小文件](#大量小文件) + - [大数据量](#大数据量) + - [OpenPAI 中的 HDFS](#openpai-中的-hdfs) + +## 为什么要关注存储 + +OpenPAI 会管理计算资源,但不提供数据、代码或模型文件的持久化存储。 OpenPAI 上的训练 Job 运行在 Docker 容器中,这些容器每次都会重建,运行完成即被删除。 因此, OpenPAI Job 需要先准备好文件,并在环境被删除前将输出的文件保存出来。 + +本文介绍了如何在 OpenPAI 中访问文件。实际上,这与在一般的 Docker 容器中访问文件是一样的。 + +## 通用流程 + +下面的 Job 配置与 [hello-world 示例](training.md#提交-hello-world-job)非常类似,只有 command 字段有些不同。 command 字段用了共享文件夹中的代码,而不是从 GitHub 克隆代码,另外还将输出保存回了这个文件夹。 + +注意,此示例使用的是 Windows 的共享文件夹。 [Samba](https://www.samba.org/) 可在 Linux 下支持这样共享文件夹。 如果要尝试此示例,需要: + +1. 克隆[相应的代码](https://github.com/tensorflow/models)并共享该文件夹。 +2. 替换所有变量为相应的值,包括:``,``,``,以及 ``。 + +```json +{ +"jobName": "tensorflow-cifar10", +"image": "tensorflow/tensorflow:1.12.0-gpu-py3", +"taskRoles": [ + { + "name": "default", + "taskNumber": 1, + "cpuNumber": 4, + "memoryMB": 8192, + "gpuNumber": 1, + "command": "apt update && apt install -y cifs-utils && mkdir /models && mount -t cifs /// /models -o username=,password= && cd /models/research/slim && python3 download_and_convert_data.py --dataset_name=cifar10 --dataset_dir=/tmp/data && python3 train_image_classifier.py --dataset_name=cifar10 --dataset_dir=/tmp/data --train_dir=/tmp/output --max_number_of_steps=1000 && cp -rf /tmp/output /models/output" + } +] +} +``` + +command 字段可分为以下几步。 + +1. **准备环境**。 Docker 镜像已经准备好了大部分依赖。 但如果 Job 需要更多的组件,可通过 apt,pip 或其它命令来安装。 此例中,`apt update && apt install -y cifs-utils` 安装了 `cifs-utils` 来挂载代码文件夹。 + + 如果将所有依赖都包含在 Docker 映像中,可以在每次运行前省下下载和安装时间。 但如果这些依赖更新得非常频繁,或不同的 Job 需要大量的依赖,则可以在 Job 运行时安装。 + +2. **准备文件**。 `mkdir /models && mount -t cifs /// /models -o username=,password= && cd /models/research/slim`,挂在了包含代码的共享文件夹。 如果还有其它文件夹包含了数据或模型,也可以在此挂载上。 + +3. **执行核心逻辑**。 命令 `python3 download_and_convert_data.py --dataset_name=cifar10 --dataset_dir=/tmp/data && python3 train_image_classifier.py --dataset_name=cifar10 --dataset_dir=/tmp/data --train_dir=/tmp/output --max_number_of_steps=1000` 与 [hello-world 示例](training.md#提交-hello-world-job)中的一样。 + +4. **保存输出**。 Docker 容器会在每次 Job 完成后被删除。 因此,如果需要任何结果文件,要将其保存到 Docker 容器之外。 命令 `cp -rf /tmp/output /models/output` 将训练后的模型和检查点都复制回了共享文件夹。 + +注意,此例将所有步骤都放到了 command 字段中。 有些步骤可以放到 Bash 或 Python 脚本中,然后用一条命令来运行。这样可以用脚本来处理更复杂的逻辑。 + +## 主要方法 + +除了共享文件夹,文件也可以直接内置到 Docker 映像中,或复制进出 Docker 容器。 这三种方法适应不同的场景。 以下介绍了它们各自的优缺点以及使用简介。 + +### 共享路径 + +这种方法会在存储和 Docker 容器之间建立长时间的连接,一般会在整个 Job 的声明周期都保持可用。 + +- 优点 + + - 没有使用的数据不会被传输。 因此,共享很大的目录也不会产生额外的性能影响。 + - 易于使用。 挂载的文件夹和本地文件夹的代码逻辑是一样的。 + - 写操作会立刻发生在共享文件上。 因此可以快速反映改动。 + +- 缺点 + + - 因为共享文件可能在任何时候被访问到,所以如果 Job 运行期间网络不稳定,可能会造成 Job 失败。 + - 如果文件被读写多次,与其它方法相比,可能会造成多次网络 IO。 + - 大多数共享路径的协议都不能穿过防火墙。 + - 大多数共享协议在访问大量小文件时,性能都会很低。 + - 如果共享路径被多个 Job 访问,网络或磁盘 IO 可能会成为瓶颈。 + - 如果多个 Job 同时写回同一个文件,可能会造成文件损坏。 + +- 适用场景 + + - 共享存储和 OpenPAI 需要在同一个局域网中,存储的 IOPS 需要足够以支持并发的 Job。 + - 文件夹中包含有在 Job 运行过程中不会被访问到的文件。 + - 没有大量小文件,也不需要并发保存文件。 + +- 如何使用 + + [通用流程](#通用流程)就使用了共享路径,很好的演示了 SMB 协议的用法。 [NFS](https://en.wikipedia.org/wiki/Network_File_System) 是另一个流行的共享协议。 `apt install nfs-common && mkdir /models && mount -t nfs4 : /models` 可用来安装并挂载 NFS 路径。 + + 参考[这里](https://www.linux.org/docs/man8/mount.html)了解更多关于 `mount` 命令以及其它共享协议的信息。 + +### 复制 + +此方法仅在传输文件的时候需要连接,将文件缓存在本地。 + +- 优点 + + - 因为文件复制到了本地,IO 性能会大大高于远程共享文件。 在多次读写文件的场景下,也非常快。 + - 部分传输协议可穿越防火墙。 许多成熟的协议都可用来传输文件,如 SSH,SFTP,HTTP,SMB 等等。 + - 因为复制不需要长时间保持连接,所以在网络不稳定的情况下,其更有可能让 Job 运行成功。 + +- 缺点 + + - 如果只需要部分文件,则需要通过规则来选择复制文件。 + - 如果 Job 意外失败,可能无法将输出复制出来。 + - 可能本地磁盘空间不足以复制所有文件。 + - 大多数协议在访问大量小文件时,性能都会很低。 + +- 适用场景 + + - Dockers 容器的磁盘大小足够复制文件。 + - 复制的文件需要很高的 IO 性能,或会被多次访问。 + - 没有大量小文件。 + +- 如何使用 + + 复制是指的一种方法,而不是某种工具或协议。 能传输文件的命令都可以成为复制的方法。 例如,SSH,SFTP,FTP,HTTP,SMB,NFS 等等。 + + 下面 command 字段的示例使用了 `smbclient`,与共享示例的功能相同。 `smbclient` 也使用了 SMB 协议。 + + 注意,此示例的先决条件与[通用流程](#通用流程)相同。 + + ```bash + apt update && apt install -y smbclient && mkdir /models && cd /models && smbclient --user= /// -c "prompt OFF;recurse ON;mask *.py;mget *" -m=SMB2 && cd /models/research/slim && python3 download_and_convert_data.py --dataset_name=cifar10 --dataset_dir=/tmp/data && python3 train_image_classifier.py --dataset_name=cifar10 --dataset_dir=/tmp/data --train_dir=/tmp/output --max_number_of_steps=1000 && smbclient --user= /// -c "prompt OFF;cd /output;lcd /tmp/output;recurse ON;mput *" -m=SMB2 + ``` + + 更多详情与其它协议和工具,参考其相关文档。 + +### Docker 内置 + +- 优点 + + - 因为 Docker 映像会在本地缓存,所以每次运行都能节省复制文件的时间和 IO 消耗。 + - 与复制方法类似,所有文件都在本地,也会有很好的 IO 性能。 + - 因为文件都在 Docker 映像块文件中,大量小文件也能很好处理。 + +- 缺点 + + - 如果输出文件需要被持久化,也需要使用共享或复制的方法。 + - 如果文件有更新,需要重新构建 Docker 映像。 所有 Docker 映像的缓存也会因此而过期,需要重新下载。 + - 如果文件很大,则不适合此方法。 通常,Docker 映像都在 2 到 4 GB 的大小。 因此,如果文件大于 1 GB,就不适合内置到 Docker 映像中。 + +- 适用场景 + + - 文件不经常更新,大小不超过 1 GB。 + - 有大量的小文件。 + +- 如何使用 + + 下面的示例与 hello-world 更类似,没将输出的文件拷贝出来。 + + 1. 参考[这里](https://docs.docker.com/docker-hub/)来构建 Docker 映像并发布到 hub.docker.com 上。 下面的 Docker 文件将代码复制到了 Docker 映像中。 + ```docker + FROM tensorflow/tensorflow:1.12.0-gpu-py3 + + RUN apt update && apt install -y git && cd / && git clone https://github.com/tensorflow/models + ``` + + 2. 参考下列示例来改动 Job 配置。 除了 command 字段,image 字段也不相同。 image 字段需要改为包含有代码的 docker 映像的地址。 + ```json + { + "jobName": "tensorflow-cifar10", + "image": "", + "taskRoles": [ + { + "name": "default", + "taskNumber": 1, + "cpuNumber": 4, + "memoryMB": 8192, + "gpuNumber": 1, + "command": "cd /models/research/slim && python download_and_convert_data.py --dataset_name=cifar10 --dataset_dir=/tmp/data && python train_image_classifier.py --dataset_name=cifar10 --dataset_dir=/tmp/data --max_number_of_steps=1000" + } + ] + } + ``` + +## 云服务存储(Azure) + +如果 OpenPAI 部署在了 Azure中,[Azure Files](https://azure.microsoft.com/en-us/services/storage/files/) 和 [Blob Storage](https://azure.microsoft.com/en-us/services/storage/blobs/) 都可用来保存文件。 + +Azure Files 提供了完全托管在云中的文件共享方案,可通过标准的 SMB 协议来访问。 它支持通过 [mount](https://docs.microsoft.com/en-us/azure/storage/files/storage-how-to-use-files-linux) 命令来共享,或者通过 [Python SDK](https://docs.microsoft.com/en-us/azure/storage/files/storage-python-how-to-use-file-storage) 来复制文件。 GUI 工具 [Storage Explorer](https://docs.microsoft.com/en-us/azure/vs-azure-tools-storage-explorer-files) 可在 Windows, Linux 和 macOS 下管理文件。 + +Azure Blob 是微软针对云提供的对象存储方案。 Blob 存储可存储较大的非结构化数据。 它支持[多种方法](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction#move-data-to-blob-storage)来访问文件,例如使用 [AzCopy](https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10) 来复制数据,[blobfuse](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-how-to-mount-container-linux) 来挂载共享数据。 它和 Azure Files 一样也支持 [Python SDK](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-python) 和 [Storage Explorer](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-storage-explorer)。 + +## 大量小文件 + +在一些深度学习 Job 中,训练数据是很多小文件,如图片、音频或文本。 如果这些文件没有存放在本地,那么 IO 性能就会很低。 可将这些小文件文件打包到一个文件中,然后传输到本地。 虽然会有解压的额外成本,但大多数情况下都会比直接传输要快。 + +## 大数据量 + +如果文件是 TB 级,则需要避免占满本地磁盘空间。 很多场景下都会有这种挑战,OpenPAI 上也一样。 可采用更好的硬件架构或算法来缓解。 + +## OpenPAI 中的 HDFS + +OpenPAI 部署了一个 HDFS 服务来保存日志和其它文件。 虽然此 HDFS 也可用来存储文件,但**不推荐**这样做。 因为 OpenPAI 集群的服务器可能会频繁增减,磁盘空间也有可能不够,因此无法保证存储的质量。 + +对于一些非常小的集群,如果管理员就是用户,可以使用此 HDFS 来简化部署。 但同时应考虑上述风险。 \ No newline at end of file diff --git a/docs/zh_CN/user/training.md b/docs/zh_CN/user/training.md index f69a0c9eed..a530c2a007 100644 --- a/docs/zh_CN/user/training.md +++ b/docs/zh_CN/user/training.md @@ -17,45 +17,46 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --> -# Train models on OpenPAI +# 在 OpenPAI 上训练模型 -- [Train models on OpenPAI](#train-models-on-openpai) - - [Submit a hello-world job](#submit-a-hello-world-job) - - [Understand job](#understand-job) - - [Learn hello-world job](#learn-hello-world-job) - - [Exchange data](#exchange-data) - - [Job workflow](#job-workflow) - - [Reference](#reference) +- [在 OpenPAI 上训练模型](#在-openpai-上训练模型) + - [提交 hello-world Job](#提交-hello-world-job) + - [理解 Job](#理解-job) + - [了解 hello-world Job](#了解-hello-world-job) + - [传入/传出文件](#传入传出文件) + - [Job 流程](#job-流程) + - [参考](#参考) -This document is for beginners, who use OpenPAI to train machine learning models or execute other commands. +本文档适用于 OpenPAI 的新用户。 其介绍了在 OpenPAI 上训练模型或执行其它类型命令的必需知识。 -It assumes that you know IP address or domain name and have an account of OpenPAI. 如果还没安装 OpenPAI 集群,参考[这里](../../../README_zh_CN.md#部署)进行部署。 +在开始之前,确保已经有了 OpenPAI 集群的 IP 地址或域名,以及它的用户名、密码。 如果还没安装 OpenPAI 集群,参考[这里](../../../README_zh_CN.md#部署)进行部署。 -## Submit a hello-world job +## 提交 hello-world Job -The **job** of OpenPAI defines how to execute command(s) in specified environment(s). A job can be model training, other kinds of commands, or distributed on multiple servers. +**Job** 在 OpenPAI 中定义了在指定的环境中如何执行命令。 Job 可以是模型训练,其它用途的命令,或者分布在多台服务器上。 -Following this section to submit a very simple job like hello-world during learning a program language. It trains a model, which is implemented by TensorFlow, on CIFAR-10 dataset. It downloads data and code from internet and doesn't copy model out. It helps getting started with OpoenPAI. Next sections include more details to help on submitting real jobs. +本节介绍了如何提交一个非常简单的 Job,这就像在学习编程语言时,从 hello-world 示例开始一样。 此示例使用 TensorFlow 在 CIFAR-10 数据集上训练模型。 其从互联网下载数据和代码,且没有将训练完的模型复制出来。 通过此示例可初步了解 OpenPAI。 接下来的章节会介绍更多内容,以便于提交真正实用的 Job。 -1. Navigate to OpenPAI web portal. Input IP address or domain name of OpenPAI, which is from administrator of the OpenPAI cluster. If it doesn't require to login, click *login* link at top right side and input user/password. +**注意**, Web 界面是提交 Job 的方法之一。 它学起来非常简单,但却不是最高效的提交和管理 Job 的方法。 推荐使用 [OpenPAI VS Code Client](../../../contrib/pai_vscode/VSCodeExt_zh_CN.md),来获得最好的体验。 + +1. 浏览至 OpenPAI 的 Web 界面。 可从 OpenPAI 管理员那里获取 IP 地址或域名。 在登录页面中,点击 *sign in*,输入用户名、密码。 - After that, OpenPAI will show dashboard as below. + 之后,OpenPAI 会显示如下的 Job 列表。 - ![dashboard](imgs/web_dashboard.png) + ![Job 列表](imgs/web_job_list.png) -2. Click **Submit Job** on the left pane and reach this page. +2. 单击左边的的 **Submit Job** 并转到此页面。 - ![submit job](imgs/web_submit_job.png) - + ![提交 Job](imgs/web_submit_job.png) -3. Click **JSON** button. Clear existing content and paste below content in the popped text box, then click save. +3. 点击 **JSON** 按钮。 在弹出的文本框中,清除现有内容并粘贴下面的内容,然后单击“保存”。 - The content is introduced in next sections. + 内容将在下一节中介绍。 json { "jobName": "tensorflow-cifar10", - "image": "ufoym/deepo:tensorflow-py36-cu90", + "image": "tensorflow/tensorflow:1.12.0-gpu-py3", "taskRoles": [ { "name": "default", @@ -63,107 +64,96 @@ Following this section to submit a very simple job like hello-world during learn "cpuNumber": 4, "memoryMB": 8192, "gpuNumber": 1, - "command": "git clone https://github.com/tensorflow/models && cd models/research/slim && python download_and_convert_data.py --dataset_name=cifar10 --dataset_dir=/tmp/data && python train_image_classifier.py --dataset_name=cifar10 --dataset_dir=/tmp/data --max_number_of_steps=1000" + "command": "apt update && apt install -y git && git clone https://github.com/tensorflow/models && cd models/research/slim && python download_and_convert_data.py --dataset_name=cifar10 --dataset_dir=/tmp/data && python train_image_classifier.py --dataset_name=cifar10 --dataset_dir=/tmp/data --max_number_of_steps=1000" } ] } - ![paste job](imgs/web_paste_json.png) - + ![粘贴 Job](imgs/web_paste_json.png) -4. It will show as below. Click **Submit** button to submit the job to OpenPAI platform. +4. 然后点击 **Submit** 按钮将 Job 提交到 OpenPAI 平台。 - ![click submit job](imgs/web_click_submit_job.png) - - Note, Web portal is one of ways to submit jobs. It's not most efficient way, but simplest way to begin. [OpenPAI VS Code Client](../../../contrib/pai_vscode/VSCodeExt_zh_CN.md) is recommended to work with OpenPAI. - + ![点击提交 Job](imgs/web_click_submit_job.png) -5. After submitted, the page redirects to job list, and the submitted job is in list as **waiting** status. Click **Jobs** on right pane can also reach this page. +5. 提交后,页面重定向到作业列表,提交的作业在列表中为 **Waiting** 状态。 单击左边的 **Jobs** 也可以到达此页面。 - ![job list](imgs/web_job_list.png) - + ![Job 列表](imgs/web_job_list.png) -6. Click job name to view job details. Keep refreshing the details page, until job status is changed to *Running*, and IP address is assigned in below pane of task role. There are more details and actions, like status, tracking log and so on. +6. 单击 Job 名称查看详细信息。 开始运行后,Job 状态会变为 *Running*,并且会在下面显示分配给 Task Role 的 IP 地址。 除此之外,还有更多的信息及操作,如状态、查看日志等。 - ![job list](imgs/web_job_details.png) - + ![Job 列表](imgs/web_job_details.png) -## Understand job +## 理解 Job -With submitting a hello-world job, this section introduces more knowledge about job, so that you can write your own job configuration easily. +本届介绍了更多关于 Job 的知识,以便于编写自己的 Job 配置。 -### Learn hello-world job +### 了解 hello-world Job -The **job configuration** is a JSON file, which is posted to OpenPAI. Here uses the hello-world job configuration to understand key fields. +**Job 配置**是一个发送到 OpenPAI 的 JSON 文件。 hello-world Job 的配置包含了以下必需的关键字段。 -The JSON file of job has two levels entries. The top level includes shared information of the job, including job name, docker image, task roles, and so on. The second level is taskRoles, it's an array. Each item in the array specifies commands and the corresponding running environment. +JSON 文件中的字段有两个级别。 顶级节点是此 Job 的共享信息,包括 Job 名称,Docker 映像, Task Role 等等。 第二级是 taskRoles,是一个数组,其中每一项包含一个命令及其运行环境。 以下是 Job 配置的必需字段,更多字段参考 [Job 配置手册](../job_tutorial.md)。 -- **jobName** is the unique name of current job, displays in web also. A meaningful name helps managing jobs well. +- **jobName** 是当前 Job 的名称。 在每个用户账号中,其必需是唯一的。 有意义的名称有助于管理 Job。 - **image** - OpenPAI uses [docker](https://www.docker.com/why-docker) to provide runtime environments. Docker is a popular technology to provide isolated environments on the same server. So that OpenPAI can serve multiple resource requests on the same server and provides consistent clean environments. - - The **image** field is the identity of docker image, which includes customized Python and system packages, to provide a clean and consistent environment for each running. - - Administrator may set a private docker repository. The hub.docker.com is a public docker repository with a lot of docker images. The [ufoym/deepo](https://hub.docker.com/r/ufoym/deepo) on hub.docker.com is recommended for deep learning. In the hello-world example, it uses a TensorFlow image, *ufoym/deepo:tensorflow-py36-cu90*, from ufoym/deepo. - - If an appropriate docker image isn't found, it's not difficult to [build a docker image](../job_docker_env.md) from scratch. - - Note, if a docker image doesn't include *openssh-server* and *curl* components by default, it cannot use SSH feature of OpenPAI. If SSH is needed, another docker image can be built on top of this image and includes *openssh-server* and *curl*. - + [Docker](https://www.docker.com/why-docker) 是在服务器上提供虚拟环境的常用技术。 OpenPAI 用 Docker 来提供一致、干净的环境。 通过 Docker,OpenPAI 可以在一台服务器上同时服务多个资源请求。 + + **image** 字段是 Docker 映像的标识,其中已经安装好了定制的 Python 和系统的组件包。 + + hub.docker.com 是共享的 Docker 存储库,有很多 Docker 映像。 深度学习训练任务推荐使用 hub.docker.com 上的 [ufoym/deepo](https://hub.docker.com/r/ufoym/deepo)。 在 hello-world 示例中,使用了 ufoym/deepo 中的 Tensorflow 映像:*ufoym/deepo:tensorflow-py36-cu90*。 管理员可以设置专用的 Docker 存储库。 + + 如果没有找到合适的 Docker 映像,可参考[构建 Docker 映像](../job_docker_env.md),能很容易的定制一个 Docker 映像。 + + 注意,如果 Docker 映像没有包括 *openssh-server* 和 *curl* 包,则无法使用 OpenPAI 的 SSH 功能。 如果需要 SSH 功能,可在已有的 Docker 映像上构造一个包含 *openssh-server* 和 *curl* 的新 Docker 映像。 -- **taskRoles** defines different roles in a job. +- **taskRoles** 定义了 Job 中的不同角色。 + + 对于单机运行的 Job,在 taskRoles 中只有一个角色。 - For single machine jobs, there is only one item in taskRoles. - - For distributed jobs, there may be multiple roles in taskRoles. For example, when TensorFlow is used to running distributed job, it has two roles, including parameter server and worker. There are two task roles in the corresponding job configuration, refer to [an example](../job_tutorial.md#a-complete-example). - + 对于分布式的 Job,taskRoles 中可能会有多个角色。 例如,在使用 TensorFlow 来运行分布式 Job 时,需要两个角色,包括参数服务器和工作节点。 相应的在 Job 配置中需要两个任务角色,参考[示例](../job_tutorial.md#a-complete-example),来了解详细信息。 -- **taskRoles/name** is the name of current task role and it's used in environment variables for communication in distributed jobs. +- **taskRoles/name** 是任务角色的名称,还会被用于分布式 Job 的环境变量中。 -- **taskRoles/taskNumber** is number of current task instances. For single server jobs, it should be 1. For distributed jobs, it depends on how many instances are needed for this task role. For example, if it's 8 in a worker role of TensorFlow. It means there should be 8 docker containers as workers should be instantiated for this task. +- **taskRoles/taskNumber** 是任务角色的实例数量。 在单服务器 Job 中,其为 1。 在分布式 Job 中,根据任务角色需要多少个实例来定。 例如,其在 TensorFlow 的工作阶段角色中为 8。 这表示 worker 角色会被实例化出 8 个 Docker 容器。 -- **taskRoles/cpuNumber**, **taskRoles/memoryMB**, **taskRoles/gpuNumber** are easy to understand. They specify corresponding hardware resources including count of CPU core, MB of memory, and count of GPU. +- **taskRoles/cpuNumber**,**taskRoles/memoryMB**,**taskRoles/gpuNumber** 非常容易理解。 它们指定了相应的硬件资源,包括 CPU 核数量,内存(MB),以及 GPU 数量。 -- **taskRoles/command** is what user want to run in this task role. It can be multiple commands, which are joint by `&&` like in terminal. In the hello-world job configuration, it clones code from GitHub, downloads data and then executes the training progress within one line. +- **taskRoles/command** 是此任务角色要运行的命令。 可以是多个命令,像在终端中一样,通过 `&&` 组合到一起。 例如,在 hello-world Job 中,命令会从 GitHub 中克隆代码,下载数据,然后执行训练过程。 - Like the hello-world job, user needs to construct command(s) to get code, data and trigger executing. - + 像 hello-world Job 一样,用户需要构造命令来获取代码、数据,并开始执行。 -### Exchange data +### 传入/传出文件 -The data here doesn't only mean *dataset* of machine learning, also includes all files and information, like code, scripts, trained model, and so on. Most model training and other kinds of jobs need to exchange data between docker container and outside. +大多数模型训练以及其它类型的 Job 都需要在运行环境内外间传输文件。 这些文件包括数据集、代码、脚本、训练好的模型等等。 -OpenPAI creates a clean docker container. Some data can be built into docker image directly if it's changed rarely. +OpenPAI 会管理计算资源,但不会管理持久化的存储资源。 [如何使用存储](storage.md)可帮助 OpenPAI 用户来理解并使用存储。 -If it needs to exchange data on runtime, the command, which passes to docker in job configuration, needs to initiate the data exchange progress. For example, use `git`, `wget`, `scp`, `sftp` or other commands to copy data in and out. If some command is not built in docker, it can be installed in the command by `apt install` or `python -m pip install`. +最好与 OpenPAI 集群的管理员确认如何传输文件,他们可能已经选出了最合适的方法和示例。 -It's better to check with administrator of the OpenPAI cluster, since there may be suggested approaches and examples already. +### Job 流程 -### Job workflow +Job 配置准备好后,下一步则需要将其提交到 OpenPAI。 推荐使用 [Visual Studio Code OpenPAI Client](../../../contrib/pai_vscode/VSCodeExt_zh_CN.md) 来提交 Job。 -Once job configuration is ready, next step is to submit it to OpenPAI. 推荐使用 [Visual Studio Code OpenPAI 扩展](../../../contrib/pai_vscode/VSCodeExt_zh_CN.md)来提交 Job。 Both web UI and extension through [RESTful API of OpenPAI](../rest-server/API.md) to manage jobs. So, it's possible to implement your own script or tool. +注意,WEB 界面和 Visual Studio Code Client 都通过 [RESTful API](../rest-server/API.md) 来访问 OpenPAI。 可使用 RESTful API 来定制客户端体验。 -After received job configuration, OpenPAI processes it as below steps. +收到 Job 配置后, OpenPAI 按以下步骤处理。 -1. Wait to allocate resource. As job configuration, OpenPAI waits enough resources including CPU, memory, and GPU are allocated. If there is enough resource, the job starts to run very soon. If there is not enough resource, job is queued and wait previous job to complete. - - Note, distributed jobs start to run when first environment is ready. But user code can still wait until enough container(s) are running to execute actual progress. The job status is set to *Running* on OpenPAI as well, once one container is running. - +1. 等待分配资源。 OpenPAI 会等待分配到足够的资源,包括 CPU,内存和 GPU。 如果资源足够,Job 会很快开始。 如果资源不够,Job 会进入队列,并等待前面的 Job 结束后释放资源。 -2. Initialize docker container. OpenPAI pulls the docker image, which is specified in configuration, if it doesn't exist locally. After docker container started, OpenPAI executes some initialization and then run user's command(s). +2. 初始化 Docker 容器。 如果指定的 Docker 映像不在本地, OpenPAI 会拉取它。 随后,OpenPAI 会初始化 Docker 容器。 -3. Execute user commands. During user command executing, OpenPAI outputs [stdout and stderr](troubleshooting_job.md) near real-time. There also are metrics to [monitor workload](troubleshooting_job.md#how-to-check-job-log). +3. 运行配置中的命令。 在命令执行过程中,OpenPAI 会近实时的输出 [stdout 和 stderr](troubleshooting_job.md)。 还可通过一些指标来[监控工作负载](troubleshooting_job.md#查看-job-指标)。 -4. Finalize job running. Once user's command completed. OpenPAI use latest exit code as signal to decide the job is success or not. 0 means success, others mean failure. Then OpenPAI recycles resource for next job. +4. 结束 Job。 命令完成后,OpenPAI 会用最后的退出代码作为信号来决定 Job 是否成功结束。 0 表示成功,其它值表示失败。 随后,OpenPAI 会回收资源,以便运行下一个 Job。 -When job is submitted to OpenPAI, user can see job's status changing from waiting, to running, then to succeeded or failed. It may be stopped if the job is interrupted by user or system. +当 Job 提交到 OpenPAI 后, Job 会从 waiting,切换到 running,然后是 succeeded 或 failed。 如果 Job 被用户或系统中断了,状态也可能显示为 stopped。 -## Reference +## 参考 -- [Full spec of job configuration](../job_tutorial.md) -- [Examples](../../../examples) -- [Troubleshooting job failure](troubleshooting_job.md) \ No newline at end of file +- [Job 配置的完整说明](../job_tutorial.md) +- [示例](../../../examples) +- [调研 Job 错误](troubleshooting_job.md) +- [如何使用存储](storage.md) \ No newline at end of file diff --git a/docs/zh_CN/user/troubleshooting_job.md b/docs/zh_CN/user/troubleshooting_job.md index b82d531015..fea1d54a81 100644 --- a/docs/zh_CN/user/troubleshooting_job.md +++ b/docs/zh_CN/user/troubleshooting_job.md @@ -17,205 +17,189 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --> -# Troubleshoot job +# 诊断调试 Job -Like other platforms, the job failures in OpenPAI need more effort to find and fix than local code. This document helps troubleshooting issues on OpenPAI. +与其它远程平台一样,OpenPAI 中 Job 失败的诊断和调试上需要更多精力。 本文有助于诊断 OpenPAI 上发生的问题。 -- [Troubleshoot job](#troubleshoot-job) - - [Best practice](#best-practice) - - [Fix issues locally](#fix-issues-locally) - - [Make log clear](#make-log-clear) - - [Validate job with local simulator](#validate-job-with-local-simulator) - - [Know resource bottleneck well](#know-resource-bottleneck-well) - - [Diagnostic issues](#diagnostic-issues) - - [Job is waiting for hours](#job-is-waiting-for-hours) - - [Job is running, but no IP address, ports, and GPU assigned](#job-is-running-but-no-ip-address-ports-and-gpu-assigned) - - [Job is running and retried many times](#job-is-running-and-retried-many-times) - - [Job runs slowly](#job-runs-slowly) - - [Job is failed](#job-is-failed) - - [Guidance](#guidance) - - [How to view job metrics](#how-to-view-job-metrics) - - [How to check job log](#how-to-check-job-log) - - [Connect to running environments with SSH](#connect-to-running-environments-with-ssh) - - [Reserve failed docker for debugging](#reserve-failed-docker-for-debugging) - - [Ask helps](#ask-helps) +- [诊断调试 Job](#诊断调试-job) + - [最佳实践](#最佳实践) + - [在本机修复问题](#在本机修复问题) + - [编写易于理解的日志](#编写易于理解的日志) + - [通过本机模拟验证 Job](#通过本机模拟验证-job) + - [充分了解资源瓶颈](#充分了解资源瓶颈) + - [诊断问题](#诊断问题) + - [Job 等待了数小时](#job-等待了数小时) + - [Job 重试了很多次](#job-重试了很多次) + - [Job 执行较慢](#job-执行较慢) + - [Job 失败](#job-失败) + - [指南](#指南) + - [查看 Job 指标](#查看-job-指标) + - [查看 Job 日志](#查看-job-日志) + - [使用 SSH 远程连接](#使用-ssh-远程连接) + - [保留失败的 Docker 用于调试](#保留失败的-docker-用于调试) + - [寻求帮助](#寻求帮助) -## Best practice +## 最佳实践 -With best practice, many issues could be addressed earlier with low cost, and some tough issues can be found easily also. +通过最佳实践,很多问题能被更早的发现,一些棘手的问题也能被更容易的解决。 -### Fix issues locally +### 在本机修复问题 -Troubleshooting issues remotely is hard, so keep in mind to consider fix an issue at local, not to investigate it at remote server immediately. +远程诊断问题较困难,因此要考虑尽量在本机修复问题,而不是在远程服务器上就开始调研。 -- If some error happens in remote environment, try to reproduce it at local firstly, and then try to fix it. It may spend more time on reproducing, but the time returns later mostly. -- Minimize code difference between local and remote. That makes it's easy to reproduce problems locally. -- Some issues may be caused by difference between local and remote environments, try to narrow down the difference where it happens. For example, to write a very small code snippet to reproduce it remotely. +- 如果远程环境中发生了错误,首先要尝试在本地复现,然后再试着修复它。 这可能会在复现上花更多的时间,但大多数情况下,修复会更容易。 +- 最大限度减少本地和远程代码逻辑的差异。 这样更多的逻辑问题能在本机找到。 +- 某些问题可能是因为远程和本地环境的不同而造成的,因此无法在本地重现。 这时要尝试缩小发生问题的范围。 例如,用非常小的代码片段来重现问题。 -### Make log clear +### 编写易于理解的日志 -Debug is very useful at local development, but it's hard to use remotely, and most impossible in production environment. Log provides lots of information and works well in most environments. +在本地开发时,调试非常有用,但远程调试却很困难,而在生产环境中几乎无法进行调试。 日志可提供大量的信息,而且适用于各种环境。 -To use log better, +要提高日志质量: -1. Use log more when developing. In development phase, avoid debugging, or printing output for one-time use. The log should be improved if it doesn't have enough information to understand an issue. Some issue may be fixed locally or happens seldom, but it may happen at remote environment. Once it happens, the log can help locating. -2. Reduce duplicated content. The duplicated or repeated content is easy to bury useful information. So, duplicated content should be merged or disable. -3. Tell story in log, not just dump variables. People, who look log, may never see code, or forget it. Besides dump variable's value, the log needs to explain what variables mean in business logic. For example, when some variable is abnormal, the log should include why it's considered as abnormal, how it's critical, how to fix it. -4. Associate related log with context. In some parallel cases, log is dumped by concurrent threads, processes, or servers in same time. A context id is necessary to associate log together. And time synchronization is needed for distributed servers. -5. What should be logged? It's answered above partially. If something is helpful for troubleshooting, or further analyzing, it should be logged. For example, full error with call stack, and so on. +1. 更多的使用日志。 在开发阶段,更多的查看日志,避免调试或一次性的打印输出。 如果日志还没有足够的信息,就需要进一步改进。 +2. 减少重复的日志。 重复的日志很容易将有用的信息掩盖住。 因此,重复的日志应该合并,或者完全禁用。 +3. 不仅打印变量,还要讲故事。 查看日志的人可能永远不会看代码,或者已经忘记了代码逻辑。 除了打印变量值以外,日志还要解释变量在业务逻辑中的意义。 例如,日志应该说明为什么这个值被认为时异常值,它有多重要,如何修复。 +4. 将相关日志关联起来。 在并行的情况下,并发线程、进程或服务都会同时保存日志。 需要用一个上下文的 ID 将日志关联起来。 如果是分布式的服务,还需要考虑时间的同步。 +5. 什么应该在日志中? 上文已经部分回答了这个问题。 如果某个内容对诊断问题,进一步分析有帮助,那就应该记录下来。 例如,完整的错误栈等等。 -### Validate job with local simulator +### 通过本机模拟验证 Job -Some bugs may happen within OpenPAI jobs only, so the code may run well at local, but failed remotely. With local simulator, more environment issues can be found locally. +一些问题可能只在运行 OpenPAI Job 的时候才会发生,所以代码可能在本机能很好的运行,但在 Job 中却会失败。 使用本机模拟器,就能在本机找到更多环境相关的问题。 -OpenPAI VS Code Client can consume OpenPAI job configuration file and run in Docker container locally. This simulation can find problems that related to job configuration files, mismatched docker image with code dependencies, command line errors, environment variables and so on. +OpenPAI Visual Studio Code Client 可以解析 OpenPAI Job 配置文件,并在本机的 Docker 容器中运行 Job。 这样的模拟可以找到很多与配置相关的问题,比如 Docker 映像和代码中需要的依赖不相匹配,命令行写错了,环境变量等等。 -OpenPAI VS Code Client covers most situations at remote, but still limited, like the resource specification in configuration is ignored, as in most case, the local workstation is not powerful as a GPU server. When code is running locally, it may be much slower, and may be out of memory. The code or command can be modified to avoid this kind of issues and reduce training times at local to disclose more remote issues. +虽然这样的模拟能覆盖大部分远程运行的情况,但仍然有其局限。 例如: -Before using the simulator, [Docker](https://www.docker.com/get-started) needs to be installed. Refer to [here](../../../contrib/pai_vscode/VSCodeExt_zh_CN.md) to install and learn how to [simulate Job Running](../../../contrib/pai_vscode/README_zh_CN.md#simulate-job-running). +- 例如,配置文件中的资源请求数量会被忽略掉,因为本机通常不会像远端 GPU 服务器那样强大。 +- 在本地模拟运行代码时,可能会非常慢,或者内存不够。 这时候,需要修改一下代码或命令行来避免这类问题,并减少训练时间来更快的发现更多问题。 -Note, as Docker on Windows doesn't support GPU, so TensorFlow may need a docker image with CPU package for local simulation. +在使用模拟器之前,需要先安装 [Docker](https://www.docker.com/get-started)。 参考如何[安装 Visual Studio Code Client](../../../contrib/pai_vscode/VSCodeExt_zh_CN.md) 以及[运行模拟 Job](../../../contrib/pai_vscode/README_zh_CN.md#本机模拟)。 -### Know resource bottleneck well +注意,由于 Docker 在 Windows上不支持 GPU,因此在本机模拟时 TensorFlow 需要使用 CPU 版本的 Docker 映像。 -To use OpenPAI, user needs to specify resource specification, including CPU, GPU and memory. If requested resource is too low, the job may be much slower than expected or out of memory. But if a job is assigned too much resource, it's waste also. So, to be aware and understand bottleneck is important. +### 充分了解资源瓶颈 -OpenPAI provides metrics of CPU, memory, and GPU, and it can be used to understand runtime consumption of resource. Learn [how to check job metrics](#how-to-check-job-metrics) for details. +使用 OpenPAI 时,要说明需要的资源,包括 CPU、GPU 以及内存。 如果请求的资源太少, Job 可能会运行得非常慢或者出现内存不足的错误。 但如果给 Job 分配了过多的资源,就会被浪费掉。 因此,知道并理解资源瓶颈很重要。 -## Diagnostic issues +OpenPAI 提供了 CPU、内存以及 GPU 的指标,可用来了解运行时的资源使用情况。 了解[如何查看 Job 指标](#查看-job-指标)。 -### Job is waiting for hours +## 诊断问题 -In general, jobs of OpenPAI stays in waiting status less than 1 minute before running. But if there is not enough resource, a job may stay in waiting status longer. In this case, waiting jobs are in queue, and will be executed later. +### Job 等待了数小时 -![waiting](imgs/web_job_list_waiting.png) - -### Job is running, but no IP address, ports, and GPU assigned - -As the design of OpenPAI, there are two phases to request resources. In first phase, job is in waiting status. In second phase, job is running, but the task role(s) may be requesting resources yet. When a job is running, it doesn't mean task roles of the job are assigned resource. If there is no IP address displayed, it means the task roles are requesting resource. If there is enough resource, the task container can start in seconds. If there is not enough resource available, the task roles keep like below status. +通常,OpenPAI 中的 Job 处于 Waiting 状态不会超过 1 分钟。 但如果没有足够的资源,Job 可能会长时间处于 Waiting 状态。 当其它 Job 完成后,等待的 Job 就有机会获得资源。 -![no IP](imgs/web_job_detail_noip.png) +可以通过减少请求的资源来缩短 Job 等待的时间。 -When some jobs complete, the task roles of waiting jobs have a chance to get resource. One way to start waiting jobs earlier, is to reduce requested resources, so this job may get enough resource easier. +注意,Web 界面上可能会显示出有较多的空闲资源,但这些资源分布在不同的服务器上。 因此,每台服务器可能都无法同时满足 CPU、内存和 GPU 的资源要求。 因此,在这种情况下,Job 仍会等待资源。 -Note, there may have more free resources than requested in dashboard of web portal. But resources are distributed on different servers, there may be no one server meet all resources requirement of CPU, memory, and GPU. - -### Job is running and retried many times +![waiting](imgs/web_job_list_waiting.png) -If a job fails by system reasons, OpenPAI retries to run the job again. +### Job 重试了很多次 -For example, as OpenPAI has two phases to request resources, it may be timeout in second phase. OpenPAI retries the job to request resources again. Check above [job is running, but no IP address, ports, and GPU assigned](#job-is-running-but-no-ip-address-ports-and-gpu-assigned) to check if it's caused by limited resource. If a job retries many times, and isn't caused by limited resource, administrators of OpenPAI may needs to check why it happens. +如果 Job 因为系统的问题而失败,OpenPAI 会尝试重新运行 Job。例如,Job 运行时系统进行了升级。 如果 Job 重试了多次,并且不是因为这个原因,管理员可能需要检查发生了什么问题。 ![retry](imgs/web_job_detail_retry.png) -### Job runs slowly +### Job 执行较慢 -The running speed of job is subjective sometime, so it needs more fact and data to measure, before trying to fix something. Below are several reasons that may make job slowly in OpenPAI. +Job 运行快慢是主观的,因此在试着“修复”这个问题前,需要通过数据来衡量。 下面是一些可能会造成 Job 在 OpenPAI 上较慢的原因。 -1. GPU is not enabled. Some frameworks, like TensorFlow, need to install GPU package to enable GPU computing. In most case, the log of framework shows if GPU is in use. Some frameworks, like PyTorch, need to write code to use GPU explicitly. Learn [how to check job log](#how-to-check-job-log) to validate it in log. +1. 没有用上 GPU。 有些框架,如 TensorFlow,需要安装 GPU 版本才能使用上 GPU 的算力。 通常情况下,可以通过日志来查看是否用上了 GPU。 像 PyTorch 这样的框架,需要显式的写代码才能用上 GPU。 通过[查看 Job 日志](#查看-job-日志)来确认。 -2. Resource bottleneck. Computing resource is not the only potential bottleneck, IO and memory capacity are also bottleneck sometime. When job is running in OpenPAI, metrics can be used to analyze bottleneck. Refer to [how to check job metrics](#how-to-check-job-metrics) for more information. +2. 资源瓶颈。 不仅是计算资源有可能成为瓶颈,有时 IO 和内存容量也会是瓶颈。 指标可用来分析瓶颈。 参考[如何查看 Job 指标](#查看-job-指标)来了解详情。 -### Job is failed +### Job 失败 -Job failures can be caused by many reasons. In general, it can be categorized to two types due to in different phases. +Job 失败的原因很多。 一般根据它发生的阶段,将其归为两种类型。 -1. **Failures before running**, for example requested resources over capacity. If a job requests resources over the OpenPAI cluster can provide, the job fails soon. For example, if the cluster has only 24 cores of CPU, but user requests 48 cores in a job configuration, it causes job failure. +1. **运行之前的失败**,例如,请求的资源超过了限制。 如果 Job 请求的资源超过了集群可提供的,Job 很快就会失败。 例如,如果服务器只有 24 个 CPU 内核,但 Job 配置中请求了 48 个内核,就会造成 Job 失败。 - For this kind of system failures, there is no resource assigned, no IP, ports and GPUs as below. + 这种系统级的失败,错误类型为 *System Error*。 ![over requested 1](imgs/web_job_details_over1.png) - Click *View Application Summary*, there is an exception like below. it specifies which resource is over than maximum number. + 点击 *application summary* 可看到如下的错误详情。 这里解释了哪项资源超出了限制。 ![over requested 1](imgs/web_job_details_over2.png) - - Note, there may be other kinds of failures happening. If no resource assigned, click *View Application Summary* to get details of failures. -2. **Failures during job running**. If IP address and GPU are assigned, it means task instance is running. In this case, log provides details of failure. Learn [how to check job log](#how-to-check-job-log) to get failure details. +2. **Job 运行时的失败**。 如果错误类型是 *User Error*,标准输出 stdout 和 stderr 可提供失败的更多细节。 通过[查看 Job 日志](#查看-job-日志)来了解更多细节。 - Note, OpenPAI detects job failure by returned non-zero exit code of task instance. The exit code is from specified command in job configuration usually, and it may be caused by OpenPAI errors occasionally. + 注意,OpenPAI 通过 Task 实例的退出代码来决定 Job 是否运行成功。 退出代码通常是 Job 配置中由用户所编写的 command 返回的。 但偶尔也会是 OpenPAI 的系统错误代码。 - The error code depends on the failed command, though there is [a document for exit codes](http://www.tldp.org/LDP/abs/html/exitcodes.html) of Linux. + 错误代码的意义取决于具体的命令。 Linux 的系统命令,可参考[退出代码规范](http://www.tldp.org/LDP/abs/html/exitcodes.html)。 - ![job link](imgs/web_job_details_exitcode.png) + ![job user error](imgs/web_job_details_exitcode.png) -## Guidance +## 指南 -### How to view job metrics +### 查看 Job 指标 -- Click *Go to Job Metrics Page* as below in job details page, if some tasks are assigned IP, and ports. +- 点击 Job 详情页面的 *Go to Job Metrics Page*。 ![job link](imgs/web_job_details_metrics.png) -- A new page is opened and show metrics of this job. +- 将打开如下新页面并显示 Job 的指标。 ![job link](imgs/web_job_metrics.png) -- The *memory usage*, and *disk bandwidth* uses absolute value. It's easy to understand. -- *network traffic* shouldn't be regarded as an accurate value, as the collection approach is optimized for performance. If a data connection is alive for a short time, it may not be counted. -- 100% of *CPU*, it means 100% of one virtual core. So, the value may be more than 100%. For example, 300% means 3 virtual cores are occupied fully. -- *GPU Utilization* and *GPU memory* are total value. It's different with *CPU*. For example, if 4 GPU cards are assigned to an environment, 50% usage means 2 GPU cards are used. -- For distributed jobs, the value is average of all task instances. If a task role has multiple instances, it's average also. +- *memory usage* 和 *disk bandwidth* 使用的是绝对值。 这些值很容易理解。 +- *network traffic* 的值不能作为精确值对待,因为收集指标的方法为性能进行了优化。 如果数据连接只活跃了很短时间,就有可能不会被统计到。 +- *CPU* 的 100% 表示一个虚拟内核使用了 100%。 因此,此值可能会超过 100%。 例如,300% 表示 3 个虚拟核心被完全使用。 +- *GPU Utilization* 和 *GPU memory* 是总数,与 *CPU* 不相同。 例如,如果一个环境上分配了 4 块 GPU 卡,50% 表示的是 GPU 卡的平均使用率。 +- 对于分布式 Job,这些值都是所有 Task 实例的平均值。 如果一个 Task Role 有多个实例,这也是平均值。 -The UI is implemented by [Grafana](https://grafana.com/), check its web site for more details. +用户界面是由 [Grafana](https://grafana.com/) 实现,可查看其网站了解更多详情。 -### How to check job log +### 查看 Job 日志 -- Click *Go to Tracking Page* in job details page, if IP address, ports and GPU are assigned. - -![job link](imgs/web_job_details_loglink.png) - -- A new page is opened and shows log of yarn platform. - - It may show like below, with file name only. Click file names, it shows last 4096 bytes of that file. +- 点击 Job 详情页面的 *stdout* 或 *stderr*。 - ![job link](imgs/web_log_list1.png) - - Or it shows like below with last lines directly. Scroll down can find other files. + ![job link](imgs/web_job_details_loglink.png) + +- 会显示如下内容,包含了最新的 4096 字节。 它每 10 秒会自动刷新。 - ![job link](imgs/web_log_list2.png) + 如果需要查看完整日志,点击 *View Full Log*。 - In both cases, the page includes 4 files for a task instance, *DockerContainerDebug.log*, *YarnContainerDebug.log*, *stderr*, and *stdout*. Click *refresh* button of browser can show latest last 4k bytes. Click *here* shows the full log. + ![job link](imgs/web_job_details_logview.png) - *stderr* and *stdout* is screen output of the task instance. So, all content, that user prints to screen, displays there near real-time. Hints of most errors can be found in the two files. *DockerContainerDebug.log*, *YarnContainerDebug.log* can find some errors like out of memory for GPU, if there is no hint in *stderr* and *stdout*. + *stderr* 和 *stdout* 都是 Task 实例的屏幕输出。 所有输出到屏幕的内容都会近实时的显示在这里。 大多数 Job 运行时的错误都能在这两个文件中找到。 -Note, if a task instance has no resource assigned, there is no log file. +注意,如果 Task 实例还被未分配资源,就不会有日志文件。 -### Connect to running environments with SSH +### 使用 SSH 远程连接 -With SSH, any command can be run in an environment, and it provides familiar ways for terminal users. +通过 SSH,可以在环境中运行任何命令,这也为终端用户提供了熟悉的使用方法。 -For a running task instance, if it supports SSH connection, Click the link *View SSH Info*. +如果正在运行的 Task 实例支持 SSH,点击 *View SSH Info*。 ![job SSH](imgs/web_job_detail_ssh.png) -It pops up information as below. Follow steps in the dialog, can connect to the running docker container. +会显示如下信息。 按照其中的步骤可连接到正在运行的 Docker 容器。 ![job SSH info](imgs/web_job_details_ssh_info.png) -For distributed jobs, it's easy to connect from one to another container by environment variables. For example, `ssh $PAI_CURRENT_TASK_ROLE_NAME-$PAI_CURRENT_TASK_ROLE_CURRENT_TASK_INDEX` is parsed to `ssh worker-0` in a docker container. - -Note, the **SSH connection doesn't support in below cases**, +对于分布式 Job,可以通过环境变量从一个容器连接到另一个容器。 例如,`ssh $PAI_CURRENT_TASK_ROLE_NAME-$PAI_CURRENT_TASK_ROLE_CURRENT_TASK_INDEX` 在 Docker 容器中会被解析为 `ssh worker-0`。 -- The task instance isn't running or ready. -- The task instance is completed, as environment is recycled. From v0.11.0, the task instance can be reserved for debugging, refer to [reserve failed docker for debugging](#reserve-failed-docker-for-debugging). -- The docker image doesn't support SSH connection. To support SSH connection, *openssh-server* and *curl* must be installed in the docker image. +注意,**以下情况无法使用 SSH**: -### Reserve failed docker for debugging +- Task 实例还未准备好或没有运行。 +- Task 实例已经完成,环境已被回收。 从 v0.11.0 开始,可保留 Task 实例用于调试,参考[保留失败的 Docker 用于调试](#保留失败的-docker-用于调试)。 +- Docker 映像不支持 SSH 连接。 要支持 SSH 连接,必须在 Docker 映像中安装好 *openssh-server* 和 *curl*。 -*It supports from OpenPAI v0.11.0*. +### 保留失败的 Docker 用于调试 -To reserve failed docker for debugging, it needs to set the following property in the jobEnv field. If the job is failed by user's command, the container is kept for 1 week by default. The period may be configured by administrators. If the job is success, the container won't be reserved. +要保留失败的 Docker 容器用于调试,需要在 jobEnv 字段中设置下列属性。 如果 Job 因为 command 字段的命令失败,容器默认可以保留一周。 时间周期可由管理员进行配置。 如果 Job 成功执行,容器不会被保留。 ![debugging](./imgs/webportal-job-debugging.png) -Refer to [here](../job_tutorial.md) to enable isDebug in job configuration file. +参考[这里](../job_tutorial.md)来在 Job 配置中支持 isDebug。 -**Note**, with debugging is enabled for a job, the resource of this job is reserved also. To save resources for other jobs, this feature should be limited used, and shouldn't be enabled by default. And once debug is completed, the job should be stopped manually to release resources. +**注意**,Job 启用调试后,Job 所用的资源也会被保留。 为了节省资源,此功能应该只被有限制的使用,而且不应默认开启。 一般调试完成,要手动停止 Job 来释放资源。 -### Ask helps +### 寻求帮助 -Administrators of the OpenPAI cluster may be able to fix issues if this guidance doesn't work unfortunately. +如果本文无法解决问题,可寻找 OpenPAI 集群管理员的帮助。 -If it isn't fixed by administrators, or you are administrator, you are welcome to [ask questions or submit issues](../../../README_zh_CN.md#get-involved) to us. \ No newline at end of file +如果管理员无法修复此问题,或者你就是管理员,欢迎[提交问题或建议](../../../README_zh_CN.md#寻求帮助)。 \ No newline at end of file diff --git a/examples/Dockerfiles/autobuild_docker/README_zh_CN.md b/examples/Dockerfiles/autobuild_docker/README_zh_CN.md deleted file mode 100644 index 5ff1738238..0000000000 --- a/examples/Dockerfiles/autobuild_docker/README_zh_CN.md +++ /dev/null @@ -1,51 +0,0 @@ -# How to maintain docker image by using dockerfile - -When submitting jobs to [Microsoft OpenPAI](https://github.com/Microsoft/pai), a docker image in [dockerhub](https://hub.docker.com/) is required in the job config. This tutorial aims to demonstrate how to maintain a docker image for OpenPAI by using dockerfile. - -## Table of Content - -- [ Prerequisites ](#Prerequisites) -- [ Write Your Own Dockerfile ](#Write-your-own-dockerfile) -- [ Push Dockerfile to Github](#Push-Dockerfile-to-Github) -- [ Create Autobuild Repository in Dockerhub ](#Create-Autobuild-Repository-in-Dockerhub) -- [ Use Autobuild Docker Image in OpenPAI ](#Use-Autobuild-Docker-Image-in-OpenPAI) - -## Prerequisites - -- An account in dockerhub. You can register a free account in dockerhub to push, update and share your own docker image. the account is nessesary if you want to build your own docker image in OpenPAI. - -- An account in github. You will use github account to create a new repo for dockerfile. - -## Write Your Own Dockerfile - -- Write your own dockerfile to build docker image. Here is the official [dockerfile reference](https://docs.docker.com/engine/reference/builder/), you might use on of the [OpenPAI images](https://hub.docker.com/u/openpai/) as base image. - -## Push Dockerfile to Github - -- Create a new github repo to maintain the dockerfile and others files needed during docker image build process. - -- Use this repo to maintain dockerfile as a source control. - -## Create Autobuild Repository in Dockerhub - -- Use your dockerhub account to create an autobuild image repo for your docker image and link the github repo created in the previous step. Here is an [official guide](https://docs.docker.com/docker-cloud/builds/automated-build/) for how to create a autobuild image. Below images illustrate an example process. You need to link your github account to this dockerhub account first. - -![image](./images/create_autobuild.png) - -![image](./images/select_github_repo.png) - -![image](./images/customize_autobuild.png) - -- In the butobuild settings, you can triger a docker image build process manually, or auto build everytime when the github repo updates. - -![build settings](./images/build_settings.png) - -- You can check the build details whether the docker image build process succeeds or fails. - -![build details](./images/build_details.png) - -- After setting the auto build repo, you can focus on the dockerfile in github. And the docker image will built automatically based on the dockerfile. - -## Use Autobuild Docker Image in OpenPAI - -- Use this autobuild docker image as OpenPAI job docker image. And this docker image will updated whenever the dockerfile changed. \ No newline at end of file diff --git a/examples/README_zh_CN.md b/examples/README_zh_CN.md deleted file mode 100644 index fac3689ef6..0000000000 --- a/examples/README_zh_CN.md +++ /dev/null @@ -1,83 +0,0 @@ -# OpenPAI Job Examples - -- [OpenPAI Job Examples](#openpai-job-examples) - - [Quick start: submit a hello-world job](#quick-start-submit-a-hello-world-job) - - [List of off-the-shelf examples ](#list-of-off-the-shelf-examples-a-name%22offtheshelf%22a) - - [List of customized job template ](#list-of-customized-job-template-a-name%22customize%22a) - - [What if the example is failed ](#what-if-the-example-is-failed-a-name%22debug%22a) - - [Contributing](#contributing) - -## Quick start: submit a hello-world job - -Refer to [how to submit a hello-world job](../docs/user/training.md#submit-a-hello-world-job). It's a good start for beginners. - -## List of off-the-shelf examples - -Examples which can be run by submitting the json straightly without any modification. - -- [tensorflow.cifar10.json](./tensorflow/tensorflow.cifar10.json): Single GPU training on CIFAR-10 using TensorFlow. -- [pytorch.mnist.json](./pytorch/pytorch.mnist.json): Single GPU training on MNIST using PyTorch. -- [pytorch.regression.json](./pytorch/pytorch.regression.json): Regression using PyTorch. -- [mxnet.autoencoder.json](./mxnet/mxnet.autoencoder.json): Autoencoder using MXNet. -- [mxnet.image-classification.json](./mxnet/mxnet.image-classification.json): Image -- [serving.tensorflow.json](./serving/serving.tensorflow.json): TensorFlow model serving. classification on MNIST using MXNet. - -## List of customized job template - -These user could customize and run these jobs over OpenPAI. - -- [TensorFlow](./tensorflow): - - 1. [TensorFlow CIFAR-10 image classification](./tensorflow#tensorflow-cifar-10-image-classification) - 2. [TensorFlow ImageNet image classification](./tensorflow#tensorflow-imagenet-image-classification) - 3. [Distributed TensorFlow CIFAR-10 image classification](./tensorflow#distributed-tensorflow-cifar-10-image-classification) - 4. [TensorFlow Tensorboard](./tensorflow#tensorflow-tensorboard) - -- [Keras](./keras): - - 1. [MNIST training job over keras.](./keras/README.md) -- [Jupyter](./jupyter): - 1. [MNIST over Jupyter Notebook. User can also treat this job as an example how to use Jupyter over OpenPAI](./jupyter/README.md) -- [Model Serving](./serving): - 1. [MNIST model serving over Tensorflow](./serving/README.md) -- [Scikit-Learn](./scikit-learn): - 1. [Scikit-Learn MNIST digit recognition](./scikit-learn/#scikit-learn-mnist-digit-recognition-example) - 2. [Scikit-Learn text-vectorizers](./scikit-learn/#scikit-learn-text-vectorizers-example) -- [CNTK](./cntk): - 1. [CNTK grapheme-to-phoneme](./cntk/README.md) -- [PyTorch](./pytorch): - 1. [PyTorch MNIST digit recognition](./pytorch/#pytorch-mnist-digit-recognition-examples) - 2. [PyTorch regression](./pytorch/#pytorch-regression-examples) -- [MXNet](./mxnet): - 1. [MXNet autoencoder](./mxnet#mxnet-autoencoder-examples) - 2. [MXNet image classification](./mxnet#mxnet-image-classification-examples) -- [Open MPI](./mpi): - 1. [Open MPI TensorFlow CIFAR-10](./mpi#open-mpi-tensorflow-cifar-10-example) - 2. [Open MPI CNTK grapheme-to-phoneme conversion](./mpi#open-mpi-cntk-grapheme-to-phoneme-conversion-example) - -## What if the example is failed - -The example in the folder could be failed due to the following reasons: - - 1. The format of json is incorrect. You may get error when you copy the json file to the webportal. It may due to version updating of webportal. You should refer to the latest version of it. - 2. The docker image is removed. You will find this error in your job tracking page. You should create an issue to report it, or you can build the image according to the dockerfile in the example's folder, then push it to another docker registry and modify the json file's image field. Just refer to the README or DOCKER in the folder of that example. - 3. If the example you submit contains a prepare.sh script shell, it may fail due to the source of the data or code changed or been unstable. You may get error in your job tracking page. Check and try to fix it. - 4. The version of the code, tools or library. You may get this error if you rebuild the docker image. Some example doesn't fix the version of its dependency, so, you should check the version. - - -## Contributing - -If you want to contribute a job example that can be run on PAI, please open a new pull request. - -- Prepare a folder under pai/examples folder, for example create pai/examples/caffe2/ - -- Prepare example files: - - Under [Caffe2 example](./caffe2) dir, user should prepare these files for an example's contribution PR: - -![PAI_caffe2_dir](./images/PAI_caffe2_dir.png) - -1. README.md: Example's introductions -2. Dockerfile: Example's dependencies -3. Pai job json file: Example's OpenPAI job json template -4. [Optional] Code file: Example's code file \ No newline at end of file diff --git a/examples/XGBoost/DOCKER_zh_CN.md b/examples/XGBoost/DOCKER_zh_CN.md deleted file mode 100644 index d9e01b4c8f..0000000000 --- a/examples/XGBoost/DOCKER_zh_CN.md +++ /dev/null @@ -1,54 +0,0 @@ -# XGBoost on PAI docker env - -## Contents - -1. [Basic environment](#basic-environment) -2. [Advanced environment](#advanced-environment) - -## Basic environment - -First of all, PAI runs all jobs in Docker container. - -[Install Docker-CE](https://docs.docker.com/install/linux/docker-ce/ubuntu/) if you haven't. Register an account at public Docker registry [Docker Hub](https://hub.docker.com/) if you do not have a private Docker registry. - -You can also jump to [XGBoost example](#xgboost-example) using [pre-built images](https://hub.docker.com/r/openpai/pai.example.xgboost/) on Docker Hub. - -We need to build a XGBoost image with GPU support to run XGBoost workload on PAI, this can be done in two steps: - -1. Build a base Docker image for PAI. We prepared a [base Dockerfile](../Dockerfiles/cuda8.0-cudnn6/Dockerfile.build.base) which can be built directly. - -```bash - $ cd ../Dockerfiles/cuda8.0-cudnn6 - $ sudo docker build -f Dockerfile.build.base \ - > -t pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 . - $ cd - - ``` - -2. Prepare XGBoost envoriment in a [Dockerfile](./Dockerfile.example.xgboost) using the base image. - - Write a XGBoost Dockerfile and save it to `Dockerfile.example.xgboost`: - - Push the Docker image to a Docker registry: - - ```bash - $ sudo docker tag pai.example.xgboost USER/pai.example.xgboost - $ sudo docker push USER/pai.example.xgboost - ``` - *Note: Replace USER with the Docker Hub username you registered, you will be required to login before pushing Docker image.* - - -## Advanced environment - -You can skip this section if you do not need to prepare other dependencies. - -You can customize runtime XGBoost environment in [Dockerfile.example.xgboost](./Dockerfile.example.xgboost), for example, adding other dependeces in Dockerfile: - -```dockerfile -FROM pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 - -# install other packages using apt-get -RUN apt-get -y update && apt-get -y install PACKAGE - -# install other packages using pip -RUN pip install PACKAGE -``` \ No newline at end of file diff --git a/examples/XGBoost/README_zh_CN.md b/examples/XGBoost/README_zh_CN.md deleted file mode 100644 index f5931ed7a8..0000000000 --- a/examples/XGBoost/README_zh_CN.md +++ /dev/null @@ -1,51 +0,0 @@ - - -# XGBoost on PAI - -This guide introduces how to run [XGBoost](https://xgboost.readthedocs.io/en/latest/) workload on PAI. The following contents show some basic XGBoost examples, other customized XGBoost code can be run similarly. - -## XGBoost covertype dataset classification example - -To run XGBoost examples in PAI, you need to prepare a job configuration file and submit it through webportal. - -OpenPAI packaged the docker env required by the job for user to use. User could refer to [DOCKER.md](./DOCKER.md) to customize this example docker env. If user have built a customized image and pushed it to Docker Hub, replace our pre-built image `openpai/pai.example.xgboost` with your own. - -Here's one configuration file example to train a model on the [forest cover type](https://archive.ics.uci.edu/ml/datasets/covertype) dataset using GPU acceleration: - -### [gpu_hist](https://github.com/dmlc/xgboost/blob/master/demo/gpu_acceleration/cover_type.py) - -```json -{ - "jobName": "xgboost_gpu_hist", - "image": "openpai/pai.example.xgboost", - "taskRoles": [ - { - "name": "main", - "taskNumber": 1, - "cpuNumber": 4, - "memoryMB": 8192, - "gpuNumber": 1, - "command": "pip install -q sklearn && python demo/gpu_acceleration/cover_type.py" - } - ] -} -``` - -For more details on how to write a job configuration file, please refer to [job tutorial](../../docs/user/training.md). \ No newline at end of file diff --git a/examples/auto-test/readme_zh_CN.md b/examples/auto-test/readme_zh_CN.md deleted file mode 100644 index d70f5da526..0000000000 --- a/examples/auto-test/readme_zh_CN.md +++ /dev/null @@ -1,89 +0,0 @@ -## Table of Contents: - -- [Introduction](#Introduction) -- [Testing Process](#Testing_Process) - - [Running the testing project on PAI](#Running_on_PAI) - - [Running the testing project locally](#Running_on_local_machine) - - [Parameters of the project](#Parameters_of_the_start.sh) - - [The mode of the project](#mode) -- [Note](#Note) - - [Add new example](#Add) - - [Delete example](#Delete) - -## Introduction - -This python project can help you test all the examples in this folder. It is a semi-automatic testing tool which could make your testing work more easy. Just read the following "Testing Process" section and run this testing project after you having changed the pai project or before you doing your release process. - -## Testing Process - -You have 2 ways to run the project. One is submitting a job on PAI, and the other one is running it on your local machine. - -### Running on PAI - -1. Submit the job onto PAI according to the [test_all_examples.json.igr](https://github.com/Microsoft/pai/blob/master/examples/auto-test/test_all_examples.json.igr) in this folder. You must edit the command with your own parameters. Refer to [Parameters of the start.sh](#Parameters_of_the_start.sh) to edit your parameters. -2. See the job's stdout in the application page. -3. For the succeeded test items, you could do nothing, but it may not mean there is nothing wrong with the job. You'd better check it. -4. For the failed test items, you should check the stdout in application page. -5. There may be some testing jobs can not be submitted on PAI due to formulation error. You can see "The formulation of file finename is wrong!" in stdout. If this happened, check the json file of that job. - -### Running on local machine - -1. Download the project. -2. Build the docker image according to the [dockerfile](https://github.com/Microsoft/pai/blob/master/examples/auto-test/Dockerfile.example.autotest). `sudo docker build -f Dockerfile.example.autotest -t openpai/pai.example.autotest .` -3. Run a container based on the docker image you built just now. `sudo docker run -itd --name=my-autotest openpai/pai.example.autotest` Copy the project into the container. `sudo docker cp ./pai/examples/auto-test my-autotest:/root/` -4. Execute the container. `sudo docker exec -it my-autotest /bin/bash` -5. Run the start.sh script file and use your own parameters of mode, hdfs_socket, webhdfs_socket, PAI_username,PAI_password and rest_server_socket. Pay attention to the order, you must give the 6 parameters in the above order. Refer to [Parameters of the start.sh](#Parameters_of_the_start.sh). `/bin/bash auto-test/start.sh normal 10.20.30.40:9000 http://10.20.30.40:9186/api/v1/user/your_username 10.20.30.40:50070 test test` -6. When you run the script, you should choice the examples you want to test. See [Parameters of the start.sh](#Parameters_of_the_start.sh) to get the reference. -7. Wait until all jobs are finished. - -### Parameters of the start.sh - -There are 6 parameters required by start.sh. They are: - -- **mode**: the mode you want to enter, you can refer to the [later document](#mode). - -- **rest_server_socket**: the socket of rest server of PAI. - -- **hdfs_socket**: the socket of hdfs of PAI. - -- **webhdfs_socket**: the socket of webhdfs of PAI. - -- **PAI_username**: the username of PAI. - -- **PAI_password**: the password of PAI. - -And during the runtime of this shell script, it will require you input F/S or job names to strict the testing example. - -- Enter **F** means you want to run all examples; - -- Enter **S** means you want to run only the stable examples;(the others are unstable due to data downloading, see [Note](#Note) to get reference.) - -- Enter job names like `cntk-mpi,tensorflow-mpi,sklearn-mnist` means you want to run just the three examples. - -Here is an example to start the script: `echo "S" | /bin/bash pai_tmp/examples/auto-test/start.sh normal http://10.20.30.40:9186/api/v1/ 10.20.30.40:9000 http://10.20.30.40:50070 test test` - -### mode - -The project offers 3 different modes. - -1. **ci mode**: If the job can run correctly within 10 minutes, the project will regards it succeeded. Use "ci" as the first parameter of start.sh to enter this mode. -2. **release mode**: If the job can run correctly within 60 minutes, the project will regards it succeeded. Use "release" as the first parameter of start.sh to enter this mode. -3. **normal mode**: If the job can run correctly within 30 minutes, the project will regards it succeeded. Use "normal" as the first parameter of start.sh to enter this mode. - -## Note - -If the parameters contains special characters like '&', please use single qutations to mark that parameter. - -If you want to add or delete an example, please follow these steps: - -### For adding - -1. Prepare your example, include the json file. If you should prepare data and code before submit the job, you should also write a prepare shell script named "prepare.sh". You can refer to [prepare.sh](https://github.com/Microsoft/pai/blob/master/examples/tensorflow/prepare.sh). -2. Add the job name in your json file to the [start.sh](./start.sh), you can see the comment in line 17. Just add your job name to "full" line and "stable" line if the job is stable(Can run correctly in anytime). -3. Put forward your pull request. - -### For deleting - -1. Delete your example. -2. Delete the job name in your json file from the [start.sh](./start.sh), you can see the comment in line 17. Just delete your job name from "full" line and "stable" line if the job is stable(Can run correctly in anytime). -3. Put forward your pull request. \ No newline at end of file diff --git a/examples/azure-rdma-inte-mpi-benchmark-with-horovod-image/DOCKER_zh_CN.md b/examples/azure-rdma-inte-mpi-benchmark-with-horovod-image/DOCKER_zh_CN.md deleted file mode 100644 index 4def92456e..0000000000 --- a/examples/azure-rdma-inte-mpi-benchmark-with-horovod-image/DOCKER_zh_CN.md +++ /dev/null @@ -1,35 +0,0 @@ -## Basic environment - -First of all, PAI runs all jobs in Docker container. - -1: Install Docker CE - -2: Get an account of docker hub to store your image. - -# AzureRDMA && IntelMpi on PAI docker env - -## Contents - -We need to build a AzureRDMA&IntelMPI image to run intel benchmark workload on OpenPAI, this can be done with following steps: - -- Get a license for your intel mpi. And then modify the ```ACTIVATION_TYPE``` in the [silent.cfg](./silent.cfg) - -- Write an AzureRDMA&IntelMPI Dockerfile and save it to `Dockerfile.example.horovod-intelmpi-az-rdma`: - - - You could refer to this [Dockerfile](./Dockerfile.example.horovod-intelmpi-az-rdma) - - If your intel MPI is activated by a license file. You should copy it to the docker image, when building it. - - You'd better keep the image in a private registry. Because you build the license in the image. - -- Build the Docker image from `Dockerfile.example.horovod-intelmpi-az-rdma`: - -```bash -$ sudo docker build -f Dockerfile.example.horovod-intelmpi-az-rdma -t USER/pai.example.horovod-intelmpi-az-rdma . -``` - -- Push the Docker image to a Docker registry: - -```bash -$ sudo docker push USER/pai.example.horovod-intelmpi-az-rdma -``` - -Note: Replace USER with the Docker Hub username you registered, you will be required to login before pushing Docker image. \ No newline at end of file diff --git a/examples/azure-rdma-inte-mpi-benchmark-with-horovod-image/README_zh_CN.md b/examples/azure-rdma-inte-mpi-benchmark-with-horovod-image/README_zh_CN.md deleted file mode 100644 index 3277a6146e..0000000000 --- a/examples/azure-rdma-inte-mpi-benchmark-with-horovod-image/README_zh_CN.md +++ /dev/null @@ -1,77 +0,0 @@ - - -## Intel MPI benchmark in OpenPAI based on Azure's RDMA Capable machines. - -#### Prerequisites - -Please contact with your cluster admin to ensure that whether azure rdma is enabled in your cluster or not. - -#### Prepare build an image with necessary library. - -To run AzureRDMA&IntelMPI benchmark in OpenPAI, you need to prepare a job configuration file and submit it through webportal. - -Users should prepare their own intel mpi licences to build the docker image. When building docker image, please refer to [DOCKER.md](./DOCKER.md) - -###### - -```json -{ - "jobName": "intel-mpi-benchmark", - "image": "your/images/url", - "virtualCluster": "default", - "taskRoles": [ - { - "name": "master", - "taskNumber": 1, - "cpuNumber": 2, - "memoryMB": 10240, - "shmMB": 256, - "gpuNumber": 1, - "minFailedTaskCount": 1, - "minSucceededTaskCount": 1, - "command": "sleep 1000 && /opt/intel/impi/5.1.3.223/bin64/mpirun -d -hosts worker-0,master-0 -n 2 -ppn 1 -env I_MPI_FABRICS=shm:dapl -env I_MPI_DAPL_PROVIDER=ofa-v2-ib0 /opt/intel/impi/5.1.3.223/bin64/IMB-MPI1" - }, - { - "name": "worker", - "taskNumber": 1, - "cpuNumber": 2, - "memoryMB": 10240, - "shmMB": 256, - "gpuNumber": 1, - "minFailedTaskCount": 1, - "minSucceededTaskCount": 1, - "command": "sleep infinity" - } - ], - "jobEnvs": { - "paiAzRDMA": true - } -} -``` - -- For more details on how to write a job configuration file, please refer to [job tutorial](../../docs/user/training.md). -- Sleep 1000 in ```master-0``` is a hack to ensure that all work containers are ready. You could optimize it in a better way. For example try to ssh all the work containers with the hostanme ```${taskname}-${taskid}``` until sccessful. -- If user wanna a AZ-RDMA capable container. The following parameter is necessary. - -```bash -"jobEnvs": { - "paiAzRDMA": true - } -``` \ No newline at end of file diff --git a/examples/caffe/DOCKER_zh_CN.md b/examples/caffe/DOCKER_zh_CN.md deleted file mode 100644 index ebfc164ab8..0000000000 --- a/examples/caffe/DOCKER_zh_CN.md +++ /dev/null @@ -1,54 +0,0 @@ -# Caffe on PAI docker env - -## Table of Contents - -1. [Basic environment](#basic-environment) -2. [Advanced environment](#advanced-environment) - -## Basic environment - -First of all, PAI runs all jobs in Docker container. - -[Install Docker-CE](https://docs.docker.com/install/linux/docker-ce/ubuntu/) if you haven't. Register an account at public Docker registry [Docker Hub](https://hub.docker.com/) if you do not have a private Docker registry. - -You can also jump to [Caffe example](#caffe-example) using [pre-built images](https://hub.docker.com/r/openpai/pai.example.caffe/) on Docker Hub. - -We need to build a Caffe image with GPU support to run Caffe workload on PAI, this can be done in two steps: - -1. Build a base Docker image for PAI. We prepared a [base Dockerfile](../Dockerfiles/cuda8.0-cudnn6/Dockerfile.build.base) which can be built directly. - -```bash - $ cd ../Dockerfiles/cuda8.0-cudnn6 - $ sudo docker build -f Dockerfile.build.base \ - > -t pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 . - $ cd - - ``` - -2. Prepare Caffe envoriment in a [Dockerfile](./Dockerfile.example.caffe) using the base image. - - Write a Caffe Dockerfile and save it to `Dockerfile.example.caffe`: - - Push the Docker image to a Docker registry: - - ```bash - $ sudo docker tag pai.example.caffe USER/pai.example.caffe - $ sudo docker push USER/pai.example.caffe - ``` - *Note: Replace USER with the Docker Hub username you registered, you will be required to login before pushing Docker image.* - - -## Advanced environment - -You can skip this section if you do not need to prepare other dependencies. - -You can customize runtime PyTorch environment in [Dockerfile.example.caffe](./Dockerfile.example.caffe), for example, adding other dependeces in Dockerfile: - -```dockerfile -FROM pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 - -# install other packages using apt-get -RUN apt-get -y update && apt-get -y install git PACKAGE - -# install other packages using pip -RUN pip install torch torchvision PACKAGE -``` \ No newline at end of file diff --git a/examples/caffe/README_zh_CN.md b/examples/caffe/README_zh_CN.md deleted file mode 100644 index 620fd762dc..0000000000 --- a/examples/caffe/README_zh_CN.md +++ /dev/null @@ -1,51 +0,0 @@ - - -# Caffe on OpenPAI - -This guide introduces how to run [Caffe](http://caffe.berkeleyvision.org/) job on OpenPAI. The following contents show some basic Caffe examples, other customized Caffe code can be run similarly. - -# Caffe lenet MNIST digit recognition example - -To run Caffe examples in OpenPAI, you need to prepare a job configuration file and submit it through webportal. - -OpenPAI packaged the docker env required by the job for user to use. User could refer to [DOCKER.md](./DOCKER.md) to customize this example docker env. If user have built a customized image and pushed it to Docker Hub, replace our pre-built image `openpai/pai.example.caffe` with your own. - -Here's one configuration file example: - -### [mnist](http://caffe.berkeleyvision.org/gathered/examples/mnist.html) - -```json -{ - "jobName": "caffe-mnist", - "image": "openpai/pai.example.caffe", - "taskRoles": [ - { - "name": "main", - "taskNumber": 1, - "cpuNumber": 4, - "memoryMB": 8192, - "gpuNumber": 1, - "command": "./data/mnist/get_mnist.sh && ./examples/mnist/create_mnist.sh && ./examples/mnist/train_lenet.sh" - } - ] -} -``` - -For more details on how to write a job configuration file, please refer to [job tutorial](../../docs/user/training.md). \ No newline at end of file diff --git a/examples/caffe2/DOCKER_zh_CN.md b/examples/caffe2/DOCKER_zh_CN.md deleted file mode 100644 index 9b8a762865..0000000000 --- a/examples/caffe2/DOCKER_zh_CN.md +++ /dev/null @@ -1,60 +0,0 @@ -# Apache Caffe2 on PAI docker env - -## Contents - -1. [Basic environment](#basic-environment) -2. [Advanced environment](#advanced-environment) - -## Basic environment - -First of all, PAI runs all jobs in Docker container. - -[Install Docker-CE](https://docs.docker.com/install/linux/docker-ce/ubuntu/) if you haven't. Register an account at public Docker registry [Docker Hub](https://hub.docker.com/) if you do not have a private Docker registry. - -You can also jump to [Caffe2 example](#caffe2-example) using [pre-built images](https://hub.docker.com/r/openpai/pai.example.caffe2/) on Docker Hub. - -We need to build a Caffe2 image with GPU support to run Caffe2 workload on PAI, this can be done in two steps: - -1. Build a base Docker image for PAI. We prepared a [base Dockerfile](../Dockerfiles/cuda8.0-cudnn6/Dockerfile.build.base) which can be built directly. - -```bash - $ cd ../Dockerfiles/cuda8.0-cudnn6 - $ sudo docker build -f Dockerfile.build.base \ - > -t pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 . - $ cd - - ``` - -1. Prepare Caffe2 envoriment in a [Dockerfile](./Dockerfile.example.caffe2) using the base image. - - Write a Caffe2 Dockerfile and save it to `Dockerfile.example.caffe2`: - - Build the Docker image from `Dockerfile.example.caffe2`: - - ```bash - $ sudo docker build -f Dockerfile.example.caffe2 -t pai.example.caffe2 . - ``` - - Push the Docker image to a Docker registry: - - ```bash - $ sudo docker tag pai.example.caffe2 USER/pai.example.caffe2 - $ sudo docker push USER/pai.example.caffe2 - ``` - *Note: Replace USER with the Docker Hub username you registered, you will be required to login before pushing Docker image.* - - -## Advanced environment - -You can skip this section if you do not need to prepare other dependencies. - -You can customize runtime Caffe2 environment in [Dockerfile.example.caffe2](./Dockerfile.example.caffe2), for example, adding other dependeces in Dockerfile: - -```dockerfile -FROM pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 - -# install other packages using apt-get -RUN apt-get -y update && apt-get -y install PACKAGE - -# install other packages using pip -RUN pip install PACKAGE -``` \ No newline at end of file diff --git a/examples/caffe2/README_zh_CN.md b/examples/caffe2/README_zh_CN.md deleted file mode 100644 index 625197f01d..0000000000 --- a/examples/caffe2/README_zh_CN.md +++ /dev/null @@ -1,51 +0,0 @@ - - -# Apache Caffe2 on OpenPAI - -This guide introduces how to run [Caffe2](https://caffe2.ai/) job on OpenPAI. The following contents show some basic Caffe2 examples, other customized Caffe2 code can be run similarly. - -# Caffe2 resnet50 ImageNet example - -To run Caffe2 examples in OpenPAI, you need to prepare a job configuration file and submit it through webportal. - -OpenPAI packaged the docker env required by the job for user to use. User could refer to [DOCKER.md](./DOCKER.md) to customize this example docker env. If user have built a customized image and pushed it to Docker Hub, replace our pre-built image `openpai/pai.example.caffe2` with your own. - -Here's one configuration file example: - -### [resnet50](https://github.com/pytorch/pytorch/blob/master/caffe2/python/examples/resnet50_trainer.py) - -```json -{ - "jobName": "caffe2-resnet50", - "image": "openpai/pai.example.caffe2", - "taskRoles": [ - { - "name": "main", - "taskNumber": 1, - "cpuNumber": 4, - "memoryMB": 8192, - "gpuNumber": 1, - "command": "python resnet50_trainer.py --train_data null" - } - ] -} -``` - -For more details on how to write a job configuration file, please refer to [job tutorial](../../docs/user/training.md). \ No newline at end of file diff --git a/examples/chainer/DOCKER_zh_CN.md b/examples/chainer/DOCKER_zh_CN.md deleted file mode 100644 index 018217e1c5..0000000000 --- a/examples/chainer/DOCKER_zh_CN.md +++ /dev/null @@ -1,57 +0,0 @@ -## Basic environment - -First of all, PAI runs all jobs in Docker container. - -[Install Docker-CE](https://docs.docker.com/install/linux/docker-ce/ubuntu/) if you haven't. Register an account at public Docker registry [Docker Hub](https://hub.docker.com/) if you do not have a private Docker registry. - -# Chainer on PAI docker env - -## Contents - -1. \[Basic environment\](#basic-environment - -We need to build a Chainer image with GPU support to run Chainer workload on PAI, this can be done with two steps: - -1. Build a base Docker image for PAI. We prepared a [base Dockerfile](../Dockerfiles/cuda8.0-cudnn6/Dockerfile.build.base) which can be built directly. - - ```bash - $ cd ../Dockerfiles/cuda8.0-cudnn6 - $ sudo docker build -f Dockerfile.build.base \ - > -t pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 . - $ cd - - ``` - -2. Prepare Chainer envoriment in a [Dockerfile](./Dockerfile.example.chainer) using the base image. - - Write a Chainer Dockerfile and save it to `Dockerfile.example.chainer`: - - ```dockerfile - FROM pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 - - #set LC_ALL - ENV LC_ALL C - - # install git - RUN apt-get -y update && apt-get -y install git - - # install Chainer and cupy using pip - RUN pip install chainer && pip install cupy-cuda80 - - # clone Chainer official code - RUN git clone https://github.com/chainer/chainer.git - - ``` - - Build the Docker image from `Dockerfile.example.chainer`: - - ```bash - $ sudo docker build -f Dockerfile.example.chainer -t USER/pai.example.chainer . - ``` - - Push the Docker image to a Docker registry: - - ```bash - $ sudo docker push USER/pai.example.chainer - ``` - - *Note: Replace USER with the Docker Hub username you registered, you will be required to login before pushing Docker image.* \ No newline at end of file diff --git a/examples/chainer/README_zh_CN.md b/examples/chainer/README_zh_CN.md deleted file mode 100644 index 89d11dfc62..0000000000 --- a/examples/chainer/README_zh_CN.md +++ /dev/null @@ -1,55 +0,0 @@ - - -# Chainer on OpenPAI - -This guide introduces how to run [Chainer](https://chainer.org/) job on OpenPAI. The following contents show a basic Chainer example, other customized Chainer code can be run similarly. - -## Contents - -1. [Chainer examples](#chainer-example) -2. [Customize Docker Env](#customize-docker-env) - -## Chainer CIFAR-100 image classification example - -To run Chainer examples in OpenPAI, you need to prepare a job configuration file and submit it through webportal. - -OpenPAI packaged the docker env required by the job for user to use. User could refer to [DOCKER.md](./DOCKER.md) to customize this example docker env. If user have built a customized image and pushed it to Docker Hub, replace our pre-built image `openpai/pai.example.chainer` with your own. - -Here're some configuration file examples: - -### [cifar](https://github.com/chainer/chainer/tree/master/examples/cifar) - -```json - "jobName": "chainer-cifar", - "image": "openpai/pai.example.chainer", - "taskRoles": [ - { - "name": "main", - "taskNumber": 1, - "cpuNumber": 4, - "memoryMB": 8192, - "gpuNumber": 1, - "command": "python ./chainer/examples/cifar/train_cifar.py" - } - ] -} -``` - -For more details on how to write a job configuration file, please refer to [job tutorial](../../docs/user/training.md). \ No newline at end of file diff --git a/examples/cntk/DOCKER_zh_CN.md b/examples/cntk/DOCKER_zh_CN.md deleted file mode 100644 index 91f9470fa5..0000000000 --- a/examples/cntk/DOCKER_zh_CN.md +++ /dev/null @@ -1,119 +0,0 @@ -# CNTK on PAI docker env - -## Contents - -1. [Basic environment](#basic-environment) -2. [Advanced environment](#advanced-environment) - -## Basic environment - -First of all, PAI runs all jobs in Docker container. - -[Install Docker-CE](https://docs.docker.com/install/linux/docker-ce/ubuntu/) if you haven't. Register an account at public Docker registry [Docker Hub](https://hub.docker.com/) if you do not have a private Docker registry. - -You can also jump to [CNTK examples](#cntk-examples) using [pre-built images](https://hub.docker.com/r/openpai/pai.example.cntk/) on Docker Hub. - -We need to build a CNTK image with GPU support to run CNTK workload on PAI, this can be done in three steps: - -1. Build a base Docker image for PAI. We prepared a [base Dockerfile](../Dockerfiles/cuda8.0-cudnn6/Dockerfile.build.base) which can be built directly. - - ```bash - $ cd ../Dockerfiles/cuda8.0-cudnn6 - $ sudo docker build -f Dockerfile.build.base \ - > -t pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 . - $ cd - - ``` - -2. Build a openmpi Docker image. We prepared a [mpi Dockerfile](../Dockerfiles/cuda8.0-cudnn6/Dockerfile.build.mpi) which can be built based on the base image. - - ```bash - $ cd ../Dockerfiles/cuda8.0-cudnn6 - $ sudo docker build -f Dockerfile.build.mpi \ - > -t pai.build.mpi:openmpi1.10.4-hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 . - $ cd - - ``` - -3. Prepare CNTK envoriment in a [Dockerfile](./Dockerfile.example.cntk) using the base image. - - Write a CNTK Dockerfile and save it to `Dockerfile.example.cntk`: - - ```dockerfile - FROM pai.build.mpi:openmpi1.10.4-hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 - - ENV CNTK_VERSION=2.0.beta11.0 - - RUN apt-get -y update && \ - apt-get -y install git \ - fuse \ - golang \ - libjasper1 \ - libjpeg8 \ - libpng12-0 \ - libgfortran3 && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* - - WORKDIR / - - # Install hdfs-mount - RUN git clone --recursive https://github.com/Microsoft/hdfs-mount.git && \ - cd hdfs-mount && \ - make -j $(nproc) && \ - make test && \ - cp hdfs-mount /bin && \ - cd .. && \ - rm -rf hdfs-mount - - # Install Anaconda - RUN ANACONDA_PREFIX="/root/anaconda3" && \ - ANACONDA_VERSION="3-4.1.1" && \ - ANACONDA_SHA256="4f5c95feb0e7efeadd3d348dcef117d7787c799f24b0429e45017008f3534e55" && \ - wget -q https://repo.continuum.io/archive/Anaconda${ANACONDA_VERSION}-Linux-x86_64.sh && \ - echo "$ANACONDA_SHA256 Anaconda${ANACONDA_VERSION}-Linux-x86_64.sh" | sha256sum --check --strict - && \ - chmod a+x Anaconda${ANACONDA_VERSION}-Linux-x86_64.sh && \ - ./Anaconda${ANACONDA_VERSION}-Linux-x86_64.sh -b -p ${ANACONDA_PREFIX} && \ - rm -rf Anaconda${ANACONDA_VERSION}-Linux-x86_64.sh && \ - $ANACONDA_PREFIX/bin/conda clean --all --yes - - ENV PATH=/root/anaconda3/bin:/usr/local/mpi/bin:$PATH \ - LD_LIBRARY_PATH=/root/anaconda3/lib:/usr/local/mpi/lib:$LD_LIBRARY_PATH - - # Get CNTK Binary Distribution - RUN CNTK_VERSION_DASHED=$(echo $CNTK_VERSION | tr . -) && \ - CNTK_SHA256="2e60909020a0f553431dc7f7818401cc1bb2c99eef307d65bb552c497993593a" && \ - wget -q https://cntk.ai/BinaryDrop/CNTK-${CNTK_VERSION_DASHED}-Linux-64bit-GPU.tar.gz && \ - echo "$CNTK_SHA256 CNTK-${CNTK_VERSION_DASHED}-Linux-64bit-GPU.tar.gz" | sha256sum --check --strict - && \ - tar -xzf CNTK-${CNTK_VERSION_DASHED}-Linux-64bit-GPU.tar.gz && \ - rm -f CNTK-${CNTK_VERSION_DASHED}-Linux-64bit-GPU.tar.gz && \ - wget -q https://raw.githubusercontent.com/Microsoft/CNTK-docker/master/ubuntu-14.04/version_2/${CNTK_VERSION}/gpu/runtime/install-cntk-docker.sh \ - -O /cntk/Scripts/install/linux/install-cntk-docker.sh && \ - /bin/bash /cntk/Scripts/install/linux/install-cntk-docker.sh && \ - /root/anaconda3/bin/conda clean --all --yes && \ - rm -rf /cntk/cntk/python - - ENV PATH=/cntk/cntk/bin:$PATH \ - LD_LIBRARY_PATH=/cntk/cntk/lib:/cntk/cntk/dependencies/lib:$LD_LIBRARY_PATH - - WORKDIR /root - ``` - - Build the Docker image from `Dockerfile.example.cntk`: - - ```bash - $ sudo docker build -f Dockerfile.example.cntk -t pai.example.cntk . - ``` - - Push the Docker image to a Docker registry: - - ```bash - $ sudo docker tag pai.example.cntk USER/pai.example.cntk - $ sudo docker push USER/pai.example.cntk - ``` - - *Note: Replace USER with the Docker Hub username you registered, you will be required to login before pushing Docker image.* - -## Advanced environment - -You can skip this section if you do not need to prepare other dependencies. - -You can customize runtime CNTK environment in [Dockerfile.example.cntk](./Dockerfile.example.cntk), for example, adding other dependeces in Dockerfile. \ No newline at end of file diff --git a/examples/cntk/README_zh_CN.md b/examples/cntk/README_zh_CN.md deleted file mode 100644 index 906b4b539f..0000000000 --- a/examples/cntk/README_zh_CN.md +++ /dev/null @@ -1,68 +0,0 @@ - - -# CNTK on OpenPAI - -This guide introduces how to run [CNTK](https://docs.microsoft.com/en-us/cognitive-toolkit/) job on OpenPAI. The following contents show some basic CNTK examples, other customized CNTK code can be run similarly. - -# CNTK grapheme-to-phoneme examples - -### prepare - -To run CNTK examples in OpenPAI, you need to do the following things: - -1. Prepare the data by downloading all files in https://git.io/vbT5A(`wget https://github.com/Microsoft/CNTK/raw/master/Examples/SequenceToSequence/CMUDict/Data/cmudict-0.7b`) and put them up to HDFS:`hdfs dfs -put filename hdfs://ip:port/examples/cntk/data`. -2. Prepare the executable code(`wget https://github.com/Microsoft/pai/raw/master/examples/cntk/cntk-g2p.sh`) and config(`wget https://github.com/Microsoft/CNTK/raw/master/Examples/SequenceToSequence/CMUDict/BrainScript/G2P.cntk`). And upload them to HDFS:`hdfs dfs -put filename hdfs://ip:port/examples/cntk/code`. -3. Prepare a docker image and upload it to docker hub. You can get the tutorial below. -4. Prepare a job configuration file and submit it through webportal. Note that you can simply run the prepare.sh to do the above preparing work, but you must make sure you can use HDFS client on your local machine. If you can, just run the shell script with a parameter of your HDFS socket!`/bin/bash prepare.sh ip:port` - -OpenPAI packaged the docker env required by the job for user to use. User could refer to [DOCKER.md](./DOCKER.md) to customize this example docker env. If user have built a customized image and pushed it to Docker Hub, replace our pre-built image `openpai/pai.example.caffe` with your own. - -Here're some configuration file examples, pay attention to the codeDir/dataDir/outputDir, they must be the same as the path that you upload your code and data to: - -### [grapheme-to-phoneme](https://github.com/Microsoft/CNTK/tree/master/Examples/SequenceToSequence/CMUDict) - -```js -{ - "jobName": "cntk-g2p", - "image": "openpai/pai.example.cntk", - - // prepare cmudict corpus in CNTK format https://git.io/vbT5A and upload to hdfs - "dataDir": "$PAI_DEFAULT_FS_URI/examples/cntk/data", - // make a new dir for output on hdfs - "outputDir": "$PAI_DEFAULT_FS_URI/examples/cntk/output", - // prepare g2p training script cntk-example.sh and upload to hdfs - "codeDir": "$PAI_DEFAULT_FS_URI/examples/cntk/code", - - "taskRoles": [ - { - "name": "g2p_train", - "taskNumber": 1, - "cpuNumber": 8, - "memoryMB": 16384, - "gpuNumber": 1, - "command": "cd code && /bin/bash cntk-g2p.sh" - } - ] -} -``` - -When the job finished and succeeded, you can get the output of the example from HDFS:`hdfs dfs -get hdfs://ip:port/examples/cntk/output`. - -For more details on how to write a job configuration file, please refer to [job tutorial](../../docs/user/training.md). \ No newline at end of file diff --git a/examples/horovod-with-azure-rdma-intel-mpi/DOCKER_zh_CN.md b/examples/horovod-with-azure-rdma-intel-mpi/DOCKER_zh_CN.md deleted file mode 100644 index 16cb247f6f..0000000000 --- a/examples/horovod-with-azure-rdma-intel-mpi/DOCKER_zh_CN.md +++ /dev/null @@ -1,35 +0,0 @@ -## Basic environment - -First of all, PAI runs all jobs in Docker container. - -1: Install Docker CE - -2: Get an account of docker hub to store your image. - -# horovod-with-azure-rdma-intel-mpi on PAI docker env - -## Contents - -We need to build an horovod-with-azure-rdma-intel-mpi image to run horovod with rdma&&mpi on OpenPAI@Azure, and this can be done with following steps: - -- Get a license for your intel mpi. And then modify the ```ACTIVATION_TYPE``` in the [silent.cfg](./silent.cfg) - -- Write a horovod-with-azure-rdma-intel-mpi Dockerfile and save it to `Dockerfile.example.horovod-with-azure-rdma-intel-mpi`: - - - You could refer to this [Dockerfile](./Dockerfile.example.horovod-with-azure-rdma-intel-mpi) - - If your intel MPI is activated by a license file. You should copy it to the docker image, when building it. - - You'd better keep the image in a private registry. Because you build the license in the image. - -- Build the Docker image from `Dockerfile.example.horovod-with-azure-rdma-intel-mpi`: - -```bash -$ sudo docker build -f Dockerfile.example.horovod-with-azure-rdma-intel-mpi -t USER/pai.example.horovod-with-azure-rdma-intel-mpi . -``` - -- Push the Docker image to a Docker registry: - -```bash -$ sudo docker push USER/pai.example.horovod-with-azure-rdma-intel-mpi -``` - -Note: Replace USER with the Docker Hub username you registered, you will be required to login before pushing Docker image. \ No newline at end of file diff --git a/examples/horovod-with-azure-rdma-intel-mpi/README_zh_CN.md b/examples/horovod-with-azure-rdma-intel-mpi/README_zh_CN.md deleted file mode 100644 index 24d562d236..0000000000 --- a/examples/horovod-with-azure-rdma-intel-mpi/README_zh_CN.md +++ /dev/null @@ -1,77 +0,0 @@ - - -## horovod in OpenPAI based on Azure's RDMA Capable machines. - -#### Prerequisites - -Please contact with your cluster admin to ensure that whether azure rdma is enabled in your cluster or not. - -#### Prepare build an image with necessary library. - -To run horovod-with-azure-rdma-intel-mpi in OpenPAI, you need to prepare a job configuration file and submit it through webportal. - -Users should prepare their own intel mpi licences to build the docker image. When building docker image, please refer to [DOCKER.md](./DOCKER.md) - -###### - -```json -{ - "jobName": "horovod-job", - "image": "your/images/url", - "virtualCluster": "default", - "taskRoles": [ - { - "name": "master", - "taskNumber": 1, - "cpuNumber": 2, - "memoryMB": 10240, - "shmMB": 256, - "gpuNumber": 1, - "minFailedTaskCount": 1, - "minSucceededTaskCount": 1, - "command": "sleep 1000 && Your code!" - }, - { - "name": "worker", - "taskNumber": 1, - "cpuNumber": 2, - "memoryMB": 10240, - "shmMB": 256, - "gpuNumber": 1, - "minFailedTaskCount": 1, - "minSucceededTaskCount": 1, - "command": "sleep infinity" - } - ], - "jobEnvs": { - "paiAzRDMA": true - } -} -``` - -- For more details on how to write a job configuration file, please refer to [job tutorial](../../docs/user/training.md). -- Sleep 1000 in ```master-0``` is a hack to ensure that all work containers are ready. You could optimize it in a better way. For example try to ssh all the work containers with the hostanme ```${taskname}-${taskid}``` until sccessful. -- If user wanna a AZ-RDMA capable container. The following parameter is necessary. - -```bash -"jobEnvs": { - "paiAzRDMA": true - } -``` \ No newline at end of file diff --git a/examples/horovod/README_zh_CN.md b/examples/horovod/README_zh_CN.md deleted file mode 100644 index 98a61deef7..0000000000 --- a/examples/horovod/README_zh_CN.md +++ /dev/null @@ -1,73 +0,0 @@ - - -# Horovod with mpi on OpenPAI - -This guide introduces how to run [Open MPI](https://www.open-mpi.org/) workload on OpenPAI. We use [tensorflow benchmark](https://github.com/tensorflow/benchmarks/tree/cnn_tf_v1.10_compatible/scripts/tf_cnn_benchmarks) as the example. It seems impossible to run it just with openmpi and tensorflow. So, we use [horovod](https://github.com/uber/horovod) as the runtime environment to run the example. Other customized MPI code can be run similarly. - -# Open MPI TensorFlow CIFAR-10 example - -### Prepare work - -1. Prepare the data: - -* TensorFlow: Just go to the [official website](http://www.cs.toronto.edu/~kriz/cifar.html) and download the python version data by the [url](http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz). `wget http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz && tar zxvf cifar-10-python.tar.gz && rm cifar-10-python.tar.gz` After you downloading the data, upload them to HDFS:`hdfs dfs -put filename hdfs://ip:port/examples/mpi/tensorflow/data` or `hdfs dfs -put filename hdfs://ip:port/examples/tensorflow/distributed-cifar-10/data` Note that we use the same data as [tensorflow distributed cifar-10 example](https://github.com/Microsoft/pai/tree/master/examples/tensorflow). So, if you have already run that example, just use that data path. 2. Prepare the executable code: * Tensorflow: We use [tensorflow benchmark](https://github.com/tensorflow/benchmarks/tree/cnn_tf_v1.10_compatible) as the example code. Pay attention to the version, the example here uses v1.10 code. 3. Prepare a docker image and upload it to docker hub. We use the [horovod official image](https://hub.docker.com/r/uber/horovod/tags/), tag `0.14.1-tf1.10.0-torch0.4.0-py2.7`. If you want to use a customized image, just refer to the [official Docker file](https://github.com/uber/horovod/blob/master/Dockerfile) and make your own. Then, build it and push the image onto docker hub. 4. Prepare a script in order to detest whether the containers are ready before run the mpi job. [Here](./start.sh) is an example. 5. Prepare a job configuration file and submit it through webportal. The config examples are following. - -**Note:** you can run the `prepare.sh` to do the above preparing work, make sure you have installed HDFS client before. - - export HADOOP_USER_NAME=root - bash prepare.sh {hdfs_uri} {pai_username} - - -Here is a configuration file example: - -## Open MPI TensorFlow CIFAR-10 example - -### [TensorFlow cifar10 benchmark](https://git.io/vF4wT) - -```js -{ - "jobName": "horovod-mpi-cifar10", - "image": "openpai/example.horovod.mpi", - "dataDir": "$PAI_DEFAULT_FS_URI/$PAI_USERNAME/examples/tensorflow/distributed-cifar-10/data", - "outputDir": "$PAI_DEFAULT_FS_URI/$PAI_USERNAME/examples/horovod/output", - "codeDir": "$PAI_DEFAULT_FS_URI/$PAI_USERNAME/examples/horovod/code", - "taskRoles": [ - { - "name": "main", - "taskNumber": 1, - "cpuNumber": 4, - "memoryMB": 16384, - "gpuNumber": 2, - "minSucceededTaskCount": 1, - "command": "/bin/bash code/start.sh" - }, - { - "name": "worker", - "taskNumber": 1, - "cpuNumber": 4, - "memoryMB": 16384, - "gpuNumber": 2, - "command": "sleep infinity" - } - ] -} -``` - -For more details on how to write a job configuration file, please refer to [job tutorial](../../docs/user/training.md). \ No newline at end of file diff --git a/examples/job-editor/README_zh_CN.md b/examples/job-editor/README_zh_CN.md deleted file mode 100644 index b61ffa1740..0000000000 --- a/examples/job-editor/README_zh_CN.md +++ /dev/null @@ -1,78 +0,0 @@ -# Launcher a jupyter job-editor for interactive debugging - -The example is a prototype of online job editor. It demonstrates: - -1. Launcher a jupyter notebook for online code editing and interactive debugging. The editor is running on PAI, so user will debug on the same environment as the job will be running and get the feedback on the fly. -2. Leverage PAI restserver APIs to submit job on PAI. So user could try more experiments without leaving the editor. - -The job-editor runs as a normal PAI job, launch a jupyter notebook `prepares dependencies`, `tests code`, `submits job to PAI` and `does all other things`. - -We havn't done any encapsulation, leaving the `raw code` exposing the implemetation details. It's simple and for extending, any improves are welcomed. - -## Setup - -You will need to figure out the ENVs below: - -- PAI_USER_NAME: your_pai_user #your user name on PAI - -## HDFS (optional) - -In order to use hdfs in job-editor, you will need to figure the ENVs below: - -- HDFS_FS_DEFAULT: hdfs://ip:9000/ #hdfs://hdfs_name_node_ip:hdfs_port/ -- WEBHDFS_FS_DEFAULT: http://ip:5070/ #http://hdfs_name_node_ip:webhdfs_port/ - -## Run the jupyter job-editor on PAI - -Using the config template below, **change** the `jobEnvs` according to your PAI config. - -```json -{ - "jobName": "job-editor", - "image": "docker.io/openpai/job-editor", - "retryCount": 0, - "jobEnvs": { - "PAI_URL": "your_pai_cluster_url", - "PAI_USER_NAME": "your_pai_user", - "HDFS_FS_DEFAULT": "hdfs://your_hdfs_name_node_ip:9000/", - "WEBHDFS_FS_DEFAULT": "http://your_hdfs_name_node_ip:5070/", - "JUPYTER_TOKEN": "choose_your_jupyter_token" - }, - "taskRoles": [ - { - "name": "editor", - "taskNumber": 1, - "cpuNumber": 4, - "memoryMB": 4096, - "shmMB": 64, - "gpuNumber": 1, - "minFailedTaskCount": 1, - "command": "bash -c /root/setup_hdfs.sh && start-notebook.sh --ip $JUPYTER_HOST_IP --port=$PAI_CONTAINER_HOST_jupyter_PORT_LIST --NotebookApp.token=${JUPYTER_TOKEN}", - "portList": [ - { - "label": "jupyter", - "beginAt": 0, - "portNumber": 1 - } - ] - } - ] -} -``` - -Refer to the screenshots below. ![image](https://user-images.githubusercontent.com/1547343/48335823-d0119c80-e699-11e8-960a-1e6aa97d567e.png) ![image](https://user-images.githubusercontent.com/1547343/48335887-fc2d1d80-e699-11e8-89e4-b6b15a261cc3.png) ![image](https://user-images.githubusercontent.com/1547343/48335988-3eeef580-e69a-11e8-851a-5415a9aee8a6.png) - -## Testing: Run the job-editor out of PAI - -Correct the ENVs according to your cluster, then launcher the job-editor as below: - -```bash -sudo docker run \ - --env "PAI_URL=your_pai_cluster_url" \ - --env "PAI_USER_NAME=your_pai_user" \ - --env "HDFS_FS_DEFAULT=hdfs://your_hdfs_name_node_ip:9000/" \ - --env "WEBHDFS_FS_DEFAULT=http://your_hdfs_name_node_ip:5070/" \ - -it \ - --network=host \ - openpai/job-editor -``` \ No newline at end of file diff --git a/examples/jupyter/DOCKER_zh_CN.md b/examples/jupyter/DOCKER_zh_CN.md deleted file mode 100644 index 1cb98765e3..0000000000 --- a/examples/jupyter/DOCKER_zh_CN.md +++ /dev/null @@ -1,45 +0,0 @@ -# Jupyter on PAI docker env - -## Contents - -1. [Basic environment](#basic-environment) -2. [Advanced environment](#advanced-environment) - -## Basic environment - -First of all, PAI runs all jobs in Docker container. - -[Install Docker-CE](https://docs.docker.com/install/linux/docker-ce/ubuntu/) if you haven't. Register an account at public Docker registry [Docker Hub](https://hub.docker.com/) if you do not have a private Docker registry. - -We need a docker image to run it on PAI, this can be done under following instructions: - -1. Build a base Docker image to run jobs on PAI. We prepared a [base Dockerfile](../Dockerfiles/cuda8.0-cudnn6/Dockerfile.build.base) which can be built directly. - -```bash - $ cd ../Dockerfiles/cuda8.0-cudnn6 - $ sudo docker build -f Dockerfile.build.base \ - > -t pai.example.jupyter . - $ cd - - ``` -2. Push the Docker image to a Docker registry: - - ```bash - $ sudo docker tag pai.example.jupyter USER/pai.example.jupyter - $ sudo docker push USER/pai.example.jupyter - ``` - *Note: Replace USER with the Docker Hub username you registered, you will be required to login before pushing Docker image.* -## Advanced environment - -You can skip this section if you do not need to prepare other dependencies. - -You can customize runtime Jupyter Notebook environment in your own docker image based on our base image, for example, adding other dependeces in Dockerfile: - -```dockerfile -FROM openpai/pai.example.jupyter - -# install other packages using apt-get -RUN apt-get -y update && apt-get -y install git PACKAGE - -# install other packages using pip -RUN pip install PACKAGE -``` \ No newline at end of file diff --git a/examples/jupyter/README_zh_CN.md b/examples/jupyter/README_zh_CN.md deleted file mode 100644 index 284c809f39..0000000000 --- a/examples/jupyter/README_zh_CN.md +++ /dev/null @@ -1,62 +0,0 @@ - - -# Jupyter on OpenPAI - -This guide introduces how to run [Jupyter Notebook](http://jupyter.org/) on OpenPAI. The following contents show some basic examples, other customized examples can be run similarly. - -## Jupyter Notebook example - -To run Jupyter Notebook in OpenPAI, you need to prepare a job configuration file and submit it through webportal. - -OpenPAI packaged the docker env required by the job for user to use. User could refer to [DOCKER.md](./DOCKER.md) to customize this example docker env. If user have built a customized image and pushed it to Docker Hub, replace our pre-built image `openpai/pai.example.caffe` with your own. - -Here's one configuration file example to use Jupyter Notebook as a tutorial to run a tensorflow mnist example: - -### Job configuration file - -```json -{ - "jobName": "jupyter_example", - "image": "openpai/pai.example.tensorflow", - "taskRoles": [ - { - "name": "jupyter", - "taskNumber": 1, - "cpuNumber": 4, - "memoryMB": 8192, - "gpuNumber": 1, - "portList": [ - { - "label": "jupyter", - "beginAt": 0, - "portNumber": 1 - } - ], - "command": "python3 -m pip install -q jupyter matplotlib && wget -O mnist.ipynb https://raw.githubusercontent.com/ianlewis/tensorflow-examples/master/notebooks/TensorFlow%20MNIST%20tutorial.ipynb && jupyter notebook --allow-root --no-browser --ip 0.0.0.0 --port=$PAI_CONTAINER_HOST_jupyter_PORT_LIST --NotebookApp.token=\"\" --NotebookApp.allow_origin=\"*\" --NotebookApp.base_url=\"/jupyter\"" - } - ] -} -``` - -For more details on how to write a job configuration file, please refer to [job tutorial](../../docs/user/training.md). - -### Access Jupyter Notebook - -Once the job is successfully submitted to PAI, you can view job info in webportal, and access your Jupyter Notebook via http://${container_ip}:${container_port}/jupyter/notebooks/mnist.ipynb. ![avatar](example.png) for example, from the above job info page, you can access your Jupyter Notebook via http://10.151.40.202:4836/jupyter/notebooks/mnist.ipynb \ No newline at end of file diff --git a/examples/kafka/DOCKER_zh_CN.md b/examples/kafka/DOCKER_zh_CN.md deleted file mode 100644 index 78745bb623..0000000000 --- a/examples/kafka/DOCKER_zh_CN.md +++ /dev/null @@ -1,39 +0,0 @@ -# Build customize Kafka docker - -Please follow the next processes step by step. Do not skip any steps if you don't know whether you can skip them. - -### Zookeeper - -If you already have a kafka cluster, you could skip this step. And if you build the image by "Dockerfile.example.kafka", you should do the work of step 2 and ignore the others. - -1. [Download zookeeper source file](https://zookeeper.apache.org/doc/r3.1.2/zookeeperStarted.html) and unpack it. - -2. Change the name of file "/conf/zoo_sample.cfg" to "/conf/zoo.cfg" and open it. - -3. Set the "dataDir" and "clientPort" like "dataDir=/var/zookeeper clientPort=XXXX". Remember the port you set. - -4. Start it `bin/zkServer.sh start`. - -### Kafka - -If you already have a kafka cluster or build the image by "Dockerfile.example.kafka", you could skip this step. - -Just take reference in the [official document](https://www.tutorialspoint.com/apache_kafka/apache_kafka_installation_steps.html). - -Note: - -1. You should set the listeners in config/server.properties:"listeners=PLAINTEXT://localhost:XXXX". The port "XXXX" is the kafka client port you should use in your client code. But you'd better use dynamic port rather than static port due to possible conflict. The way of using dynamic port is described at the end of this document. - -2. The "zookeeper.connect" port is the port you have already set in "/conf/zoo.cfg". - -3. If you can't start the kafka server, it might because you haven't started the zookeeper server or you haven't set the correct port. - -### Make your logical code - -1. If you want to use python to check if the kafka can be used correctly, you'd better see the [official document](https://kafka-python.readthedocs.io/en/master/). Don't forget to install kafka-python.(If you build the image by "Dockerfile.example.kafka", ignore it!) - -2. When you use the producer of kafka, you should keep in mind that the massage might be lost if you haven't set "acks" and haven't use "producer.flush()". - -3. When you use the consumer of kafka, you should notice that you might be not able to consumer the message if you don't set "auto_offset_reset" to "earliest" even though you produce the message after you starting the consumer. - -4. Make a shell file to start all the servers and programs. \ No newline at end of file diff --git a/examples/kafka/README_zh_CN.md b/examples/kafka/README_zh_CN.md deleted file mode 100644 index ad60b13a58..0000000000 --- a/examples/kafka/README_zh_CN.md +++ /dev/null @@ -1,35 +0,0 @@ -## How to run kafka on PAI - -If you just want to make a very simple example to see whether you can use kafka on PAI, you could submit the job with the kafka.json file in this folder. Then, you can see the stdout in the "Go to Tracking Page" page. You could see that the program has already produced and consumed message with kafka. - -OpenPAI packaged the docker env required by the job for user to use. User could refer to [DOCKER.md](./DOCKER.md) to customize this example docker env. If user have built a customized image and pushed it to Docker Hub, replace our pre-built image `Dockerfile.example.kafka` with your own. - -### Submit Job - -If you could use kafka correctly in your own environment, of course computer or server, you could: - -1. build the environment into a docker image. - -2. push it into a public registry. - -3. submit your job on PAI webportal. - -Note: Now(2018-6-26), we can't use static port and dynamic port at the same time, and the job would add two dynamic ports(ssh and http) automatically. So, we could only use dynamic port to support zookeeper and kafka instead of static port. Then the way to use dynamic port is following: - -1. Delete the port setting sentences in "zoo.cfg" and "server.properties". - -2. Add the sentences you have deleted by using command "sed" and environment variable: - - ```bash - sed -i "13a clientPort=$PAI_CONTAINER_HOST_zookeeper_PORT_LIST" zoo.cfg - sed -i "123a zookeeper.connect=localhost:$PAI_CONTAINER_HOST_zookeeper_PORT_LIST" server.properties - sed -i "31a listeners=PLAINTEXT://localhost:$PAI_CONTAINER_HOST_kafka_PORT_LIST" server.properties - ``` - -3. Delete the port setting codes in your logic codes. - -4. Add the deleted codes by the same way as you doing with the sentences. - -5. Make sure you have already put these sed commands in your shell file. - -6. Submit your job again! \ No newline at end of file diff --git a/examples/keras/DOCKER_zh_CN.md b/examples/keras/DOCKER_zh_CN.md deleted file mode 100644 index 01ea51616c..0000000000 --- a/examples/keras/DOCKER_zh_CN.md +++ /dev/null @@ -1,80 +0,0 @@ -# Keras on PAI docker env - -## Contents - -1. [Basic environment](#basic-environment) -2. [Advanced environment](#advanced-environment) - -## Basic environment - -First of all, PAI runs all jobs in Docker container. - -[Install Docker-CE](https://docs.docker.com/install/linux/docker-ce/ubuntu/) if you haven't. Register an account at public Docker registry [Docker Hub](https://hub.docker.com/) if you do not have a private Docker registry. - -We need to build a Keras image to run Keras workload on PAI, this can be done in two steps: - -1. Build a base Docker image for PAI Keras. We prepared a [base Dockerfile](../Dockerfiles/cuda8.0-cudnn6/Dockerfile.build.base) which can be built directly. - -```bash - $ cd ../Dockerfiles/cuda8.0-cudnn6 - $ sudo docker build -f Dockerfile.build.base \ - > -t pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 . - $ cd - - ``` - -You can also directly use [cntk](../cntk/Dockerfile.example.cntk)/[tensorflow](../tensorflow/Dockerfile.example.tensorflow) base image as Keras backend. - -2. Prepare Keras envoriment in a [Dockerfile](./Dockerfile.example.keras.tensorflow_backend) using tensorflow base image as Keras backend. - - Write a Keras Dockerfile and save it to `Dockerfile.example.Keras`: - - ```dockerfile - # use tensorflow as Keras backend - FROM openpai/pai.example.tensorflow - - # install git - RUN apt-get -y update && apt-get -y install git - - # install Keras python package using pip - RUN pip install keras - - WORKDIR /root - - # clone Keras examples - RUN git clone https://github.com/keras-team/keras.git - - # set tensorflow as keras backend - ENV KERAS_BACKEND tensorflow - - # set work directory to keras examples - WORKDIR /root/keras/examples - ``` - - Build the Docker image from `Dockerfile.example.Keras`: - - ```bash - $ sudo docker build -f Dockerfile.example.keras -t pai.example.keras . - ``` - - Push the Docker image to a Docker registry: - - ```bash - $ sudo docker tag pai.example.keras USER/pai.example.keras - $ sudo docker push USER/pai.example.keras - ``` - *Note: Replace USER with the Docker Hub username you registered, you will be required to login before pushing Docker image.* - - -## Advanced environment - -You can skip this section if you do not need to prepare other dependencies. - -You can customize runtime Keras environment in Dockerfile, for example, adding other dependeces in Dockerfile: - -```dockerfile -# install other packages using apt-get -RUN apt-get -y update && apt-get -y install git PACKAGE - -# install other packages using pip -RUN pip install PACKAGE -``` \ No newline at end of file diff --git a/examples/keras/README_zh_CN.md b/examples/keras/README_zh_CN.md deleted file mode 100644 index a50d1a0fb1..0000000000 --- a/examples/keras/README_zh_CN.md +++ /dev/null @@ -1,78 +0,0 @@ - - -# Keras on OpenPAI - -This guide introduces how to run [Keras](http://keras.io/) job on OpenPAI. The following contents show some basic Keras examples, other customized Keras code can be run similarly. - -## Keras tensorflow backend MNIST digit recognition examples - -To run Keras examples in OpenPAI, you need to prepare a job configuration file and submit it through webportal. - -OpenPAI packaged the docker env required by the job for user to use. User could refer to [DOCKER.md](./DOCKER.md) to customize this example docker env. If user have built a customized image and pushed it to Docker Hub, replace our pre-built image `pai.example.keras.tensorflow` with your own. - -Here're some configuration file examples: - -### [mnist_tensorflow_backend](https://github.com/keras-team/keras/blob/master/examples/mnist_cnn.py) - -```json -{ - "jobName": "keras_tensorflow_backend_mnist", - "image": "openpai/pai.example.keras.tensorflow", - "taskRoles": [ - { - "name": "mnist", - "taskNumber": 1, - "cpuNumber": 4, - "memoryMB": 8192, - "gpuNumber": 1, - "command": "python mnist_cnn.py" - } - ] -} -``` - -## Keras cntk backend MNIST digit recognition examples - -### [mnist_cntk_backend](https://github.com/keras-team/keras/blob/master/examples/mnist_cnn.py) - -```json -{ - "jobName": "keras_cntk_backend_mnist", - "image": "openpai/pai.example.keras.cntk", - "taskRoles": [ - { - "name": "mnist", - "taskNumber": 1, - "cpuNumber": 4, - "memoryMB": 8192, - "gpuNumber": 1, - "command": "python mnist_cnn.py" - } - ] -} -``` - -For more details on how to write a job configuration file, please refer to [job tutorial](../../docs/user/training.md). - -### Note: - -Since PAI runs Keras jobs in Docker, the training speed on PAI should be similar to speed on host. - -We provide two stable docker images by adding the data to the images. If you want to use them, add `stable` tag to the image name: `openpai/pai.example.keras.cntk:stable` or `openpai/pai.example.keras.tensorflow:stable`. \ No newline at end of file diff --git a/examples/mpi/DOCKER_zh_CN.md b/examples/mpi/DOCKER_zh_CN.md deleted file mode 100644 index 82f0525383..0000000000 --- a/examples/mpi/DOCKER_zh_CN.md +++ /dev/null @@ -1,47 +0,0 @@ -# MPI on PAI docker env - -## Contents - -1. [Basic environment](#basic-environment) -2. [Advanced environment](#advanced-environment) - -## Basic environment - -First of all, PAI runs all jobs in Docker container. - -[Install Docker-CE](https://docs.docker.com/install/linux/docker-ce/ubuntu/) if you haven't. Register an account at public Docker registry [Docker Hub](https://hub.docker.com/) if you do not have a private Docker registry. - -We need to build a Open MPI base image with GPU support to run Open MPI workload on PAI, this can be done in two steps: - -1. Build a base Docker image for PAI. We prepared a [base Dockerfile](../Dockerfiles/cuda8.0-cudnn6/Dockerfile.build.base) which can be built directly. - -```bash - $ cd ../Dockerfiles/cuda8.0-cudnn6 - $ sudo docker build -f Dockerfile.build.base \ - > -t pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 . - $ cd - - ``` - -2. Build an Open MPI Docker image for PAI. We prepared a [mpi Dockerfile](../Dockerfiles/cuda8.0-cudnn6/Dockerfile.build.mpi) which can be built directly. - - ```bash - $ cd ../Dockerfiles/cuda8.0-cudnn6 - $ sudo docker build -f Dockerfile.build.mpi \ - > -t pai.build.mpi:openmpi1.10.4-hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 . - $ cd - - ``` - - -## Advanced environment - -You can build runtime CNTK Docker images based on the MPI base image, -for example, we prepared [CNTK mpi Dockerfile](./Dockerfile.example.cntk-mpi) which can be refered to. - -Push the Docker image to a Docker registry, we use CNTK mpi Docker image as an example: - -```bash -$ sudo docker tag pai.example.cntk USER/pai.example.cntk -$ sudo docker push USER/pai.example.cntk -``` - -*Note: Replace USER with the Docker Hub username you registered, you will be required to login before pushing Docker image.* \ No newline at end of file diff --git a/examples/mpi/README_zh_CN.md b/examples/mpi/README_zh_CN.md deleted file mode 100644 index 161443ba87..0000000000 --- a/examples/mpi/README_zh_CN.md +++ /dev/null @@ -1,85 +0,0 @@ - - -# MPI on OpenPAI - -This guide introduces how to run [Open MPI](https://www.open-mpi.org/) workload on OpenPAI. The following contents show some basic Open MPI examples, other customized MPI code can be run similarly. - -## Contents - -- [Note](#note) -- [MPI on OpenPAI](#mpi-on-openpai) - - [Contents](#contents) -- [CNTK CIFAR-10 example](#cntk-cifar-10-example) - [Prepare work](#prepare-work) - - [Open MPI CNTK grapheme-to-phoneme conversion example](#open-mpi-cntk-grapheme-to-phoneme-conversion-example) - - [CNTK G2P example](#cntk-g2p-example) - -# CNTK CIFAR-10 example - -### Prepare work - -1. Prepare the data: - -* CNTK: Download all files in https://git.io/vbT5A `wget https://github.com/Microsoft/CNTK/raw/master/Examples/SequenceToSequence/CMUDict/Data/cmudict-0.7b` and put them up to HDFS:`hdfs dfs -put filename hdfs://ip:port/examples/cntk/data` or `hdfs dfs -put filename hdfs://ip:port/examples/mpi/cntk/data`. Note that we use the same data as cntk example. So, if you have already run that example, just use that data path. 2. Prepare the executable code: * cntk: Download the script example from [github](https://github.com/Microsoft/pai/blob/master/examples/mpi/cntk-mpi.sh)`wget https://github.com/Microsoft/pai/raw/master/examples/mpi/cntk-mpi.sh`. Then upload them to HDFS:`hdfs dfs -put filename hdfs://ip:port/examples/mpi/cntk/code/` 3. Prepare a docker image and upload it to docker hub. OpenPAI packaged the docker env required by the job for user to use. User could refer to [DOCKER.md](./DOCKER.md) to customize this example docker env. If user have built a customized image and pushed it to Docker Hub, replace our pre-built image `openpai/pai.example.cntk` with your own. 4. Prepare a job configuration file and submit it through webportal. The config examples are following. - -**Note** that you can simply run the prepare.sh to do the above preparing work, but you must make sure you can use HDFS client on your local machine. If you can, just run the shell script with a parameter of your HDFS socket! `/bin/bash prepare.sh ip:port` - -Here's a configuration file examples: - -## Open MPI CNTK grapheme-to-phoneme conversion example - -### [CNTK G2P example](https://github.com/Microsoft/CNTK/tree/master/Examples/SequenceToSequence/CMUDict/BrainScript) - -```js -{ - "jobName": "cntk-mpi", - "image": "openpai/pai.example.cntk-mpi", - - // prepare cmudict corpus in CNTK format https://git.io/vbT5A and upload to hdfs - "dataDir": "$PAI_DEFAULT_FS_URI/path/cntk-mpi/data", - // make a new dir for output on hdfs - "outputDir": "$PAI_DEFAULT_FS_URI/path/cntk-mpi/output", - // prepare g2p distributed training script cntk-mpi.sh and upload to hdfs - "codeDir": "$PAI_DEFAULT_FS_URI/path/cntk-mpi/code", - "virtualCluster": "default", - - "taskRoles": [ - { - "name": "mpi", - "taskNumber": 1, - "cpuNumber": 8, - "memoryMB": 16384, - "gpuNumber": 0, - "command": "cd code && mpirun --allow-run-as-root -np 2 --host worker-0,worker-1 /bin/bash cntk-mpi.sh", - "minSucceededTaskCount": 1 - }, - { - "name": "worker", - "taskNumber": 2, - "cpuNumber": 8, - "memoryMB": 16384, - "gpuNumber": 2, - "command": "/bin/bash" - } - ], - "retryCount": 0 -} -``` - -For more details on how to write a job configuration file, please refer to [job tutorial](../../docs/user/training.md). \ No newline at end of file diff --git a/examples/mxnet/DOCKER_zh_CN.md b/examples/mxnet/DOCKER_zh_CN.md deleted file mode 100644 index 6b07aa3d8e..0000000000 --- a/examples/mxnet/DOCKER_zh_CN.md +++ /dev/null @@ -1,76 +0,0 @@ -# Apache MXNet on PAI docker env - -## Contents - -1. [Basic environment](#basic-environment) -2. [Advanced environment](#advanced-environment) - -## Basic environment - -First of all, PAI runs all jobs in Docker container. - -[Install Docker-CE](https://docs.docker.com/install/linux/docker-ce/ubuntu/) if you haven't. Register an account at public Docker registry [Docker Hub](https://hub.docker.com/) if you do not have a private Docker registry. - -You can also jump to [MXNet examples](#mxnet-examples) using [pre-built images](https://hub.docker.com/r/openpai/pai.example.mxnet/) on Docker Hub. - -We need to build a MXNet image with GPU support to run MXNet workload on PAI, this can be done in two steps: - -1. Build a base Docker image for PAI. We prepared a [base Dockerfile](../Dockerfiles/cuda8.0-cudnn6/Dockerfile.build.base) which can be built directly. - -```bash - $ cd ../Dockerfiles/cuda8.0-cudnn6 - $ sudo docker build -f Dockerfile.build.base \ - > -t pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 . - $ cd - - ``` - -2. Prepare MXNet envoriment in a [Dockerfile](./Dockerfile.example.mxnet) using the base image. - - Write a MXNet Dockerfile and save it to `Dockerfile.example.mxnet`: - - ```dockerfile - FROM pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 - - # install git - RUN apt-get -y update && apt-get -y install git - - # install MXNet dependeces using pip - RUN pip install mxnet-cu80 - - # clone MXNet examples - RUN git clone https://github.com/apache/incubator-mxnet.git - ``` - - Build the Docker image from `Dockerfile.example.mxnet`: - - ```bash - $ sudo docker build -f Dockerfile.example.mxnet -t pai.example.mxnet . - ``` - - Push the Docker image to a Docker registry: - - ```bash - $ sudo docker tag pai.example.mxnet USER/pai.example.mxnet - $ sudo docker push USER/pai.example.mxnet - ``` - *Note: Replace USER with the Docker Hub username you registered, you will be required to login before pushing Docker image.* - - -## Advanced environment - -You can skip this section if you do not need to prepare other dependencies. - -You can customize runtime MXNet environment in [Dockerfile.example.mxnet](./Dockerfile.example.mxnet), for example, adding other dependeces in Dockerfile: - -```dockerfile -FROM pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 - -# install other packages using apt-get -RUN apt-get -y update && apt-get -y install git PACKAGE - -# install other packages using pip -RUN pip install mxnet-cu80 PACKAGE - -# clone MXNet examples -RUN git clone https://github.com/apache/incubator-mxnet.git -``` \ No newline at end of file diff --git a/examples/mxnet/README_zh_CN.md b/examples/mxnet/README_zh_CN.md deleted file mode 100644 index 9b1d5b85b2..0000000000 --- a/examples/mxnet/README_zh_CN.md +++ /dev/null @@ -1,88 +0,0 @@ - - -# Apache MXNet on PAI - -This guide introduces how to run [Apache MXNet](https://mxnet.apache.org/) workload on PAI. The following contents show some basic MXNet examples, other customized MXNet code can be run similarly. - -## Contents - -- [Apache MXNet on PAI](#apache-mxnet-on-pai) - - [Contents](#contents) - - [MXNet autoencoder examples](#mxnet-autoencoder-examples) - - [autoencoder](#autoencoder) - - [MXNet image classification examples](#mxnet-image-classification-examples) - - [image classification](#image-classification) - - [Note:](#note) - -## MXNet autoencoder examples - -To run MXNet examples in PAI, you need to prepare a job configuration file and submit it through webportal. - -OpenPAI packaged the docker env required by the job for user to use. User could refer to [DOCKER.md](./DOCKER.md) to customize this example docker env. If user have built a customized image and pushed it to Docker Hub, replace our pre-built image `openpai/pai.example.mxnet` with your own. - -Here're some configuration file examples: - -### [autoencoder](https://github.com/apache/incubator-mxnet/tree/master/example/autoencoder) - -```json -{ - "jobName": "mxnet-autoencoder", - "image": "openpai/pai.example.mxnet", - "taskRoles": [ - { - "name": "main", - "taskNumber": 1, - "cpuNumber": 4, - "memoryMB": 8192, - "gpuNumber": 1, - "command": "pip install scipy scikit-learn && cd incubator-mxnet/example/autoencoder && python mnist_sae.py --gpu" - } - ] -} -``` - -## MXNet image classification examples - -### [image classification](https://github.com/apache/incubator-mxnet/tree/master/example/image-classification) - -```json -{ - "jobName": "mxnet-image-classification", - "image": "openpai/pai.example.mxnet", - "taskRoles": [ - { - "name": "main", - "taskNumber": 1, - "cpuNumber": 4, - "memoryMB": 8192, - "gpuNumber": 1, - "command": "cd incubator-mxnet/example/image-classification && python train_mnist.py --network mlp" - } - ] -} -``` - -For more details on how to write a job configuration file, please refer to [job tutorial](../../docs/user/training.md). - -### Note: - -Since PAI runs MXNet jobs in Docker, the training speed on PAI should be similar to speed on host. - -We provide a stable docker image by adding the data to the image. If you want to use it, add `stable` tag to the image name: `openpai/pai.example.mxnet:stable`. \ No newline at end of file diff --git a/examples/ocr-serving/README_zh_CN.md b/examples/ocr-serving/README_zh_CN.md deleted file mode 100644 index af49327f4b..0000000000 --- a/examples/ocr-serving/README_zh_CN.md +++ /dev/null @@ -1,92 +0,0 @@ - - -# OCR serving on PAI - -This example introduces how to run an OCR serving job on OpenPAI, - -Please note that it's a simple demo, don't use it directly in production environments. - -## Prepare Docker image - -To provide a more simple experience, we have prepared an image of `openpai/pai.example.ocr-serving`, you could also prepare your own image with following steps. - -1. Build a base Docker image to pack necessary basic libraries for OpenPAI. We prepared a [base Dockerfile](../Dockerfiles/cuda9.0-cudnn7/Dockerfile.build.base) which can be built directly. - -```bash - $ cd ../Dockerfiles/cuda9.0-cudnn7 - $ sudo docker build -f Dockerfile.build.base \ - > -t pai.build.base:hadoop2.7.2-cuda9.0-cudnn7-devel-ubuntu16.04 . - $ cd - - ``` - -2. Prepare the OCR serving Docker image, which includes OCR and web-server libraries. - It can be built with following command. - - ``` - $ sudo docker build -f Dockerfile.example.ocr-serving -t pai.example.ocr-serving . - ``` - - Then push the Docker image to a Docker registry: - - ```bash - $ sudo docker tag pai.example.ocr-serving USER/pai.example.ocr-serving - $ sudo docker push USER/pai.example.ocr-serving - ``` - Please replace USER with the Docker Hub username you registered, you will be required to login before pushing Docker image. - - - -## Submit job - -To use the OCR demo docker image on OpenPAI, you will need to submit a job with the command to config the port for the OCR web-server and start the service in docker. - -The full OCR job description is shown as below: -```json -{ - "jobName": "ocr-serving", - "image": "openpai/pai.example.ocr-serving", - "taskRoles": [ - { - "name": "serving", - "taskNumber": 1, - "cpuNumber": 4, - "memoryMB": 8192, - "gpuNumber": 0, - "portList": [ - { - "label": "model_server", - "beginAt": 0, - "portNumber": 1 - } - ], - "command": "python3 app.py -p $PAI_CONTAINER_HOST_model_server_PORT_LIST" - } - ], - "retryCount": -2 -} -``` - -*For more details on how to write a job configuration file, please refer to [job tutorial](../../docs/user/training.md).* - -After submitting this job, it might take few mins for OpenPAI to load docker image and deploy the service. - -## Access service - -OpenPAI will dynamic allocate resources, IP and Port for jobs. Dynamic allocated IP and Port can be found in the job detail page, with which users could access the web-server \ No newline at end of file diff --git a/examples/ocr-serving/copied_file/request_ocr/README_zh_CN.md b/examples/ocr-serving/copied_file/request_ocr/README_zh_CN.md deleted file mode 100644 index 1ae5c8574d..0000000000 --- a/examples/ocr-serving/copied_file/request_ocr/README_zh_CN.md +++ /dev/null @@ -1,29 +0,0 @@ - - -# OCR web-server - -This is a simple ocr web demo, leverage [tesserocr](https://github.com/tesseract-ocr/tesseract) or [Microsoft cognitive services](https://www.azure.cn/en-us/home/features/cognitive-services/computer-vision/) to detect text in image. - -## Usage - - python3 app.py [-p PORT] [-m METHOD] [--debug] - - -Currently, it supports three ocr methods: `tesserocr`, `pyocr`, `api`. With `tesserocr` or `pyocr`, ocr results is generated by local tesserocr library. With `api` option, results is gotten from a remote address configured by env `OCR_URI` or `OCR_IP_PORT`. \ No newline at end of file diff --git a/examples/pytorch/DOCKER_zh_CN.md b/examples/pytorch/DOCKER_zh_CN.md deleted file mode 100644 index 54f66b30cd..0000000000 --- a/examples/pytorch/DOCKER_zh_CN.md +++ /dev/null @@ -1,76 +0,0 @@ -# PyTorch on PAI docker env - -## Contents - -1. [Basic environment](#basic-environment) -2. [Advanced environment](#advanced-environment) - -## Basic environment - -First of all, PAI runs all jobs in Docker container. - -[Install Docker-CE](https://docs.docker.com/install/linux/docker-ce/ubuntu/) if you haven't. Register an account at public Docker registry [Docker Hub](https://hub.docker.com/) if you do not have a private Docker registry. - -You can also jump to [PyTorch examples](#pytorch-examples) using [pre-built images](https://hub.docker.com/r/openpai/pai.example.pytorch/) on Docker Hub. - -We need to build a PyTorch image with GPU support to run PyTorch workload on PAI, this can be done in two steps: - -1. Build a base Docker image for PAI. We prepared a [base Dockerfile](../Dockerfiles/cuda8.0-cudnn6/Dockerfile.build.base) which can be built directly. - -```bash - $ cd ../Dockerfiles/cuda8.0-cudnn6 - $ sudo docker build -f Dockerfile.build.base \ - > -t pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 . - $ cd - - ``` - -2. Prepare PyTorch envoriment in a [Dockerfile](./Dockerfile.example.pytorch) using the base image. - - Write a PyTorch Dockerfile and save it to `Dockerfile.example.pytorch`: - - ```dockerfile - FROM pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 - - # install git - RUN apt-get -y update && apt-get -y install git - - # install PyTorch dependeces using pip - RUN pip install torch torchvision - - # clone PyTorch examples - RUN git clone https://github.com/pytorch/examples.git - ``` - - Build the Docker image from `Dockerfile.example.pytorch`: - - ```bash - $ sudo docker build -f Dockerfile.example.pytorch -t pai.example.pytorch . - ``` - - Push the Docker image to a Docker registry: - - ```bash - $ sudo docker tag pai.example.pytorch USER/pai.example.pytorch - $ sudo docker push USER/pai.example.pytorch - ``` - *Note: Replace USER with the Docker Hub username you registered, you will be required to login before pushing Docker image.* - - -## Advanced environment - -You can skip this section if you do not need to prepare other dependencies. - -You can customize runtime PyTorch environment in [Dockerfile.example.pytorch](./Dockerfile.example.pytorch), for example, adding other dependeces in Dockerfile: - -```dockerfile -FROM pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 - -# install other packages using apt-get -RUN apt-get -y update && apt-get -y install git PACKAGE - -# install other packages using pip -RUN pip install torch torchvision PACKAGE - -# clone PyTorch examples -RUN git clone https://github.com/pytorch/examples.git -``` \ No newline at end of file diff --git a/examples/pytorch/README_zh_CN.md b/examples/pytorch/README_zh_CN.md deleted file mode 100644 index 6ac7bf77c5..0000000000 --- a/examples/pytorch/README_zh_CN.md +++ /dev/null @@ -1,86 +0,0 @@ - - -# PyTorch on OpenPAI - -This guide introduces how to run [PyTorch](http://pytorch.org/) job on OpenPAI. The following contents show some basic PyTorch examples, other customized PyTorch code can be run similarly. - -## Contents - -- [PyTorch on OpenPAI](#pytorch-on-openpai) - - [Contents](#contents) - - [PyTorch MNIST digit recognition examples](#pytorch-mnist-digit-recognition-examples) - - [mnist](#mnist) - - [PyTorch regression examples](#pytorch-regression-examples) - - [regression](#regression) - - [Note:](#note) - -## PyTorch MNIST digit recognition examples - -To run PyTorch examples in OpenPAI, you need to prepare a job configuration file and submit it through webportal. - -OpenPAI packaged the docker env required by the job for user to use. User could refer to [DOCKER.md](./DOCKER.md) to customize this example docker env. If user have built a customized image and pushed it to Docker Hub, replace our pre-built image `openpai/pai.example.pytorch` with your own. - -Here're some configuration file examples: - -### [mnist](https://github.com/pytorch/examples/tree/master/mnist) - -```json -{ - "jobName": "pytorch-mnist", - "image": "openpai/pai.example.pytorch", - "taskRoles": [ - { - "name": "main", - "taskNumber": 1, - "cpuNumber": 4, - "memoryMB": 8192, - "gpuNumber": 1, - "command": "cd examples/mnist && python main.py" - } - ] -} -``` - -## PyTorch regression examples - -### [regression](https://github.com/pytorch/examples/tree/master/regression) - -```json -{ - "jobName": "pytorch-regression", - "image": "openpai/pai.example.pytorch", - "taskRoles": [ - { - "name": "main", - "taskNumber": 1, - "cpuNumber": 4, - "memoryMB": 8192, - "gpuNumber": 0, - "command": "cd examples/regression && python main.py" - } - ] -} -``` - -For more details on how to write a job configuration file, please refer to [job tutorial](../../docs/user/training.md). - -## Note: - -Since PAI runs PyTorch jobs in Docker, the training speed on PAI should be similar to speed on host. \ No newline at end of file diff --git a/examples/scikit-learn/DOCKER_zh_CN.md b/examples/scikit-learn/DOCKER_zh_CN.md deleted file mode 100644 index 16d14e54f3..0000000000 --- a/examples/scikit-learn/DOCKER_zh_CN.md +++ /dev/null @@ -1,76 +0,0 @@ -# scikit-learn on PAI docker env - -## Contents - -1. [Basic environment](#basic-environment) -2. [Advanced environment](#advanced-environment) - -## Basic environment - -First of all, PAI runs all jobs in Docker container. - -[Install Docker-CE](https://docs.docker.com/install/linux/docker-ce/ubuntu/) if you haven't. Register an account at public Docker registry [Docker Hub](https://hub.docker.com/) if you do not have a private Docker registry. - -You can also jump to [scikit-learn examples](#scikit-learn-examples) using [pre-built images](https://hub.docker.com/r/openpai/pai.example.sklearn/) on Docker Hub. - -We need to build a scikit-learn image to run scikit-learn workload on PAI, this can be done in two steps: - -1. Build a base Docker image for PAI. We prepared a [base Dockerfile](../Dockerfiles/cuda8.0-cudnn6/Dockerfile.build.base) which can be built directly. - -```bash - $ cd ../Dockerfiles/cuda8.0-cudnn6 - $ sudo docker build -f Dockerfile.build.base \ - > -t pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 . - $ cd - - ``` - -2. Prepare scikit-learn envoriment in a [Dockerfile](./Dockerfile.example.sklearn) using the base image. - - Write a scikit-learn Dockerfile and save it to `Dockerfile.example.sklearn`: - - ```dockerfile - FROM pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 - - # install git - RUN apt-get -y update && apt-get -y install git - - # install scikit-learn using pip - RUN pip install numpy pandas scipy scikit-learn - - # clone scikit-learn examples - RUN git clone https://github.com/scikit-learn/scikit-learn.git - ``` - - Build the Docker image from `Dockerfile.example.sklearn`: - - ```bash - $ sudo docker build -f Dockerfile.example.sklearn -t pai.example.sklearn . - ``` - - Push the Docker image to a Docker registry: - - ```bash - $ sudo docker tag pai.example.sklearn USER/pai.example.sklearn - $ sudo docker push USER/pai.example.sklearn - ``` - *Note: Replace USER with the Docker Hub username you registered, you will be required to login before pushing Docker image.* - - -## Advanced environment - -You can skip this section if you do not need to prepare other dependencies. - -You can customize runtime scikit-learn environment in [Dockerfile.example.sklearn](./Dockerfile.example.sklearn), for example, adding other dependeces in Dockerfile: - -```dockerfile -FROM pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 - -# install other packages using apt-get -RUN apt-get -y update && apt-get -y install git PACKAGE - -# install other packages using pip -RUN pip install numpy pandas scipy scikit-learn PACKAGE - -# clone scikit-learn examples -RUN git clone https://github.com/scikit-learn/scikit-learn.git -``` \ No newline at end of file diff --git a/examples/scikit-learn/README_zh_CN.md b/examples/scikit-learn/README_zh_CN.md deleted file mode 100644 index 4d6ee40b58..0000000000 --- a/examples/scikit-learn/README_zh_CN.md +++ /dev/null @@ -1,88 +0,0 @@ - - -# scikit-learn on OpenPAI - -This guide introduces how to run [scikit-learn](http://scikit-learn.org/stable/) job on OpenPAI. The following contents show some basic scikit-learn examples, other customized scikit-learn code can be run similarly. - -## Contents - -- [scikit-learn on OpenPAI](#scikit-learn-on-openpai) - - [Contents](#contents) - - [scikit-learn MNIST digit recognition example](#scikit-learn-mnist-digit-recognition-example) - - [mnist](#mnist) - - [scikit-learn text-vectorizers example](#scikit-learn-text-vectorizers-example) - - [text-vectorizers](#text-vectorizers) - - [Note:](#note) - -## scikit-learn MNIST digit recognition example - -To run scikit-learn examples in OpenPAI, you need to prepare a job configuration file and submit it through webportal. - -OpenPAI packaged the docker env required by the job for user to use. User could refer to [DOCKER.md](./DOCKER.md) to customize this example docker env. If user have built a customized image and pushed it to Docker Hub, replace our pre-built image `openpai/pai.example.sklearn` with your own. - -Here're some configuration file examples: - -### [mnist](https://github.com/scikit-learn/scikit-learn/blob/master/benchmarks/bench_mnist.py) - -```json -{ - "jobName": "sklearn-mnist", - "image": "openpai/pai.example.sklearn", - "taskRoles": [ - { - "name": "main", - "taskNumber": 1, - "cpuNumber": 4, - "memoryMB": 8192, - "gpuNumber": 0, - "command": "cd scikit-learn/benchmarks && python bench_mnist.py" - } - ] -} -``` - -## scikit-learn text-vectorizers example - -### [text-vectorizers](https://github.com/scikit-learn/scikit-learn/blob/master/benchmarks/bench_text_vectorizers.py) - -```json -{ - "jobName": "sklearn-text-vectorizers", - "image": "openpai/pai.example.sklearn", - "taskRoles": [ - { - "name": "main", - "taskNumber": 1, - "cpuNumber": 4, - "memoryMB": 8192, - "gpuNumber": 0, - "command": "pip install memory_profiler && cd scikit-learn/benchmarks && python bench_text_vectorizers.py" - } - ] -} -``` - -For more details on how to write a job configuration file, please refer to [job tutorial](../../docs/user/training.md). - -### Note: - -Since PAI runs PyTorch jobs in Docker, the training speed on PAI should be similar to speed on host. - -We provide a stable docker image by adding the data to the image. If you want to use it, add `stable` tag to the image name: `openpai/pai.example.sklearn:stable`. \ No newline at end of file diff --git a/examples/serving/DOCKER_zh_CN.md b/examples/serving/DOCKER_zh_CN.md deleted file mode 100644 index d79046c62d..0000000000 --- a/examples/serving/DOCKER_zh_CN.md +++ /dev/null @@ -1,40 +0,0 @@ -# Model Serving on PAI docker env - -## Contents - -1. [Basic environment](#basic-environment) - -## Basic environment - -First of all, PAI runs all jobs in Docker container. - -[Install Docker-CE](https://docs.docker.com/install/linux/docker-ce/ubuntu/) if you haven't. Register an account at public Docker registry [Docker Hub](https://hub.docker.com/) if you do not have a private Docker registry. - -We use TensorFlow model serving as an example, for how to serve a TensorFlow model, please refer to its [serving tutorial](https://www.tensorflow.org/serving/serving_basic). - -You can also jump to [Serving a TensorFlow model](#serving-a-tensorflow-model) using [pre-built images](https://hub.docker.com/r/openpai/pai.example.tensorflow-serving/) on Docker Hub. - -We need to build a TensorFlow serving image with GPU support to serve a TensorFlow model on PAI, this can be done in two steps: - -1. Build a base Docker image for PAI. We prepared a [base Dockerfile](../Dockerfiles/cuda9.0-cudnn7/Dockerfile.build.base) which can be built directly. - - ```bash - $ cd ../Dockerfiles/cuda9.0-cudnn7 - $ sudo docker build -f Dockerfile.build.base \ - > -t pai.build.base:hadoop2.7.2-cuda9.0-cudnn7-devel-ubuntu16.04 . - $ cd - - ``` - -2. Build the TensorFlow serving Docker image for PAI. We use the [TensorFlow serving Dockerfile](./Dockerfile.example.tensorflow-serving) provided in its tutorial. - - $ sudo docker build -f Dockerfile.example.tensorflow-serving . - - - Then push the Docker image to a Docker registry: - - ```bash - $ sudo docker tag pai.example.tensorflow-serving USER/pai.example.tensorflow-serving - $ sudo docker push USER/pai.example.tensorflow-serving - ``` - - *Note: Replace USER with the Docker Hub username you registered, you will be required to login before pushing Docker image.* \ No newline at end of file diff --git a/examples/serving/README_zh_CN.md b/examples/serving/README_zh_CN.md deleted file mode 100644 index a9526f75fb..0000000000 --- a/examples/serving/README_zh_CN.md +++ /dev/null @@ -1,59 +0,0 @@ - - -# Model Serving on OpenPAI - -This guide introduces how to run model serving job on OpenPAI. Serving system for machine learning models is designed for production environments, which makes it easy to deploy new algorithms and experiments to users. The following contents show some basic model serving examples, other customized serving code can be run similarly. - -# Serving a TensorFlow MNIST digit recognition model - -To run TensorFlow model serving, you need to prepare a job configuration file and submit it through webportal. - -OpenPAI packaged the docker env required by the job for user to use. User could refer to [DOCKER.md](./DOCKER.md) to customize this example docker env. If user have built a customized image and pushed it to Docker Hub, replace our pre-built image `openpai/pai.example.tensorflow-serving` with your own. - -Here're some configuration file examples: - -### [serving](https://www.tensorflow.org/serving/serving_basic) - -```json -{ - "jobName": "tensorflow-serving", - "image": "openpai/pai.example.tensorflow-serving", - "taskRoles": [ - { - "name": "serving", - "taskNumber": 1, - "cpuNumber": 4, - "memoryMB": 8192, - "gpuNumber": 1, - "portList": [ - { - "label": "model_server", - "beginAt": 0, - "portNumber": 1 - } - ], - "command": "bazel-bin/tensorflow_serving/example/mnist_saved_model /tmp/mnist_model && while :; do tensorflow_model_server --port=$PAI_CONTAINER_HOST_model_server_PORT_LIST --model_name=mnist --model_base_path=/tmp/mnist_model; done" - } - ], - "retryCount": -2 -} -``` - -For more details on how to write a job configuration file, please refer to [job tutorial](../../docs/user/training.md). \ No newline at end of file diff --git a/examples/spark/README_zh_CN.md b/examples/spark/README_zh_CN.md deleted file mode 100644 index 15509f5522..0000000000 --- a/examples/spark/README_zh_CN.md +++ /dev/null @@ -1,157 +0,0 @@ -# Spark on PAI - -This example demonstrate howto run Spark job on PAI. - -## 1. Off-the-shelf example - -### 1. Submit your Spark application - -Below is a job config running the `SparkPi` Java example on PAI. - -Note: Replace the `YOUR_PAI_MASTER_IP` with your own, before submitting the job on PAI. If you want to quit after Spark job finished, change `minSucceededTaskCount` to `1`. - -```json -{ - "jobName": "spark-example", - "image": "openpai/spark-example", - "virtualCluster": "default", - "retryCount": 0, - "taskRoles": [ - { - "name": "submitter", - "taskNumber": 1, - "cpuNumber": 1, - "memoryMB": 2048, - "shmMB": 64, - "gpuNumber": 0, - "minFailedTaskCount": 1, - "minSucceededTaskCount": null, - "command": "spark-submit --conf spark.eventLog.enabled=true --conf spark.history.fs.logDirectory=hdfs://YOUR_PAI_MASTER_IP:9000/shared/spark-logs --conf spark.eventLog.dir=hdfs://YOUR_PAI_MASTER_IP:9000/shared/spark-logs --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --driver-memory 1g --executor-memory 2g --executor-cores 1 --queue default ${SPARK_HOME}/examples/jars/spark-examples*.jar 10", - "portList": [] - }, - { - "name": "spark_history_server", - "taskNumber": 1, - "cpuNumber": 1, - "memoryMB": 1024, - "shmMB": 64, - "gpuNumber": 0, - "minFailedTaskCount": 1, - "minSucceededTaskCount": null, - "command": "URL=http://${PAI_CURRENT_CONTAINER_IP}:${PAI_CONTAINER_HOST_history_server_PORT_LIST}/ && echo Please visit spark histroy server: ${URL} && SPARK_DAEMON_JAVA_OPTS=\"-Dspark.history.ui.port=${PAI_CONTAINER_HOST_history_server_PORT_LIST} -Dspark.history.fs.logDirectory=hdfs://YOUR_PAI_MASTER_IP:9000/shared/spark-logs -Dspark.eventLog.enabled=true -Dspark.eventLog.dir=hdfs://YOUR_PAI_MASTER_IP:9000/shared/spark-logs\" spark-class org.apache.spark.deploy.history.HistoryServer", - "portList": [ - { - "label": "history_server", - "beginAt": 0, - "portNumber": 1 - } - ] - } - ] -} -``` - -### 2. Visit Spark history server - -Your job look like below, key info is marked on red font. ![job](https://user-images.githubusercontent.com/1547343/43951079-b981c892-9cc4-11e8-8eeb-dc28a0ac0950.png) - -As the previous image indicated, you can visit the Spark history server on . ![history_server](https://user-images.githubusercontent.com/1547343/43951284-55719106-9cc5-11e8-92db-d0d228e547b1.png) - -## 2. Run your python application - -For python application, you will need to manage dependencies carefully. In the example below, we provide the dependency using `--py-files` parameter. - -### 1. Prepare your data and code - -Upload `sample_libsvm_data.txt` and `gradient_boosted_tree_classifier_example.py` to hdfs: - -```sh -hdfs dfs -mkdir -p hdfs://YOUR_PAI_MASTER_IP:9000/user/core/data/mllib/ -hdfs dfs -put sample_libsvm_data.txt hdfs://YOUR_PAI_MASTER_IP:9000/user/core/data/mllib/ - -hdfs dfs -mkdir -p hdfs://YOUR_PAI_MASTER_IP:9000/user/core/code -hdfs dfs -put gradient_boosted_tree_classifier_example.py hdfs://YOUR_PAI_MASTER_IP:9000/user/core/code/ -``` - -### 2. Generate your dependencies with `conda env` - -First, install conda. - -```sh -sudo apt update --yes -sudo apt upgrade --yes - -# Get Miniconda and make it the main Python interpreter -wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh -bash ~/miniconda.sh -b -p ~/miniconda -rm ~/miniconda.sh - -``` - -Then create an `spark-python` env, with `python3`, `numpy` installed. - -```sh -conda create -n spark-python --copy -y -q python=3 numpy -``` - -At last, zip and ship your dependencies. - -```sh -cd /YOUR_CONDA_HOME/envs -zip -r spark-python.zip spark-python -hdfs dfs -put spark-python.zip hdfs://YOUR_PAI_MASTER_IP:9000/user/core/ -``` - -### 3. Submit job on PAI - -Note: Replace the `YOUR_PAI_MASTER_IP` with your own, before submitting the job on PAI. If you want to quit after Spark job finished, change `minSucceededTaskCount` to `1`. - -```json -{ - "jobName": "spark-python-example", - "image": "openpai/spark-example", - "dataDir": "hdfs://YOUR_PAI_MASTER_IP:9000/user/core/data/mllib/", - "codeDir": "hdfs://YOUR_PAI_MASTER_IP:9000/user/core/code", - "virtualCluster": "default", - "retryCount": 0, - "taskRoles": [ - { - "name": "submitter", - "taskNumber": 1, - "cpuNumber": 1, - "memoryMB": 2048, - "shmMB": 64, - "gpuNumber": 0, - "minFailedTaskCount": 1, - "minSucceededTaskCount": null, - "command": "spark-submit --conf spark.eventLog.enabled=true --conf spark.history.fs.logDirectory=hdfs://YOUR_PAI_MASTER_IP:9000/shared/spark-logs --conf spark.eventLog.dir=hdfs://YOUR_PAI_MASTER_IP:9000/shared/spark-logs --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=MY_CONDA/spark-python/bin/python --master yarn --deploy-mode cluster --archives hdfs://YOUR_PAI_MASTER_IP:9000/user/core/spark-python.zip#MY_CONDA --queue default hdfs://YOUR_PAI_MASTER_IP:9000/user/core/code/gradient_boosted_tree_classifier_example.py hdfs://YOUR_PAI_MASTER_IP:9000/user/core/data/mllib/sample_libsvm_data.txt", - "portList": [] - }, - { - "name": "spark_history_server", - "taskNumber": 1, - "cpuNumber": 1, - "memoryMB": 1024, - "shmMB": 64, - "gpuNumber": 0, - "minFailedTaskCount": 1, - "minSucceededTaskCount": null, - "command": "URL=http://${PAI_CURRENT_CONTAINER_IP}:${PAI_CONTAINER_HOST_history_server_PORT_LIST}/ && echo Please visit spark histroy server: ${URL} && SPARK_DAEMON_JAVA_OPTS=\"-Dspark.history.ui.port=${PAI_CONTAINER_HOST_history_server_PORT_LIST} -Dspark.history.fs.logDirectory=hdfs://YOUR_PAI_MASTER_IP:9000/shared/spark-logs -Dspark.eventLog.enabled=true -Dspark.eventLog.dir=hdfs://YOUR_PAI_MASTER_IP:9000/shared/spark-logs\" spark-class org.apache.spark.deploy.history.HistoryServer", - "portList": [ - { - "label": "history_server", - "beginAt": 0, - "portNumber": 1 - } - ] - } - ] -} - -``` - -### 4. Visit Spark history server - -As previous section. - -Note: If you want to write your own pyspark code, you must set yarn-master as the master `setMaster("yarn-master")` instead of `"local[*]`. Then, you **must** upload your code to hdfs rather than build it in your docker. Finally, you should `spark-submit` the code on hdfs. You can refer to the [simple pyspark example](./simple_pyspark_example.py) and read the comment. \ No newline at end of file diff --git a/examples/tensorflow/DOCKER_zh_CN.md b/examples/tensorflow/DOCKER_zh_CN.md deleted file mode 100644 index 2238eb1189..0000000000 --- a/examples/tensorflow/DOCKER_zh_CN.md +++ /dev/null @@ -1,77 +0,0 @@ -# TensorFlow on PAI docker env - -## Contents - -1. [Basic environment](#basic-environment) -2. [Advanced environment](#advanced-environment) - -## Basic environment - -First of all, PAI runs all jobs in Docker container. - -[Install Docker-CE](https://docs.docker.com/install/linux/docker-ce/ubuntu/) if you haven't. Register an account at public Docker registry [Docker Hub](https://hub.docker.com/) if you do not have a private Docker registry. - -You can also jump to [TensorFlow examples](#tensorflow-examples) using [pre-built images](https://hub.docker.com/r/openpai/pai.example.tensorflow/) on Docker Hub. - -We need to build a TensorFlow image with GPU support to run TensorFlow workload on PAI, this can be done in two steps: - -1. Build a base Docker image for PAI. We prepared a [base Dockerfile](../Dockerfiles/cuda8.0-cudnn6/Dockerfile.build.base) which can be built directly. - -```bash - $ cd ../Dockerfiles/cuda8.0-cudnn6 - $ sudo docker build -f Dockerfile.build.base \ - > -t pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 . - $ cd - - ``` - -2. Prepare TensorFlow envoriment in a [Dockerfile](./Dockerfile.example.tensorflow) using the base image. - - Write a TensorFlow Dockerfile and save it to `Dockerfile.example.tensorflow`: - - ```dockerfile - FROM pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 - - ENV TENSORFLOW_VERSION=1.4.0 - - # For how to run TensorFlow on Hadoop, - # please refer to https://www.tensorflow.org/deploy/hadoop - RUN pip install tensorflow-gpu==${TENSORFLOW_VERSION} && \ - pip3 install tensorflow-gpu==${TENSORFLOW_VERSION} - - WORKDIR /root - ``` - - Build the Docker image from `Dockerfile.example.tensorflow`: - - ```bash - $ sudo docker build -f Dockerfile.example.tensorflow -t pai.example.tensorflow . - ``` - - Push the Docker image to a Docker registry: - - ```bash - $ sudo docker tag pai.example.tensorflow USER/pai.example.tensorflow - $ sudo docker push USER/pai.example.tensorflow - ``` - *Note: Replace USER with the Docker Hub username you registered, you will be required to login before pushing Docker image.* - - -## Advanced environment - -You can skip this section if you do not need to prepare other dependencies. - -You can customize runtime TensorFlow environment in [Dockerfile.example.tensorflow](./Dockerfile.example.tensorflow), for example, adding other dependeces in Dockerfile: - -```dockerfile -FROM pai.build.base:hadoop2.7.2-cuda8.0-cudnn6-devel-ubuntu16.04 - -ENV TENSORFLOW_VERSION=1.4.0 - -# install other packages using apt-get -RUN apt-get -y update && apt-get -y install git PACKAGE - -# install other packages using pip -RUN pip install tensorflow-gpu==${TENSORFLOW_VERSION} PACKAGE - -WORKDIR /root -``` \ No newline at end of file diff --git a/examples/tensorflow/README_zh_CN.md b/examples/tensorflow/README_zh_CN.md deleted file mode 100644 index 7cf39656ea..0000000000 --- a/examples/tensorflow/README_zh_CN.md +++ /dev/null @@ -1,157 +0,0 @@ - - -# TensorFlow on OpenPAI - -This guide introduces how to run [TensorFlow](https://www.tensorflow.org/) job on OpenPAI. The following contents show some basic TensorFlow examples, other customized TensorFlow code can be run similarly. - -## Contents - -- [TensorFlow on OpenPAI](#tensorflow-on-openpai) - - [Contents](#contents) -- [TensorFlow examples](#tensorflow-examples) - [Prepare work](#prepare-work) - [TensorFlow CIFAR-10 image classification](#tensorflow-cifar-10-image-classification) - [TensorFlow ImageNet image classification](#tensorflow-imagenet-image-classification) - [Distributed TensorFlow CIFAR-10 image classification](#distributed-tensorflow-cifar-10-image-classification) - [TensorFlow Tensorboard](#tensorflow-tensorboard) - [Note](#note) - -# TensorFlow examples - -### Prepare work - -1. Prepare the data: - -* imageNet: Go to [imageNet official website](http://www.image-net.org/download-images), signup and download the data manually. Or, you can use tensorflow data loader to download the data automatically. Just clone [ensorflow/models](https://github.com/tensorflow/models) and run models/research/slim/datasets/download_and_convert_imagenet.sh:`git clone https://github.com/tensorflow/models.git && mv models/research/slim . && rm -rf models && sed -i "s/^WORK_DIR=.*$/WORK_DIR=.\/slim/g" slim/datasets/download_and_convert_imagenet.sh && chmod u+x slim/datasets/download_and_convert_imagenet.sh && abspath=`pwd`/data && echo -e "openpai\nopenpai\n" | ./slim/datasets/download_and_convert_imagenet.sh $abspath` Pay attention to your disk, because the data size is about 500GB. **Note** that the `prepare.sh` in this folder **close** the imageNet data preparation precess by default. If you want to reopen that, just remove the `#` of `#imageNet_prepare_code \$1` and `#imageNet_prepare_data \$1` in the shell script. After you download the data, upload them to HDFS:`hdfs dfs -put filename hdfs://ip:port/examples/tensorflow/imageNet/data/` * cifar-10: Just go to the [official website](http://www.cs.toronto.edu/~kriz/cifar.html) and download the python version data by the [url](http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz). `wget http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz && tar zxvf cifar-10-python.tar.gz && rm cifar-10-python.tar.gz` After you downloading the data, upload them to HDFS:`hdfs dfs -put filename hdfs://ip:port/examples/tensorflow/distributed-cifar-10/data` 2. Prepare the executable code: * imageNet: The *slim* folder you just downloaded contains the code. If you download the data manually, refer to the automatic method to get the code. -After you download the data, upload them to HDFS:`hdfs dfs -put filename hdfs://ip:port/examples/tensorflow/distributed-cifar-10/code/` * cifar-10: We use the [tensorflow official benchmark code](https://github.com/tensorflow/benchmarks). Pay attention to the version. We use *tf_benchmark_stage* branch. `git clone -b tf_benchmark_stage https://github.com/tensorflow/benchmarks.git` * After you download the data, upload them to HDFS:`hdfs dfs -put filename hdfs://ip:port/examples/tensorflow/distributed-cifar-10/code/` 3. Prepare a docker image and upload it to docker hub. OpenPAI packaged the docker env required by the job for user to use. User could refer to [DOCKER.md](./DOCKER.md) to customize this example docker env. If user have built a customized image and pushed it to Docker Hub, replace our pre-built image `openpai/pai.example.tensorflow` with your own. 4. Prepare a job configuration file and submit it through webportal. Note that you can simply run the prepare.sh to do the above preparing work, but you must make sure you can use HDFS client on your local machine. If you can, just run the shell script with a parameter of your HDFS socket! `/bin/bash prepare.sh ip:port` Note that, the default operation of the prepare script has closed the data preparing of imageNet due to its size. If you want to open it, just remove the "#" in the line 52. 5. Prepare a job configuration file and submit it through webportal. The config examples are following. - -Here're some configuration file examples: - -### TensorFlow CIFAR-10 image classification - -```js -{ - "jobName": "tensorflow-cifar10", - "image": "openpai/pai.example.tensorflow", - - "dataDir": "/tmp/data", - "outputDir": "/tmp/output", - - "taskRoles": [ - { - "name": "cifar_train", - "taskNumber": 1, - "cpuNumber": 8, - "memoryMB": 32768, - "gpuNumber": 1, - "command": "git clone https://github.com/tensorflow/models && cd models/research/slim && python download_and_convert_data.py --dataset_name=cifar10 --dataset_dir=$PAI_DATA_DIR && python train_image_classifier.py --batch_size=64 --model_name=inception_v3 --dataset_name=cifar10 --dataset_split_name=train --dataset_dir=$PAI_DATA_DIR --train_dir=$PAI_OUTPUT_DIR" - } - ] -} -``` - -### TensorFlow ImageNet image classification - -```js -{ - "jobName": "tensorflow-imagenet", - "image": "openpai/pai.example.tensorflow", - - // prepare imagenet dataset in TFRecord format following https://git.io/vFxjh and upload to hdfs - "dataDir": "$PAI_DEFAULT_FS_URI/examples/tensorflow/data", - // make a new dir for output on hdfs - "outputDir": "$PAI_DEFAULT_FS_URI/examples/tensorflow/output", - // download code from tensorflow slim https://git.io/vFpef and upload to hdfs - "codeDir": "$PAI_DEFAULT_FS_URI/examples/tensorflow/code", - - "taskRoles": [ - { - "name": "imagenet_train", - "taskNumber": 1, - "cpuNumber": 8, - "memoryMB": 32768, - "gpuNumber": 1, - "command": "python code/train_image_classifier.py --batch_size=64 --model_name=inception_v3 --dataset_name=imagenet --dataset_split_name=train --dataset_dir=$PAI_DATA_DIR --train_dir=$PAI_OUTPUT_DIR" - } - ] -} -``` - -### Distributed TensorFlow CIFAR-10 image classification - -```js -{ - "jobName": "tensorflow-distributed-cifar10", - "image": "openpai/pai.example.tensorflow", - - // download cifar10 dataset from http://www.cs.toronto.edu/~kriz/cifar.html and upload to hdfs - "dataDir": "$PAI_DEFAULT_FS_URI/examples/tensorflow/distributed-cifar-10/data", - // make a new dir for output on hdfs - "outputDir": "$PAI_DEFAULT_FS_URI/examples/tensorflow/distributed-cifar-10/output", - // download code from tensorflow benchmark https://git.io/vF4wT and upload to hdfs - "codeDir": "$PAI_DEFAULT_FS_URI/examples/tensorflow/distributed-cifar-10/code", - - "taskRoles": [ - { - "name": "ps_server", - "taskNumber": 2, - "cpuNumber": 2, - "memoryMB": 8192, - "gpuNumber": 0, - "command": "pip --quiet install scipy && python code/tf_cnn_benchmarks.py --local_parameter_device=cpu --batch_size=32 --model=resnet20 --variable_update=parameter_server --data_dir=$PAI_DATA_DIR --data_name=cifar10 --train_dir=$PAI_OUTPUT_DIR --ps_hosts=$PAI_TASK_ROLE_ps_server_HOST_LIST --worker_hosts=$PAI_TASK_ROLE_worker_HOST_LIST --job_name=ps --task_index=$PAI_CURRENT_TASK_ROLE_CURRENT_TASK_INDEX" - }, - { - "name": "worker", - "taskNumber": 2, - "cpuNumber": 2, - "memoryMB": 16384, - "gpuNumber": 4, - "command": "pip --quiet install scipy && python code/tf_cnn_benchmarks.py --local_parameter_device=cpu --batch_size=32 --model=resnet20 --variable_update=parameter_server --data_dir=$PAI_DATA_DIR --data_name=cifar10 --train_dir=$PAI_OUTPUT_DIR --ps_hosts=$PAI_TASK_ROLE_ps_server_HOST_LIST --worker_hosts=$PAI_TASK_ROLE_worker_HOST_LIST --job_name=worker --task_index=$PAI_CURRENT_TASK_ROLE_CURRENT_TASK_INDEX", - "minSucceededTaskCount": 2 - } - ], - "retryCount": 0 -} -``` - -### TensorFlow Tensorboard - -```js -{ - "jobName": "tensorflow-tensorboard", - "image": "openpai/pai.example.tensorflow", - - // prepare checkpoint and log to be visualized and upload to hdfs - "dataDir": "$PAI_DEFAULT_FS_URI/examples/tensorflow/distributed-cifar-10/output", - // prepare visualization script tensorboard-example.sh and upload to hdfs - "codeDir": "$PAI_DEFAULT_FS_URI/examples/tensorflow/tensorboard/code", - - "taskRoles": [ - { - "name": "tensorboard", - "taskNumber": 1, - "cpuNumber": 2, - "memoryMB": 4096, - "gpuNumber": 0, - "command": "/bin/bash code/tensorflow-tensorboard.sh" - } - ] -} -``` - -For more details on how to write a job configuration file, please refer to [job tutorial](../../docs/user/training.md). - -### Note - -We provide a stable docker image by adding the cifar-10 data to the image. If you want to use it, add `stable` tag to the image name: `openpai/pai.example.tensorflow:stable`. \ No newline at end of file diff --git a/src/alert-manager/config/alert-manager_zh_CN.md b/src/alert-manager/config/alert-manager_zh_CN.md deleted file mode 100644 index f657c974c5..0000000000 --- a/src/alert-manager/config/alert-manager_zh_CN.md +++ /dev/null @@ -1,56 +0,0 @@ -## Alerter-Manager section parser - -- [Default Configuration](#D_Config) -- [How to Configure](#HT_Config) -- [Generated Configuraiton](#G_Config) - -#### Default configuration - -[alert-manager default configuration](alert-manager.yaml) - -#### How to configure cluster section in service-configuraiton.yaml - -Port configurations in this section is optional which default to 9093. All other config is mandatory. If not receiver is configured, the alert manager will not start. - -To configure alert-manager to send out alert email, you should configure alert manager with receiver in your service-configuration like following: - -```yaml -alert-manager: - receiver: your_addr@example.com - smtp_url: smtp.office365.com:587 - smtp_from: alert_sender@example.com - smtp_auth_username: alert_sender@example.com - smtp_auth_password: password_for_alert_sender - port: 9093 # this is optional, you should not write this if you do not want to change the port alert-manager is listening on -``` - -In addition, if you deployed pai behind firewall, you should configure alert-manager with `use-pylon: True`, to make url from alert email public available. - -#### Generated Configuration - -After parsing, if you configured the alert-manager the model will be like: - -```yaml -alert-manager: - receiver: your_addr@example.com - smtp_url: smtp.office365.com:587 - smtp_from: alert_sender@example.com - smtp_auth_username: alert_sender@example.com - smtp_auth_password: password_for_alert_sender - port: 9093 - configured: True - host: master_ip - url: "http://master_ip:9093" - use-pylon: False -``` - -if you didn't configured alert-manager, it will be like: - -```yaml -alert-manager: - port: 9093 - configured: False - host: master_ip - url: "http://master_ip:9093" - use-pylon: False -``` \ No newline at end of file diff --git a/src/cleaner/config/cleaner_zh_CN.md b/src/cleaner/config/cleaner_zh_CN.md deleted file mode 100644 index ba322eed60..0000000000 --- a/src/cleaner/config/cleaner_zh_CN.md +++ /dev/null @@ -1,56 +0,0 @@ -## Cleaner section parser - -- [Default Configuration](#D_Config) -- [How to Configure](#HT_Config) -- [Generated Configuraiton](#G_Config) -- [Data Table](#T_config) - -#### Default configuration - -[cleaner default configuration](cleaner.yaml) - -#### How to configure cluster section in service-configuraiton.yaml - -All configurations in this section is optional. If you want to customized these value, you can configure it in service-configuration.yaml. - -For example, if you want to use different threshold than the default value 94, add following to your service-configuration.yaml as following: - -```yaml -cleaner: - threshold: new-value - interval: new-value -``` - -#### Generated Configuration - -After parsing, object model looks like: - -```yaml -cleaner: - threshold: 90 - interval: 60 -``` - -#### Table - - - - - - - - - - - - - - - - - - - - - -
Data in Configuration FileData in Cluster Object ModelData in Jinja2 TemplateData type
cleaner.thresholdcom["cleaner"]["threshold"]cluster_cfg["cleaner"]["threshold"]Int
cleaner.intervalcom["cleaner"]["interval"]cluster_cfg["cleaner"]["interval"]Int
\ No newline at end of file diff --git a/src/cleaner/test/job/cleaner-test-job_zh_CN.md b/src/cleaner/test/job/cleaner-test-job_zh_CN.md deleted file mode 100644 index dcd8077555..0000000000 --- a/src/cleaner/test/job/cleaner-test-job_zh_CN.md +++ /dev/null @@ -1,43 +0,0 @@ -## Cleaner-Test-Job - -- [How to Use](#HT_Use) -- [How to Configure](#HT_Config) -- [How to Build Job Image](#HT_Image) - -#### How to use cleaner test job - -1. Go to PAI web portal, click Submit Job in left toolbar. -2. Import job json file. (cleaner-test-job.json) -3. Change variables in command text field if needed. -4. Click Submit button to submit job. -5. Go to Jobs page, keep monitoring the job you just submitted. -6. If everything work as expected, the job will fail due to killed by cleaner. Click "Go to Tracking Page", you will find info "Docker container killed by cleaner due to disk pressure" in the end. - -#### How to configure variables in job - -In the job page, use the following command to run cleaner test: - -```sh -sh /cleaner-test/cleaner-test.sh

- Architecture -

- -**LauncherInterfaces**: - -* RestAPI -* Submit Framework Description - -**LauncherService**: - -* One Central Service -* Manages all Frameworks for the whole Cluster. - -**LauncherAM**: - -* Per-Framework Service -* Manage Tasks for a single Framework by customized feature requirement - -## Pipeline - -

- Pipeline -

- -## Configuration - -Launcher Service can be configured by [LauncherConfiguration](../src/main/java/com/microsoft/frameworklauncher/common/model/LauncherConfiguration.java). You can check the Type, Specification and FeatureUsage inside it. - -And we also provide a default configuration for you to refer: [Default LauncherConfiguration File](../conf/frameworklauncher.yml). - -## RestAPI - -### Guarantees - -* All APIs are IDEMPOTENT and STATELESS, to allowed trivial Work Preserving Client Restart. In other words, User do not need to worry about call one API multiple times by different Client instance (such as Client Restart, etc). -* All APIs are DISTRIBUTED THREAD SAFE, to allow multiple distributed Client instances to access. In other words, User do not need to worry about call them at the same time in Multiple Threads/Processes/Nodes. - -### Best Practices - -* LauncherService can only handle a finite, limited request volume. User should try to minimize its overall request frequency and payload, so that the LauncherService is not overloaded. To achieve this, User can centralize requests, space out requests, filter respond and so on. Moreover, to get informations in a more scalable way than RestAPI, see [HDFS Published Informations](#HDFS_Published_Informations). -* Completed Frameworks will ONLY be retained in recent FrameworkCompletedRetainSec, in case Client miss to delete the Framework after FrameworkCompleted. One exclusion is the Framework Launched by DataDeployment, it will be retained until the corresponding FrameworkDescriptionFile deleted in the DataDeployment. To avoid missing the CompletedFrameworkStatus, the polling interval seconds of Client should be less than FrameworkCompletedRetainSec. Check the frameworkCompletedRetainSec by [GET LauncherStatus](#GET_LauncherStatus). - -### Root URI - -Configure it as webServerAddress inside [LauncherConfiguration File](../conf/frameworklauncher.yml). - -### Types - -* Refer [DataModel and FeatureUsage](#DataModel_and_FeatureUsage) for the Type of HTTP Request and Response. - -### Common Request Headers - -| Headers | Description | -|:-------- |:--------------------------------------------------------------------------------------------------------------------------- | -| UserName | Specifies which User send the Request. It is effective iff webServerAclEnable is true, see [Framework ACL](#Framework_ACL). | - -### API Details - -#### PUT Framework - -**Request** - - PUT /v1/Frameworks/{FrameworkName} - - -Type: application/json - -Body: [FrameworkDescriptor](../src/main/java/com/microsoft/frameworklauncher/common/model/FrameworkDescriptor.java) - -**Description** - -Add a NOT Requested Framework or Update a Requested Framework. - -1. Add a NOT Requested Framework: Framework will be Added and Launched (Now it is Requested). -2. Update a Requested Framework: - 1. If FrameworkVersion unchanged: - 1. Framework will be Updated to the FrameworkDescription on the fly (i.e. Work Preserving). - 2. To Update Framework on the fly, it is better to use the corresponding PartialUpdate (such as [PUT TaskNumber](#PUT_TaskNumber)) than PUT the entire FrameworkDescription here. Because, partially update the FrameworkDescription can avoid the Race Condition (or Transaction Conflict) between two PUT Requests. Besides, the behaviour is undefined when change parameters in FrameworkDescription which is not supported by PartialUpdate. - 2. Else: - 1. Framework will be NonRolling Upgraded to new FrameworkVersion. (i.e. Not Work Preserving). - 2. NonRolling Upgrade can be used to change parameters in FrameworkDescription which is not supported by PartialUpdate (such as Framework Queue). - 3. NonRolling Upgrade should be triggered by change FrameworkVersion, instead of DELETE then PUT with the same FrameworkVersion. -3. User is responsible and free to specify the FrameworkName of the Framework, however, the FrameworkName should respect the [Framework ACL](#Framework_ACL). -4. After Accepted Response, its corresponding Status (such as FrameworkStatus and AggregatedFrameworkStatus) exists immediately, too. However, the Status may not be updated according to the Request (FrameworkDescriptor) immediately. So, to check whether it has been updated, Client still needs to poll the GET Status APIs. - -**Response** - -| HttpStatusCode | Body | Description | -|:----------------------- |:---------------- |:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Accepted(202) | NULL | The Request has been recorded for backend to process, not that the processing of the Request has been completed. | -| BadRequest(400) | ExceptionMessage | The Request validation failed. So, Client is expected to not retry for this non-transient failure and then correct the Request. | -| Forbidden(403) | ExceptionMessage | The Request authorization failed. So, Client is expected to not retry for this non-transient failure and then correct the Request or ask Administrator to grant the Request privilege. This Response may happen only if webServerAclEnable is true, see [Framework ACL](#Framework_ACL). | -| TooManyRequests(429) | ExceptionMessage | The Request is rejected due to the New Total TaskNumber will exceed the Max Total TaskNumber if backend accepted it. So, the Client is expected to retry for this transient failure or migrate the whole Framework to another Cluster. | -| ServiceUnavailable(503) | ExceptionMessage | The Request cannot be recorded for backend to process. In our system, this only happens when target Cluster's Zookeeper is down for a long time. So, the Client is expected to retry for this transient failure or migrate the whole Framework to another Cluster. | - -#### DELETE Framework - -**Request** - - DELETE /v1/Frameworks/{FrameworkName} - - -**Description** - -Delete a Framework, no matter it is Requested or not. - -Notes: - -1. Framework will be Stopped and Deleted (Now it is NOT Requested). -2. After Accepted Response, its corresponding Status does not exist immediately, too. -3. Only recently completed Frameworks will be kept, if Client miss to DELETE the Framework after FrameworkCompleted. One exclusion is the Framework Launched by DataDeployment, it will be kept until the corresponding FrameworkDescriptionFile deleted in the DataDeployment. - -**Response** - -| HttpStatusCode | Body | Description | -|:----------------------- |:---------------- |:--------------------------------------- | -| Accepted(202) | NULL | Same as [PUT Framework](#PUT_Framework) | -| BadRequest(400) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | -| Forbidden(403) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | -| ServiceUnavailable(503) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | - -#### GET FrameworkStatus - -**Request** - - GET /v1/Frameworks/{FrameworkName}/FrameworkStatus - - -**Description** - -Get the FrameworkStatus of a Requested Framework - -Recipes: - -1. User Level RetryPolicy (Based on FrameworkState, ApplicationExitCode, ApplicationExitDiagnostics, ApplicationExitType) -2. Directly Monitor Underlay YARN Application by YARN CLI or RestAPI (Based on ApplicationId or ApplicationTrackingUrl) - -**Response** - -| HttpStatusCode | Body | Description | -|:----------------------- |:----------------------------------------------------------------------------------------------------- |:------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| OK(200) | [FrameworkStatus](../src/main/java/com/microsoft/frameworklauncher/common/model/FrameworkStatus.java) | | -| NotFound(404) | ExceptionMessage | Specified Framework has not been Requested yet. So, Client is expected to not retry for this non-transient failure and then PUT the corresponding Framework first. | -| ServiceUnavailable(503) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | - -#### PUT TaskNumber - -**Request** - - PUT /v1/Frameworks/{FrameworkName}/TaskRoles/{TaskRoleName}/TaskNumber - - -Type: application/json - -Body: [UpdateTaskNumberRequest](../src/main/java/com/microsoft/frameworklauncher/common/model/UpdateTaskNumberRequest.java) - -**Description** - -Update TaskNumber for a Requested Framework - -**Response** - -| HttpStatusCode | Body | Description | -|:----------------------- |:---------------- |:--------------------------------------------------- | -| Accepted(202) | NULL | Same as [PUT Framework](#PUT_Framework) | -| BadRequest(400) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | -| Forbidden(403) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | -| NotFound(404) | ExceptionMessage | Same as [GET FrameworkStatus](#GET_FrameworkStatus) | -| TooManyRequests(429) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | -| ServiceUnavailable(503) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | - -#### PUT ExecutionType - -**Request** - - PUT /v1/Frameworks/{FrameworkName}/ExecutionType - - -Type: application/json - -Body: [UpdateExecutionTypeRequest](../src/main/java/com/microsoft/frameworklauncher/common/model/UpdateExecutionTypeRequest.java) - -**Description** - -Update ExecutionType for a Requested Framework - -Notes: - -1. It is ignored to change Framework ExecutionType from STOP to START, if previous STOP has already caused the Framework of current FrameworkVersion entered FINAL_STATES, i.e. FRAMEWORK_COMPLETED. So, to ensure starting the Framework again after STOP, just change the FrameworkVersion instead. - -**Response** - -| HttpStatusCode | Body | Description | -|:----------------------- |:---------------- |:--------------------------------------------------- | -| Accepted(202) | NULL | Same as [PUT Framework](#PUT_Framework) | -| BadRequest(400) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | -| Forbidden(403) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | -| NotFound(404) | ExceptionMessage | Same as [GET FrameworkStatus](#GET_FrameworkStatus) | -| ServiceUnavailable(503) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | - -#### PUT MigrateTask - -**Request** - - PUT /v1/Frameworks/{FrameworkName}/MigrateTasks/{ContainerId} - - -Type: application/json - -Body: [MigrateTaskRequest](../src/main/java/com/microsoft/frameworklauncher/common/model/MigrateTaskRequest.java) - -**Description** - -Migrate a Task from current Container to another Container for a Requested Framework And new Container and old Container will satisfy the AntiAffinityLevel constraint. - -Notes: - -1. User is responsible for implement Health/Perf Measurement of the Service based on Monitoring TaskStatuses or self-contained communication. And if found some Health/Perf degradations, User can migrate it by calling this API with corresponding ContainerId as parameter. -2. Currently, only support Any AntiAffinityLevel. - -**Response** - -| HttpStatusCode | Body | Description | -|:----------------------- |:---------------- |:--------------------------------------------------- | -| Accepted(202) | NULL | Same as [PUT Framework](#PUT_Framework) | -| BadRequest(400) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | -| Forbidden(403) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | -| NotFound(404) | ExceptionMessage | Same as [GET FrameworkStatus](#GET_FrameworkStatus) | -| ServiceUnavailable(503) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | - -#### PUT ApplicationProgress - -**Request** - - PUT /v1/Frameworks/{FrameworkName}/ApplicationProgress - - -Type: application/json - -Body: [OverrideApplicationProgressRequest](../src/main/java/com/microsoft/frameworklauncher/common/model/OverrideApplicationProgressRequest.java) - -**Description** - -Update ApplicationProgress for a Requested Framework - -Notes: - -1. If User does not call this API. Default ApplicationProgress is used, and it is calculated as CompletedTaskCount / TotalTaskCount. -2. User is responsible for implement Progress Measurement of the Service based on Monitoring Task logs or self-contained communication. And then feedback the Progress by calling this API to Override the default ApplicationProgress. - -**Response** - -| HttpStatusCode | Body | Description | -|:----------------------- |:---------------- |:--------------------------------------------------- | -| Accepted(202) | NULL | Same as [PUT Framework](#PUT_Framework) | -| BadRequest(400) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | -| Forbidden(403) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | -| NotFound(404) | ExceptionMessage | Same as [GET FrameworkStatus](#GET_FrameworkStatus) | -| ServiceUnavailable(503) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | - -#### GET Framework - -**Request** - - GET /v1/Frameworks/{FrameworkName} - - -**Description** - -Get the FrameworkInfo of a Requested Framework - -FrameworkInfo = SummarizedFrameworkInfo + AggregatedFrameworkRequest + AggregatedFrameworkStatus - -**Response** - -| HttpStatusCode | Body | Description | -|:----------------------- |:------------------------------------------------------------------------------------------------- |:--------------------------------------------------- | -| OK(200) | [FrameworkInfo](../src/main/java/com/microsoft/frameworklauncher/common/model/FrameworkInfo.java) | | -| NotFound(404) | ExceptionMessage | Same as [GET FrameworkStatus](#GET_FrameworkStatus) | -| ServiceUnavailable(503) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | - -#### GET Frameworks - -**Request** - - GET /v1/Frameworks - - -| QueryParameter | Description | -|:-------------- |:---------------------------------------------------------------------------------- | -| UserName | Filter the result to only return Frameworks whose UserName equals the given value. | - -**Description** - -Get the SummarizedFrameworkInfos of all Requested Frameworks - -A Framework's SummarizedFrameworkInfo consists selected fields from its Status and Request - -**Response** - -| HttpStatusCode | Body | Description | -|:----------------------- |:----------------------------------------------------------------------------------------------------------------------- |:--------------------------------------- | -| OK(200) | [SummarizedFrameworkInfos](../src/main/java/com/microsoft/frameworklauncher/common/model/SummarizedFrameworkInfos.java) | | -| BadRequest(400) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | -| Forbidden(403) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | -| ServiceUnavailable(503) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | - -#### GET AggregatedFrameworkStatus - -**Request** - - GET /v1/Frameworks/{FrameworkName}/AggregatedFrameworkStatus - - -**Description** - -Get the AggregatedFrameworkStatus of a Requested Framework - -AggregatedFrameworkStatus = FrameworkStatus + all TaskRoles' (TaskRoleStatus + TaskStatuses) - -TaskStatuses Recipes: - -1. ServiceDiscovery (Based on TaskRoleName, ContainerHostName, ContainerIPAddress, ServiceId) -2. TaskLogForwarding (Based on ContainerLogHttpAddress) -3. MasterSlave and MigrateTask (Based on ContainerId) -4. DataPartition (Based on TaskIndex) (Note TaskIndex will not change after Task Restart, Migrated or Upgraded) - -**Response** - -| HttpStatusCode | Body | Description | -|:----------------------- |:------------------------------------------------------------------------------------------------------------------------- |:--------------------------------------------------- | -| OK(200) | [AggregatedFrameworkStatus](../src/main/java/com/microsoft/frameworklauncher/common/model/AggregatedFrameworkStatus.java) | | -| NotFound(404) | ExceptionMessage | Same as [GET FrameworkStatus](#GET_FrameworkStatus) | -| ServiceUnavailable(503) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | - -#### GET FrameworkRequest - -**Request** - - GET /v1/Frameworks/{FrameworkName}/FrameworkRequest - - -**Description** - -Get the FrameworkRequest of a Requested Framework - -Current [FrameworkDescriptor](../src/main/java/com/microsoft/frameworklauncher/common/model/FrameworkDescriptor.java) for the Framework is included in FrameworkRequest and it can reflect latest updates. - -**Response** - -| HttpStatusCode | Body | Description | -|:----------------------- |:------------------------------------------------------------------------------------------------------- |:--------------------------------------------------- | -| OK(200) | [FrameworkRequest](../src/main/java/com/microsoft/frameworklauncher/common/model/FrameworkRequest.java) | | -| NotFound(404) | ExceptionMessage | Same as [GET FrameworkStatus](#GET_FrameworkStatus) | -| ServiceUnavailable(503) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | - -#### GET AggregatedFrameworkRequest - -**Request** - - GET /v1/Frameworks/{FrameworkName}/AggregatedFrameworkRequest - - -**Description** - -Get the AggregatedFrameworkRequest of a Requested Framework - -AggregatedFrameworkRequest = FrameworkRequest + all other feedback Request - -**Response** - -| HttpStatusCode | Body | Description | -|:----------------------- |:--------------------------------------------------------------------------------------------------------------------------- |:--------------------------------------------------- | -| OK(200) | [AggregatedFrameworkRequest](../src/main/java/com/microsoft/frameworklauncher/common/model/AggregatedFrameworkRequest.java) | | -| NotFound(404) | ExceptionMessage | Same as [GET FrameworkStatus](#GET_FrameworkStatus) | -| ServiceUnavailable(503) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | - -#### GET LauncherRequest - -**Request** - - GET /v1/LauncherRequest - - -**Description** - -Get the LauncherRequest - -**Response** - -| HttpStatusCode | Body | Description | -|:----------------------- |:----------------------------------------------------------------------------------------------------- |:--------------------------------------- | -| OK(200) | [LauncherRequest](../src/main/java/com/microsoft/frameworklauncher/common/model/LauncherRequest.java) | | -| ServiceUnavailable(503) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | - -#### GET LauncherStatus - -**Request** - - GET /v1/LauncherStatus - - -**Description** - -Get the LauncherStatus - -Current [LauncherConfiguration](../src/main/java/com/microsoft/frameworklauncher/common/model/LauncherConfiguration.java) is included in LauncherStatus and it can reflect latest updates. - -**Response** - -| HttpStatusCode | Body | Description | -|:----------------------- |:--------------------------------------------------------------------------------------------------- |:--------------------------------------- | -| OK(200) | [LauncherStatus](../src/main/java/com/microsoft/frameworklauncher/common/model/LauncherStatus.java) | | -| ServiceUnavailable(503) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | - -#### PUT ClusterConfiguration - -**Request** - - PUT /v1/LauncherRequest/ClusterConfiguration - - -Type: application/json - -Body: [ClusterConfiguration](../src/main/java/com/microsoft/frameworklauncher/common/model/ClusterConfiguration.java) - -**Description** - -Update the ClusterConfiguration for all Frameworks on the fly - -Besides the cluster information provided by YARN, Administrator can use this API to provide external information about current cluster configuration, which helps Launcher to schedule Task based on that. And below features depend on it: - -1. taskGpuType - -**Response** - -| HttpStatusCode | Body | Description | -|:----------------------- |:---------------- |:--------------------------------------- | -| Accepted(202) | NULL | Same as [PUT Framework](#PUT_Framework) | -| BadRequest(400) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | -| Forbidden(403) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | -| ServiceUnavailable(503) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | - -#### GET ClusterConfiguration - -**Request** - - GET /v1/LauncherRequest/ClusterConfiguration - - -**Description** - -Get the ClusterConfiguration - -**Response** - -| HttpStatusCode | Body | Description | -|:----------------------- |:--------------------------------------------------------------------------------------------------------------- |:--------------------------------------- | -| OK(200) | [ClusterConfiguration](../src/main/java/com/microsoft/frameworklauncher/common/model/ClusterConfiguration.java) | | -| ServiceUnavailable(503) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | - -#### PUT AclConfiguration - -**Request** - - PUT /v1/LauncherRequest/AclConfiguration - - -Type: application/json - -Body: [AclConfiguration](../src/main/java/com/microsoft/frameworklauncher/common/model/AclConfiguration.java) - -**Description** - -Update the AclConfiguration - -It takes effects immediately after the Response iff webServerAclEnable is true, see [Framework ACL](#Framework_ACL). - -**Response** - -| HttpStatusCode | Body | Description | -|:----------------------- |:---------------- |:--------------------------------------- | -| OK(200) | NULL | | -| BadRequest(400) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | -| Forbidden(403) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | -| ServiceUnavailable(503) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | - -#### GET AclConfiguration - -**Request** - - GET /v1/LauncherRequest/AclConfiguration - - -**Description** - -Get the AclConfiguration - -**Response** - -| HttpStatusCode | Body | Description | -|:----------------------- |:------------------------------------------------------------------------------------------------------- |:--------------------------------------- | -| OK(200) | [AclConfiguration](../src/main/java/com/microsoft/frameworklauncher/common/model/AclConfiguration.java) | | -| ServiceUnavailable(503) | ExceptionMessage | Same as [PUT Framework](#PUT_Framework) | - -## DataModel and FeatureUsage - -You can check the Type, Specification and FeatureUsage inside [Launcher Data Model](../src/main/java/com/microsoft/frameworklauncher/common/model). - -For example: - -A Framework is Defined and Requested by FrameworkDescriptor data structure. To find the FeatureUsage inside FrameworkDescriptor, you can refer the comments inside [FrameworkDescriptor](../src/main/java/com/microsoft/frameworklauncher/common/model/FrameworkDescriptor.java). - -## EnvironmentVariables - -Launcher sets up below EnvironmentVariables for each User Service to use: - -1. Used to locate itself during the whole Framework life cycle. So, they will not be changed after Migration or Restart. - -| EnvironmentVariable | Description | -|:------------------- |:----------- | -| LAUNCHER_ADDRESS | | -| FRAMEWORK_NAME | | -| FRAMEWORK_VERSION | | -| TASKROLE_NAME | | -| TASK_INDEX | | -| SERVICE_NAME | | -| SERVICE_VERSION | | - -2. Used to locate itself during a specific execution attempt. So, they will be changed to a different one after Migration or Restart. - -| EnvironmentVariable | Description | -|:------------------- |:----------------------------------------------- | -| APP_ID | Framework's current associated Application ID. | -| CONTAINER_ID | Task's current associated Container ID. | -| CONTAINER_IP | Task's current associated Container IP address. | - -3. Used to access the Launcher managed public HDFS store. - -| EnvironmentVariable | Description | -|:---------------------------- |:----------------------------------------------------------------------------------------------------- | -| HDFS_USER_STORE_ROOT_DIR | For User to store data under the directory which can be GC automatically after the Framework Deleted. | -| HDFS_FRAMEWORK_INFO_FILE | See HDFS Published Informations: [FrameworkInfo File](#FrameworkInfo_File). | - -4. Used to get the assigned Resource, only valid when corresponding feature is enabled. - -| EnvironmentVariable | Description | -|:------------------- |:----------------------------------------------------------------------------------------------------------------------------------------------- | -| CONTAINER_GPUS | Only valid when gpuNumber is greater than 0. It is a number, each bit of this number represents a Gpu, for example, 3 represents gpu0 and gpu1. | -| CONTAINER_PORTS | Only valid when portDefinitions is not empty. It is a string, a format example is: "portLabel1:port1,port2;portLabel2:port3,port4;". | - -## HDFS Published Informations - -Launcher publishes informations to public HDFS files for User to fetch in a more scalable way than [RestAPI](#RestAPI). - -Notes: - -1. HDFS Published Informations are subsets of [RestAPI](#RestAPI). -2. HDFS Published Informations are mainly used to improve the scalability to fetch informations. For example, fetch from a per Framework HDFS [FrameworkInfo File](#FrameworkInfo_File) is more scalable than fetch from a global single instance LauncherService by [RestAPI](#RestAPI). -3. HDFS Published Informations are not so stable and up-to-date as [RestAPI](#RestAPI), so, Client is suggested to first fetch the HDFS Published Informations, if failed after several retries, then fallback to [RestAPI](#RestAPI). - -### LauncherHDFSRootDir - -Check the hdfsRootDir by [GET LauncherStatus](#GET_LauncherStatus). - -### File Details - -#### FrameworkInfo File - -**HDFS Path** - - /{LauncherHDFSRootDir}/{FrameworkName}/FrameworkInfo.json - - -And it is also set by below EnvironmentVariable, see [EnvironmentVariables](#EnvironmentVariables): - - {HDFS_FRAMEWORK_INFO_FILE} - - -**Description** - -FrameworkInfo File contains the FrameworkInfo of a Requested Framework in Json format as [GET Framework](#GET_Framework). - -Notes: - -1. The FrameworkInfo File may not be up-to-date if the Framework is not in APPLICATION_RUNNING state. So, Client is suggested to only fetch this file inside the Containers of the Framework. - -## Framework Exit Spec -### Predefined Exit Spec -Spec for Framework, App, Task and Container ExitCode: -[FrameworkExitSpec](../src/main/java/com/microsoft/frameworklauncher/common/exit/FrameworkExitSpec.java). - -### Configurable Exit Spec -Spec for Container ExitCode: -[UserContainerExitSpec](../src/main/java/com/microsoft/frameworklauncher/common/model/UserContainerExitSpec.java). - -Example: -[Default UserContainerExitSpec File](../conf/user-container-exit-spec.yml). - -## RetryPolicy - -### Overview - -RetryPolicy can be configured for the whole Framework and each TaskRole to control: - -1. **Framework RetryPolicy**: - The conditions to retry the whole Framework after the Framework's current associated [Application](#Concepts_YARN) completed. - *It can also be considered as **Framework CompletionPolicy**, i.e. the conditions to complete the whole Framework.* - -2. **Task RetryPolicy**: - The conditions to retry a single Task in the TaskRole after the Task's current associated [Container](#Concepts_YARN) completed. - *It can also be considered as **Task CompletionPolicy**, i.e. the conditions to complete a single Task in the TaskRole.* - -### Usage - -For details, please check: [RetryPolicyDescriptor](../src/main/java/com/microsoft/frameworklauncher/common/model/RetryPolicyDescriptor.java), [RetryPolicyState](../src/main/java/com/microsoft/frameworklauncher/common/model/RetryPolicyState.java). - -### Examples - -Notes: - -1. *Italic Conditions* can be inherited from the **DEFAULT** RetryPolicy, so no need to specify them explicitly. -2. For the definition of each ExitType, such as transient failure, see [ExitType](../src/main/java/com/microsoft/frameworklauncher/common/model/ExitType.java). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FrameworkTypeFramework RetryPolicyTaskRoleTask RetryPolicyDescription
DEFAULTFancyRetryPolicy = false
MaxRetryCount = 0
TaskRole1FancyRetryPolicy = false
MaxRetryCount = 0
The default RetryPolicy:
Never Retry for any failure or success.
TaskRole2FancyRetryPolicy = false
MaxRetryCount = 0
ServiceFancyRetryPolicy = false
MaxRetryCount = -2
TaskRole1FancyRetryPolicy = false
MaxRetryCount = -2
Always Retry for any failure or success.
Blind Batch JobFancyRetryPolicy = false
MaxRetryCount = -1
TaskRole1FancyRetryPolicy = false
MaxRetryCount = -1
Always Retry for any failure.
Never Retry for success.
Batch Job with Task Fault ToleranceFancyRetryPolicy = true
MaxRetryCount = 3
TaskRole1FancyRetryPolicy = true
MaxRetryCount = 3
Always Retry for transient failure.
Never Retry for non-transient failure or success.
Retry up to 3 times for unknown failure.
Batch Job without Task Fault ToleranceFancyRetryPolicy = true
MaxRetryCount = 3
TaskRole1FancyRetryPolicy = false
MaxRetryCount = 0
For Framework RetryPolicy, same as "Batch Job with Task Fault Tolerance".
For Task RetryPolicy, because the Task cannot tolerate any failed Container, such as it cannot recover from previous failed Container, so Never Retry Task for any failure or success.
Debug ModeFancyRetryPolicy = true
MaxRetryCount = 0
TaskRole1FancyRetryPolicy = true
MaxRetryCount = 0
Always Retry for transient failure.
Never Retry for non-transient failure or unknown failure or success.
This can help to capture the unexpected exit of User Service itself.
- -## ApplicationCompletionPolicy - -### Overview - -ApplicationCompletionPolicy can be configured for each TaskRole to control: - -1. The conditions to complete the [Application](#Concepts_YARN). -2. The ExitInfo of the completed [Application](#Concepts_YARN). - -### Usage - -For details, please check: [TaskRoleApplicationCompletionPolicyDescriptor](../src/main/java/com/microsoft/frameworklauncher/common/model/TaskRoleApplicationCompletionPolicyDescriptor.java). - -### Examples - -Notes: - -1. *Italic Conditions* can be inherited from the **DEFAULT** ApplicationCompletionPolicy, so no need to specify them explicitly. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FrameworkTypeTaskRoleApplicationCompletionPolicyDescription
DEFAULTTaskRole1MinFailedTaskCount = 1
MinSucceededTaskCount = null
The default ApplicationCompletionPolicy:
Fail the Application immediately if any Task failed.
Succeed the Application until all Tasks succeeded.
TaskRole2MinFailedTaskCount = 1
MinSucceededTaskCount = null
ServiceTaskRole1MinFailedTaskCount = 1
MinSucceededTaskCount = null
Actually, any ApplicationCompletionPolicy is fine, since Service's Task will never complete, i.e. its Task's MaxRetryCount is -2, see RetryPolicy Examples.
MapReduceMapMinFailedTaskCount = {Map.TaskNumber} * {mapreduce.map.failures.maxpercent} + 1
MinSucceededTaskCount = null
A few failed Tasks is acceptable, but always want to wait all Tasks to succeed:
Fail the Application immediately if the failed Tasks exceeded the limit.
Succeed the Application until all Tasks completed and the failed Tasks is within the limit.
ReduceMinFailedTaskCount = {Reduce.TaskNumber} * {mapreduce.reduce.failures.maxpercent} + 1
MinSucceededTaskCount = null
TensorFlowParameterServerMinFailedTaskCount = 1
MinSucceededTaskCount = null
Succeed a certain TaskRole is enough, and do not want to wait all Tasks to succeed:
Fail the Application immediately if any Task failed.
Succeed the Application immediately if Worker's all Tasks succeeded.
WorkerMinFailedTaskCount = 1
MinSucceededTaskCount = {Worker.TaskNumber}
Arbitrator DominatedArbitratorMinFailedTaskCount = 1
MinSucceededTaskCount = 1
The ApplicationCompletionPolicy is fully delegated to the Application's single instance arbitrator:
Fail the Application immediately if the arbitrator failed.
Succeed the Application immediately if the arbitrator succeeded.
TaskRole1MinFailedTaskCount = null
MinSucceededTaskCount = null
TaskRole2MinFailedTaskCount = null
MinSucceededTaskCount = null
First Completed Task DominatedTaskRole1MinFailedTaskCount = 1
MinSucceededTaskCount = 1
The ApplicationCompletionPolicy is fully delegated to the Application's first completed Task:
Fail the Application immediately if any Task failed.
Succeed the Application immediately if any Task succeeded.
- -## StateMachine - -### FrameworkStateMachine - -

- FrameworkStateMachine -

- -### TaskStateMachine - -

- TaskStateMachine -

- -## Framework ACL - -### Overview - -Framework ACL specifies which Users/Groups are able to access a specific FrameworkName, no matter the FrameworkName exists or not. So, essentially, it is the ACL for Users/Groups against FrameworkName's Namespace. - -Framework ACL helps to: - -1. Avoid one User/Group to occupy the FrameworkName (by Add Framework) reserved for other User/Group. -2. Avoid one User/Group to modify the Framework (by Update Framework) launched by other User/Group. - -### Assumption - -1. No naming conflict among UserNames and GroupNames. -2. UserNames and GroupNames satisfy regex ^[A-Za-z0-9\\-._]{1,254}$. - -### Usage - -Framework ACL is enabled iff the webServerAclEnable is true, check it by [GET LauncherStatus](#GET_LauncherStatus). - -1. If it is disabled, any User/Group can Read and Write the whole namespace. We assume it is enabled for simplicity below. -2. Administrator can always Read and Write the whole namespace, this fact will be omitted for simplicity below. - -**Namespace Privilege**: - -Namespace Write Privilege: Add or Update Framework in the Namespace - -Namespace Read Privilege: Get Framework in the Namespace - -**Namespace Mechanism**: - - {Namespace}~(AnyName) - - -1. It is pre-created, so no need to create the namespace in advance. -2. All Users/Groups can Read the namespace. -3. Initially, only the User named {Namespace} can Write the namespace. To grant the Write Privilege to more Users, see [PUT AclConfiguration](#PUT_AclConfiguration). -4. Based on the Assumption and Namespace Mechanism, the suggested Usage Pattern for Users/Groups can be derived below. - -### Best Practices: Usage Pattern - -**User Usage Pattern**: - -The private namespace for the User named {UserName} is: - - {UserName}~(AnyName) - - -1. It is pre-created, so no need to create the namespace in advance. -2. Only this User can Write the namespace. However, all other Users/Groups can Read the namespace. - -For example, User UA can fully control the namespace: - - UA~(AnyName) - - -**Group Usage Pattern**: - -The private namespace for the Group named {GroupName} is: - -The shared namespace for the Users belongs to {GroupName} is: - - {GroupName}~(AnyName) - - -1. It is pre-created, so no need to create the namespace in advance. -2. Initially, no User can Write the namespace. Administrator needs to add the UserNames belongs to the {GroupName} to the namespace {GroupName}, see [PUT AclConfiguration](#PUT_AclConfiguration). Only then, these Users can Write the namespace. However, all other Users/Groups can Read the namespace. - -For example, Administrator adds User UA and UB belongs to Group GA to the namespace GA, and then UA and UB can work together to fully control the namespace: - - GA~(AnyName) - - -### Best Practices: Naming within Namespace - -Launcher does not enforce Users/Groups how to further partition his private namespace or how to avoid naming conflict within his private namespace. Different Users/Groups might choose to use his private namespace differently, depending on their exact requirement, scenario and assumption. - -So, here, we just provide the best practices for two scenarios: - -**Batch Framework**: - -Batch Framework User tends to Add a new Framework each time instead of Update the existing one. - -So, he should ensure the name is not reused within his private namespace each time to call [PUT Framework](#PUT_Framework). - -**Service Framework**: - -Service Framework User tends to frequently Update the existing Framework instead of Add a new one. And he tends to specify a well-known name which he might want to expose to the Users of the Service itself. - -So, he should ensure the name is reused within his small set well-known Services each time to call [PUT Framework](#PUT_Framework). - -Anyway, If he really want to ensure to Add a new one, he needs to check his small set well-known Services, and then pick a new one. - -## Best Practices - -1. The **Initial Working Directory** of your EntryPoint is the root directory of the EntryPoint. Your Service can read data anywhere, however it can ONLY write data under the Initial Working Directory with the Service Directory excluded. And if the Source is a **ZIP file**, it will be uncompressed before starting your Service. For example: - - EntryPoint=HbaseRS.zip/start.bat - SourceLocations=hdfs:///HbaseRS.zip, hdfs:///HbaseCom <- HbaseRS.zip is a ZIP file - - - The two Sources HbaseRS.zip and HbaseCom will be downloaded (and uncompressed) to local node as below structure: - - ./ <- The Initial Working Directory - ├─HbaseRS.zip <- Service Directory <- HbaseRS.zip is a directory uncompressed from original ZIP file - └─HbaseCom <- Service Directory - - -2. Launcher may restart the exited Service on another node even if the original node is free and healthy. So, if you want to always restart the exited Service on the same node, you need to **warp the original EntryPoint** by another script, such as: - - while true; do - # call the original EntryPoint - done - - -3. Increase the replication number your data and binary on target HDFS (Higher ReplicationNumber means faster downloading, higher availability and higher durability). - - hadoop fs -setrep -w - - -4. Do not modify your data and binary on target HDFS. To use new data and binary, upload them to a different HDFS Path and then change the FrameworkVersion and SourceLocations. \ No newline at end of file