serving.md 8.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 21 22 23 24 25 26 27

#### 命令行命令启动
启动命令
```shell
$ hub serving start --modules [Module1==Version1, Module2==Version2, ...] \
                    --port XXXX \
                    --use_gpu \
                    --use_multiprocess
```

**参数**

|参数|用途|  
|-|-|  
28
|--modules/-m|PaddleHub Serving预安装模型,以多个Module==Version键值对的形式列出<br>*`当不指定Version时,默认选择最新版本`*|  
走神的阿圆's avatar
走神的阿圆 已提交
29 30
|--port/-p|服务端口,默认为8866|  
|--use_gpu|使用GPU进行预测,必须安装paddlepaddle-gpu|  
走神的阿圆's avatar
走神的阿圆 已提交
31
|--use_multiprocess|是否启用并发方式,默认为单进程方式,推荐多核CPU机器使用此方式<br>*`Windows操作系统只支持单进程方式`*|  
走神的阿圆's avatar
走神的阿圆 已提交
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54

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

```json
{  
  "modules_info": [  
    {  
       "module": "MODULE_NAME_1",
       "version": "MODULE_VERSION_1",
       "batch_size": "BATCH_SIZE_1"
    },  
    {  
       "module": "MODULE_NAME_2",  
       "version": "MODULE_VERSION_2",  
       "batch_size": "BATCH_SIZE_2"
    }
  ],  
  "port": 8866,
走神的阿圆's avatar
走神的阿圆 已提交
55
  "use_gpu": false,  
走神的阿圆's avatar
走神的阿圆 已提交
56 57 58 59 60 61 62 63
  "use_multiprocess": false
}
```

**参数**

|参数|用途|  
|-|-|  
走神的阿圆's avatar
走神的阿圆 已提交
64 65 66 67
|modules_info|PaddleHub Serving预安装模型,以字典列表形式列出,其中:<br>`module`为预测服务使用的模型名<br>`version`为预测模型的版本<br>`batch_size`为预测批次大小
|port|服务端口,默认为8866|  
|use_gpu|使用GPU进行预测,必须安装paddlepaddle-gpu|  
|use_multiprocess|是否启用并发方式,默认为单进程方式,推荐多核CPU机器使用此方式<br>*`Windows操作系统只支持单进程方式`*|  
走神的阿圆's avatar
走神的阿圆 已提交
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83

### Step2:访问服务端

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

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

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

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

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

<p align="center">  

84
<img src="../docs/imgs/web_demo.png" width="60%" />  
走神的阿圆's avatar
走神的阿圆 已提交
85 86 87

</p>  

88
## Demo——部署一个在线lac分词服务
走神的阿圆's avatar
走神的阿圆 已提交
89 90 91 92

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

走神的阿圆's avatar
走神的阿圆 已提交
93
首先,任意选择一种启动方式,两种方式分别为:
走神的阿圆's avatar
走神的阿圆 已提交
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
```shell
$ hub serving start -m lac
```

```shell
$ hub serving start -c serving_config.json
```
其中`serving_config.json`的内容如下:
```json
{
  "modules_info": [
  {
    "module": "lac",
    "version": "1.0.0",
    "batch_size": 1
  }
],
  "use_gpu": false,
  "port": 8866,
  "use_multiprocess": false
}
```
启动成功界面如图:

<p align="center">  

120
<img src="../docs/imgs/start_serving_lac.png" width="100%" />  
走神的阿圆's avatar
走神的阿圆 已提交
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141

</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
走神的阿圆 已提交
142
    url = "http://0.0.0.0:8866/predict/text/lac"
走神的阿圆's avatar
走神的阿圆 已提交
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
    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
走神的阿圆 已提交
174 175
此Demo的具体信息和代码请参见[LAC Serving](../demo/serving/module_serving/lexical_analysis_lac)。另外,下面展示了一些其他的一键服务部署Demo。

176
## Demo——其他模型的一键部署服务
走神的阿圆's avatar
走神的阿圆 已提交
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 202 203 204 205 206 207 208 209 210

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

* [图像分类-基于vgg11_imagent](../demo/serving/module_serving/classification_vgg11_imagenet)  

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

* [图像生成-基于stgan_celeba](../demo/serving/module_serving/GAN_stgan_celeba)  

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

* [文本审核-基于porn_detection_lstm](../demo/serving/module_serving/text_censorship_porn_detection_lstm)  

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

* [中文词法分析-基于lac](../demo/serving/module_serving/lexical_analysis_lac)

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

* [目标检测-基于yolov3_darknet53_coco2017](.../demo/serving/serving/object_detection_yolov3_darknet53_coco2017)  

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

* [中文语义分析-基于simnet_bow](../demo/serving/module_serving/semantic_model_simnet_bow)

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

* [图像分割-基于deeplabv3p_xception65_humanseg](../demo/serving/module_serving/semantic_segmentation_deeplabv3p_xception65_humanseg)

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

* [中文情感分析-基于simnet_bow](../demo/serving/module_serving/semantic_model_simnet_bow)

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

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