README.md 3.7 KB
Newer Older
G
guru4elephant 已提交
1
# Paddle Serving
D
Dong Daxiang 已提交
2 3 4
Paddle Serving是PaddlePaddle的在线预估服务框架,能够帮助开发者轻松实现从移动端、服务器端调用深度学习模型的远程预测服务。当前Paddle Serving以支持PaddlePaddle训练的模型为主,可以与Paddle训练框架联合使用,快速部署预估服务。Paddle Serving围绕常见的工业级深度学习模型部署场景进行设计,一些常见的功能包括多模型管理、模型热加载、基于[Baidu-rpc]的高并发低延迟响应能力、在线模型A/B实验等。与Paddle训练框架想配合的API可以使用户在训练与远程部署之间无缝过度,提升深度学习模型的落地效率。

------------
D
Dong Daxiang 已提交
5

D
Dong Daxiang 已提交
6
## 快速上手指南
D
Dong Daxiang 已提交
7

D
Dong Daxiang 已提交
8
Paddle Serving当前的develop版本支持轻量级Python API进行快速预测,并且与Paddle的训练可以打通。我们以最经典的波士顿房价预测为示例,完整说明在单机进行模型训练以及使用Paddle Serving进行模型部署的过程。
D
Dong Daxiang 已提交
9

D
Dong Daxiang 已提交
10
#### 安装
G
guru4elephant 已提交
11 12
```
pip install paddle-serving-client
D
Dong Daxiang 已提交
13
pip install paddle-serving-server
G
guru4elephant 已提交
14
```
D
Dong Daxiang 已提交
15

D
Dong Daxiang 已提交
16
#### 训练脚本
G
guru4elephant 已提交
17
``` python
G
guru4elephant 已提交
18 19 20 21
import sys
import paddle
import paddle.fluid as fluid

D
Dong Daxiang 已提交
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
train_reader = paddle.batch(paddle.reader.shuffle(
    paddle.dataset.uci_housing.train(), buf_size=500), batch_size=16)

test_reader = paddle.batch(paddle.reader.shuffle(
    paddle.dataset.uci_housing.test(), buf_size=500), batch_size=16)

x = fluid.data(name='x', shape=[None, 13], dtype='float32')
y = fluid.data(name='y', shape=[None, 1], dtype='float32')

y_predict = fluid.layers.fc(input=x, size=1, act=None)
cost = fluid.layers.square_error_cost(input=y_predict, label=y)
avg_loss = fluid.layers.mean(cost)
sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.01)
sgd_optimizer.minimize(avg_loss)

place = fluid.CPUPlace()
feeder = fluid.DataFeeder(place=place, feed_list=[x, y])
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())

import paddle_serving_client.io as serving_io

for pass_id in range(30):
    for data_train in train_reader():
        avg_loss_value, = exe.run(
            fluid.default_main_program(),
            feed=feeder.feed(data_train),
            fetch_list=[avg_loss])

serving_io.save_model(
    "serving_server_model", "serving_client_conf",
    {"x": x}, {"y": y_predict}, fluid.default_main_program())
G
guru4elephant 已提交
54
```
D
Dong Daxiang 已提交
55

D
Dong Daxiang 已提交
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
#### 服务器端代码
``` python
import sys
from paddle_serving.serving_server import OpMaker
from paddle_serving.serving_server import OpSeqMaker
from paddle_serving.serving_server import Server

op_maker = OpMaker()
read_op = op_maker.create('general_reader')
general_infer_op = op_maker.create('general_infer')

op_seq_maker = OpSeqMaker()
op_seq_maker.add_op(read_op)
op_seq_maker.add_op(general_infer_op)

server = Server()
server.set_op_sequence(op_seq_maker.get_op_sequence())
server.load_model_config(sys.argv[1])
server.prepare_server(workdir="work_dir1", port=9393, device="cpu")
server.run_server()
```

#### 服务器端启动
``` shell
python test_server.py serving_server_model
```
D
Dong Daxiang 已提交
82

D
Dong Daxiang 已提交
83
#### 客户端预测
G
guru4elephant 已提交
84
``` python
D
Dong Daxiang 已提交
85
from paddle_serving_client import Client
D
Dong Daxiang 已提交
86
import paddle
G
guru4elephant 已提交
87
import sys
D
Dong Daxiang 已提交
88

G
guru4elephant 已提交
89 90
client = Client()
client.load_client_config(sys.argv[1])
D
Dong Daxiang 已提交
91 92 93 94 95 96 97 98
client.connect(["127.0.0.1:9292"])

test_reader = paddle.batch(paddle.reader.shuffle(
    paddle.dataset.uci_housing.test(), buf_size=500), batch_size=1)

for data in test_reader():
    fetch_map = client.predict(feed={"x": data[0][0]}, fetch=["y"])
    print("{} {}".format(fetch_map["y"][0], data[0][1][0]))
W
wangguibao 已提交
99

G
guru4elephant 已提交
100
```
W
wangguibao 已提交
101

G
guru4elephant 已提交
102
### 文档
W
wangguibao 已提交
103

G
guru4elephant 已提交
104
[设计文档](doc/DESIGN.md)
W
wangguibao 已提交
105

D
Dong Daxiang 已提交
106
[FAQ](doc/FAQ.md)
W
wangguibao 已提交
107

D
Dong Daxiang 已提交
108
### 资深开发者使用指南
W
wangguibao 已提交
109

D
Dong Daxiang 已提交
110 111 112
[基于C++核心从零开始写一个预测服务](doc/CREATING.md)

[编译指南](doc/INSTALL.md)
W
wangguibao 已提交
113

D
Dong Daxiang 已提交
114
## 贡献
D
Dong Daxiang 已提交
115
如果你想要给Paddle Serving做贡献,请参考[贡献指南](doc/CONTRIBUTE.md)
D
Dong Daxiang 已提交
116