From 0429acb6433bc37bbba701650097095704af9092 Mon Sep 17 00:00:00 2001 From: Jiawei Wang Date: Wed, 14 Aug 2019 01:25:56 +0800 Subject: [PATCH] Reorder the context, move http file server to 1.4 --- doc/DEPLOY.md | 145 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 94 insertions(+), 51 deletions(-) diff --git a/doc/DEPLOY.md b/doc/DEPLOY.md index affa8dc6..37dca602 100644 --- a/doc/DEPLOY.md +++ b/doc/DEPLOY.md @@ -10,11 +10,11 @@ * [1.2.3 配置文件](#head7) * [1.2.4 安装Go](#head8) * [ 1.3 安装volcano](#head9) - * [1.4 执行训练](#head10) - * [1.5 模型产出](#head11) - * [1.5.1 模型裁剪,产出预测ProgramDesc和dense参数](#head12) - * [1.5.2 稀疏参数产出](#head13) - * [1.5.3 搭建HTTP File Server服务](#head14) + * [1.4 搭建HTTP File Server服务](#head91) + * [1.5 执行训练](#head10) + * [1.6 模型产出](#head11) + * [1.6.1 模型裁剪,产出预测ProgramDesc和dense参数](#head12) + * [1.6.2 稀疏参数产出](#head13) * [2. 大规模稀疏参数服务Cube的部署和使用](#head15) * [2.1 编译](#head16) * [2.2 分片cube server/agent部署](#head17) @@ -201,7 +201,89 @@ kubectl apply -f https://raw.githubusercontent.com/volcano-sh/volcano/master/ins ![volcano](./deploy/volcano.png) -### 1.4 执行训练 +### 1.4 搭建HTTP File Server服务 + +无论是dense参数还是Sparse参数,在生成之后,都需要以某种方式将文件服务暴露出来。dense参数需要配送给Paddle Serving,稀疏参数需要配速给Cube大规模稀疏参数服务器。 + +配送的方式是通过K8S集群建立一个Http file server的pod,再通过注册负载均衡 load balancer service,映射file server的port给load balancer,最终可以直接通过公网IP:Port的方式来访问HTTP File Server。 + + + +fileserver.yaml 一同包含两个部分,第一个是file server pod的配置,这样可以启动file server的docker镜像,并暴露文件服务端口。第二个是load balancer的配置,这样可以启动load balancer分配公网IP并且映射文件服务端口给公网。 [fileserver.yaml](./resource/fileserver.yaml) 文件示例如下: +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: file-server + labels: + app: file-server +spec: + volumes: + - hostPath: + path: /home/work + type: "" + name: file-home + containers: + - name: file-server + image: halverneus/static-file-server + ports: + - containerPort: 8080 + volumeMounts: + - mountPath: /web + name: file-home + nodeSelector: + nodeType: model +--- +kind: Service +apiVersion: v1 +metadata: + name: loadbalancer +spec: + type: LoadBalancer + ports: + - name: file-server + port: 8080 + targetPort: 8080 + selector: + app: file-server +``` + +具体步骤如下 + +执行 + +```bash +kubectl apply -f fileserver.yaml +``` + +两项配置都执行成功之后,执行 + +```bash +kubectl get pod +``` + +会显示file-server,如下图所示。 + +![file_server](./deploy/file_server.png) + +```bash +kubectl get service +``` + +会显示load balancer,如下图所示。 + +![load_balancer](./deploy/load_balancer.png) + +其中External IP就是文件服务的公网IP,我们可以在任意一台可以连接公网的计算机上,输入wget http://IP:Port 。例如图片中的示例,输入wget http://180.76.113.149:8080 。 + +如果显示下载了 index.html + +![wget_example](./deploy/wget_example.png) + +就说明服务搭建成功。 + + +### 1.5 执行训练 创建cluster role和service account,[defaultserviceaccountclusterrole.yaml](./resource/defaultserviceaccountclusterrole.yaml) 文件示例如下: @@ -258,11 +340,11 @@ kubectl apply -f volcano-ctr-demo-baiduyun.yaml ![工作负载](./deploy/workload.png) -### 1.5 模型产出 +### 1.6 模型产出 -CTR预估模型包含了embedding部分以及dense神经网络两部分,其中embedding部分包含的稀疏参数较多,在某些场景下单机的资源难以加载整个模型,因此需要将这两部分分割开来,稀疏参数部分放在分布式的稀疏参数服务,dense网络部分加载到serving服务中。在本文中使用的CTR模型训练镜像中已经包含了模型裁剪和稀疏参数产出的脚本,以下简述其原理和工作过程。 +CTR预估模型包含了embedding部分以及dense神经网络两部分,其中embedding部分包含的稀疏参数较多,在某些场景下单机的资源难以加载整个模型,因此需要将这两部分分割开来,稀疏参数部分放在分布式的稀疏参数服务,dense网络部分加载到serving服务中,稀疏参数和dense网络都需要通过http file server服务来进行配送(详见本文"1.4 搭建HTTP File Server服务"一节)。在本文中使用的CTR模型训练镜像中已经包含了模型裁剪和稀疏参数产出的脚本,以下简述其原理和工作过程。 -#### 1.5.1 模型裁剪,产出预测ProgramDesc和dense参数 +#### 1.6.1 模型裁剪,产出预测ProgramDesc和dense参数 产出用于paddle serving预测服务的dense模型需要对保存的原始模型进行裁剪操作,修改模型的输入以及内部结构。具体原理和操作流程请参考文档[改造CTR预估模型用于大规模稀疏参数服务演示](https://github.com/PaddlePaddle/Serving/blob/develop/doc/CTR_PREDICTION.md)。 @@ -271,56 +353,17 @@ CTR预估模型包含了embedding部分以及dense神经网络两部分,其中 1. 监视训练脚本所在目录的models文件夹,当发现有子目录`pass-1000`时,表示训练任务完成 (默认训练轮次为1000) 2. 调用save_program.py,生成一个适用于预测的ProgramDesc保存到models/inference_only目录,并将所需参数一并保存到该子目录下 3. 调用replace_params.py,用models/pass-1000目录下参数文件替换models/inference_only目录下同名参数文件 -4. 打包models/inference_only生成ctr_model.tar.gz,放到HTTP服务目录下,供外部用户手动下载,并替换到Serving的data/models/paddle/fluid/ctr_prediction目录中 (详见本文“预测服务部署”一节) +4. 打包models/inference_only生成ctr_model.tar.gz,放到HTTP服务目录下(详见本文"1.4 搭建HTTP File Server服务"一节),供外部用户手动下载,并替换到Serving的data/models/paddle/fluid/ctr_prediction目录中 (详见本文“预测服务部署”一节) -#### 1.5.2 稀疏参数产出 +#### 1.6.2 稀疏参数产出 分布式稀疏参数服务由paddle serving的Cube模块实现。Cube服务接受的原始数据格式为Hadoop seqfile格式,因此需要对paddle保存出的模型文件进行格式转换。 在trainer镜像中,将模型参数转换为seqfile的主要流程是: 1. 监视训练脚本所在目录的models文件夹,当发现有子目录`pass-1000`时,表示训练任务完成 (默认训练轮次为1000) -2. 调用dumper.py,将models/pass-1000/SparseFeatFactors文件转换成seqfile格式,同时生成一个用于让下游cube-transfer下载完整数据的donefile文件,整个目录结构放到HTTP服务目录下,供下游cube-transfer监听进程检测和下载 (详见本文“大规模稀疏参数服务Cube的部署和使用”一节) - -#### 1.5.3 搭建HTTP File Server服务 - -无论是dense参数还是Sparse参数,在生成之后,都需要以某种方式将文件服务暴露出来。dense参数需要配送给Paddle Serving,稀疏参数需要配速给Cube大规模稀疏参数服务器。 - -配送的方式是通过K8S集群建立一个Http file server的pod,再通过注册负载均衡 load balancer service,映射file server的port给load balancer,最终可以直接通过公网IP:Port的方式来访问HTTP File Server。 - -具体步骤如下 - -执行 - -```bash -kubectl apply -f fileserver.yaml -``` - -fileserver.yaml 一同包含两个部分,第一个是file server pod的配置,这样可以启动file server的docker镜像,并暴露文件服务端口。第二个是load balancer的配置,这样可以启动load balancer分配公网IP并且映射文件服务端口给公网。 - -两项配置都执行成功之后,执行 +2. 调用dumper.py,将models/pass-1000/SparseFeatFactors文件转换成seqfile格式,同时生成一个用于让下游cube-transfer下载完整数据的donefile文件,整个目录结构放到HTTP服务目录下(详见本文"1.4 搭建HTTP File Server服务"一节),供下游cube-transfer监听进程检测和下载 (详见本文“大规模稀疏参数服务Cube的部署和使用”一节) -```bash -kubectl get pod -``` - -会显示file-server,如下图所示。 - -![file_server](./deploy/file_server.png) - -```bash -kubectl get service -``` - -会显示load balancer,如下图所示。 -![load_balancer](./deploy/load_balancer.png) - -其中External IP就是文件服务的公网IP,我们可以在任意一台可以连接公网的计算机上,输入wget http://IP:Port 。例如图片中的示例,输入wget http://180.76.113.149:8080 。 - -如果显示下载了 index.html -![wget_example](./deploy/wget_example.png) - -就说明服务搭建成功。 ## 2. 大规模稀疏参数服务Cube的部署和使用 -- GitLab