README_CN.md 10.0 KB
Newer Older
M
MRXLT 已提交
1 2
(简体中文|[English](./README.md))

J
Jiawei Wang 已提交
3 4 5 6 7
<p align="center">
    <br>
<img src='https://paddle-serving.bj.bcebos.com/imdb-demo%2FLogoMakr-3Bd2NM-300dpi.png' width = "600" height = "130">
    <br>
<p>
8

M
MRXLT 已提交
9

B
barrierye 已提交
10

J
Jiawei Wang 已提交
11 12 13 14 15 16 17 18 19 20 21
<p align="center">
    <br>
    <a href="https://travis-ci.com/PaddlePaddle/Serving">
        <img alt="Build Status" src="https://img.shields.io/travis/com/PaddlePaddle/Serving/develop">
    </a>
    <img alt="Release" src="https://img.shields.io/badge/Release-0.0.3-yellowgreen">
    <img alt="Issues" src="https://img.shields.io/github/issues/PaddlePaddle/Serving">
    <img alt="License" src="https://img.shields.io/github/license/PaddlePaddle/Serving">
    <img alt="Slack" src="https://img.shields.io/badge/Join-Slack-green">
    <br>
<p>
W
wangjiawei04 已提交
22

J
Jiawei Wang 已提交
23
<h2 align="center">动机</h2>
J
Jiawei Wang 已提交
24

