Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
Serving
提交
71a470d0
S
Serving
项目概览
PaddlePaddle
/
Serving
大约 1 年 前同步成功
通知
186
Star
833
Fork
253
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
105
列表
看板
标记
里程碑
合并请求
10
Wiki
2
Wiki
分析
仓库
DevOps
项目成员
Pages
S
Serving
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
105
Issue
105
列表
看板
标记
里程碑
合并请求
10
合并请求
10
Pages
分析
分析
仓库分析
DevOps
Wiki
2
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
71a470d0
编写于
8月 09, 2019
作者:
M
MRXLT
提交者:
GitHub
8月 09, 2019
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request
#1
from PaddlePaddle/master
update from origin
上级
a28beb3a
270c54f6
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
220 addition
and
52 deletion
+220
-52
doc/DEPLOY.md
doc/DEPLOY.md
+220
-52
未找到文件。
doc/DEPLOY.md
浏览文件 @
71a470d0
...
...
@@ -55,16 +55,16 @@
![
PaddlePaddle分布式训练和Serving流程化部署拓扑
](
./deploy/ctr-prediction-end-to-end-deployment.png
)
其中:
1
)
分布式训练集群在百度云k8s集群上搭建,并通过
[
volcano
](
https://volcano.sh/
)
提交分布式训练任务和资源管理
2
)
分布式训练产出dense参数和ProgramDesc,通过http服务直接下载到Serving端,给Serving加载
3
)
分布式训练产出sparse embedding,由于体积太大,通过cube稀疏参数服务提供给serving访问
4
)
在线预测时,Serving通过访问cube集群获取embedding数据,与dense参数配合完成预测计算过程
1
.
分布式训练集群在百度云k8s集群上搭建,并通过
[
volcano
](
https://volcano.sh/
)
提交分布式训练任务和资源管理
2
.
分布式训练产出dense参数和ProgramDesc,通过http服务直接下载到Serving端,给Serving加载
3
.
分布式训练产出sparse embedding,由于体积太大,通过cube稀疏参数服务提供给serving访问
4
.
在线预测时,Serving通过访问cube集群获取embedding数据,与dense参数配合完成预测计算过程
以下从3部分分别介绍上图中各个组件:
1
)
分布式训练集群和训练任务提交
2
)
稀疏参数服务部署与使用
3
)
Paddle Serving的部署
4
)
客户端访问Paddle Serving完成CTR预估任务预测请求
1
.
分布式训练集群和训练任务提交
2
.
稀疏参数服务部署与使用
3
.
Paddle Serving的部署
4
.
客户端访问Paddle Serving完成CTR预估任务预测请求
## <span id="head0"> 环境配置</span>
**环境要求**
:helm、kubectl、go
...
...
@@ -274,16 +274,16 @@ python dumper.py --model_path=xxx --output_data_path=xxx
**注意事项:**
文档中使用的CTR模型训练镜像中已经包含了模型裁剪以及稀疏参数产出的脚本,并且搭建了一个http服务用于从外部获取产出的dense模型以及稀疏参数文件。
## <span id="head15"> 大规模稀疏参数服务Cube的部署和使用</span>
Cube大规模稀疏参数服务服务组件,用于承载超大规模稀疏参数的查询、更新等各功能。上述分布式训练产出的稀疏参数,在k8s中以http文件服务的形式提供下载;cube则负责将稀疏参数读取、加工,切分成多个分片,灌入稀疏参数服务集群,提供对外访问。
Cube一共拆分成
三
个组件,共同完成上述工作:
Cube一共拆分成
四
个组件,共同完成上述工作:
1) cube-transfer 负责监听上游数据产出,当判断到数据更新时,将数据下载到cube-builder建库端
2) cube-builder 负责从上游数据构建cube内部索引格式,并切分成多个分片,配送到由多个物理节点组成的稀疏参数服务集群
3) cube-server 每个单独的cube服务承载一个分片的cube数据
1.
cube-transfer 负责监听上游数据产出,当判断到数据更新时,将数据下载到cube-builder建库端,然后将建库的数据配送到由多个物理节点组成的稀疏参数服务集群
2.
cube-builder 负责从上游数据构建cube内部索引格式,并切分成多个分片,完成建库工作
3.
cube-server 每个单独的cube服务承载一个分片的cube数据
4.
cube-agent 与cube-server伴生部署,负责接受cube-transfer下发的指令,在本地执行实际的数据下载维护等操作
关于Cube的详细说明文档,请参考
[
Cube设计文档
](
https://github.com/PaddlePaddle/Serving/tree/develop/cube/doc/DESIGN.md
)
。本文仅描述从头部署Cube服务的流程。
...
...
@@ -307,20 +307,20 @@ gflags.conf transfer.conf
```
其中:
1) bin/cube, bin/cube-builder, bin/cube-transfer是上述3个组件的可执行文件。
**bin/cube是cube-server的可执行文件**
1) bin/cube, bin/cube-
agent, bin/cube-
builder, bin/cube-transfer是上述3个组件的可执行文件。
**bin/cube是cube-server的可执行文件**
2) conf/gflags.conf是配合bin/cube使用的配置文件,主要包括端口配置等等
3) conf/transfer.conf是配合bin/cube-transfer使用的配置文件,主要包括要监听的上游数据地址等等
接下来我们按cube server, cube-builder, cube-transfer的顺序,介绍Cube的完整部署流程
接下来我们按cube server
/agent
, cube-builder, cube-transfer的顺序,介绍Cube的完整部署流程
### <span id="head17">2. 分片cube server部署</span>
### <span id="head17">2. 分片cube server
/agent
部署</span>
#### <span id="head18">2.1 配置文件修改</span>
首先修改cube server的配置文件,将
端口改为我们需要的端口:
首先修改cube server的配置文件,将
port改为我们需要的端口号,(当本机内存资源紧张时,将in_mem修改为false将以磁盘访问的模式启动cube server):
```
--port=8000
...
...
@@ -330,22 +330,25 @@ gflags.conf transfer.conf
#### <span id="head19">2.2 拷贝可执行文件和配置文件到物理机</span>
将bin/cube和conf/gflags.conf拷贝到多个物理机上。假设拷贝好的文件结构如下:
将bin/cube
,bin/cube-agent
和conf/gflags.conf拷贝到多个物理机上。假设拷贝好的文件结构如下:
```
$ tree
.
|-- bin
| `-- cube
`-- conf
`-- gflags.conf
| `-- cube-agent
|-- conf
| `-- gflags.conf
```
#### <span id="head20">2.3 启动 cube server</span>
#### <span id="head20">2.3 启动 cube server
/agent
</span>
```
bash
nohup
bin/cube &
nohup
bin/cube-agent
-P
8001 &
```
其中cube-agent在启动命令中使用 -P 参数指定监听端口号
### <span id="head21">3. cube-builder部署</span>
...
...
@@ -353,68 +356,214 @@ nohup bin/cube &
cube-builder配置项说明:
TOBE FILLED
均在启动参数中提交
修改
如下:
参数项
如下:
```
下游节点地址列表
TOBE FILLED
```
open_builder: Usage : ./open_build --help
Flags from /home/work/dangyifei/open-builder/src/main.cpp:
-cur_version (current version, no need) type: int32 default: 0 //单机builder模式下不需要
-depend_version (depend version, job mode delta need) type: int32 default: 0 //单机builder base模式下不需要,patch模式找到meta_info里的base的key
-dict_name (dict name, no need) type: string default: "" //词典名,单机builder模式下不加默认空,用来和版本拼接生成索引文件名
-input_path (source data input path) type: string default: "" //必须,源数据所在路径,仅支持本地路径
-job_mode (job mode base/delta default:base) type: string default: "base" //默认base模式,delta模式:-job_mode=delta
-last_version (last version, job mode delta need) type: int32 default: 0 //单机builder base模式下不需要,patch模式找到meta_info里的base的id
-master_address (master address, no need) type: string default: "" //单机builder模式不需要,会把index meta信息写到本地output/meta_info目录下
-only_build (wheather build need transfer) type: bool default: true //单机builder模式不需要,代表是不是单机builder,如果false会向master_address发送请求,将index meta信息写到远程
-output_path (source data input path) type: string default: "" //必须,索引建库数据的输出路径,仅支持本地路径
-shard_num (shard num) type: int32 default: -1 //必须,数据切分的分片数量
```
#### <span id="head23">3.2 拷贝可执行文件到物理机</span>
需要将bin/cube-builder拷贝到物理机上。
只利用builder工具建立索引无特殊位置要求,如果介入配送环节使用必须和cube-transfer同机部署。
假设单独使用builder工具,文件结构如下:
部署完成后目录结构如下:
```
TOBE FILLED
$ tree
`-- cube-builder
|-- source
| `-- test_seqfile
|-- output
```
#### <span id="head24">3.3 启动cube-builder</span>
##### 3.3.1接入配送流程
拷贝bin/cube-builder和cube-transfer程序同机器
相关参数已经封装好,只需要在cube-transfer的conf/transfer.conf里配置好cube-builder的地址、源数据和建库数据output的地址即可
##### 3.3.2单机builder,假设分片数为2,词典名为test
base模式
```
启动cube-builder命令
./open_builder -input_path=./source -output_path=./output -shard_num=2 -dict_name=test
```
运行后会根据当前时间戳自动生成建库索引文件夹1565323045_1565323045和meta信息文件夹meta_info结构如下:
```
$ tree
`-- cube-builder
|-- source
| `-- test_seqfile
`-- output
|-- 1565323045_1565323045
| |-- test_part0
| | |-- data.0
| | |-- data.n
| | |-- index.0
| | `-- index.n
| |-- test_part0.tar
| |-- test_part0.tar.md5
| |-- test_part1
| | |-- data.0
| | |-- data.n
| | |-- index.0
| | `-- index.n
| |-- test_part1.tar
| `-- test_part1.tar.md5
`-- meta_info
|-- 1565323045_1565323045_0_0.json
`-- 1565323045_1565323045_1_0.json
```
test_part0.tar和test_part0.tar.md5是shard0分片的数据和md5校验,1565323045_1565323045_0_0.json是0号分片的索引长度和数量,在对应版本的delta建库中需要
delta模式
需要依赖于上次的base或者delta的id和key,1565323045_1565323045_0_0.json前一个时间戳是id,后一个是key(和分片数据的目录key_id相反),对应cube-builder输入参数-last_version和-depend_version,保持output和dict_name不变(builder会寻找上一轮的index meta信息)
```
启动cube-builder命令
-input_path=./source -output_path=./output -shard_num=2 -depend_version=1565323045 -last_version=1565323045 -job_mode=delta -dict_name=test
```
运行后会根据当前时间戳自动生成delta建库索引文件夹1565323045_1565326078和meta信息文件夹meta_info结构如下:
```
$ tree
`-- cube-builder
|-- source
| `-- test_seqfile
`-- output
|-- 1565323045_1565323045
| |-- test_part0
| | |-- data.0
| | |-- data.n
| | |-- index.0
| | `-- index.n
| |-- test_part0.tar
| |-- test_part0.tar.md5
| |-- test_part1
| | |-- data.0
| | |-- data.n
| | |-- index.0
| | `-- index.n
| |-- test_part1.tar
| `-- test_part1.tar.md5
|-- 1565323045_1565326078
| |-- test_part0
| |-- data.0
| | |-- data.n
| | |-- index.0
| | `-- index.n
| |-- test_part0.tar
| |-- test_part0.tar.md5
| |-- test_part1
| | |-- data.0
| | |-- data.n
| | |-- index.0
| | `-- index.n
| |-- test_part1.tar
| `-- test_part1.tar.md5
`-- meta_info
|-- 1565323045_1565323045_0_0.json
|-- 1565323045_1565323045_0_0.json
|-- 1565326078_1565323045_0_0.json
`-- 1565326078_1565323045_1_0.json
```
#### <span id="head241">3.4 seqfile工具</span>
builder输入数据的源格式必须为seqfile,key为uint64(输入必须为二进制8个字节),value为序列化的二进制
提供明文转seqfile工具和读seqfile工具,位置在output/tool里kvtool.py和kv_to_seqfile.py
kvtool.py 是读seqfile工具,会输出读到的kv信息,参数是文件地址假设在/home/work/test下的seqfile,运行方式如下:
```
python kvtool.py /home/work/test/seqfile
```
kv_to_seqfile.py是明文转seqfile工具,依赖于kvtool.py,会将明文kv转为seqfile文件存储,并输出donefile,在kv_to_seqfile.py的27和30行修改输入和donefile路径:
```
BASE_DONEFILE = DATA_PATH + "donefile/base.txt" #base donefile文件地址
SOURCE_FILE = './source/file.txt' #明文源数据路径
```
要求明文txt内的格式,每行一对kv,用:分割,示例如下:
```
1:1
2:2
10:10 11 12
11:this is eleven
12:value can string
1676869128226002114:48241 37064 91 -539 114 51 -122 269 229 -134 -282
1657749292782759014:167 40 98 27 117 10 -29 15 74 67 -54
```
### <span id="head25">4. cube-transfer部署</span>
#### <span id="head26">4.1 cube-transfer配置修改</span>
cube-transfer配置文件是conf/transfer.conf,配置比较复杂;各个配置项含义如下:
1) TOBE FILLED
2) TOBE FILLED
...
我们要将上游数据地址配置到配置文件中:
```
cube-transfer配置文件修改地方:TOBE FILLED
[default]
dict_name: test_dict //词典名
mode: base_delta //配送模式base_only/base_delta
storage_place: LOCAL //默认LOCAL,表示使用单机builder工具
buildtool_local: /home/work/test-builder/build/cube-builder //build工具位置,必须在本地,绝对路径
donefile_address: /home/work/test-transfer/test_data/donefile //donefile位置支持本地路径和远程ftp或者http服务(ftp://或者http://),只到最后文件夹,文件夹内最多2个文件base.txt patch.txt
output_address: /home/work/test-transfer/test_data/output //build后数据索引输出位置
tmp_address: /home/work/test-transfer/test_data/tmp //transfer工具运行中临时文件存放位置
shard_num: 1 //分片数
copy_num: 2 //每片副本数
deploy_path: /home/work/test_dict //不用修改
transfer_address: 10.10.10.5 //cube-transfer本机的ip
[cube_agent]
agent0_0: 10.10.220.15:8001 //0号分片0号副本的agent ip:port
cube0_0: 10.10.220.15:8000:/ssd2/cube_open //0号分片0号副本的cube ip:port:deploy_path
agent0_1: 10.10.180.40:8001 //0号分片1号副本的agent ip:port
cube0_1: 10.10.180.40:8000:/home/disk1/cube_open //0号分片1号副本的cube ip:port:deploy_path
```
#### <span id="head27">4.2 拷贝cube-transfer到物理机</span>
拷贝完成后,目录结构如下:
将bin/cube-transfer和conf/transfer.conf拷贝到多个物理机上,构建output和tmp文件夹用来存放配送的中间文件。假设拷贝好的文件结构如下:
```
TOBE FILLED
$ tree
.
|-- cube-transfer
|-- output
|-- tmp
`-- conf
|-- transfer.conf
```
#### <span id="head28">4.3 启动cube-transfer</span>
假设启动服务端口8099,-l参数是log等级 --config是配置文件位置
```
启动cube-transfer命令
./cube-transfer -p 8099 -l 4 --config conf/transfer.conf
```
### <span id="head281">4.4 cube-transfer支持查询接口</span>
> 获取当前词典状态
>http://10.10.10.5:8099/dict/info
### <span id="head29">4.4 验证</span>
> 获取实例当前状态
>http://10.10.10.5:8099/instance/status
一旦cube-transfer部署完成,它就不断监听我们配置好的数据位置,发现有数据更新后,即启动数据下载,然后通知cube-builder执行建库和配送流程,将新数据配送给各个分片的cube-server。
> 获取配送历史从最近的base到当前正在配送的delta
>http://10.10.10.5:8099/dict/deploy/history
在上述过程中,经常遇到如下问题,可自行排查解决:
1) TOBE FILLED
2) TOBE FILLED
3) TOBE FILLED
### <span id="head29">4.5 donefile格式协议</span>
一旦cube-transfer部署完成,它就不断监听我们配置好的donefile数据位置,发现有数据更新后,即启动数据下载,然后通知cube-builder执行建库和配送流程,将新数据配送给各个分片的cube-server。
id最好使用版本产出时间戳,base和patch每产出一条直接在donefile文件最后加一行即可,文件名固定base.txt、patch.txt
>base.txt每行一条,id和key相同,目录下可有多个文件,不能有文件夹
>```
>{"id":"1562000400","key":"1562000400","input":"/home/work/test_data/input/seqfile"}
>```
>patch.txt每行一条,key为base的id
>```
>{"id":"1562000401","key":"1562000400","input":"/home/work/test_data/input/seqfile"}
>{"id":"1562000402","key":"1562000400","input":"/home/work/test_data/input/seqfile"}
>```
## <span id="head30"> 预测服务部署</span>
...
...
@@ -467,6 +616,8 @@ $ cmake -DWITH_GPU=OFF .. # 不需要GPU
$
make
-jN
# 这里可修改并发编译线程数
$
make
install
$
cd
output/demo/serving
$
ls
bin conf data kvdb log
```
#### <span id="head34">1.3 配置修改</span>
...
...
@@ -552,11 +703,28 @@ conf/cube.conf是一个完整的cube配置文件模板,其中只要修改nodes
##### <span id="head38">1.3.4 模型文件</span>
Paddle Serving自带了一个可以工作的CTR预估模型,是从BCE上下载下来的,其制作方法为: 1) 分布式训练CTR预估任务,保存模型program和参数文件 2) 用save_program.py保存一份用于预测的program (文件名为
**model**
)。save_program.py随trainer docker image发布 3) 第2步中保存的program (
**model**
) 覆盖到第1)步保存的模型文件夹中
**model**
文件,打包成.tar.gz上传到BCE
Paddle Serving自带了一个可以工作的CTR预估模型,是从BCE上下载下来的,其制作方法为:
1.
分布式训练CTR预估任务,保存模型program和参数文件
2.
用save_program.py保存一份用于预测的program (文件名为
**model**
)。save_program.py随trainer docker image发布
3.
第2步中保存的program (
**model**
) 覆盖到第1步保存的模型文件夹中
**model**
文件,打包成.tar.gz上传到BCE
如果只是为了验证demo流程,serving此时已经可以用自带的CTR模型加载模型并提供预测服务能力。
为了应用重新训练的模型,只需要从k8s集群暴露的ftp服务下载新的.tar.gz,解压到data/model/paddle/fluid下,覆盖原来的ctr_prediction目录即可。从K8S集群暴露的ftp服务下载训练模型,请参考文档
[
PaddlePaddle分布式训练和Serving流程化部署
](
http://icode.baidu.com/repos/baidu/personal-code/wangguibao/blob/master:ctr-embedding-to-sequencefile/path/to/doc/DISTRIBUTED_TRANING_AND_SERVING.md
)
为了应用重新训练的模型,只需要从k8s集群暴露的http服务下载新的ctr_model.tar.gz,解压到data/model/paddle/fluid下,并将内容移至原来的ctr_prediction目录即可:
```
bash
$
cd
data/model/paddle/fluid
$
wget
${
HTTP_SERVICE_IP
}
:
${
HTTP_SERVICE_PORT
}
/data/ctr_model.tar.gz
$
tar
zxvf ctr_model.tar.gz
# 假设解压出一个inference_only目录
$
rm
-rf
ctr_prediction
# 删除旧的ctr_prediction目录下内容
$
cp
-r
inference_only/
*
ctr_prediction
$
cd
../../../../
# 切换至serving所在目录
$
ls
bin conf data kvdb log
$
killall serving
# 杀死旧的serving进程
$
bin/serving &
# 重启serving
```
从K8S集群暴露的http服务下载训练模型,请参考文档
[
PaddlePaddle分布式训练和Serving流程化部署
](
http://icode.baidu.com/repos/baidu/personal-code/wangguibao/blob/master:ctr-embedding-to-sequencefile/path/to/doc/DISTRIBUTED_TRANING_AND_SERVING.md
)
#### <span id="head39">1.4 启动Serving</span>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录