(简体中文|English)
Paddle Serving 旨在帮助深度学习开发者轻易部署在线预测服务。 本项目目标: 当用户使用 Paddle 训练了一个深度神经网络,就同时拥有了该模型的预测服务。
强烈建议您在Docker内构建Paddle Serving,请查看如何在Docker中运行PaddleServing。更多镜像请查看Docker镜像列表。
# 启动 CPU Docker
docker pull hub.baidubce.com/paddlepaddle/serving:latest
docker run -p 9292:9292 --name test -dit hub.baidubce.com/paddlepaddle/serving:latest
docker exec -it test bash
# 启动 GPU Docker
nvidia-docker pull hub.baidubce.com/paddlepaddle/serving:latest-cuda9.0-cudnn7
nvidia-docker run -p 9292:9292 --name test -dit hub.baidubce.com/paddlepaddle/serving:latest-cuda9.0-cudnn7
nvidia-docker exec -it test bash
pip install paddle-serving-client==0.4.0
pip install paddle-serving-server==0.4.0 # CPU
pip install paddle-serving-app==0.2.0
pip install paddle-serving-server-gpu==0.4.0.post9 # GPU with CUDA9.0
pip install paddle-serving-server-gpu==0.4.0.post10 # GPU with CUDA10.0
pip install paddle-serving-server-gpu==0.4.0.100 # GPU with CUDA10.1+TensorRT
您可能需要使用国内镜像源(例如清华源, 在pip命令中添加-i https://pypi.tuna.tsinghua.edu.cn/simple
)来加速下载。
如果需要使用develop分支编译的安装包,请从最新安装包列表中获取下载地址进行下载,使用pip install
命令进行安装。
paddle-serving-server和paddle-serving-server-gpu安装包支持Centos 6/7, Ubuntu 16/18和Windows 10。
paddle-serving-client和paddle-serving-app安装包支持Linux和Windows,其中paddle-serving-client仅支持python2.7/3.5/3.6。
推荐安装1.8.4及以上版本的paddle
对于Windows 10 用户,请参考文档Windows平台使用Paddle Serving指导。
> python -m paddle_serving_app.package --get_model lac
> tar -xzf lac.tar.gz
> python lac_web_service.py lac_model/ lac_workdir 9393 &
> curl -H "Content-Type:application/json" -X POST -d '{"feed":[{"words": "我爱北京天安门"}], "fetch":["word_seg"]}' http://127.0.0.1:9393/lac/prediction
{"result":[{"word_seg":"我|爱|北京|天安门"}]}
> python -m paddle_serving_app.package --get_model resnet_v2_50_imagenet
> tar -xzf resnet_v2_50_imagenet.tar.gz
> python resnet50_imagenet_classify.py resnet50_serving_model &
> curl -H "Content-Type:application/json" -X POST -d '{"feed":[{"image": "https://paddle-serving.bj.bcebos.com/imagenet-example/daisy.jpg"}], "fetch": ["score"]}' http://127.0.0.1:9292/image/prediction
{"result":{"label":["daisy"],"prob":[0.9341403245925903]}}
这个快速开始示例主要是为了给那些已经有一个要部署的模型的用户准备的,而且我们也提供了一个可以用来部署的模型。如果您想知道如何从离线训练到在线服务走完全流程,请参考从训练到部署
wget --no-check-certificate https://paddle-serving.bj.bcebos.com/uci_housing.tar.gz
tar -xzf uci_housing.tar.gz
Paddle Serving 为用户提供了基于 HTTP 和 RPC 的服务
用户还可以使用paddle_serving_server.serve
启动RPC服务。 尽管用户需要基于Paddle Serving的python客户端API进行一些开发,但是RPC服务通常比HTTP服务更快。需要指出的是这里我们没有指定--name
。
python -m paddle_serving_server.serve --model uci_housing_model --thread 10 --port 9292
Argument | Type | Default | Description |
---|---|---|---|
thread |
int | 4 |
Concurrency of current service |
port |
int | 9292 |
Exposed port of current service to users |
name |
str | "" |
Service name, can be used to generate HTTP request url |
model |
str | "" |
Path of paddle model directory to be served |
mem_optim_off |
- | - | Disable memory optimization |
ir_optim |
- | - | Enable analysis and optimization of calculation graph |
use_mkl (Only for cpu version) |
- | - | Run inference with MKL |
use_trt (Only for trt version) |
- | - | Run inference with TensorRT |
我们使用 curl
命令来发送HTTP POST请求给刚刚启动的服务。用户也可以调用python库来发送HTTP POST请求,请参考英文文
档 requests。
# A user can visit rpc service through paddle_serving_client API
from paddle_serving_client import Client
client = Client()
client.load_client_config("uci_housing_client/serving_client_conf.prototxt")
client.connect(["127.0.0.1:9292"])
data = [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_map = client.predict(feed={"x": np.array(data).reshape(1,13,1)}, fetch=["price"])
print(fetch_map)
在这里,client.predict
函数具有两个参数。 feed
是带有模型输入变量别名和值的python dict
。 fetch
被要从服务器返回的预测变量赋值。 在该示例中,在训练过程中保存可服务模型时,被赋值的tensor名为"x"
和"price"
。
from paddle_serving_server.web_service import WebService
import numpy as np
class UciService(WebService):
def preprocess(self, feed=[], fetch=[]):
feed_batch = []
is_batch = True
new_data = np.zeros((len(feed), 1, 13)).astype("float32")
for i, ins in enumerate(feed):
nums = np.array(ins["x"]).reshape(1, 1, 13)
new_data[i] = nums
feed = {"x": new_data}
return feed, fetch, is_batch
uci_service = UciService(name="uci")
uci_service.load_model_config("uci_housing_model")
uci_service.prepare_server(workdir="workdir", port=9292)
uci_service.run_rpc_service()
uci_service.run_web_service()
客户端输入
curl -H "Content-Type:application/json" -X POST -d '{"feed":[{"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
返回结果
{"result":{"price":[[18.901151657104492]]}}
- 与Paddle训练紧密连接,绝大部分Paddle模型可以 一键部署.
- 支持 工业级的服务能力 例如模型管理,在线加载,在线A/B测试等.
- 支持 分布式键值对索引 助力于大规模稀疏特征作为模型输入.
- 支持客户端和服务端之间 高并发和高效通信.
- 支持 多种编程语言 开发客户端,例如Golang,C++和Python.
- 如何配置Server端的计算图?
- 如何开发一个新的General Op?
- 如何开发一个新的Web Service?
- 如何在Paddle Serving使用Go Client?
- 如何编译PaddleServing?
- 如何使用uWSGI部署Web Service
- 如何实现模型文件热加载
想要同开发者和其他用户沟通吗?欢迎加入我们的 Slack channel
如果您想为Paddle Serving贡献代码,请参考 Contribution Guidelines
- 特别感谢 @BeyondYourself 提供grpc教程,更新FAQ教程,整理文件目录。
- 特别感谢 @mcl-stone 提供faster rcnn benchmark脚本
- 特别感谢 @cg82616424 提供unet benchmark脚本和修改部分注释错误
如有任何反馈或是bug,请在 GitHub Issue提交