J
Jiawei Wang 已提交
25
Paddle Serving 旨在帮助深度学习开发者轻易部署在线预测服务。 **本项目目标**: 当用户使用 [Paddle](https://github.com/PaddlePaddle/Paddle) 训练了一个深度神经网络,就同时拥有了该模型的预测服务。
J
Jiawei Wang 已提交
26

B
barrierye 已提交
27 28 29
<p align="center">
    <img src="doc/demo.gif" width="700">
</p>
W
wangjiawei04 已提交
30

J
Jiawei Wang 已提交
31

W
wangjiawei04 已提交
32

J
Jiawei Wang 已提交
33
<h2 align="center">安装</h2>
W
wangjiawei04 已提交
34

B
barrierye 已提交
35
**强烈建议**您在**Docker内构建**Paddle Serving,请查看[如何在Docker中运行PaddleServing](doc/RUN_IN_DOCKER_CN.md)。更多镜像请查看[Docker镜像列表](doc/DOCKER_IMAGES_CN.md)
B
barrierye 已提交
36

M
MRXLT 已提交
37 38
```
# 启动 CPU Docker
B
barrierye 已提交
39 40
docker pull hub.baidubce.com/paddlepaddle/serving:latest
docker run -p 9292:9292 --name test -dit hub.baidubce.com/paddlepaddle/serving:latest
M
MRXLT 已提交
41 42 43 44
docker exec -it test bash
```
```
# 启动 GPU Docker
B
barrierye 已提交
45 46
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
M
MRXLT 已提交
47 48
nvidia-docker exec -it test bash
```
W
wangjiawei04 已提交
49
```shell
W
wangjiawei04 已提交
50 51 52 53 54
pip install paddle-serving-client==0.4.0
pip install paddle-serving-server==0.4.0 # CPU
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.trt # GPU with CUDA10.1+TensorRT
W
wangjiawei04 已提交
55 56
```

M
MRXLT 已提交
57
您可能需要使用国内镜像源(例如清华源, 在pip命令中添加`-i https://pypi.tuna.tsinghua.edu.cn/simple`)来加速下载。
58

M
MRXLT 已提交
59 60
如果需要使用develop分支编译的安装包,请从[最新安装包列表](./doc/LATEST_PACKAGES.md)中获取下载地址进行下载,使用`pip install`命令进行安装。

W
wangjiawei04 已提交
61
paddle-serving-server和paddle-serving-server-gpu安装包支持Centos 6/7, Ubuntu 16/18和Windows 10。
M
MRXLT 已提交
62

M
MRXLT 已提交
63
paddle-serving-client和paddle-serving-app安装包支持Linux和Windows,其中paddle-serving-client仅支持python2.7/3.5/3.6。
M
MRXLT 已提交
64

W
wangjiawei04 已提交
65 66 67
推荐安装1.8.4及以上版本的paddle

对于**Windows 10 用户**,请参考文档[Windows平台使用Paddle Serving指导](./doc/WINDOWS_TUTORIAL_CN.md)
M
MRXLT 已提交
68

D
Dong Daxiang 已提交
69 70 71 72 73
<h2 align="center"> Paddle Serving预装的服务 </h2>

<h3 align="center">中文分词</h4>

``` shell
M
MRXLT 已提交
74
> python -m paddle_serving_app.package --get_model lac
D
Dong Daxiang 已提交
75
> tar -xzf lac.tar.gz
M
MRXLT 已提交
76
> python lac_web_service.py lac_model/ lac_workdir 9393 &
D
Dong Daxiang 已提交
77 78 79 80 81 82 83 84 85 86 87
> 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":"我|爱|北京|天安门"}]}
```

<h3 align="center">图像分类</h4>

<p align="center">
    <br>
<img src='https://paddle-serving.bj.bcebos.com/imagenet-example/daisy.jpg' width = "200" height = "200">
    <br>
<p>
B
barrierye 已提交
88

D
Dong Daxiang 已提交
89
``` shell
M
MRXLT 已提交
90
> python -m paddle_serving_app.package --get_model resnet_v2_50_imagenet
D
Dong Daxiang 已提交
91 92 93 94 95 96 97 98
> 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]}}
```


<h2 align="center">快速开始示例</h2>
W
wangjiawei04 已提交
99

D
Dong Daxiang 已提交
100 101
这个快速开始示例主要是为了给那些已经有一个要部署的模型的用户准备的,而且我们也提供了一个可以用来部署的模型。如果您想知道如何从离线训练到在线服务走完全流程,请参考[从训练到部署](https://github.com/PaddlePaddle/Serving/blob/develop/doc/TRAIN_TO_SERVICE_CN.md)

J
Jiawei Wang 已提交
102
<h3 align="center">波士顿房价预测</h3>
J
Jiawei Wang 已提交
103

W
wangjiawei04 已提交
104 105 106 107 108
``` shell
wget --no-check-certificate https://paddle-serving.bj.bcebos.com/uci_housing.tar.gz
tar -xzf uci_housing.tar.gz
```

J
Jiawei Wang 已提交
109
Paddle Serving 为用户提供了基于 HTTP 和 RPC 的服务
J
Jiawei Wang 已提交
110

W
wangjiawei04 已提交
111
<h3 align="center">RPC服务</h3>
J
Jiawei Wang 已提交
112

W
wangjiawei04 已提交
113
用户还可以使用`paddle_serving_server.serve`启动RPC服务。 尽管用户需要基于Paddle Serving的python客户端API进行一些开发,但是RPC服务通常比HTTP服务更快。需要指出的是这里我们没有指定`--name`
J
Jiawei Wang 已提交
114 115

``` shell
W
wangjiawei04 已提交
116
python -m paddle_serving_server.serve --model uci_housing_model --thread 10 --port 9292
J
Jiawei Wang 已提交
117 118 119 120 121 122 123 124 125
```
<center>

| 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 |
M
MRXLT 已提交
126
| `mem_optim_off` | - | - | Disable memory optimization |
M
MRXLT 已提交
127 128
| `ir_optim` | - | - | Enable analysis and optimization of calculation graph |
| `use_mkl` (Only for cpu version) | - | - | Run inference with MKL |
M
bug fix  
MRXLT 已提交
129
| `use_trt` (Only for trt version) | - | - | Run inference with TensorRT  |
J
Jiawei Wang 已提交
130

W
wangjiawei04 已提交
131 132
我们使用 `curl` 命令来发送HTTP POST请求给刚刚启动的服务。用户也可以调用python库来发送HTTP POST请求,请参考英文文
[requests](https://requests.readthedocs.io/en/master/)
J
Jiawei Wang 已提交
133 134
</center>

W
wangjiawei04 已提交
135
``` python
J
Jiawei Wang 已提交
136
# A user can visit rpc service through paddle_serving_client API
W
wangjiawei04 已提交
137 138 139 140 141 142 143
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]
W
wangjiawei04 已提交
144
fetch_map = client.predict(feed={"x": np.array(data).reshape(1,13,1)}, fetch=["price"])
W
wangjiawei04 已提交
145 146 147
print(fetch_map)

```
J
Jiawei Wang 已提交
148 149
在这里,`client.predict`函数具有两个参数。 `feed`是带有模型输入变量别名和值的`python dict``fetch`被要从服务器返回的预测变量赋值。 在该示例中,在训练过程中保存可服务模型时,被赋值的tensor名为`"x"``"price"`

W
wangjiawei04 已提交
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
<h3 align="center">HTTP服务</h3>
用户也可以将数据格式处理逻辑放在服务器端进行,这样就可以直接用curl去访问服务,参考如下案例,在目录``python/examples/fit_a_line``

```python
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]]}}
```

D
Dong Daxiang 已提交
183
<h2 align="center">Paddle Serving的核心功能</h2>
J
Jiawei Wang 已提交
184

D
Dong Daxiang 已提交
185 186 187 188 189
- 与Paddle训练紧密连接,绝大部分Paddle模型可以 **一键部署**.
- 支持 **工业级的服务能力** 例如模型管理,在线加载,在线A/B测试等.
- 支持 **分布式键值对索引** 助力于大规模稀疏特征作为模型输入.
- 支持客户端和服务端之间 **高并发和高效通信**.
- 支持 **多种编程语言** 开发客户端,例如Golang,C++和Python.
J
Jiawei Wang 已提交
190

J
Jiawei Wang 已提交
191 192 193 194 195 196 197
<h2 align="center">文档</h2>

### 新手教程
- [怎样保存用于Paddle Serving的模型?](doc/SAVE_CN.md)
- [端到端完成从训练到部署全流程](doc/TRAIN_TO_SERVICE_CN.md)
- [十分钟构建Bert-As-Service](doc/BERT_10_MINS_CN.md)

W
wangjiawei04 已提交
198 199 200 201 202
### AIStudio教程
- [PaddleServing作业](https://aistudio.baidu.com/aistudio/projectdetail/605819)
- [PaddleServing图像分割](https://aistudio.baidu.com/aistudio/projectdetail/457715)
- [PaddleServing情感分析](https://aistudio.baidu.com/aistudio/projectdetail/509014)

J
Jiawei Wang 已提交
203 204 205
### 开发者教程
- [如何配置Server端的计算图?](doc/SERVER_DAG_CN.md)
- [如何开发一个新的General Op?](doc/NEW_OPERATOR_CN.md)
B
barrierye 已提交
206
- [如何开发一个新的Web Service?](doc/NEW_WEB_SERVICE_CN.md)
J
Jiawei Wang 已提交
207
- [如何在Paddle Serving使用Go Client?](doc/IMDB_GO_CLIENT_CN.md)
J
Jiawei Wang 已提交
208
- [如何编译PaddleServing?](doc/COMPILE_CN.md)
M
MRXLT 已提交
209 210
- [如何使用uWSGI部署Web Service](doc/UWSGI_DEPLOY_CN.md)
- [如何实现模型文件热加载](doc/HOT_LOADING_IN_SERVING_CN.md)
J
Jiawei Wang 已提交
211 212

### 关于Paddle Serving性能
M
MRXLT 已提交
213
- [如何测试Paddle Serving性能?](python/examples/util/)
M
MRXLT 已提交
214 215
- [如何优化性能?](doc/PERFORMANCE_OPTIM_CN.md)
- [在一张GPU上启动多个预测服务](doc/MULTI_SERVICE_ON_ONE_GPU_CN.md)
J
Jiawei Wang 已提交
216 217 218 219
- [CPU版Benchmarks](doc/BENCHMARKING.md)
- [GPU版Benchmarks](doc/GPU_BENCHMARKING.md)

### FAQ
M
add FAQ  
MRXLT 已提交
220
- [常见问答](doc/FAQ.md)
W
wangjiawei04 已提交
221

J
Jiawei Wang 已提交
222 223
### 设计文档
- [Paddle Serving设计文档](doc/DESIGN_DOC_CN.md)
W
wangjiawei04 已提交
224

J
Jiawei Wang 已提交
225
<h2 align="center">社区</h2>
W
wangjiawei04 已提交
226

J
Jiawei Wang 已提交
227
### Slack
W
wangjiawei04 已提交
228

J
Jiawei Wang 已提交
229
想要同开发者和其他用户沟通吗?欢迎加入我们的 [Slack channel](https://paddleserving.slack.com/archives/CUBPKHKMJ)
W
wangjiawei04 已提交
230

J
Jiawei Wang 已提交
231
### 贡献代码
W
wangjiawei04 已提交
232

J
Jiawei Wang 已提交
233
如果您想为Paddle Serving贡献代码,请参考 [Contribution Guidelines](doc/CONTRIBUTE.md)
W
wangjiawei04 已提交
234

J
Jiawei Wang 已提交
235
### 反馈
W
wangjiawei04 已提交
236

J
Jiawei Wang 已提交
237
如有任何反馈或是bug,请在 [GitHub Issue](https://github.com/PaddlePaddle/Serving/issues)提交
W
wangjiawei04 已提交
238

J
Jiawei Wang 已提交
239
### License
W
wangjiawei04 已提交
240

J
Jiawei Wang 已提交
241
[Apache 2.0 License](https://github.com/PaddlePaddle/Serving/blob/develop/LICENSE)