diff --git a/doc/ELASTIC_CTR.rst b/doc/ELASTIC_CTR.rst new file mode 100644 index 0000000000000000000000000000000000000000..97198c5ca1dafc5ed25358b8b96dd32e927c14f8 --- /dev/null +++ b/doc/ELASTIC_CTR.rst @@ -0,0 +1,280 @@ +.. _deploy_ctr_on_baidu_cloud_cn: + +百度云分布式训练CTR +========================= + +1. 总体概览 +---------------- + +.. image:: elastic_ctr/overview.png + +本项目提供了端到端的CTR训练和二次开发的解决方案,它具有如下特点。 + +- 使用K8S集群解决来解决原来在物理集群上训练时,会出现类似于配置参数冗杂,环境搭建繁复等问题。 +- 使用基于Kube-batch开发的Volcano框架来进行任务提交和弹性调度。 +- 使用Paddle Serving来进行模型的上线和预测。 +- 使用Cube作为稀疏参数的分布式存储,在预测对接Paddle Serving使用。 + +以上组件就可以一键完成从训练到部署的所有流程。 + +此外,我们在各个环节也提供了二次开发的指导。具体有如下方式 + +- 指定数据集的输入和读取方式,来feed不同的数据集和数据集格式 +- 通过指定训练的规模,包括参数服务器的数量和训练节点的数量。 +- 通过指定Cube参数服务器的分片数量和副本数量。 +- 指定Serving的模型信息 + + +2. 创建集群 +---------------- +具体请参考 `帮助文档 `_ 说明文档来建立一个集群。 + +集群配置需要满足如下要求 + +- CPU核数 > 4 + +示例图 + +.. image:: elastic_ctr/ctr_node.png + +创建完成后,即可查看 `集群信息 `_ 。 + + + +3. 操作集群 +---------------- +集群的操作可以通过百度云web或者通过kubectl工具进行,推荐用 `kubectl工具 `_ 。 + +从Kubernetes 版本下载页面下载对应的 kubectl 客户端,关于kubectl 的其他信息,可以参见kubernetes官方安装和设置 kubectl文档。 + +.. image:: elastic_ctr/ctr_kubectl_download.png + +* 注意: +本操作指南给出的操作步骤都是基于linux操作环境的。 + +- 解压下载后的文件,为kubectl添加执行权限,并放在PATH下 + +.. code-block:: bash + + cd kubernetes/client/bin && chmod +x ./kubectl && sudo mv ./kubectl /usr/local/bin/kubectl + +- 配置kubectl,下载集群凭证。在集群界面下载集群配置文件,放在kubectl的默认配置路径(请检查~/.kube 目录是否存在,若没有请创建) + +.. code-block:: bash + + mv kubectl.conf ~/.kube/config + +- 配置完成后,您即可以使用 kubectl 从本地计算机访问 Kubernetes 集群 + +.. code-block:: bash + + kubectl get node + + + +4. 部署任务 +---------------- + +安装Volcano +>>>>>>>>>>>>> + +执行 + +.. code-block:: bash + + kubectl apply -f https://raw.githubusercontent.com/volcano-sh/volcano/master/installer/volcano-development.yaml + +.. image:: elastic_ctr/ctr_volcano_install.png + + +一键完成部署 +>>>>>>>>>>>>>> + +执行 + +.. code-block:: bash + + bash paddle-suite.sh + +为方便理解,接下来会将该脚本的每一步执行过程给出说明 + + +任务的所有脚本文件可以访问 `这里 `_ 获取。 + +选择一个node作为输出节点 +::::::::::::: + +.. code-block:: bash + + kubectl label nodes $NODE_NAME nodeType=model + + +这句话的意思是给这个node做一个标记,之后的文件服务和模型产出都被强制分配在这个node上进行,把NAME的一串字符 替换 $NODE_NAME即可。 + +启动文件服务器 +:::::::::::: + +.. code-block:: bash + + kubectl apply -f fileserver.yaml + +运行file server的启动脚本kubectl apply -f ftp.yaml,启动文件服务器 + +.. image:: elastic_ctr/file_server_pod.png + +.. image:: elastic_ctr/file_server_svc.png + +启动Cube稀疏参数服务器 +::::::::::: + +.. code-block:: bash + + kubectl apply -f cube.yaml + +如果在Service中发现了cube-0/1,在kubectl get svc中发现了相关的服务,则说明cube server/agent启动成功。 + +.. image:: elastic_ctr/cube.png + +启动Paddle Serving +::::::::::: + +.. code-block:: bash + + kubectl apply -f paddleserving.yaml + +如果在Service中发现了paddle serving,在kubectl get svc中发现了相关的服务,则说明paddle serving启动成功。 + +.. image:: elastic_ctr/paddleserving_pod.png + +.. image:: elastic_ctr/paddleserving_svc.png + +启动Cube稀疏参数服务器配送工具 +::::::::::::: + +.. code-block:: bash + + kubectl apply -f transfer.yaml + +.. image:: elastic_ctr/transfer.png + +这个cube-transfer配送工具会把训练好的模型从下面要介绍的edl-demo-trainer-0上通过file server拉取,再进行装载。最终目的是给Paddle Serving来进行稀疏参数查询。如果出现最后wait 5 min这样的字样,说明上一轮的模型已经配送成功了,接下来就可以做最后Paddle Serving的测试了。 + +执行 Paddle CTR 分布式训练 +:::::::::::::: + +.. code-block:: bash + + kubectl apply -f ctr.yaml + +接下来需要等待一段时间,我们可以通过kubectl logs edl-demo-trainer-0来查看训练的进度,如果pass 一直为0就继续等待,通常需要大概3-5分钟的之间会完成第一轮pass,这时候就会生成inference_model。 + +.. image:: elastic_ctr/ctr.png + + +5. 查看结果 +---------------- + +查看训练日志 +>>>>>>>>>>>> + +百度云容器引擎CCE提供了web操作台方便查看pod的运行状态。 + +本次训练任务将启动3个pserver节点,3个trainer节点。 + +可以通过检查pserver和trainer的log来检查任务运行状态。 +Trainer日志示例: + +.. image:: elastic_ctr/ctr_trainer_log.png + +pserver日志示例: + +.. image:: elastic_ctr/ctr_pserver_log.png + +验证Paddle Serving预测结果 +>>>>>>>>>>>> + +执行 + +.. code-block:: bash + + kubectl apply -f paddleclient.yaml + +在/client/ctr_prediction目录下,执行 + +.. code-block:: bash + + bin/ctr_prediction + +如果运行正常的话,会在一段时间后退出,紧接着就可以在log/ctr_prediction.INFO的最后几行看到类似于这样的日志 + +.. image:: elastic_ctr/paddleclient.png + +6. 二次开发指南 +---------------- + +指定数据集的输入和读取方式 +>>>>>>>>>>>> + +现有的数据的输入是从edldemo镜像当中的/workspace/ctr/data/download.sh目录进行下载。下载之后会解压在/workspace/ctr/data/raw文件夹当中,包含train.txt和test.txt。所有的数据的每一行通过空格隔开40个属性。 + +然后在train.py当中给出数据集的读取方式 + +.. image:: elastic_ctr/pyreader.png + +这里面包含了连续数据和离散数据。 +连续数据是index [1, 14),离散数据是index [14, 40),label是index 0,分别对应最后yield [dense_feature] + sparse_feature + [label]。当离散的数据和连续的数据格式和样例有不同,需要用户在这里进行指定,并且可以在__init__函数当中参考样例的写法对连续数据进行归一化。 + +对于数据的来源,文章给出的是download.sh从Criteo官方去下载数据集,然后解压后放在raw文件夹。 + +可以用HDFS/AFS或是其他方式来配送数据集,在启动项中加入相关命令。 + +在改动之后,记得保存相关的docker镜像并推送到云端 + + +.. code-block:: bash + + docker commit ${DOCKER_CONTAINER_NAME} ${DOCKER_IMAGE_NAME} + docker push ${DOCKER_IMAGE_NAME} + +也可以在Dockerfile当中进行修改 + +.. code-block:: bash + + docker build -t ${DOCKER_IMAGE_NAME} . + docker push ${DOCKER_IMAGE_NAME} + +指定训练规模 +>>>>>>>>>>>> + +在ctr.yaml文件当中,我们会发现这个是在volcano的框架下定义的Job。在Job里面,我们给出了很多Pserver和Trainer的定义,在总体的Job也给出了MinAvailable数量的定义。Pserver和Trainer下面有自己的Replicas,环境变量当中有PSERVER_NUM和TRAINER_MODEL和TRAINER_NUM的数量。通常MinAvailable = PServer Num + Trainer Num,这样我们就可以启动相应的服务。 + +.. image:: elastic_ctr/ctryaml1.png + +如上图所示,我们需要在min_available处设置合理的数字。例如一个POD占用一个CPU,那么我们就要对集群的总CPU数有一个预估,不要过于接近或事超过集群CPU总和的上限。否则无法满足Volcano的Gang-Schedule机制,就会出现无法分配资源,一直处于Pending的情况。然后第二个红框当中是 + +.. image:: elastic_ctr/ctryaml2.png + +如上图所示,这个部分是用来专门做模型的输出,这里我们不需要做任何的改动,只要保留一个副本就可以。 + +.. image:: elastic_ctr/ctryaml3.png + +如上图所示 + +指定cube参数服务器的分片数量和副本数量 +>>>>>>>>>>>> + +在cube.yaml文件当中,我们可以看到每一个cube的节点的定义,有一个cube server pod和cube server service。如果我们需要增加cube的副本数和分片数,只需要在yaml文件中复制相关的定义和环境变量即可。 + +.. image:: elastic_ctr/cube_config1.png + +.. image:: elastic_ctr/cube_config2.png + +以上两个图片,一个是对cube POD的定义,一个是对cube SERVICE的定义。如果需要扩展Cube分片数量,可以复制POD和SERVICE的定义,并重命名它们。示例程序给出的是2个分片,复制之后第3个可以命名为cube-2。 + + +Serving适配新的模型 +>>>>>>>>>>>>>> + +在本示例中,所有训练的模型,都可以自动地被Serving获取,但是,我们如果需要别的模型,就需要自行去配置相关的信息。具体可以参见 `Serving从零开始写一个预测服务 `_ + + diff --git a/doc/elastic_ctr/ctr.png b/doc/elastic_ctr/ctr.png new file mode 100644 index 0000000000000000000000000000000000000000..fea2d8e2591ba4ce05ffdffcf95526d1d5dada0e Binary files /dev/null and b/doc/elastic_ctr/ctr.png differ diff --git a/doc/elastic_ctr/ctr_kubectl_download.png b/doc/elastic_ctr/ctr_kubectl_download.png new file mode 100644 index 0000000000000000000000000000000000000000..b87395a1f19e90d30644a1e28b9e434dda3545ab Binary files /dev/null and b/doc/elastic_ctr/ctr_kubectl_download.png differ diff --git a/doc/elastic_ctr/ctr_node.png b/doc/elastic_ctr/ctr_node.png new file mode 100644 index 0000000000000000000000000000000000000000..9a43c4257316e3bd2879f10a49d0edb74a41d7d7 Binary files /dev/null and b/doc/elastic_ctr/ctr_node.png differ diff --git a/doc/elastic_ctr/ctr_pods.png b/doc/elastic_ctr/ctr_pods.png new file mode 100644 index 0000000000000000000000000000000000000000..5e836b2490a978dd3d3664d08e5a4c056fed52a7 Binary files /dev/null and b/doc/elastic_ctr/ctr_pods.png differ diff --git a/doc/elastic_ctr/ctr_pserver_log.png b/doc/elastic_ctr/ctr_pserver_log.png new file mode 100644 index 0000000000000000000000000000000000000000..189b40e4f65c49c6e1bfec219759433c683b1ee4 Binary files /dev/null and b/doc/elastic_ctr/ctr_pserver_log.png differ diff --git a/doc/elastic_ctr/ctr_trainer_log.png b/doc/elastic_ctr/ctr_trainer_log.png new file mode 100644 index 0000000000000000000000000000000000000000..303e2b1ee95802b16daa35e4cad5a283922504b9 Binary files /dev/null and b/doc/elastic_ctr/ctr_trainer_log.png differ diff --git a/doc/elastic_ctr/ctr_volcano_install.png b/doc/elastic_ctr/ctr_volcano_install.png new file mode 100644 index 0000000000000000000000000000000000000000..536fd4b3a68184316b9b96c488b48b7e6403a28b Binary files /dev/null and b/doc/elastic_ctr/ctr_volcano_install.png differ diff --git a/doc/elastic_ctr/ctryaml1.png b/doc/elastic_ctr/ctryaml1.png new file mode 100644 index 0000000000000000000000000000000000000000..d5268a27a4ab4de76c5383d95fd5625f7ace4de3 Binary files /dev/null and b/doc/elastic_ctr/ctryaml1.png differ diff --git a/doc/elastic_ctr/ctryaml2.png b/doc/elastic_ctr/ctryaml2.png new file mode 100644 index 0000000000000000000000000000000000000000..d93e55ec07ec289b8c4d008a311f477e6cfd539a Binary files /dev/null and b/doc/elastic_ctr/ctryaml2.png differ diff --git a/doc/elastic_ctr/ctryaml3.png b/doc/elastic_ctr/ctryaml3.png new file mode 100644 index 0000000000000000000000000000000000000000..c0b75395924719b16d68c3eb124d90f7497ee300 Binary files /dev/null and b/doc/elastic_ctr/ctryaml3.png differ diff --git a/doc/elastic_ctr/cube.png b/doc/elastic_ctr/cube.png new file mode 100644 index 0000000000000000000000000000000000000000..0757421c20c84c1e0df61454902e4c24cd655df7 Binary files /dev/null and b/doc/elastic_ctr/cube.png differ diff --git a/doc/elastic_ctr/cube_config1.png b/doc/elastic_ctr/cube_config1.png new file mode 100644 index 0000000000000000000000000000000000000000..188c4214460814a67d0eafa3cf1af18ded4340fa Binary files /dev/null and b/doc/elastic_ctr/cube_config1.png differ diff --git a/doc/elastic_ctr/cube_config2.png b/doc/elastic_ctr/cube_config2.png new file mode 100644 index 0000000000000000000000000000000000000000..9b5a171e39303f373dbf31f6204baa913cec7130 Binary files /dev/null and b/doc/elastic_ctr/cube_config2.png differ diff --git a/doc/elastic_ctr/file_server_pod.png b/doc/elastic_ctr/file_server_pod.png new file mode 100644 index 0000000000000000000000000000000000000000..8086e889ee41d0525025edc4873a0024e4478ae7 Binary files /dev/null and b/doc/elastic_ctr/file_server_pod.png differ diff --git a/doc/elastic_ctr/file_server_svc.png b/doc/elastic_ctr/file_server_svc.png new file mode 100644 index 0000000000000000000000000000000000000000..90bfd0c8f1e378874e6dd5859dbda76ecd554265 Binary files /dev/null and b/doc/elastic_ctr/file_server_svc.png differ diff --git a/doc/elastic_ctr/overview.png b/doc/elastic_ctr/overview.png new file mode 100644 index 0000000000000000000000000000000000000000..66de7cd6571f64430db1cc0becd325287ffe5119 Binary files /dev/null and b/doc/elastic_ctr/overview.png differ diff --git a/doc/elastic_ctr/paddleclient.png b/doc/elastic_ctr/paddleclient.png new file mode 100644 index 0000000000000000000000000000000000000000..69157cd8327712a860e47934a124233bc88ffe60 Binary files /dev/null and b/doc/elastic_ctr/paddleclient.png differ diff --git a/doc/elastic_ctr/paddleserving_pod.png b/doc/elastic_ctr/paddleserving_pod.png new file mode 100644 index 0000000000000000000000000000000000000000..6dfddfd17059f1583f6219a4fca56280ef5089c8 Binary files /dev/null and b/doc/elastic_ctr/paddleserving_pod.png differ diff --git a/doc/elastic_ctr/paddleserving_svc.png b/doc/elastic_ctr/paddleserving_svc.png new file mode 100644 index 0000000000000000000000000000000000000000..e4f34095053692ff3b01bd0aa4e40b2830b145d8 Binary files /dev/null and b/doc/elastic_ctr/paddleserving_svc.png differ diff --git a/doc/elastic_ctr/pyreader.png b/doc/elastic_ctr/pyreader.png new file mode 100644 index 0000000000000000000000000000000000000000..2c887f5705e17eafcd0bf58c045721572c252a24 Binary files /dev/null and b/doc/elastic_ctr/pyreader.png differ diff --git a/doc/elastic_ctr/transfer.png b/doc/elastic_ctr/transfer.png new file mode 100644 index 0000000000000000000000000000000000000000..4a48e4313dd7cadf399ca7c7d056eeacffc66465 Binary files /dev/null and b/doc/elastic_ctr/transfer.png differ diff --git a/readme.md b/readme.md index 5191dd5cfbbe4d8abbb5d72e7a876bd7e267c807..e7a3c7dd6e98bed7e9c4a8a048947703deef4d7b 100644 --- a/readme.md +++ b/readme.md @@ -1,3 +1,4 @@ # Paddle Serving Github 项目主页 -[PaddlePaddle分布式训练和Serving流程化部署](./doc/DEPLOY.md) +[PaddlePaddle分布式训练和Serving流程化部署](./doc/DEPLOY.md) +[百度云分布式训练CTR](./doc/ELASTIC_CTR.rst)