serving.md 11.5 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核数|  
走神的阿圆's avatar
走神的阿圆 已提交
34 35 36 37 38 39 40 41 42

#### 配置文件启动
启动命令
```shell
$ hub serving start --config config.json
```
`config.json`格式如下:  

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

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

**参数**

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

### Step2:访问服务端

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

http://0.0.0.0:8866/predict/<CATEGORY\>/\<MODULE>

其中,\<CATEGORY>为text或image,与模型种类对应,\<MODULE>为模型名。

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

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

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

<p align="center">  

走神的阿圆's avatar
走神的阿圆 已提交
97
<img src="../imgs/web_demo.png" width="60%" />  
走神的阿圆's avatar
走神的阿圆 已提交
98 99 100

</p>  

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

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

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

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

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

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

<p align="center">  

走神的阿圆's avatar
走神的阿圆 已提交
148
<img src="../imgs/start_serving_lac.png" width="100%" />  
走神的阿圆's avatar
走神的阿圆 已提交
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169

</p>  

这样我们就在8866端口部署了lac的在线分词服务。
*此处warning为Flask提示,不影响使用*

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

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

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

if __name__ == "__main__":
    # 指定用于用于预测的文本并生成字典{"text": [text_1, text_2, ... ]}
    text_list = ["今天是个好日子", "天气预报说今天要下雨"]
    text = {"text": text_list}
    # 指定预测方法为lac并发送post请求
走神的阿圆's avatar
走神的阿圆 已提交
170
    url = "http://0.0.0.0:8866/predict/text/lac"
走神的阿圆's avatar
走神的阿圆 已提交
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
    r = requests.post(url=url, data=text)

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


```python
{
    "results": [
        {
            "tag": [
                "TIME", "v", "q", "n"
            ],
            "word": [
                "今天", "是", "个", "好日子"
            ]
        },
        {
            "tag": [
                "n", "v", "TIME", "v", "v"
            ],
            "word": [
                "天气预报", "说", "今天", "要", "下雨"
            ]
        }
    ]
}
```

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

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

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

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

获取其他PaddleHub Serving的一键服务部署场景示例,可参见下列demo

走神的阿圆's avatar
走神的阿圆 已提交
224
* [图像分类-基于vgg11_imagent](../../demo/serving/module_serving/classification_vgg11_imagenet)  
走神的阿圆's avatar
走神的阿圆 已提交
225 226 227

&emsp;&emsp;该示例展示了利用vgg11_imagent完成图像分类服务化部署和在线预测,获取图像分类结果。

走神的阿圆's avatar
走神的阿圆 已提交
228
* [图像生成-基于stgan_celeba](../../demo/serving/module_serving/GAN_stgan_celeba)  
走神的阿圆's avatar
走神的阿圆 已提交
229 230 231

&emsp;&emsp;该示例展示了利用stgan_celeba生成图像服务化部署和在线预测,获取指定风格的生成图像。

走神的阿圆's avatar
走神的阿圆 已提交
232
* [文本审核-基于porn_detection_lstm](../../demo/serving/module_serving/text_censorship_porn_detection_lstm)  
走神的阿圆's avatar
走神的阿圆 已提交
233 234 235

&emsp;&emsp;该示例展示了利用porn_detection_lstm完成中文文本黄色敏感信息鉴定的服务化部署和在线预测,获取文本是否敏感及其置信度。

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

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

走神的阿圆's avatar
走神的阿圆 已提交
240
* [目标检测-基于yolov3_darknet53_coco2017](../../demo/serving/module_serving/object_detection_yolov3_darknet53_coco2017)  
走神的阿圆's avatar
走神的阿圆 已提交
241 242 243

&emsp;&emsp;该示例展示了利用yolov3_darknet53_coco2017完成目标检测服务化部署和在线预测,获取检测结果和覆盖识别框的图片。

走神的阿圆's avatar
走神的阿圆 已提交
244
* [中文语义分析-基于simnet_bow](../../demo/serving/module_serving/semantic_model_simnet_bow)
走神的阿圆's avatar
走神的阿圆 已提交
245 246 247

&emsp;&emsp;该示例展示了利用simnet_bow完成中文文本相似度检测服务化部署和在线预测,获取文本的相似程度。  

走神的阿圆's avatar
走神的阿圆 已提交
248
* [图像分割-基于deeplabv3p_xception65_humanseg](../../demo/serving/module_serving/semantic_segmentation_deeplabv3p_xception65_humanseg)
走神的阿圆's avatar
走神的阿圆 已提交
249 250 251

&emsp;&emsp;该示例展示了利用deeplabv3p_xception65_humanseg完成图像分割服务化部署和在线预测,获取识别结果和分割后的图像。

走神的阿圆's avatar
走神的阿圆 已提交
252
* [中文情感分析-基于simnet_bow](../../demo/serving/module_serving/semantic_model_simnet_bow)
走神的阿圆's avatar
走神的阿圆 已提交
253 254

&emsp;&emsp;该示例展示了利用senta_lstm完成中文文本情感分析服务化部署和在线预测,获取文本的情感分析结果。
255

走神的阿圆's avatar
走神的阿圆 已提交
256 257 258 259 260
## 客户端请求新版模型的方式
对某些新版模型,客户端请求方式有所变化,更接近本地预测的请求方式,以降低学习成本。
以lac(2.1.0)为例,使用上述方法进行请求将提示:
```python
{
走神的阿圆's avatar
走神的阿圆 已提交
261
    "Warnning": "This usage is out of date, please use 'application/json' as content-type to post to /predict/lac. See 'https://github.com/PaddlePaddle/PaddleHub/blob/release/v1.6/docs/tutorial/serving.md' for more details."
走神的阿圆's avatar
走神的阿圆 已提交
262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
}
```
对于lac(2.1.0),请求的方式如下:
```python
# coding: utf8
import requests
import json

if __name__ == "__main__":
    # 指定用于预测的文本并生成字典{"text": [text_1, text_2, ... ]}
    text = {"text": ["今天是个好日子", "天气预报说今天要下雨"]}
    # 以key的方式指定text传入预测方法的时的参数,此例中为"data"
    # 对应本地部署,则为lac.analysis_lexical(data=text)
    data = {"data": text}
    # 指定预测方法为lac并发送post请求
走神的阿圆's avatar
走神的阿圆 已提交
277
    url = "http://127.0.0.1:8866/predict/lac"
走神的阿圆's avatar
走神的阿圆 已提交
278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
    # 指定post请求的headers为application/json方式
    headers = {"Content-Type": "application/json"}

    r = requests.post(url=url, headers=headers, data=json.dumps(data))

    # 打印预测结果
    print(json.dumps(r.json(), indent=4, ensure_ascii=False))
```
对结果的解析等与前种方式一致,显示如下:
```python
{
    "results": [
        {
            "tag": [
                "TIME", "v", "q", "n"
            ],
            "word": [
                "今天", "是", "个", "好日子"
            ]
        },
        {
            "tag": [
                "n", "v", "TIME", "v", "v"
            ],
            "word": [
                "天气预报", "说", "今天", "要", "下雨"
            ]
        }
    ]
}
```
走神的阿圆's avatar
走神的阿圆 已提交
309
此Demo的具体信息和代码请参见[LAC Serving_2.1.0](../../demo/serving/module_serving/lexical_analysis_lac/lac_2.1.0_serving_demo.py)
走神的阿圆's avatar
走神的阿圆 已提交
310

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