serving.md 8.3 KB
Newer Older
走神的阿圆's avatar
走神的阿圆 已提交
1 2 3
# PaddleHub Serving模型一键服务部署
## 简介
### 为什么使用一键服务部署
走神的阿圆's avatar
走神的阿圆 已提交
4
使用PaddleHub能够快速进行模型预测,但开发者常面临本地预测过程迁移线上的需求。无论是对外开放服务端口,还是在局域网中搭建预测服务,都需要PaddleHub具有快速部署模型预测服务的能力。在这个背景下,模型一键服务部署工具——PaddleHub Serving应运而生。开发者通过一行命令即可快速启动一个模型预测在线服务,而无需关注网络框架选择和实现。
走神的阿圆's avatar
走神的阿圆 已提交
5 6 7 8
### 什么是一键服务部署
PaddleHub Serving是基于PaddleHub的一键模型服务部署工具,能够通过简单的Hub命令行工具轻松启动一个模型预测在线服务,前端通过Flask和Gunicorn完成网络请求的处理,后端直接调用PaddleHub预测接口,同时支持使用多进程方式利用多核提高并发能力,保证预测服务的性能。

### 支持模型
走神的阿圆's avatar
走神的阿圆 已提交
9
目前PaddleHub Serving支持对PaddleHub所有可直接预测的模型进行服务部署,包括`lac``senta_bilstm`等NLP类模型,以及`yolov3_darknet53_coco2017``vgg16_imagenet`等CV类模型,更多模型请参见[PaddleHub支持模型列表](https://paddlepaddle.org.cn/hublist)。未来还将支持开发者使用PaddleHub Fine-tune API得到的模型用于快捷服务部署。
走神的阿圆's avatar
走神的阿圆 已提交
10 11 12

## 使用
### Step1:启动服务端部署
走神的阿圆's avatar
走神的阿圆 已提交
13
PaddleHub Serving有两种启动方式,分别是使用命令行启动,以及使用配置文件启动。
走神的阿圆's avatar
走神的阿圆 已提交
14 15 16 17 18 19 20

#### 命令行命令启动
启动命令
```shell
$ hub serving start --modules [Module1==Version1, Module2==Version2, ...] \
                    --port XXXX \
                    --use_gpu \
走神的阿圆's avatar
走神的阿圆 已提交
21 22
                    --use_multiprocess \
                    --workers \
走神的阿圆's avatar
走神的阿圆 已提交
23 24 25 26 27 28
```

**参数**

|参数|用途|  
|-|-|  
29
|--modules/-m|PaddleHub Serving预安装模型,以多个Module==Version键值对的形式列出<br>*`当不指定Version时,默认选择最新版本`*|  
走神的阿圆's avatar
走神的阿圆 已提交
30 31
|--port/-p|服务端口,默认为8866|  
|--use_gpu|使用GPU进行预测,必须安装paddlepaddle-gpu|  
走神的阿圆's avatar
走神的阿圆 已提交
32 33
|--use_multiprocess|是否启用并发方式,默认为单进程方式,推荐多核CPU机器使用此方式<br>*`Windows操作系统只支持单进程方式`*|
|--workers|在并发方式下指定的并发任务数,默认为`2*cpu_count-1`,其中`cpu_count`为CPU核数|  
34

35
**NOTE:** --use_gpu不可与--use_multiprocess共用。
36

走神的阿圆's avatar
走神的阿圆 已提交
37 38 39 40 41 42 43 44
#### 配置文件启动
启动命令
```shell
$ hub serving start --config config.json
```
`config.json`格式如下:  

```json
走神的阿圆's avatar
走神的阿圆 已提交
45 46 47 48 49 50 51 52 53 54 55 56 57
{
  "modules_info": {
    "yolov3_darknet53_coco2017": {
      "init_args": {
        "version": "1.0.0"
      },
      "predict_args": {
        "batch_size": 1,
        "use_gpu": false
      }
    },
    "lac": {
      "init_args": {
走神的阿圆's avatar
走神的阿圆 已提交
58
        "version": "1.1.0"
走神的阿圆's avatar
走神的阿圆 已提交
59 60 61 62 63
      },
      "predict_args": {
        "batch_size": 1,
        "use_gpu": false
      }
走神的阿圆's avatar
走神的阿圆 已提交
64
    }
走神的阿圆's avatar
走神的阿圆 已提交
65
  },
走神的阿圆's avatar
走神的阿圆 已提交
66
  "port": 8866,
走神的阿圆's avatar
走神的阿圆 已提交
67 68
  "use_multiprocess": false,
  "workers": 2
走神的阿圆's avatar
走神的阿圆 已提交
69
}
走神的阿圆's avatar
走神的阿圆 已提交
70

走神的阿圆's avatar
走神的阿圆 已提交
71 72 73 74 75 76
```

**参数**

|参数|用途|  
|-|-|  
走神的阿圆's avatar
走神的阿圆 已提交
77
|modules_info|PaddleHub Serving预安装模型,以字典列表形式列出,key为模型名称。其中:<br>`init_args`为模型加载时输入的参数,等同于`paddlehub.Module(**init_args)`<br>`predict_args`为模型预测时输入的参数,以`lac`为例,等同于`lac.analysis_lexical(**predict_args)`
走神的阿圆's avatar
走神的阿圆 已提交
78 79
|port|服务端口,默认为8866|  
|use_gpu|使用GPU进行预测,必须安装paddlepaddle-gpu|  
走神的阿圆's avatar
走神的阿圆 已提交
80 81
|use_multiprocess|是否启用并发方式,默认为单进程方式,推荐多核CPU机器使用此方式<br>*`Windows操作系统只支持单进程方式`*|
|workers|启动的并发任务数,在并发模式下才生效,默认为`2*cpu_count-1`,其中`cpu_count`代表CPU的核数|
走神的阿圆's avatar
走神的阿圆 已提交
82 83 84 85 86

### Step2:访问服务端

在使用PaddleHub Serving部署服务端的模型预测服务后,就可以在客户端访问预测接口以获取结果了,接口url格式为:

走神的阿圆's avatar
走神的阿圆 已提交
87
`http://127.0.0.1:8866/predict/<MODULE>`
走神的阿圆's avatar
走神的阿圆 已提交
88

走神的阿圆's avatar
走神的阿圆 已提交
89
其中,`<MODULE>`为模型名。
走神的阿圆's avatar
走神的阿圆 已提交
90 91 92

通过发送一个POST请求,即可获取预测结果,下面我们将展示一个具体的demo,以说明使用PaddleHub Serving部署和使用流程。

走神的阿圆's avatar
走神的阿圆 已提交
93

走神的阿圆's avatar
走神的阿圆 已提交
94 95 96
### Step3:利用PaddleHub Serving进行个性化开发
使用PaddleHub Serving进行模型服务部署后,可以利用得到的接口进行开发,如对外提供web服务,或接入到应用程序中,以降低客户端预测压力,提高性能,下面展示了一个web页面demo:

A
adaxiadaxi 已提交
97
![](../imgs/web_demo.png)
走神的阿圆's avatar
走神的阿圆 已提交
98 99


走神的阿圆's avatar
走神的阿圆 已提交
100 101 102 103 104 105 106 107 108 109 110
### Step4:关闭serving
使用关闭命令即可关闭启动的serving,
```shell
$ hub serving stop --port XXXX
```
**参数**

|参数|用途|  
|-|-|  
|--port/-p|指定要关闭的服务端口,默认为8866|  

111
## Demo——部署一个在线lac分词服务
走神的阿圆's avatar
走神的阿圆 已提交
112 113 114 115

### Step1:部署lac在线服务
现在,我们要部署一个lac在线服务,以通过接口获取文本的分词结果。

走神的阿圆's avatar
走神的阿圆 已提交
116
首先,任意选择一种启动方式,两种方式分别为:
走神的阿圆's avatar
走神的阿圆 已提交
117 118 119 120 121 122 123 124 125 126
```shell
$ hub serving start -m lac
```

```shell
$ hub serving start -c serving_config.json
```
其中`serving_config.json`的内容如下:
```json
{
走神的阿圆's avatar
走神的阿圆 已提交
127 128 129 130 131 132 133 134 135 136 137
  "modules_info": {
    "lac": {
      "init_args": {
        "version": "1.1.0"
      },
      "predict_args": {
        "batch_size": 1,
        "use_gpu": false
      }
    }
  },
走神的阿圆's avatar
走神的阿圆 已提交
138
  "port": 8866,
走神的阿圆's avatar
走神的阿圆 已提交
139 140
  "use_multiprocess": false,
  "workers": 2
走神的阿圆's avatar
走神的阿圆 已提交
141 142 143 144
}
```
启动成功界面如图:

A
adaxiadaxi 已提交
145
![](../imgs/start_serving_lac.png)
走神的阿圆's avatar
走神的阿圆 已提交
146

147
这样我们就在8866端口成功部署了lac的在线分词服务。
走神的阿圆's avatar
走神的阿圆 已提交
148 149 150 151 152 153 154 155 156 157 158 159 160
*此处warning为Flask提示,不影响使用*

### Step2:访问lac预测接口

在服务部署好之后,我们可以进行测试,用来测试的文本为`今天是个好日子``天气预报说今天要下雨`

客户端代码如下
```python
# coding: utf8
import requests
import json

if __name__ == "__main__":
走神的阿圆's avatar
走神的阿圆 已提交
161 162 163 164 165 166 167 168 169 170 171
    # 指定用于预测的文本并生成字典{"text": [text_1, text_2, ... ]}
    text = ["今天是个好日子", "天气预报说今天要下雨"]
    # 以key的方式指定text传入预测方法的时的参数,此例中为"data"
    # 对应本地部署,则为lac.analysis_lexical(data=text, batch_size=1)
    data = {"texts": text, "batch_size": 1}
    # 指定预测方法为lac并发送post请求,content-type类型应指定json方式
    url = "http://127.0.0.1:8866/predict/lac"
    # 指定post请求的headers为application/json方式
    headers = {"Content-Type": "application/json"}

    r = requests.post(url=url, headers=headers, data=json.dumps(data))
走神的阿圆's avatar
走神的阿圆 已提交
172 173 174 175 176 177 178 179 180

    # 打印预测结果
    print(json.dumps(r.json(), indent=4, ensure_ascii=False))
```
运行后得到结果


```python
{
走神的阿圆's avatar
走神的阿圆 已提交
181
    "msg": "",
走神的阿圆's avatar
走神的阿圆 已提交
182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
    "results": [
        {
            "tag": [
                "TIME", "v", "q", "n"
            ],
            "word": [
                "今天", "是", "个", "好日子"
            ]
        },
        {
            "tag": [
                "n", "v", "TIME", "v", "v"
            ],
            "word": [
                "天气预报", "说", "今天", "要", "下雨"
            ]
        }
走神的阿圆's avatar
走神的阿圆 已提交
199 200
    ],
    "status": "0"
走神的阿圆's avatar
走神的阿圆 已提交
201
}
走神的阿圆's avatar
走神的阿圆 已提交
202

走神的阿圆's avatar
走神的阿圆 已提交
203 204
```

走神的阿圆's avatar
走神的阿圆 已提交
205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
### Step3:停止serving服务

由于启动时我们使用了默认的服务端口8866,则对应的关闭命令为:
```shell
$ hub serving stop --port 8866
```
或不指定关闭端口,则默认为8866。
```shell
$ hub serving stop
```
等待serving清理服务后,提示:
```shell
$ PaddleHub Serving will stop.
```
则serving服务已经停止。

走神的阿圆's avatar
走神的阿圆 已提交
221
此Demo的具体信息和代码请参见[LAC Serving](../../demo/serving/module_serving/lexical_analysis_lac)。另外,下面展示了一些其他的一键服务部署Demo。
走神的阿圆's avatar
走神的阿圆 已提交
222

223
## Demo——其他模型的一键部署服务
走神的阿圆's avatar
走神的阿圆 已提交
224

走神的阿圆's avatar
走神的阿圆 已提交
225
* [中文词法分析-基于lac](../../demo/serving/module_serving/lexical_analysis_lac)
走神的阿圆's avatar
走神的阿圆 已提交
226 227 228

&emsp;&emsp;该示例展示了利用lac完成中文文本分词服务化部署和在线预测,获取文本的分词结果,并可通过用户自定义词典干预分词结果。

走神的阿圆's avatar
走神的阿圆 已提交
229
* [人脸检测-基于pyramidbox_lite_server_mask](../../demo/serving/module_serving/object_detection_pyramidbox_lite_server_mask)
230

S
Steffy-zxf 已提交
231
&emsp;&emsp;该示例展示了利用pyramidbox_lite_server_mask完成人脸口罩检测,检测人脸位置以及戴口罩的置信度。
走神的阿圆's avatar
走神的阿圆 已提交
232

233
## Bert Service
走神的阿圆's avatar
走神的阿圆 已提交
234
除了预训练模型一键服务部署功能之外,PaddleHub Serving还具有`Bert Service`功能,支持ernie_tiny、bert等模型快速部署,对外提供可靠的在线embedding服务,具体信息请参见[Bert Service](./bert_service.md)