README.md 3.2 KB
Newer Older
G
guru4elephant 已提交
1 2
# Paddle Serving
Paddle Serving是PaddlePaddle的在线预估服务框架,能够帮助开发者轻松实现从移动端、服务器端调用深度学习模型的远程预测服务。当前Paddle Serving以支持PaddlePaddle训练的模型为主,可以与Paddle训练框架联合使用,快速部署预估服务。
D
Dong Daxiang 已提交
3

D
Dong Daxiang 已提交
4
## 快速上手
D
Dong Daxiang 已提交
5 6

Paddle Serving当前的develop版本支持轻量级Python API进行快速预测,并且与Paddle的训练可以打通。我们以最经典的波士顿房价预测为示例,说明Paddle Serving的使用方法。
D
Dong Daxiang 已提交
7

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

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

D
Dong Daxiang 已提交
20 21 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
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 已提交
52
```
D
Dong Daxiang 已提交
53

D
Dong Daxiang 已提交
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
#### 服务器端代码
``` 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 已提交
80

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

G
guru4elephant 已提交
87 88
client = Client()
client.load_client_config(sys.argv[1])
D
Dong Daxiang 已提交
89 90 91 92 93 94 95 96
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 已提交
97

G
guru4elephant 已提交
98
```
W
wangguibao 已提交
99

G
guru4elephant 已提交
100
### 文档
W
wangguibao 已提交
101

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

G
guru4elephant 已提交
104
[从零开始写一个预测服务](doc/CREATING.md)
W
wangguibao 已提交
105

G
guru4elephant 已提交
106
[编译安装](doc/INSTALL.md)
W
wangguibao 已提交
107

G
guru4elephant 已提交
108
[FAQ](doc/FAQ.md)
W
wangguibao 已提交
109

D
Dong Daxiang 已提交
110 111 112
# 贡献
如果你想要给Paddle Serving做贡献,请参考贡献指南