提交 87257b63 编写于 作者: 走神的阿圆's avatar 走神的阿圆 提交者: Steffy-zxf

Move serving image to docs/img (#307)

* update serving doc

* update serving doc

* fix doc format

* fix doc format

* modify serving tutorial

* move serving img

* move serving img

* Add bert_service demo readme

* modify demo- to Demo——

* Add serving tips in tail
上级 51820323
...@@ -38,8 +38,8 @@ ...@@ -38,8 +38,8 @@
* [超参优化AutoDL Finetuner使用](./autofinetune) * [超参优化AutoDL Finetuner使用](./autofinetune)
该样例展示了PaddleHub超参优化AutoDL Finetuner如何使用,给出了自动搜素图像分类/文本分类任务的较佳超参数示例。 该样例展示了PaddleHub超参优化AutoDL Finetuner如何使用,给出了自动搜素图像分类/文本分类任务的较佳超参数示例。
* [服务化部署Hub Serving使用](./serving) * [服务化部署PaddleHub Serving使用](./serving)
该样例文件夹下展示了服务化部署Hub Serving如何使用,将PaddleHub支持的可预测Module如何服务化部署。 该样例文件夹下展示了服务化部署PaddleHub Serving如何使用,将PaddleHub支持的可预测Module如何服务化部署。
**NOTE:** **NOTE:**
以上任务示例均是利用PaddleHub提供的数据集,若您想在自定义数据集上完成相应任务,请查看[PaddleHub适配自定义数据完成FineTune](https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub%E9%80%82%E9%85%8D%E8%87%AA%E5%AE%9A%E4%B9%89%E6%95%B0%E6%8D%AE%E5%AE%8C%E6%88%90FineTune) 以上任务示例均是利用PaddleHub提供的数据集,若您想在自定义数据集上完成相应任务,请查看[PaddleHub适配自定义数据完成FineTune](https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub%E9%80%82%E9%85%8D%E8%87%AA%E5%AE%9A%E4%B9%89%E6%95%B0%E6%8D%AE%E5%AE%8C%E6%88%90FineTune)
......
...@@ -17,7 +17,7 @@ Bert Service是基于[Paddle Serving](https://github.com/PaddlePaddle/Serving) ...@@ -17,7 +17,7 @@ Bert Service是基于[Paddle Serving](https://github.com/PaddlePaddle/Serving)
## 预训练模型一键服务部署 ## 预训练模型一键服务部署
预训练模型一键服务部署是基于PaddleHub的预训练模型快速部署的服务化方案,能够将模型预测以API接口的方式实现。 预训练模型一键服务部署是基于PaddleHub的预训练模型快速部署的服务化方案,能够将模型预测以API接口的方式实现。
关于预训练模型一键服务部署的具体信息请参见[PaqddleHub Serving](../../tutorial/serving.md) 关于预训练模型一键服务部署的具体信息请参见[PaddleHub Serving](../../tutorial/serving.md)
预训练模型一键服务部署包括以下示例: 预训练模型一键服务部署包括以下示例:
......
# Bert Service
## 简介
### 什么是Bert Service
`Bert Service`是基于[Paddle Serving](https://github.com/PaddlePaddle/Serving)框架的快速部署模型远程计算服务方案,可将embedding过程通过调用API接口的方式实现,减少了对机器资源的依赖。使用PaddleHub可在服务器上一键部署`Bert Service`服务,在另外的普通机器上通过客户端接口即可轻松的获取文本对应的embedding数据。
**NOTE:** 关于`Bert Service`的更多信息请参见[Bert Serving](../../../tutorial/bert_service.md)
## Demo——利用Bert Service部署ernie_tiny在线embedding服务
在这里,我们将展示一个实际场景中可能使用的demo,我们利用PaddleHub在一台GPU机器上部署`ernie_tiny`模型服务,并在另一台CPU机器上尝试访问,获取一首七言绝句的embedding。
### Step1:安装环境依赖
首先需要安装环境依赖,根据第2节内容分别在两台机器上安装相应依赖。
### Step2:启动Bert Service服务端
确保环境依赖安装正确后,在要部署服务的GPU机器上使用PaddleHub命令行工具启动`Bert Service`服务端,命令如下:
```shell
$ hub serving start bert_service -m ernie_tiny --use_gpu --gpu 0 --port 8866
```
启动成功后打印:
```shell
Server[baidu::paddle_serving::predictor::bert_service::BertServiceImpl] is serving on port=8866.
```
这样就启动了`ernie_tiny`的在线服务,监听8866端口,并在0号GPU上进行任务。
### Step3:使用Bert Service客户端进行远程调用
部署好服务端后,就可以用普通机器作为客户端测试在线embedding功能。
首先导入客户端依赖。
```python
from paddlehub.serving.bert_serving import bs_client
```
接着启动并初始化`bert service`客户端`BSClient`(这里的server为虚拟地址,需根据自己实际ip设置)。
```python
bc = bs_client.BSClient(module_name="ernie_tiny", server="127.0.0.1:8866")
```
然后输入文本信息。
```python
input_text = [["西风吹老洞庭波"], ["一夜湘君白发多"], ["醉后不知天在水"], ["满船清梦压星河"], ]
```
最后利用客户端接口`get_result`发送文本到服务端,以获取embedding结果。
```python
result = bc.get_result(input_text=input_text)
```
最后即可得到embedding结果(此处只展示部分结果)。
```python
[[0.9993321895599361, 0.9994612336158751, 0.9999646544456481, 0.732795298099517, -0.34387934207916204, ... ]]
```
客户端代码demo文件见[示例](../paddlehub/serving/bert_serving/bert_service.py)
运行命令如下:
```shell
$ python bert_service_client.py
```
运行过程如下图:
<div align="center">
&emsp;&emsp;<img src="https://github.com/ShenYuhan/ml-python/blob/master/short_client_fast.gif" aligh="center" width="70%" alt="启动BS" />
</div>
### Step4:关闭Bert Service服务端
如要停止`Bert Service`服务端程序,可在其启动命令行页面使用Ctrl+C方式关闭,关闭成功会打印如下日志:
```shell
Paddle Inference Server exit successfully!
```
这样,我们就利用一台GPU机器就完成了`Bert Service`的部署,并利用另一台普通机器进行了测试,可见通过`Bert Service`能够方便地进行在线embedding服务的快速部署。
## 预训练模型一键服务部署
除了`Bert Service`外,PaddleHub
Serving还具有预训练模型一键服务部署功能,能够将预训练模型快捷部署上线,对外提供可靠的在线预测服务,具体信息请参见[Module Serving](../../../tutorial/serving.md)
...@@ -21,7 +21,7 @@ Loading stgan_celeba successful. ...@@ -21,7 +21,7 @@ Loading stgan_celeba successful.
我们用来测试的样例图片为: 我们用来测试的样例图片为:
<p align="center"> <p align="center">
<img src="../img/man.png" width="30%" /> <img src="../../../../docs/imgs/man.png" width="30%" />
</p> </p>
根据stgan_celeba所需信息,准备的数据包括图像文件和生成图像风格,格式为: 根据stgan_celeba所需信息,准备的数据包括图像文件和生成图像风格,格式为:
...@@ -36,7 +36,7 @@ info为图像描述,根据示例图像信息,info应为"Male,Black_Hair,Eyeg ...@@ -36,7 +36,7 @@ info为图像描述,根据示例图像信息,info应为"Male,Black_Hair,Eyeg
image为要生成的图像风格,我们选取"Bald"(秃顶的)作为生成图像的风格。 image为要生成的图像风格,我们选取"Bald"(秃顶的)作为生成图像的风格。
代码如下 代码如下
```python ```python
>>> # 指定要使用的图片文件并生成列表[("image", img_1), ("image", img_2), ... ] >>> # 指定要使用的图片文件并生成列表[("image", img_1), ("image", img_2), ... ]
>>> file_list = ["../img/man.png"] >>> file_list = ["../img/man.png"]
...@@ -46,19 +46,19 @@ image为要生成的图像风格,我们选取"Bald"(秃顶的)作为生成图 ...@@ -46,19 +46,19 @@ image为要生成的图像风格,我们选取"Bald"(秃顶的)作为生成图
``` ```
## Step3:获取并验证结果 ## Step3:获取并验证结果
然后就可以发送请求到图像生成服务API,并得到结果,代码如下 然后就可以发送请求到图像生成服务API,并得到结果,代码如下
```python ```python
>>> url = "http://127.0.0.1:8866/predict/image/stgan_celeba" >>> url = "http://127.0.0.1:8866/predict/image/stgan_celeba"
>>> r = requests.post(url=url, data=data, files=files) >>> r = requests.post(url=url, data=data, files=files)
``` ```
stgan_celeba返回的结果包括生成图像的base64编码格式,经过转换可以得到生成图像,代码如下 stgan_celeba返回的结果包括生成图像的base64编码格式,经过转换可以得到生成图像,代码如下
```python ```python
>>> for item in results: >>> for item in results:
... with open(output_path, "wb") as fp: ... with open(output_path, "wb") as fp:
... fp.write(base64.b64decode(item["base64"].split(',')[-1])) ... fp.write(base64.b64decode(item["base64"].split(',')[-1]))
``` ```
查看指定输出文件夹,就能看到生成图像了,如图 查看指定输出文件夹,就能看到生成图像了,如图
<p align="center"> <p align="center">
<img src="./stgan_output/Bald_man.png" width="30%" /> <img src="./stgan_output/Bald_man.png" width="30%" />
......
# PaddleHub Serving模型一键服务部署
## 简介
### 为什么使用一键服务部署
使用PaddleHub能够快速进行迁移学习和模型预测,但开发者常面临将训练好的模型部署上线的需求,无论是对外开放服务端口,还是在局域网中搭建预测服务,都需要PaddleHub具有快速部署模型预测服务的能力。在这个背景下,模型一键服务部署工具——PaddleHub Serving应运而生。开发者通过一句命令快速得到一个预测服务API,而无需关注网络框架选择和实现。
### 什么是一键服务部署
PaddleHub Serving是基于PaddleHub的一键模型服务部署工具,能够通过简单的Hub命令行工具轻松启动一个模型预测在线服务,前端通过Flask和Gunicorn完成网络请求的处理,后端直接调用PaddleHub预测接口,同时支持使用多进程方式利用多核提高并发能力,保证预测服务的性能。
### 支持模型
目前PaddleHub Serving支持PaddleHub所有可直接用于预测的模型进行服务部署,包括`lac``senta_bilstm`等nlp类模型,以及`yolov3_coco2017``vgg16_imagenet`等cv类模型,未来还将支持开发者使用PaddleHub Fine-tune API得到的模型用于快捷服务部署。
**NOTE:** 关于PaddleHub Serving一键服务部署的具体信息请参见[PaddleHub Servung](../../../tutorial/serving.md)
## Demo——部署一个在线lac分词服务
### Step1:部署lac在线服务
现在,我们要部署一个lac在线服务,以通过接口获取文本的分词结果。
首先,根据2.1节所述,启动PaddleHub Serving服务端的两种方式分别为:
```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">
<img src="../demo/serving/module_serving/img/start_serving_lac.png" width="100%" />
</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请求
url = "http://127.0.0.1:8866/predict/text/lac"
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": [
"天气预报", "说", "今天", "要", "下雨"
]
}
]
}
```
## Demo——其他模型的一键部署服务
获取其他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完成中文文本情感分析服务化部署和在线预测,获取文本的情感分析结果。
## Bert Service
除了预训练模型一键服务部署功能外外,PaddleHub Serving还具有`Bert Service`功能,支持ernie_tiny、bert等模型快速部署,对外提供可靠的在线embedding服务,具体信息请参见[Bert Service](../../../tutorial/bert_service.md)
...@@ -21,11 +21,11 @@ Loading vgg11_imagenet successful. ...@@ -21,11 +21,11 @@ Loading vgg11_imagenet successful.
我们用来测试的样例图片为: 我们用来测试的样例图片为:
<p align="center"> <p align="center">
<img src="../img/cat.jpg" width="45%" /> <img src="../../../../docs/imgs/cat.jpg" width="45%" />
</p> </p>
<p align="center"> <p align="center">
<img src="../img/flower.jpg" width="45%"/> <img src="../../../../docs/imgs/flower.jpg" width="45%"/>
</p> </p>
准备的数据格式为: 准备的数据格式为:
......
...@@ -21,13 +21,13 @@ Loading lac successful. ...@@ -21,13 +21,13 @@ Loading lac successful.
### 不使用自定义词典 ### 不使用自定义词典
在服务部署好之后,我们可以进行测试,用来测试的文本为`今天是个好日子``天气预报说今天要下雨` 在服务部署好之后,我们可以进行测试,用来测试的文本为`今天是个好日子``天气预报说今天要下雨`
准备的数据格式为 准备的数据格式为
```python ```python
{"text": [text_1, text_2, ...]} {"text": [text_1, text_2, ...]}
``` ```
**NOTE:** 字典的key为"text"。 **NOTE:** 字典的key为"text"。
根据文本和数据格式,代码如下 根据文本和数据格式,代码如下
```python ```python
>>> # 指定用于用于预测的文本并生成字典{"text": [text_1, text_2, ... ]} >>> # 指定用于用于预测的文本并生成字典{"text": [text_1, text_2, ... ]}
>>> text_list = ["今天是个好日子", "天气预报说今天要下雨"] >>> text_list = ["今天是个好日子", "天气预报说今天要下雨"]
...@@ -35,13 +35,13 @@ Loading lac successful. ...@@ -35,13 +35,13 @@ Loading lac successful.
``` ```
## Step3:获取并验证结果 ## Step3:获取并验证结果
接下来发送请求到词法分析API,并得到结果,代码如下 接下来发送请求到词法分析API,并得到结果,代码如下
```python ```python
# 指定预测方法为lac并发送post请求 # 指定预测方法为lac并发送post请求
>>> url = "http://127.0.0.1:8866/predict/text/lac" >>> url = "http://127.0.0.1:8866/predict/text/lac"
>>> r = requests.post(url=url, data=text) >>> r = requests.post(url=url, data=text)
``` ```
`LAC`模型返回的结果为每个文本分词后的结果,我们尝试打印接口返回结果 `LAC`模型返回的结果为每个文本分词后的结果,我们尝试打印接口返回结果
```python ```python
# 打印预测结果 # 打印预测结果
>>> print(json.dumps(r.json(), indent=4, ensure_ascii=False)) >>> print(json.dumps(r.json(), indent=4, ensure_ascii=False))
...@@ -85,11 +85,11 @@ Loading lac successful. ...@@ -85,11 +85,11 @@ Loading lac successful.
完整的测试代码见[lac_serving_demo.py](lac_serving_demo.py) 完整的测试代码见[lac_serving_demo.py](lac_serving_demo.py)
### 使用自定义词典 ### 使用自定义词典
`LAC`模型在预测时还可以使用自定义词典干预默认分词结果,这种情况只需要将自定义词典以文件的形式附加到request请求即可,数据格式如下 `LAC`模型在预测时还可以使用自定义词典干预默认分词结果,这种情况只需要将自定义词典以文件的形式附加到request请求即可,数据格式如下
```python ```python
{"user_dict": user_dict.txt} {"user_dict": user_dict.txt}
``` ```
根据数据格式,具体代码如下 根据数据格式,具体代码如下
```python ```python
>>> # 指定自定义词典{"user_dict": dict.txt} >>> # 指定自定义词典{"user_dict": dict.txt}
>>> file = {"user_dict": open("dict.txt", "rb")} >>> file = {"user_dict": open("dict.txt", "rb")}
......
...@@ -7,38 +7,38 @@ ...@@ -7,38 +7,38 @@
下面就带领大家使用PaddleHub Serving,通过简单几步部署一个目标检测服务。 下面就带领大家使用PaddleHub Serving,通过简单几步部署一个目标检测服务。
## Step1:启动PaddleHub Serving ## Step1:启动PaddleHub Serving
启动命令如下 启动命令如下
```shell ```shell
$ hub serving start -m yolov3_darknet53_coco2017 $ hub serving start -m yolov3_darknet53_coco2017
``` ```
启动时会显示加载模型过程,启动成功后显示 启动时会显示加载模型过程,启动成功后显示
```shell ```shell
Loading yolov3_darknet53_coco2017 successful. Loading yolov3_darknet53_coco2017 successful.
``` ```
这样就完成了一个图像生成服务化API的部署,默认端口号为8866。 这样就完成了一个图像生成服务化API的部署,默认端口号为8866。
## Step2:测试图像生成在线API ## Step2:测试图像生成在线API
我们用来测试的样例图片为 我们用来测试的样例图片为
<p align="center"> <p align="center">
<img src="../img/cat.jpg" width="65%" /> <img src="../../../../docs/imgs/cat.jpg" width="65%" />
</p> </p>
<p align="center"> <p align="center">
<img src="../img/dog.jpg" width="65%" /> <img src="../../../../docs/imgs/dog.jpg" width="65%" />
</p> </p>
准备的数据格式为 准备的数据格式为
```python ```python
files = [("image", file_1), ("image", file_2)] files = [("image", file_1), ("image", file_2)]
``` ```
**NOTE:** 文件列表每个元素第一个参数为"image"。 **NOTE:** 文件列表每个元素第一个参数为"image"。
代码如下 代码如下
```python ```python
>>> # 指定要检测的图片并生成列表[("image", img_1), ("image", img_2), ... ] >>> # 指定要检测的图片并生成列表[("image", img_1), ("image", img_2), ... ]
>>> file_list = ["../img/cat.jpg", "../img/dog.jpg"] >>> file_list = ["../img/cat.jpg", "../img/dog.jpg"]
...@@ -46,13 +46,13 @@ files = [("image", file_1), ("image", file_2)] ...@@ -46,13 +46,13 @@ files = [("image", file_1), ("image", file_2)]
``` ```
## Step3:获取并验证结果 ## Step3:获取并验证结果
然后就可以发送请求到目标检测服务API,并得到结果,代码如下 然后就可以发送请求到目标检测服务API,并得到结果,代码如下
```python ```python
>>> # 指定检测方法为yolov3_darknet53_coco2017并发送post请求 >>> # 指定检测方法为yolov3_darknet53_coco2017并发送post请求
>>> url = "http://127.0.0.1:8866/predict/image/yolov3_darknet53_coco2017" >>> url = "http://127.0.0.1:8866/predict/image/yolov3_darknet53_coco2017"
>>> r = requests.post(url=url, files=files) >>> r = requests.post(url=url, files=files)
``` ```
我们可以打印接口返回结果 我们可以打印接口返回结果
```python ```python
>>> results = eval(r.json()["results"]) >>> results = eval(r.json()["results"])
>>> print(json.dumps(results, indent=4, ensure_ascii=False)) >>> print(json.dumps(results, indent=4, ensure_ascii=False))
...@@ -95,13 +95,13 @@ files = [("image", file_1), ("image", file_2)] ...@@ -95,13 +95,13 @@ files = [("image", file_1), ("image", file_2)]
``` ```
根据结果可以看出准确识别了请求的图片。 根据结果可以看出准确识别了请求的图片。
yolov3_darknet53_coco2017返回的结果还包括标注检测框的图像的base64编码格式,经过转换可以得到生成图像,代码如下 yolov3_darknet53_coco2017返回的结果还包括标注检测框的图像的base64编码格式,经过转换可以得到生成图像,代码如下
```python ```python
>>> for item in results: >>> for item in results:
... with open(output_path, "wb") as fp: ... with open(output_path, "wb") as fp:
... fp.write(base64.b64decode(item["base64"].split(',')[-1])) ... fp.write(base64.b64decode(item["base64"].split(',')[-1]))
``` ```
查看指定输出文件夹,就能看到生成图像了,如图 查看指定输出文件夹,就能看到生成图像了,如图
<p align="center"> <p align="center">
......
...@@ -7,11 +7,11 @@ ...@@ -7,11 +7,11 @@
这里就带领大家使用PaddleHub Serving,通过简单几步部署一个语义模型在线服务。 这里就带领大家使用PaddleHub Serving,通过简单几步部署一个语义模型在线服务。
## Step1:启动PaddleHub Serving ## Step1:启动PaddleHub Serving
启动命令如下 启动命令如下
```shell ```shell
$ hub serving start -m simnet_bow $ hub serving start -m simnet_bow
``` ```
启动时会显示加载模型过程,启动成功后显示 启动时会显示加载模型过程,启动成功后显示
```shell ```shell
Loading lac successful. Loading lac successful.
``` ```
...@@ -20,13 +20,13 @@ Loading lac successful. ...@@ -20,13 +20,13 @@ Loading lac successful.
## Step2:测试语义模型在线API ## Step2:测试语义模型在线API
在服务部署好之后,我们可以进行测试,用来测试的文本对分别为`[这道题太难了:这道题是上一年的考题], [这道题太难了:这道题不简单], [这道题太难了:这道题很有意思]` 在服务部署好之后,我们可以进行测试,用来测试的文本对分别为`[这道题太难了:这道题是上一年的考题], [这道题太难了:这道题不简单], [这道题太难了:这道题很有意思]`
准备的数据格式为 准备的数据格式为
```python ```python
{"text_1": [text_a1, text_a2, ... ], "text_2": [text_b1, text_b2, ... ]} {"text_1": [text_a1, text_a2, ... ], "text_2": [text_b1, text_b2, ... ]}
``` ```
**NOTE:** 字典的key分别为"text_1"和"text_2",与`simnet_bow`模型使用的输入数据一致。 **NOTE:** 字典的key分别为"text_1"和"text_2",与`simnet_bow`模型使用的输入数据一致。
根据文本和数据格式,代码如下 根据文本和数据格式,代码如下
```python ```python
>>> # 指定用于用于匹配的文本并生成字典{"text_1": [text_a1, text_a2, ... ] >>> # 指定用于用于匹配的文本并生成字典{"text_1": [text_a1, text_a2, ... ]
>>> # "text_2": [text_b1, text_b2, ... ]} >>> # "text_2": [text_b1, text_b2, ... ]}
...@@ -37,13 +37,13 @@ Loading lac successful. ...@@ -37,13 +37,13 @@ Loading lac successful.
``` ```
## Step3:获取并验证结果 ## Step3:获取并验证结果
接下来发送请求到语义模型API,并得到结果,代码如下 接下来发送请求到语义模型API,并得到结果,代码如下
```python ```python
>>> # 指定匹配方法为simnet_bow并发送post请求 >>> # 指定匹配方法为simnet_bow并发送post请求
>>> url = "http://127.0.0.1:8866/predict/text/simnet_bow" >>> url = "http://127.0.0.1:8866/predict/text/simnet_bow"
>>> r = requests.post(url=url, data=text) >>> r = requests.post(url=url, data=text)
``` ```
`simnet_bow`模型返回的结果为每对文本对比后的相似度,我们尝试打印接口返回结果 `simnet_bow`模型返回的结果为每对文本对比后的相似度,我们尝试打印接口返回结果
```python ```python
# 打印预测结果 # 打印预测结果
>>> print(json.dumps(r.json(), indent=4, ensure_ascii=False)) >>> print(json.dumps(r.json(), indent=4, ensure_ascii=False))
......
...@@ -11,14 +11,14 @@ ...@@ -11,14 +11,14 @@
```shell ```shell
$ hub serving start -m deeplabv3p_xception65_humanseg $ hub serving start -m deeplabv3p_xception65_humanseg
``` ```
启动时会显示加载模型过程,启动成功后显示 启动时会显示加载模型过程,启动成功后显示
```shell ```shell
Loading deeplabv3p_xception65_humanseg successful. Loading deeplabv3p_xception65_humanseg successful.
``` ```
这样就完成了一个图像分割服务化API的部署,默认端口号为8866。 这样就完成了一个图像分割服务化API的部署,默认端口号为8866。
## Step2:测试图像分割在线API ## Step2:测试图像分割在线API
我们用来测试的样例图片为 我们用来测试的样例图片为
<p align="center"> <p align="center">
...@@ -26,7 +26,7 @@ Loading deeplabv3p_xception65_humanseg successful. ...@@ -26,7 +26,7 @@ Loading deeplabv3p_xception65_humanseg successful.
</p> </p>
准备的数据格式为 准备的数据格式为
```python ```python
files = [("image", file_1), ("image", file_2)] files = [("image", file_1), ("image", file_2)]
``` ```
...@@ -35,18 +35,18 @@ files = [("image", file_1), ("image", file_2)] ...@@ -35,18 +35,18 @@ files = [("image", file_1), ("image", file_2)]
代码如下 代码如下
```python ```python
>>> # 指定要检测的图片并生成列表[("image", img_1), ("image", img_2), ... ] >>> # 指定要检测的图片并生成列表[("image", img_1), ("image", img_2), ... ]
>>> file_list = ["../img/girl.jpg"] >>> file_list = ["../../../../docs/imgs/girl.jpg"]
>>> files = [("image", (open(item, "rb"))) for item in file_list] >>> files = [("image", (open(item, "rb"))) for item in file_list]
``` ```
## Step3:获取并验证结果 ## Step3:获取并验证结果
然后就可以发送请求到图像分割服务API,并得到结果,代码如下 然后就可以发送请求到图像分割服务API,并得到结果,代码如下
```python ```python
>>> # 指定检测方法为deeplabv3p_xception65_humanseg并发送post请求 >>> # 指定检测方法为deeplabv3p_xception65_humanseg并发送post请求
>>> url = "http://127.0.0.1:8866/predict/image/deeplabv3p_xception65_humanseg" >>> url = "http://127.0.0.1:8866/predict/image/deeplabv3p_xception65_humanseg"
>>> r = requests.post(url=url, files=files) >>> r = requests.post(url=url, files=files)
``` ```
我们可以打印接口返回结果 我们可以打印接口返回结果
```python ```python
>>> results = eval(r.json()["results"]) >>> results = eval(r.json()["results"])
>>> print(json.dumps(results, indent=4, ensure_ascii=False)) >>> print(json.dumps(results, indent=4, ensure_ascii=False))
...@@ -58,13 +58,13 @@ files = [("image", file_1), ("image", file_2)] ...@@ -58,13 +58,13 @@ files = [("image", file_1), ("image", file_2)]
] ]
``` ```
deeplabv3p_xception65_humanseg返回的结果还包括人像分割后的图像的base64编码格式,经过转换可以得到生成图像,代码如下 deeplabv3p_xception65_humanseg返回的结果还包括人像分割后的图像的base64编码格式,经过转换可以得到生成图像,代码如下
```python ```python
>>> for item in results: >>> for item in results:
... with open(output_path, "wb") as fp: ... with open(output_path, "wb") as fp:
... fp.write(base64.b64decode(item["base64"].split(',')[-1])) ... fp.write(base64.b64decode(item["base64"].split(',')[-1]))
``` ```
查看指定输出文件夹,就能看到生成图像了,如图 查看指定输出文件夹,就能看到生成图像了,如图
<p align="center"> <p align="center">
......
...@@ -21,13 +21,13 @@ Loading senta_lstm successful. ...@@ -21,13 +21,13 @@ Loading senta_lstm successful.
## Step2:测试词法分析在线API ## Step2:测试词法分析在线API
在服务部署好之后,我们可以进行测试,用来测试的文本为`我不爱吃甜食``我喜欢躺在床上看电影` 在服务部署好之后,我们可以进行测试,用来测试的文本为`我不爱吃甜食``我喜欢躺在床上看电影`
准备的数据格式为 准备的数据格式为
```python ```python
{"text": [text_1, text_2, ...]} {"text": [text_1, text_2, ...]}
``` ```
**NOTE:** 字典的key为"text"。 **NOTE:** 字典的key为"text"。
根据文本和数据格式,代码如下 根据文本和数据格式,代码如下
```python ```python
>>> # 指定用于用于预测的文本并生成字典{"text": [text_1, text_2, ... ]} >>> # 指定用于用于预测的文本并生成字典{"text": [text_1, text_2, ... ]}
>>> text_list = ["我不爱吃甜食", "我喜欢躺在床上看电影"] >>> text_list = ["我不爱吃甜食", "我喜欢躺在床上看电影"]
...@@ -35,13 +35,13 @@ Loading senta_lstm successful. ...@@ -35,13 +35,13 @@ Loading senta_lstm successful.
``` ```
## Step3:获取并验证结果 ## Step3:获取并验证结果
接下来发送请求到词法分析API,并得到结果,代码如下 接下来发送请求到词法分析API,并得到结果,代码如下
```python ```python
# 指定预测方法为lac并发送post请求 # 指定预测方法为lac并发送post请求
>>> url = "http://127.0.0.1:8866/predict/text/senta_lstm" >>> url = "http://127.0.0.1:8866/predict/text/senta_lstm"
>>> r = requests.post(url=url, data=text) >>> r = requests.post(url=url, data=text)
``` ```
`LAC`模型返回的结果为每个文本分词后的结果,我们尝试打印接口返回结果 `LAC`模型返回的结果为每个文本分词后的结果,我们尝试打印接口返回结果
```python ```python
# 打印预测结果 # 打印预测结果
>>> print(json.dumps(r.json(), indent=4, ensure_ascii=False)) >>> print(json.dumps(r.json(), indent=4, ensure_ascii=False))
......
...@@ -8,11 +8,11 @@ ...@@ -8,11 +8,11 @@
这里就带领大家使用PaddleHub Serving,通过简单几步部署一个文本审核在线服务。 这里就带领大家使用PaddleHub Serving,通过简单几步部署一个文本审核在线服务。
## Step1:启动PaddleHub Serving ## Step1:启动PaddleHub Serving
启动命令如下 启动命令如下
```shell ```shell
$ hub serving start -m porn_detection_lstm $ hub serving start -m porn_detection_lstm
``` ```
启动时会显示加载模型过程,启动成功后显示 启动时会显示加载模型过程,启动成功后显示
```shell ```shell
Loading porn_detection_lstm successful. Loading porn_detection_lstm successful.
``` ```
...@@ -21,26 +21,26 @@ Loading porn_detection_lstm successful. ...@@ -21,26 +21,26 @@ Loading porn_detection_lstm successful.
## Step2:测试文本审核在线API ## Step2:测试文本审核在线API
在服务部署好之后,我们可以进行测试,用来测试的文本为`黄片下载``中国黄页` 在服务部署好之后,我们可以进行测试,用来测试的文本为`黄片下载``中国黄页`
准备的数据格式为 准备的数据格式为
```python ```python
{"text": [text_1, text_2, ...]} {"text": [text_1, text_2, ...]}
``` ```
**NOTE:** 字典的key为"text"。 **NOTE:** 字典的key为"text"。
根据文本和数据格式,代码如下 根据文本和数据格式,代码如下
```python ```python
>>> # 指定用于用于预测的文本并生成字典{"text": [text_1, text_2, ... ]} >>> # 指定用于用于预测的文本并生成字典{"text": [text_1, text_2, ... ]}
>>> text_list = ["黄片下载", "中国黄页"] >>> text_list = ["黄片下载", "中国黄页"]
>>> text = {"text": text_list} >>> text = {"text": text_list}
``` ```
## Step3:获取并验证结果 ## Step3:获取并验证结果
接下来发送请求到文本审核API,并得到结果,代码如下 接下来发送请求到文本审核API,并得到结果,代码如下
```python ```python
# 指定预测方法为lac并发送post请求 # 指定预测方法为lac并发送post请求
>>> url = "http://127.0.0.1:8866/predict/text/porn_detection_lstm" >>> url = "http://127.0.0.1:8866/predict/text/porn_detection_lstm"
>>> r = requests.post(url=url, data=text) >>> r = requests.post(url=url, data=text)
``` ```
`porn_detection_lstm`模型返回的结果为每个文本鉴定后的结果,我们尝试打印接口返回结果 `porn_detection_lstm`模型返回的结果为每个文本鉴定后的结果,我们尝试打印接口返回结果
```python ```python
# 打印预测结果 # 打印预测结果
>>> print(json.dumps(r.json(), indent=4, ensure_ascii=False)) >>> print(json.dumps(r.json(), indent=4, ensure_ascii=False))
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<div align="center"> <div align="center">
<img src="../demo/serving/bert_service/img/bs.png" aligh="center" width="100%" alt="BS流程图" /> <img src="../docs/imgs/bs.png" aligh="center" width="100%" alt="BS流程图" />
</div> </div>
...@@ -160,7 +160,7 @@ BSClient.get_result(self, input_text) ...@@ -160,7 +160,7 @@ BSClient.get_result(self, input_text)
|retry|连接失败后的最大重试次数|int|3| |retry|连接失败后的最大重试次数|int|3|
|input_text|输入文本,要获取embedding的原始文本|二维list类型,内部元素为string类型的文本|[['样例1'],['样例2']]| |input_text|输入文本,要获取embedding的原始文本|二维list类型,内部元素为string类型的文本|[['样例1'],['样例2']]|
## Demo-利用Bert Service部署ernie_tiny在线embedding服务 ## Demo——利用Bert Service部署ernie_tiny在线embedding服务
在这里,我们将展示一个实际场景中可能使用的demo,我们利用PaddleHub在一台GPU机器上部署`ernie_tiny`模型服务,并在另一台CPU机器上尝试访问,获取一首七言绝句的embedding。 在这里,我们将展示一个实际场景中可能使用的demo,我们利用PaddleHub在一台GPU机器上部署`ernie_tiny`模型服务,并在另一台CPU机器上尝试访问,获取一首七言绝句的embedding。
### Step1:安装环境依赖 ### Step1:安装环境依赖
首先需要安装环境依赖,根据第2节内容分别在两台机器上安装相应依赖。 首先需要安装环境依赖,根据第2节内容分别在两台机器上安装相应依赖。
...@@ -222,6 +222,9 @@ Paddle Inference Server exit successfully! ...@@ -222,6 +222,9 @@ Paddle Inference Server exit successfully!
``` ```
这样,我们就利用一台GPU机器就完成了`Bert Service`的部署,并利用另一台普通机器进行了测试,可见通过`Bert Service`能够方便地进行在线embedding服务的快速部署。 这样,我们就利用一台GPU机器就完成了`Bert Service`的部署,并利用另一台普通机器进行了测试,可见通过`Bert Service`能够方便地进行在线embedding服务的快速部署。
## 预训练模型一键服务部署
除了`Bert Service`外,PaddleHub Serving还具有预训练模型一键服务部署功能,能够将预训练模型快捷部署上线,对外提供可靠的在线预测服务,具体信息请参见[Module Serving](./serving.md)
## FAQ ## FAQ
Q : 如何在一台服务器部署多个模型? Q : 如何在一台服务器部署多个模型?
A : 可通过多次启动`Bert Service`,分配不同端口实现。如果使用GPU,需要指定不同的显卡。如同时部署`ernie``bert_chinese_L-12_H-768_A-12`,分别执行命令如下: A : 可通过多次启动`Bert Service`,分配不同端口实现。如果使用GPU,需要指定不同的显卡。如同时部署`ernie``bert_chinese_L-12_H-768_A-12`,分别执行命令如下:
......
...@@ -19,7 +19,7 @@ PaddleHub Serving是基于PaddleHub的一键模型服务部署工具,能够通 ...@@ -19,7 +19,7 @@ PaddleHub Serving是基于PaddleHub的一键模型服务部署工具,能够通
## 使用 ## 使用
### Step1:启动服务端部署 ### Step1:启动服务端部署
Hub-Serving有两种启动方式,分别是使用命令行命令启动,以及使用配置文件启动。 PaddleHub Serving有两种启动方式,分别是使用命令行命令启动,以及使用配置文件启动。
#### 命令行命令启动 #### 命令行命令启动
启动命令 启动命令
...@@ -34,7 +34,7 @@ $ hub serving start --modules [Module1==Version1, Module2==Version2, ...] \ ...@@ -34,7 +34,7 @@ $ hub serving start --modules [Module1==Version1, Module2==Version2, ...] \
|参数|用途| |参数|用途|
|-|-| |-|-|
|--modules/-m|Hub-Serving预安装模型,以多个Module==Version键值对的形式列出<br/>*`当不指定Version时,默认选择最新版本`*| |--modules/-m|PaddleHub Serving预安装模型,以多个Module==Version键值对的形式列出<br>*`当不指定Version时,默认选择最新版本`*|
|--port/-p|服务端口,默认为8866| |--port/-p|服务端口,默认为8866|
|--use_gpu|使用GPU进行预测,必须安装paddlepaddle-gpu| |--use_gpu|使用GPU进行预测,必须安装paddlepaddle-gpu|
|--use_multiprocess|是否启用并发方式,默认为单进程方式| |--use_multiprocess|是否启用并发方式,默认为单进程方式|
...@@ -70,7 +70,7 @@ $ hub serving start --config config.json ...@@ -70,7 +70,7 @@ $ hub serving start --config config.json
|参数|用途| |参数|用途|
|-|-| |-|-|
|--modules_info|Hub-Serving预安装模型,以字典列表形式列出,其中:<br>`module`为预测服务使用的模型名<br>`version`为预测模型的版本<br>`batch_size`为预测批次大小 |--modules_info|PaddleHub Serving预安装模型,以字典列表形式列出,其中:<br>`module`为预测服务使用的模型名<br>`version`为预测模型的版本<br>`batch_size`为预测批次大小
|--use_gpu|使用GPU进行预测,必须安装paddlepaddle-gpu| |--use_gpu|使用GPU进行预测,必须安装paddlepaddle-gpu|
|--port/-p|服务端口,默认为8866| |--port/-p|服务端口,默认为8866|
|--use_multiprocess|是否启用并发方式,默认为单进程方式,推荐多核CPU机器使用此方式| |--use_multiprocess|是否启用并发方式,默认为单进程方式,推荐多核CPU机器使用此方式|
...@@ -90,11 +90,11 @@ http://0.0.0.0:8866/predict/<CATEGORY\>/\<MODULE> ...@@ -90,11 +90,11 @@ http://0.0.0.0:8866/predict/<CATEGORY\>/\<MODULE>
<p align="center"> <p align="center">
<img src="../demo/serving/module_serving/img/web_demo.png" width="60%" /> <img src="../docs/imgs/web_demo.png" width="60%" />
</p> </p>
## 示例-部署一个在线lac分词服务 ## Demo——部署一个在线lac分词服务
### Step1:部署lac在线服务 ### Step1:部署lac在线服务
现在,我们要部署一个lac在线服务,以通过接口获取文本的分词结果。 现在,我们要部署一个lac在线服务,以通过接口获取文本的分词结果。
...@@ -126,7 +126,7 @@ $ hub serving start -c serving_config.json ...@@ -126,7 +126,7 @@ $ hub serving start -c serving_config.json
<p align="center"> <p align="center">
<img src="../demo/serving/module_serving/img/start_serving_lac.png" width="100%" /> <img src="../docs/imgs/start_serving_lac.png" width="100%" />
</p> </p>
...@@ -180,7 +180,7 @@ if __name__ == "__main__": ...@@ -180,7 +180,7 @@ if __name__ == "__main__":
} }
``` ```
## 示例-其他模型的一键部署服务 ## Demo——其他模型的一键部署服务
获取其他PaddleHub Serving的一键服务部署场景示例,可参见下列demo 获取其他PaddleHub Serving的一键服务部署场景示例,可参见下列demo
...@@ -215,3 +215,6 @@ if __name__ == "__main__": ...@@ -215,3 +215,6 @@ if __name__ == "__main__":
* [中文情感分析-基于simnet_bow](../demo/serving/module_serving/semantic_model_simnet_bow) * [中文情感分析-基于simnet_bow](../demo/serving/module_serving/semantic_model_simnet_bow)
&emsp;&emsp;该示例展示了利用senta_lstm完成中文文本情感分析服务化部署和在线预测,获取文本的情感分析结果。 &emsp;&emsp;该示例展示了利用senta_lstm完成中文文本情感分析服务化部署和在线预测,获取文本的情感分析结果。
## Bert Service
除了预训练模型一键服务部署功能外外,PaddleHub Serving还具有`Bert Service`功能,支持ernie_tiny、bert等模型快速部署,对外提供可靠的在线embedding服务,具体信息请参见[Bert Service](./bert_service.md)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册