百度飞桨的 Paddle Serving 能够实现服务器端快速部署,最近,随着飞桨更新到 1.7 版本,Paddle Serving 也有了新变化。更新后的 Paddle Serving 有哪些改进?能给用户带来多大程度的生产力提升?本文将带你一睹为快。
简单易用:为了让使用飞桨的用户能够以极低的成本部署模型,Paddle Serving 设计了一套与飞桨开源框架无缝打通的预测部署 API。对于不需要较为复杂的数据预处理过程的普通模型来说,每一位模型算法工程师仅使用一行命令就可以轻松部署自己的模型服务。
工业可用:为了达到工业级深度学习模型在线部署的要求,Paddle Serving 提供很多大规模场景需要的部署功能:
分布式稀疏参数索引功能。
高并发底层通信能力。
模型管理、在线 A/B 流量测试、模型热加载。
功能扩展:当前 Paddle Serving 支持 C++、Python、Golang 的客户端,未来也会面向不同类型的客户新增多种语言的客户端。在 Paddle Serving 的框架设计方面,尽管当前版本以支持飞桨模型的部署为核心功能,但是用户也可以很容易嵌入其它的机器学习库部署在线预测服务。
高性能引擎支持:飞桨的 Paddle Inference 原生推理库作为当前 Paddle Serving 唯一支持的后端推理引擎,具备诸多高性能的特性,例如内存/显存复用、算子自动融合、TensorRT 子图以及 Paddle Lite 子图自动调用等功能。Paddle Serving 从客户端请求到服务端计算的整体流程如图 1 所示,整个底层通信都采用了高并发、低延时的 Baidu-RPC 服务,支撑深度学习模型在线部署的整个流程,使其性能进一步提高。
wget --no-check-certificate https://paddle-serving.bj.bcebos.com/uci_housing.tar.gz
tar -xzf uci_housing.tar.gz
pip install paddle_serving_server //在CPU环境上安装paddle_serving_server
pip install paddke_serving_server_gpu //在GPU环境上安装paddle_serving_server
python -m paddle_serving_server.serve --model uci_housing_model/ --thread 10 --port 9292 --name uci
model:Server 端配置与模型文件所在目录。
thread:Server 端线程数。
port:Server 端预测服务端口号。
name:HTTP 预测服务的的名称,如果不指定 name,则会启动 RPC 预测服务。
* Running on http://0.0.0.0:9292/ (Press CTRL+C to quit)
curl -H "Content-Type:application/json" -X POST -d '{"x": [0.0137, -0.1136, 0.2553, -0.0692, 0.0582, -0.0727, -0.1583, -0.0584, 0.6283, 0.4919, 0.1856, 0.0795, -0.0332], "fetch":["price"]}' http://127.0.0.1:9292/uci/prediction
import paddlehub as hub
model_name = "bert_chinese_L-12_H-768_A-12"
#获取模型文件
module = hub.Module(model_name)
#获取模型的输入输出信息以及program
inputs, outputs, program = module.context(
trainable=True, max_seq_len=20)
#将输入输出的名称与模型中的输入输出变量一一映射
feed_keys = ["input_ids", "position_ids", "segment_ids",
"input_mask", ]
fetch_keys = ["pooled_output", "sequence_output"]
feed_dict = dict(zip(feed_keys, [inputs[x] for x in feed_keys]))
fetch_dict = dict(zip(fetch_keys, [outputs[x] for x in fetch_keys]))
#保存serving需要的模型与配置文件,参数1是server端模型与配置文件保存的目录,参数2是client端配置文件保存的目录,参数3是输入dict,参数4是输出dict,参数5是模型的program
import paddle_serving_client.io as serving_io
serving_io.save_model("bert_seq20_model", "bert_seq20_client",
feed_dict, fetch_dict, program)
python -m paddle_serving_server_gpu.serve --model bert_seq20_model --thread 10 --port 9292 --gpu_ids 0
Server[baidu::paddle_serving::predictor::general_model:: GeneralModelServiceImpl] is serving on port=9292.
pip install paddle_serving_app
import os
import sys
from paddle_serving_client import Client
from paddle_serving_app import ChineseBertReader
#定义数据预处理reader
reader = ChineseBertReader()
#指定要获取的预测结果
fetch = ["pooled_output"]
#指定server端地址
endpoint_list = ["127.0.0.1:9292"]
#定义client类
client = Client()
#加载client配置文件
client.load_client_config("bert_seq20_client/serving_client_conf.prototxt")
#连接server端
client.connect(endpoint_list)
#从标准输入读取数据,发送给server端,并打印结果
for line in sys.stdin:
feed_dict = reader.process(line)
result = client.predict(feed=feed_dict, fetch=fetch)
print(result)
cat data.txt | python bert_client.py
官网地址:https://www.paddlepaddle.org.cn
飞桨 Paddle Serving 项目地址:https://github.com/PaddlePaddle/Serving/tree/v0.2.0
GitHub: https://github.com/PaddlePaddle/Paddle
Gitee: https://gitee.com/paddlepaddle/Paddle