Paddle Serving技术架构说明
1. 整体设计目标
长期使命:Paddle Serving是一个PaddlePaddle开源的在线服务框架,长期目标就是围绕着人工智能落地的最后一公里提供越来越专业、可靠、易用的服务。
工业级:为了达到工业级深度学习模型在线部署的要求, Paddle Serving提供很多大规模场景需要的部署功能:1)分布式稀疏参数索引功能;2)高并发底层通信能力;3)模型管理、在线A/B流量测试、模型热加载。
简单易用:为了让使用Paddle的用户能够以极低的成本部署模型,PaddleServing设计了一套与Paddle训练框架无缝打通的预测部署API,普通模型可以使用一行命令进行服务部署。
功能扩展:当前,Paddle Serving支持C++、Python、Golang的客户端,未来也会面向不同类型的客户新增多种语言的客户端。在Paddle Serving的框架设计方面,尽管当前Paddle Serving以支持Paddle模型的部署为核心功能, 用户可以很容易嵌入其他的机器学习库部署在线预测。
2. 模块设计与实现
2.1 Python API接口设计
2.1.1 训练模型的保存
Paddle的模型预测需要重点关注的内容:1)模型的输入变量;2)模型的输出变量;3)模型结构和模型参数。Paddle Serving Python API提供用户可以在训练过程中保存模型的接口,并将Paddle Serving在部署阶段需要保存的配置打包保存,一个示例如下:
import paddle_serving_client.io as serving_io
serving_io.save_model("serving_model"微服务项目技术架构, "client_conf",
                      {"words": data}, {"prediction": prediction},
                      fluid.default_main_program())
代码示例中,{"words": data}{"prediction": prediction}分别指定了模型的输入和输出,"wor
ds""prediction"是输出和输出变量的别名,设计别名的目的是为了使开发者能够记忆自己训练模型的输入输出对应的字段。dataprediction则是Paddle训练过程中的[Variable](/documentation/docs/zh/api_cn/fluid_cn/Variable_cn.html#variable),通常代表张量(Tensor)或变长张量(LodTensor)。调用保存命令后,会按照用户指定的"serving_model""client_conf"生成两个目录,内容如下:
.
├── client_conf
│  ├── serving_client_conf.prototxt
│  └── serving_client_conf.stream.prototxt
└── serving_model
    ├── embedding_0.w_0
    ├── fc_0.b_0
    ├── fc_0.w_0
    ├── fc_1.b_0
    ├── fc_1.w_0
    ├── fc_2.b_0
    ├── fc_2.w_0
    ├── lstm_0.b_0
    ├── lstm_0.w_0
    ├── __model__
    ├── serving_server_conf.prototxt
    └── serving_server_conf.stream.prototxt
其中,"serving_client_conf.prototxt""serving_server_conf.prototxt"是Paddle Serving的Client和Server端需要加载的配置,"serving_client_conf.stream.prototxt""serving_server_conf.stream.prototxt"是配置文件的二进制形式。"serving_model"下保存的其他内容和Paddle保存的模型文件是一致的。我们会考虑未来在Paddle框架中直接保存可服务的配置,实现配置保存对用户无感。
2.1.2 服务端模型加载
服务端的预测逻辑可以通过Paddle Serving Server端的API进行人工定义,一个例子:
import paddle_serving_server as serving
op_maker = serving.OpMaker()
read_op = op_maker.create('general_reader')
dist_kv_op = op_maker.create('general_dist_kv')
general_infer_op = op_maker.create('general_infer')
general_response_op = op_maker.create('general_response')
op_seq_maker = serving.OpSeqMaker()
op_seq_maker.add_op(read_op)
op_seq_maker.add_op(dist_kv_op)
op_seq_maker.add_op(general_infer_op)
op_seq_maker.add_op(general_response_op)
当前Paddle Serving在Server端支持的主要Op请参考如下列表:
Op 名称
描述
general_reader
通用数据格式的读取Op
genreal_infer
通用数据格式的Paddle预测Op
general_response
通用数据格式的响应Op
general_dist_kv
分布式索引Op
当前Paddle Serving中的预估引擎支持在CPU/GPU上进行预测,对应的预测服务安装包以及镜像也有两个。但无论是CPU上进行模型预估还是GPU上进行模型预估,普通模型的预测都可用一行命令进行启动。
python -m paddle_serving_server.serve --model your_servable_model --thread 10 --port 9292
python -m paddle_serving_server_gpu.serve --model your_servable_model --thread 10 --port 9292
启动命令的选项列表如下:
参数
类型
默认值
描述
thread
int
4
服务端的并发数,通常与CPU核数一致即可
port
int
9292
服务暴露给用户的端口
name
str
""
服务名称,当用户指定时代表直接启动的是HTTP服务
model
str
""
服务端模型文件夹路径
gpu_ids
str
""
仅在paddle_serving_server_gpu中可以使用,功能与CUDA_VISIBLE_DEVICES一致
举例python -m paddle_serving_server.serve --model your_servable_model --thread 10 --port 9292对应到具体的Server端具体配置如下
from paddle_serving_server import OpMaker, OpSeqMaker, Server
op_maker = OpMaker()
read_op = op_maker.create('general_reader')
general_infer_op = op_maker.create('general_infer')
general_response_op = op_maker.create('general_response')
op_seq_maker = OpSeqMaker()
op_seq_maker.add_op(read_op)
op_seq_maker.add_op(general_infer_op)
op_seq_maker.add_op(general_response_op)
server = Server()
server.set_op_sequence(op_seq_maker.get_op_sequence())