diff --git a/demo/serving/README.md b/demo/serving/README.md index 11467beb57042d08aa28fb6994fce21fad45de64..368048a3bb9acbc12d9cfd184d91a0425a5c5786 100644 --- a/demo/serving/README.md +++ b/demo/serving/README.md @@ -1,54 +1,56 @@ -# PaddleHub-Serving -## 1. 简介 -### 1.1 什么是PaddleHub-Serving -PaddleHub-Serving是基于PaddleHub的一键模型服务部署工具,能够通过简单的Hub命令行工具轻松启动一个模型预测在线服务。 +# PaddleHub Serving +## 简介 +### 背景 +使用PaddleHub能够完成预训练模型的管理和预测,但开发者还经常面临将模型部署上线以对外提供服务的需求,而利用PaddleHub Serving可便捷的将模型部署上线,开发者只需要关注如何处理输入数据和输出结果即可。 +### 主要功能 +PaddleHub Serving是基于PaddleHub的一键模型服务部署工具,能够通过简单的Hub命令行工具轻松启动一个模型预测在线服务。 -### 1.2 为什么使用PaddleHub-Serving -使用PaddleHub能够完成预训练模型的管理和一键预测,但开发者还经常面临将模型部署上线以对外提供服务的需求,而利用PaddleHub-Serving可便捷的将模型部署上线,开发者只需要关注如何处理输入数据和输出结果即可。 +PaddleHub Serving主要包括利用Bert Service实现embedding服务化,以及利用预测模型实现预训练模型预测服务化两大功能,未来还将支持开发者使用PaddleHub Fine-tune API的模型服务化。 -### 1.3 PaddleHub-Serving的组成 -PaddleHub-Serving主要包括利用Bert Service实现embedding服务化,以及利用预测模型实现预训练模型预测服务化,未来还将支持开发者利用PaddleHub自己finetune后的模型服务化。 +## Bert Service +Bert Service是基于[Paddle Serving](https://github.com/PaddlePaddle/Serving)框架的快速部署模型远程计算服务方案,可将embedding过程通过调用API接口的方式实现,减少了对机器资源的依赖。使用PaddleHub可在服务器上一键部署`Bert Service`服务,在另外的普通机器上通过客户端接口即可轻松的获取文本对应的embedding数据。 -## 2. Bert Service -Bert Service是基于Paddle Serving框架的快速部署模型远程计算服务方案,可将embedding过程通过调用API接口的方式实现,减少了对机器资源的依赖。使用PaddleHub可在服务器上一键部署`Bert Service`服务,在另外的普通机器上通过客户端接口即可轻松的获取文本对应的embedding数据。 - -关于Bert Service的具体信息和示例请参阅[Bert Service](./bert_service) +关于Bert Service的具体信息和demo请参见[Bert Service](../../tutorial/bert_service.md) 该示例展示了利用Bert Service进行远程embedding服务化部署和在线预测,并获取文本embedding结果。 -## 3. PaddleHub-Serving -预训练模型预测服务化能够一键完成模型服务部署,包括以下示例: +## 预训练模型一键服务部署 +预训练模型一键服务部署是基于PaddleHub的预训练模型快速部署的服务化方案,能够将模型预测以API接口的方式实现。 + +关于预训练模型一键服务部署的具体信息请参见[PaqddleHub Serving](../../tutorial/serving.md) + +预训练模型一键服务部署包括以下示例: -* [图像分类-基于vgg11_imagent](serving/classification_vgg11_imagenet) +* [图像分类-基于vgg11_imagent](module_serving/classification_vgg11_imagenet) -该示例展示了利用vgg11_imagent完成图像分类服务化部署和在线预测,获取图像分类结果。 +  该示例展示了利用vgg11_imagent完成图像分类服务化部署和在线预测,获取图像分类结果。 -* [图像生成-基于stgan_celeba](serving/GAN_stgan_celeba) +* [图像生成-基于stgan_celeba](module_serving/GAN_stgan_celeba) -该示例展示了利用stgan_celeba生成图像服务化部署和在线预测,获取指定风格的生成图像。 +  该示例展示了利用stgan_celeba生成图像服务化部署和在线预测,获取指定风格的生成图像。 -* [文本审核-基于porn_detection_lstm](serving/text_censorship_porn_detection_lstm) +* [文本审核-基于porn_detection_lstm](module_serving/text_censorship_porn_detection_lstm) -该示例展示了利用porn_detection_lstm完成中文文本黄色敏感信息鉴定的服务化部署和在线预测,获取文本是否敏感及其置信度。 +  该示例展示了利用porn_detection_lstm完成中文文本黄色敏感信息鉴定的服务化部署和在线预测,获取文本是否敏感及其置信度。 -* [中文词法分析-基于lac](serving/lexical_analysis_lac) +* [中文词法分析-基于lac](module_serving/lexical_analysis_lac) -该示例展示了利用lac完成中文文本分词服务化部署和在线预测,获取文本的分词结果,并可通过用户自定义词典干预分词结果。 +  该示例展示了利用lac完成中文文本分词服务化部署和在线预测,获取文本的分词结果,并可通过用户自定义词典干预分词结果。 -* [目标检测-基于yolov3_darknet53_coco2017](serving/object_detection_yolov3_darknet53_coco2017) +* [目标检测-基于yolov3_darknet53_coco2017](module_serving/object_detection_yolov3_darknet53_coco2017) -该示例展示了利用yolov3_darknet53_coco2017完成目标检测服务化部署和在线预测,获取检测结果和覆盖识别框的图片。 +  该示例展示了利用yolov3_darknet53_coco2017完成目标检测服务化部署和在线预测,获取检测结果和覆盖识别框的图片。 -* [中文语义分析-基于simnet_bow](serving/semantic_model_simnet_bow) +* [中文语义分析-基于simnet_bow](module_serving/semantic_model_simnet_bow) -该示例展示了利用simnet_bow完成中文文本相似度检测服务化部署和在线预测,获取文本的相似程度。 +  该示例展示了利用simnet_bow完成中文文本相似度检测服务化部署和在线预测,获取文本的相似程度。 -* [图像分割-基于deeplabv3p_xception65_humanseg](serving/semantic_segmentation_deeplabv3p_xception65_humanseg) +* [图像分割-基于deeplabv3p_xception65_humanseg](module_serving/semantic_segmentation_deeplabv3p_xception65_humanseg) -该示例展示了利用deeplabv3p_xception65_humanseg完成图像分割服务化部署和在线预测,获取识别结果和分割后的图像。 +  该示例展示了利用deeplabv3p_xception65_humanseg完成图像分割服务化部署和在线预测,获取识别结果和分割后的图像。 -* [中文情感分析-基于simnet_bow](serving/semantic_model_simnet_bow) +* [中文情感分析-基于simnet_bow](module_serving/semantic_model_simnet_bow) -该示例展示了利用senta_lstm完成中文文本情感分析服务化部署和在线预测,获取文本的情感分析结果。 +  该示例展示了利用senta_lstm完成中文文本情感分析服务化部署和在线预测,获取文本的情感分析结果。 -关于Paddle-Serving一键模型部署功能的具体信息请参与[serving](./serving) +关于Paddle Serving预训练模型一键服务部署功能的具体信息请参见[serving](module_serving) diff --git a/demo/serving/serving/GAN_stgan_celeba/README.md b/demo/serving/module_serving/GAN_stgan_celeba/README.md similarity index 81% rename from demo/serving/serving/GAN_stgan_celeba/README.md rename to demo/serving/module_serving/GAN_stgan_celeba/README.md index 45fe9a87523bbeb02a7affc29c70c87579022e87..840ca02eecff5df9bad4973b93408d8d808bc68e 100644 --- a/demo/serving/serving/GAN_stgan_celeba/README.md +++ b/demo/serving/module_serving/GAN_stgan_celeba/README.md @@ -1,35 +1,36 @@ # 部署图像生成服务-以stgan_celeba为例 -## 1 简介 -图像生成是指根据预先设置的标签,生成对应图像的过程。stgan_celeba通过在GAN中加入encoder-decoder,可实现人脸属性的转换。关于stgan_celeba的具体信息请参阅[stgan_celeba](https://paddlepaddle.org.cn/hubdetail?name=stgan_celeba&en_category=GANs)。 +## 简介 +图像生成是指根据预先设置的标签,生成对应图像的过程。stgan_celeba通过在GAN中加入encoder-decoder,可实现人脸属性的转换。关于stgan_celeba的具体信息请参见[stgan_celeba](https://paddlepaddle.org.cn/hubdetail?name=stgan_celeba&en_category=GANs)。 -使用PaddleHub-Serving可以轻松部署一个在线图像生成服务API,可将此API接入自己的web网站,也可接入应用程序,如美图类应用,实现传照片修饰脸的功能。 +使用PaddleHub Serving可以轻松部署一个在线图像生成服务API,可将此API接入自己的web网站,也可接入应用程序,如美图类应用,实现传照片修饰脸的功能。 -下面就带领大家使用PaddleHub-Serving,通过简单几步部署一个图像生成服务。 +下面就带领大家使用PaddleHub Serving,通过简单几步部署一个图像生成服务。 -## 2 启动PaddleHub-Serving -启动命令如下 +## Step1:启动PaddleHub Serving +启动命令如下: ```shell $ hub serving start -m stgan_celeba ``` -启动时会显示加载模型过程,启动成功后显示 +启动时会显示加载模型过程,启动成功后显示: ```shell Loading stgan_celeba successful. ``` 这样就完成了一个图像生成服务化API的部署,默认端口号为8866。 -## 3 测试图像生成在线API -我们用来测试的样例图片为 +## Step2:测试图像生成在线API +我们用来测试的样例图片为:

-根据stgan_celeba所需信息,准备的数据包括图像文件和生成图像风格,格式为 +根据stgan_celeba所需信息,准备的数据包括图像文件和生成图像风格,格式为: ```python files = [("image", file_a), ("image", file_b)] data = {"info": ["info_a_1, info_a_2", "info_b_1, info_b_2"], "style": ["style_a", "style_b"]} ``` -注意文件列表每个元素第一个参数为"image"。 + +**NOTE:** 文件列表每个元素第一个参数为"image"。 info为图像描述,根据示例图像信息,info应为"Male,Black_Hair,Eyeglasses,No_Beard",即"男性,黑发,戴眼镜,没有胡子"。 @@ -43,6 +44,8 @@ image为要生成的图像风格,我们选取"Bald"(秃顶的)作为生成图 >>> # 为每张图片对应指定info和style >>> data = {"info": ["Male,Black_Hair,Eyeglasses,No_Beard"], "style": ["Bald"]} ``` + +## Step3:获取并验证结果 然后就可以发送请求到图像生成服务API,并得到结果,代码如下 ```python diff --git a/demo/serving/serving/GAN_stgan_celeba/stgan_celeba_serving_demo.py b/demo/serving/module_serving/GAN_stgan_celeba/stgan_celeba_serving_demo.py similarity index 100% rename from demo/serving/serving/GAN_stgan_celeba/stgan_celeba_serving_demo.py rename to demo/serving/module_serving/GAN_stgan_celeba/stgan_celeba_serving_demo.py diff --git a/demo/serving/serving/GAN_stgan_celeba/stgan_output/Bald_man.png b/demo/serving/module_serving/GAN_stgan_celeba/stgan_output/Bald_man.png similarity index 100% rename from demo/serving/serving/GAN_stgan_celeba/stgan_output/Bald_man.png rename to demo/serving/module_serving/GAN_stgan_celeba/stgan_output/Bald_man.png diff --git a/demo/serving/serving/classification_vgg11_imagenet/README.md b/demo/serving/module_serving/classification_vgg11_imagenet/README.md similarity index 73% rename from demo/serving/serving/classification_vgg11_imagenet/README.md rename to demo/serving/module_serving/classification_vgg11_imagenet/README.md index 5dc9e974004279b270f8003d0eeda325c029d469..178ff26e75404ee444a475a4e81e4fe25e596262 100644 --- a/demo/serving/serving/classification_vgg11_imagenet/README.md +++ b/demo/serving/module_serving/classification_vgg11_imagenet/README.md @@ -1,24 +1,24 @@ # 部署图像分类服务-以vgg11_imagenent为例 -## 1 简介 -图像分类是指通过模型,预测给定的图片所属类别,vgg11_imagenent就是一种有效的图像分类模型。关于vgg11_imagenent的具体信息请参阅[vgg11_imagenent](https://paddlepaddle.org.cn/hubdetail?name=vgg11_imagenet&en_category=ImageClassification)。 +## 简介 +图像分类是指通过模型,预测给定的图片所属类别,vgg11_imagenent就是一种有效的图像分类模型。关于vgg11_imagenent的具体信息请参见[vgg11_imagenent](https://paddlepaddle.org.cn/hubdetail?name=vgg11_imagenet&en_category=ImageClassification)。 -使用PaddleHub-Serving可以部署一个在线图片分类服务,既可以对用户暴露直接预测接口,也可以利用此接口实现一个web网站,甚至可以集成到移动端应用程序中实现拍照识别功能。 +使用PaddleHub Serving可以部署一个在线图片分类服务,既可以对用户暴露直接预测接口,也可以利用此接口实现一个web网站,甚至可以集成到移动端应用程序中实现拍照识别功能。 -这里就带领大家使用PaddleHub-Serving,通过简单几步部署一个图像分类服务。 +这里就带领大家使用PaddleHub Serving,通过简单几步部署一个图像分类服务。 -## 2 启动PaddleHub-Serving -启动命令如下 +## Step1:启动PaddleHub Serving +启动命令如下: ```shell $ hub serving start -m vgg11_imagenet ``` -启动时会显示加载模型过程,启动成功后显示 +启动时会显示加载模型过程,启动成功后显示: ```shell Loading vgg11_imagenet successful. ``` 这样就完成了一个图像分类服务化API的部署,默认端口号为8866。 -## 3 测试图像分类在线API -我们用来测试的样例图片为 +## Step2:测试图像分类在线API +我们用来测试的样例图片为:

@@ -28,24 +28,26 @@ Loading vgg11_imagenet successful.

-准备的数据格式为 +准备的数据格式为: ```python files = [("image", file_1), ("image", file_2)] ``` -注意每个元素第一个参数为"image"。 +**NOTE:** 每个元素第一个参数为"image"。 -代码如下 +代码如下: ```python >>> file_list = ["../img/cat.jpg", "../img/flower.jpg"] >>> files = [("image", (open(item, "rb"))) for item in file_list] ``` -然后就可以发送请求到图像分类服务API,并得到结果了,代码如下 + +## Step3:获取并验证结果 +然后就可以发送请求到图像分类服务API,并得到结果了,代码如下: ```python >>> # 指定检测方法为vgg11_imagenet并发送post请求 >>> url = "http://127.0.0.1:8866/predict/image/vgg11_imagenet" >>> r = requests.post(url=url, files=files) ``` -vgg11_imagenent返回的结果为图像分类结果及其对应的概率,我们尝试打印接口返回结果 +vgg11_imagenent返回的结果为图像分类结果及其对应的概率,我们尝试打印接口返回结果: ```python >>> print(json.dumps(r.json(), indent=4, ensure_ascii=False)) diff --git a/demo/serving/serving/classification_vgg11_imagenet/vgg11_imagenet_serving_demo.py b/demo/serving/module_serving/classification_vgg11_imagenet/vgg11_imagenet_serving_demo.py similarity index 100% rename from demo/serving/serving/classification_vgg11_imagenet/vgg11_imagenet_serving_demo.py rename to demo/serving/module_serving/classification_vgg11_imagenet/vgg11_imagenet_serving_demo.py diff --git a/demo/serving/serving/img/cat.jpg b/demo/serving/module_serving/img/cat.jpg similarity index 100% rename from demo/serving/serving/img/cat.jpg rename to demo/serving/module_serving/img/cat.jpg diff --git a/demo/serving/serving/img/dog.jpg b/demo/serving/module_serving/img/dog.jpg similarity index 100% rename from demo/serving/serving/img/dog.jpg rename to demo/serving/module_serving/img/dog.jpg diff --git a/demo/serving/serving/img/flower.jpg b/demo/serving/module_serving/img/flower.jpg similarity index 100% rename from demo/serving/serving/img/flower.jpg rename to demo/serving/module_serving/img/flower.jpg diff --git a/demo/serving/serving/img/girl.jpg b/demo/serving/module_serving/img/girl.jpg similarity index 100% rename from demo/serving/serving/img/girl.jpg rename to demo/serving/module_serving/img/girl.jpg diff --git a/demo/serving/serving/img/man.png b/demo/serving/module_serving/img/man.png similarity index 100% rename from demo/serving/serving/img/man.png rename to demo/serving/module_serving/img/man.png diff --git a/demo/serving/serving/img/start_serving_lac.png b/demo/serving/module_serving/img/start_serving_lac.png similarity index 100% rename from demo/serving/serving/img/start_serving_lac.png rename to demo/serving/module_serving/img/start_serving_lac.png diff --git a/demo/serving/serving/img/web_demo.png b/demo/serving/module_serving/img/web_demo.png similarity index 100% rename from demo/serving/serving/img/web_demo.png rename to demo/serving/module_serving/img/web_demo.png diff --git a/demo/serving/serving/img/woman.png b/demo/serving/module_serving/img/woman.png similarity index 100% rename from demo/serving/serving/img/woman.png rename to demo/serving/module_serving/img/woman.png diff --git a/demo/serving/serving/lexical_analysis_lac/README.md b/demo/serving/module_serving/lexical_analysis_lac/README.md similarity index 88% rename from demo/serving/serving/lexical_analysis_lac/README.md rename to demo/serving/module_serving/lexical_analysis_lac/README.md index 8405f9e503595886f26c6ce347e558d2f4b96299..a3377ba83c8ef8bbb8d2ef0fe0a1df33c5bb277d 100644 --- a/demo/serving/serving/lexical_analysis_lac/README.md +++ b/demo/serving/module_serving/lexical_analysis_lac/README.md @@ -1,12 +1,12 @@ # 部署词法分析服务-以lac为例 -## 1 简介 -`Lexical Analysis of Chinese`,简称`LAC`,是一个联合的词法分析模型,能整体性地完成中文分词、词性标注、专名识别任务。关于`LAC`的具体信息请参阅[LAC](https://paddlepaddle.org.cn/hubdetail?name=lac&en_category=LexicalAnalysis)。 +## 简介 +`Lexical Analysis of Chinese`,简称`LAC`,是一个联合的词法分析模型,能整体性地完成中文分词、词性标注、专名识别任务。关于`LAC`的具体信息请参见[LAC](https://paddlepaddle.org.cn/hubdetail?name=lac&en_category=LexicalAnalysis)。 -使用PaddleHub-Serving可以部署一个在线词法分析服务,可以将此接口用于词法分析、在线分词等在线web应用。 +使用PaddleHub Serving可以部署一个在线词法分析服务,可以将此接口用于词法分析、在线分词等在线web应用。 -这里就带领大家使用PaddleHub-Serving,通过简单几步部署一个词法分析在线服务。 +这里就带领大家使用PaddleHub Serving,通过简单几步部署一个词法分析在线服务。 -## 2 启动PaddleHub-Serving +## 2 启动PaddleHub Serving 启动命令如下 ```shell $ hub serving start -m lac @@ -17,15 +17,15 @@ Loading lac successful. ``` 这样就完成了一个词法分析服务化API的部署,默认端口号为8866。 -## 3 测试语言模型在线API -### 3.1 不使用自定义词典 +## Step2:测试语言模型在线API +### 不使用自定义词典 在服务部署好之后,我们可以进行测试,用来测试的文本为`今天是个好日子`和`天气预报说今天要下雨`。 准备的数据格式为 ```python {"text": [text_1, text_2, ...]} ``` -注意字典的key为"text"。 +**NOTE:** 字典的key为"text"。 根据文本和数据格式,代码如下 ```python @@ -33,6 +33,8 @@ Loading lac successful. >>> text_list = ["今天是个好日子", "天气预报说今天要下雨"] >>> text = {"text": text_list} ``` + +## Step3:获取并验证结果 接下来发送请求到词法分析API,并得到结果,代码如下 ```python # 指定预测方法为lac并发送post请求 @@ -82,7 +84,7 @@ Loading lac successful. 完整的测试代码见[lac_serving_demo.py](lac_serving_demo.py)。 -### 3.2 使用自定义词典 +### 使用自定义词典 `LAC`模型在预测时还可以使用自定义词典干预默认分词结果,这种情况只需要将自定义词典以文件的形式附加到request请求即可,数据格式如下 ```python {"user_dict": user_dict.txt} diff --git a/demo/serving/serving/lexical_analysis_lac/dict.txt b/demo/serving/module_serving/lexical_analysis_lac/dict.txt similarity index 100% rename from demo/serving/serving/lexical_analysis_lac/dict.txt rename to demo/serving/module_serving/lexical_analysis_lac/dict.txt diff --git a/demo/serving/serving/lexical_analysis_lac/lac_serving_demo.py b/demo/serving/module_serving/lexical_analysis_lac/lac_serving_demo.py similarity index 100% rename from demo/serving/serving/lexical_analysis_lac/lac_serving_demo.py rename to demo/serving/module_serving/lexical_analysis_lac/lac_serving_demo.py diff --git a/demo/serving/serving/lexical_analysis_lac/lac_with_dict_serving_demo.py b/demo/serving/module_serving/lexical_analysis_lac/lac_with_dict_serving_demo.py similarity index 100% rename from demo/serving/serving/lexical_analysis_lac/lac_with_dict_serving_demo.py rename to demo/serving/module_serving/lexical_analysis_lac/lac_with_dict_serving_demo.py diff --git a/demo/serving/serving/object_detection_yolov3_darknet53_coco2017/README.md b/demo/serving/module_serving/object_detection_yolov3_darknet53_coco2017/README.md similarity index 90% rename from demo/serving/serving/object_detection_yolov3_darknet53_coco2017/README.md rename to demo/serving/module_serving/object_detection_yolov3_darknet53_coco2017/README.md index 2129ed0c0e4116037d816d443038d2019b98031d..46e0e752da9ed66db4e7c5487bff4e3be03894bc 100644 --- a/demo/serving/serving/object_detection_yolov3_darknet53_coco2017/README.md +++ b/demo/serving/module_serving/object_detection_yolov3_darknet53_coco2017/README.md @@ -1,12 +1,12 @@ # 部署图像分类服务-以yolov3_darknet53_coco2017为例 -## 1 简介 -目标检测作为深度学习常见任务,在各种场景下都有所使用。使用`yolov3_darknet53_coco2017`模型可以进行目标检测任务,关于`yolov3_darknet53_coco2017`的具体信息请参阅[yolov3_darknet53_coco2017](https://paddlepaddle.org.cn/hubdetail?name=yolov3_darknet53_coco2017&en_category=ObjectDetection)。 +## 简介 +目标检测作为深度学习常见任务,在各种场景下都有所使用。使用`yolov3_darknet53_coco2017`模型可以进行目标检测任务,关于`yolov3_darknet53_coco2017`的具体信息请参见[yolov3_darknet53_coco2017](https://paddlepaddle.org.cn/hubdetail?name=yolov3_darknet53_coco2017&en_category=ObjectDetection)。 -使用PaddleHub-Serving可以轻松部署一个在线目标检测服务API,可将此API接入自己的web网站进行在线目标检测,也可接入移动端应用程序,实现识图、圈人等功能。 +使用PaddleHub Serving可以轻松部署一个在线目标检测服务API,可将此API接入自己的web网站进行在线目标检测,也可接入移动端应用程序,实现识图、圈人等功能。 -下面就带领大家使用PaddleHub-Serving,通过简单几步部署一个目标检测服务。 +下面就带领大家使用PaddleHub Serving,通过简单几步部署一个目标检测服务。 -## 2 启动PaddleHub-Serving +## Step1:启动PaddleHub Serving 启动命令如下 ```shell $ hub serving start -m yolov3_darknet53_coco2017 @@ -17,7 +17,7 @@ Loading yolov3_darknet53_coco2017 successful. ``` 这样就完成了一个图像生成服务化API的部署,默认端口号为8866。 -## 3 测试图像生成在线API +## Step2:测试图像生成在线API 我们用来测试的样例图片为

@@ -36,7 +36,7 @@ Loading yolov3_darknet53_coco2017 successful. ```python files = [("image", file_1), ("image", file_2)] ``` -注意文件列表每个元素第一个参数为"image"。 +**NOTE:** 文件列表每个元素第一个参数为"image"。 代码如下 ```python @@ -44,6 +44,8 @@ files = [("image", file_1), ("image", file_2)] >>> file_list = ["../img/cat.jpg", "../img/dog.jpg"] >>> files = [("image", (open(item, "rb"))) for item in file_list] ``` + +## Step3:获取并验证结果 然后就可以发送请求到目标检测服务API,并得到结果,代码如下 ```python >>> # 指定检测方法为yolov3_darknet53_coco2017并发送post请求 diff --git a/demo/serving/serving/object_detection_yolov3_darknet53_coco2017/output/cat.jpg b/demo/serving/module_serving/object_detection_yolov3_darknet53_coco2017/output/cat.jpg similarity index 100% rename from demo/serving/serving/object_detection_yolov3_darknet53_coco2017/output/cat.jpg rename to demo/serving/module_serving/object_detection_yolov3_darknet53_coco2017/output/cat.jpg diff --git a/demo/serving/serving/object_detection_yolov3_darknet53_coco2017/output/dog.jpg b/demo/serving/module_serving/object_detection_yolov3_darknet53_coco2017/output/dog.jpg similarity index 100% rename from demo/serving/serving/object_detection_yolov3_darknet53_coco2017/output/dog.jpg rename to demo/serving/module_serving/object_detection_yolov3_darknet53_coco2017/output/dog.jpg diff --git a/demo/serving/serving/object_detection_yolov3_darknet53_coco2017/yolov3_darknet53_coco2017_serving_demo.py b/demo/serving/module_serving/object_detection_yolov3_darknet53_coco2017/yolov3_darknet53_coco2017_serving_demo.py similarity index 100% rename from demo/serving/serving/object_detection_yolov3_darknet53_coco2017/yolov3_darknet53_coco2017_serving_demo.py rename to demo/serving/module_serving/object_detection_yolov3_darknet53_coco2017/yolov3_darknet53_coco2017_serving_demo.py diff --git a/demo/serving/serving/semantic_model_simnet_bow/README.md b/demo/serving/module_serving/semantic_model_simnet_bow/README.md similarity index 85% rename from demo/serving/serving/semantic_model_simnet_bow/README.md rename to demo/serving/module_serving/semantic_model_simnet_bow/README.md index 05e72cf41e91586758f968e608ae2d7fd5ee549f..e9dae4cff7d276075ce404d6b1d12b4c9404453f 100644 --- a/demo/serving/serving/semantic_model_simnet_bow/README.md +++ b/demo/serving/module_serving/semantic_model_simnet_bow/README.md @@ -1,12 +1,12 @@ # 部署语义模型服务-以simnet_bow为例 -## 1 简介 -`simnet_bow`是一个计算短文本相似度的模型,可以根据用户输入的两个文本,计算出相似度得分。关于`simnet_bow`的具体信息请参阅[simnet_bow](https://paddlepaddle.org.cn/hubdetail?name=simnet_bow&en_category=SemanticModel)。 +## 简介 +`simnet_bow`是一个计算短文本相似度的模型,可以根据用户输入的两个文本,计算出相似度得分。关于`simnet_bow`的具体信息请参见[simnet_bow](https://paddlepaddle.org.cn/hubdetail?name=simnet_bow&en_category=SemanticModel)。 -使用PaddleHub-Serving可以部署一个在线语义模型服务,可以将此接口用于在线文本相似度分析、智能问答检索等应用。 +使用PaddleHub Serving可以部署一个在线语义模型服务,可以将此接口用于在线文本相似度分析、智能问答检索等应用。 -这里就带领大家使用PaddleHub-Serving,通过简单几步部署一个语义模型在线服务。 +这里就带领大家使用PaddleHub Serving,通过简单几步部署一个语义模型在线服务。 -## 2 启动PaddleHub-Serving +## Step1:启动PaddleHub Serving 启动命令如下 ```shell $ hub serving start -m simnet_bow @@ -17,14 +17,14 @@ Loading lac successful. ``` 这样就完成了一个语义模型服务化API的部署,默认端口号为8866。 -## 3 测试语义模型在线API +## Step2:测试语义模型在线API 在服务部署好之后,我们可以进行测试,用来测试的文本对分别为`[这道题太难了:这道题是上一年的考题], [这道题太难了:这道题不简单], [这道题太难了:这道题很有意思]`。 准备的数据格式为 ```python {"text_1": [text_a1, text_a2, ... ], "text_2": [text_b1, text_b2, ... ]} ``` -注意字典的key分别为"text_1"和"text_2",与`simnet_bow`模型使用的输入数据一致。 +**NOTE:** 字典的key分别为"text_1"和"text_2",与`simnet_bow`模型使用的输入数据一致。 根据文本和数据格式,代码如下 ```python @@ -35,6 +35,8 @@ Loading lac successful. >>> "text_2": ["这道题是上一年的考题", "这道题不简单", "这道题很有意思"] >>> } ``` + +## Step3:获取并验证结果 接下来发送请求到语义模型API,并得到结果,代码如下 ```python >>> # 指定匹配方法为simnet_bow并发送post请求 diff --git a/demo/serving/serving/semantic_model_simnet_bow/simnet_bow_serving_demo.py b/demo/serving/module_serving/semantic_model_simnet_bow/simnet_bow_serving_demo.py similarity index 100% rename from demo/serving/serving/semantic_model_simnet_bow/simnet_bow_serving_demo.py rename to demo/serving/module_serving/semantic_model_simnet_bow/simnet_bow_serving_demo.py diff --git a/demo/serving/serving/semantic_segmentation_deeplabv3p_xception65_humanseg/README.md b/demo/serving/module_serving/semantic_segmentation_deeplabv3p_xception65_humanseg/README.md similarity index 86% rename from demo/serving/serving/semantic_segmentation_deeplabv3p_xception65_humanseg/README.md rename to demo/serving/module_serving/semantic_segmentation_deeplabv3p_xception65_humanseg/README.md index 3a1a11535c8b069329c2b1268d917fc867d7b785..2a17ee34b5b54c425fb52ea6c19e7311cb87f9d8 100644 --- a/demo/serving/serving/semantic_segmentation_deeplabv3p_xception65_humanseg/README.md +++ b/demo/serving/module_serving/semantic_segmentation_deeplabv3p_xception65_humanseg/README.md @@ -1,12 +1,12 @@ # 部署图像分割服务-以deeplabv3p_xception65_humanseg为例 -## 1 简介 -图像分割是深度学习的常见任务。使用`deeplabv3p_xception65_humanseg`模型可以进行人像分割任务,关于`deeplabv3p_xception65_humanseg`的具体信息请参阅[deeplabv3p_xception65_humanseg](https://paddlepaddle.org.cn/hubdetail?name=deeplabv3p_xception65_humanseg&en_category=ImageSegmentation)。 +## 简介 +图像分割是深度学习的常见任务。使用`deeplabv3p_xception65_humanseg`模型可以进行人像分割任务,关于`deeplabv3p_xception65_humanseg`的具体信息请参见[deeplabv3p_xception65_humanseg](https://paddlepaddle.org.cn/hubdetail?name=deeplabv3p_xception65_humanseg&en_category=ImageSegmentation)。 -使用PaddleHub-Serving可以轻松部署一个在线图像分割服务API,可将此API接入自己的web网站进行在线图像分割,也可接入移动端应用程序,实现拍照分割等功能。 +使用PaddleHub Serving可以轻松部署一个在线图像分割服务API,可将此API接入自己的web网站进行在线图像分割,也可接入移动端应用程序,实现拍照分割等功能。 -下面就带领大家使用PaddleHub-Serving,通过简单几步部署一个目标检测服务。 +下面就带领大家使用PaddleHub Serving,通过简单几步部署一个目标检测服务。 -## 2 启动PaddleHub-Serving +## Step1:启动PaddleHub Serving 启动命令如下 ```shell $ hub serving start -m deeplabv3p_xception65_humanseg @@ -17,7 +17,7 @@ Loading deeplabv3p_xception65_humanseg successful. ``` 这样就完成了一个图像分割服务化API的部署,默认端口号为8866。 -## 3 测试图像分割在线API +## Step2:测试图像分割在线API 我们用来测试的样例图片为

@@ -30,7 +30,7 @@ Loading deeplabv3p_xception65_humanseg successful. ```python files = [("image", file_1), ("image", file_2)] ``` -注意文件列表每个元素第一个参数为"image"。 +**NOTE:** 文件列表每个元素第一个参数为"image"。 代码如下 ```python @@ -38,6 +38,8 @@ files = [("image", file_1), ("image", file_2)] >>> file_list = ["../img/girl.jpg"] >>> files = [("image", (open(item, "rb"))) for item in file_list] ``` + +## Step3:获取并验证结果 然后就可以发送请求到图像分割服务API,并得到结果,代码如下 ```python >>> # 指定检测方法为deeplabv3p_xception65_humanseg并发送post请求 diff --git a/demo/serving/serving/semantic_segmentation_deeplabv3p_xception65_humanseg/deeplabv3p_xception65_humanseg_serving_demo.py b/demo/serving/module_serving/semantic_segmentation_deeplabv3p_xception65_humanseg/deeplabv3p_xception65_humanseg_serving_demo.py similarity index 100% rename from demo/serving/serving/semantic_segmentation_deeplabv3p_xception65_humanseg/deeplabv3p_xception65_humanseg_serving_demo.py rename to demo/serving/module_serving/semantic_segmentation_deeplabv3p_xception65_humanseg/deeplabv3p_xception65_humanseg_serving_demo.py diff --git a/demo/serving/serving/semantic_segmentation_deeplabv3p_xception65_humanseg/output/girl.png b/demo/serving/module_serving/semantic_segmentation_deeplabv3p_xception65_humanseg/output/girl.png similarity index 100% rename from demo/serving/serving/semantic_segmentation_deeplabv3p_xception65_humanseg/output/girl.png rename to demo/serving/module_serving/semantic_segmentation_deeplabv3p_xception65_humanseg/output/girl.png diff --git a/demo/serving/serving/Sentiment_Analysis_senta_lstm/README.md b/demo/serving/module_serving/sentiment_analysis_senta_lstm/README.md similarity index 84% rename from demo/serving/serving/Sentiment_Analysis_senta_lstm/README.md rename to demo/serving/module_serving/sentiment_analysis_senta_lstm/README.md index be187024b153b51b7992912b83bcead3d39c3f5c..958f412e85134e7f176baf948684985f446db69e 100644 --- a/demo/serving/serving/Sentiment_Analysis_senta_lstm/README.md +++ b/demo/serving/module_serving/sentiment_analysis_senta_lstm/README.md @@ -1,12 +1,13 @@ # 部署情感分析服务-以senta_lstm为例 -## 1 简介 -情感分析针对带有主观描述的中文文本,可自动判断该文本的情感极性类别并给出相应的置信度。利用`senta_lstm`模型可以完成中文情感分析任务,关于`senta_lstm`的具体信息请参阅[senta_lstm](https://paddlepaddle.org.cn/hubdetail?name=senta_lstm&en_category=SentimentAnalysis)。 +## 简介 +情感分析针对带有主观描述的中文文本,可自动判断该文本的情感极性类别并给出相应的置信度。利用`senta_lstm`模型可以完成中文情感分析任务,关于`senta_lstm`的具体信息请参见[senta_lstm] +(https://paddlepaddle.org.cn/hubdetail?name=senta_lstm&en_category=SentimentAnalysis)。 -使用PaddleHub-Serving可以部署一个在线情感分析服务,可以将此接口用于分析评论、智能客服等应用。 +使用PaddleHub Serving可以部署一个在线情感分析服务,可以将此接口用于分析评论、智能客服等应用。 -这里就带领大家使用PaddleHub-Serving,通过简单几步部署一个情感分析在线服务。 +这里就带领大家使用PaddleHub Serving,通过简单几步部署一个情感分析在线服务。 -## 2 启动PaddleHub-Serving +## Step1:启动PaddleHub Serving 启动命令如下 ```shell $ hub serving start -m senta_lstm @@ -17,14 +18,14 @@ Loading senta_lstm successful. ``` 这样就完成了一个词法分析服务化API的部署,默认端口号为8866。 -## 3 测试词法分析在线API +## Step2:测试词法分析在线API 在服务部署好之后,我们可以进行测试,用来测试的文本为`我不爱吃甜食`和`我喜欢躺在床上看电影`。 准备的数据格式为 ```python {"text": [text_1, text_2, ...]} ``` -注意字典的key为"text"。 +**NOTE:** 字典的key为"text"。 根据文本和数据格式,代码如下 ```python @@ -32,6 +33,8 @@ Loading senta_lstm successful. >>> text_list = ["我不爱吃甜食", "我喜欢躺在床上看电影"] >>> text = {"text": text_list} ``` + +## Step3:获取并验证结果 接下来发送请求到词法分析API,并得到结果,代码如下 ```python # 指定预测方法为lac并发送post请求 diff --git a/demo/serving/serving/Sentiment_Analysis_senta_lstm/senta_lstm_serving_demo.py b/demo/serving/module_serving/sentiment_analysis_senta_lstm/senta_lstm_serving_demo.py similarity index 100% rename from demo/serving/serving/Sentiment_Analysis_senta_lstm/senta_lstm_serving_demo.py rename to demo/serving/module_serving/sentiment_analysis_senta_lstm/senta_lstm_serving_demo.py diff --git a/demo/serving/serving/text_censorship_porn_detection_lstm/README.md b/demo/serving/module_serving/text_censorship_porn_detection_lstm/README.md similarity index 83% rename from demo/serving/serving/text_censorship_porn_detection_lstm/README.md rename to demo/serving/module_serving/text_censorship_porn_detection_lstm/README.md index fcdbb36ad61972fa68762b071da3455cf6fe392a..0b273ae0df562bc9e6ad048d9f086696ce547283 100644 --- a/demo/serving/serving/text_censorship_porn_detection_lstm/README.md +++ b/demo/serving/module_serving/text_censorship_porn_detection_lstm/README.md @@ -1,12 +1,13 @@ # 部署文本审核服务-以porn_detection_lstm为例 -## 1 简介 -在网站建设等场景中经常需要对敏感信息进行鉴定和过滤,采用文本审核模型`porn_detection_lstm`可自动判别文本是否涉黄并给出相应的置信度,关于`porn_detection_lstm`的具体信息请参阅[porn_detection_lstm](https://paddlepaddle.org.cn/hubdetail?name=porn_detection_lstm&en_category=TextCensorship) +## 简介 +在网站建设等场景中经常需要对敏感信息进行鉴定和过滤,采用文本审核模型`porn_detection_lstm`可自动判别文本是否涉黄并给出相应的置信度,关于`porn_detection_lstm`的具体信息请参见[porn_detection_lstm](https://paddlepaddle.org +.cn/hubdetail?name=porn_detection_lstm&en_category=TextCensorship) -使用PaddleHub-Serving可以部署一个在线文本审核服务,可以将此接口用于防止低俗交友、色情文本等应用。 +使用PaddleHub Serving可以部署一个在线文本审核服务,可以将此接口用于防止低俗交友、色情文本等应用。 -这里就带领大家使用PaddleHub-Serving,通过简单几步部署一个文本审核在线服务。 +这里就带领大家使用PaddleHub Serving,通过简单几步部署一个文本审核在线服务。 -## 2 启动PaddleHub-Serving +## Step1:启动PaddleHub Serving 启动命令如下 ```shell $ hub serving start -m porn_detection_lstm @@ -17,14 +18,14 @@ Loading porn_detection_lstm successful. ``` 这样就完成了一个文本审核服务化API的部署,默认端口号为8866。 -## 3 测试文本审核在线API +## Step2:测试文本审核在线API 在服务部署好之后,我们可以进行测试,用来测试的文本为`黄片下载`和`中国黄页`。 准备的数据格式为 ```python {"text": [text_1, text_2, ...]} ``` -注意字典的key为"text"。 +**NOTE:** 字典的key为"text"。 根据文本和数据格式,代码如下 ```python @@ -32,6 +33,7 @@ Loading porn_detection_lstm successful. >>> text_list = ["黄片下载", "中国黄页"] >>> text = {"text": text_list} ``` +## Step3:获取并验证结果 接下来发送请求到文本审核API,并得到结果,代码如下 ```python # 指定预测方法为lac并发送post请求 diff --git a/demo/serving/serving/text_censorship_porn_detection_lstm/porn_detection_lstm_serving_demo.py b/demo/serving/module_serving/text_censorship_porn_detection_lstm/porn_detection_lstm_serving_demo.py similarity index 100% rename from demo/serving/serving/text_censorship_porn_detection_lstm/porn_detection_lstm_serving_demo.py rename to demo/serving/module_serving/text_censorship_porn_detection_lstm/porn_detection_lstm_serving_demo.py diff --git a/demo/serving/serving/README.md b/demo/serving/serving/README.md deleted file mode 100644 index 03df13d55ce4b3e7c5066dfa9ddbe24fa83b3f45..0000000000000000000000000000000000000000 --- a/demo/serving/serving/README.md +++ /dev/null @@ -1,230 +0,0 @@ -# Hub-Serving一键服务部署 -## 1 简介 -### 1.1 什么是PaddleHub-Serving一键服务部署 -PaddleHub-Serving是基于PaddleHub的一键模型服务部署工具,能够通过简单的Hub命令行工具轻松启动一个模型预测在线服务,开发者可利用PaddleHub-Serving快速得到一个预测服务API。 - -### 1.2 支持模型 -目前PaddleHub-Serving支持PaddleHub所有可直接用于预测的模型进行服务部署,包括`lac`、`senta_bilstm`等nlp类模型,以及`yolov3_coco2017`、`vgg16_imagenet`等cv类模型,未来还将支持开发者使用自己finetune后的模型用于快捷服务部署。 - -### 1.3 所需环境 -下表是使用PaddleHub-Serving的环境要求及注意事项。 - -|项目|建议版本|说明| -|:-:|:-:|:-:| -|操作系统|Linux/Darwin/Windows|建议使用Linux或Darwin,对多线程启动方式支持性较好| -|PaddleHub|>=1.4.0|无| -|PaddlePaddle|>=1.6.1|若使用GPU计算,则对应使用PaddlePaddle-gpu版本| - -## 2 使用 -### 2.1 启动Hub-Serving服务端部署 -Hub-Serving有两种启动方式,分别是使用命令行命令启动,以及使用配置文件启动。 - -#### 2.1.1 命令行命令启动 -启动命令 -```shell -$ hub serving start --modules [Module1==Version1, Module2==Version2, ...] \ - --port XXXX \ - --use_gpu \ - --use_multiprocess -``` - -**参数**: - -|参数|用途| -|-|-| -|--modules/-m|Hub-Serving预安装模型,以多个Module==Version键值对的形式列出
*`当不指定Version时,默认选择最新版本`*| -|--port/-p|服务端口,默认为8866| -|--use_gpu|使用GPU进行预测,必须安装paddlepaddle-gpu| -|--use_multiprocess|是否启用并发方式,默认为单进程方式| - -#### 2.1.2 配置文件启动 -启动命令 -```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" - } - ], - "use_gpu": false, - "port": 8866, - "use_multiprocess": false -} -``` - -**参数**: - -|参数|用途| -|-|-| -|--modules_info|Hub-Serving预安装模型,以字典列表形式列出,其中:
`module`为预测服务使用的模型名
`version`为预测模型的版本
`batch_size`为预测批次大小 -|--use_gpu|使用GPU进行预测,必须安装paddlepaddle-gpu| -|--port/-p|服务端口,默认为8866| -|--use_multiprocess|是否启用并发方式,默认为单进程方式,推荐多核CPU机器使用此方式| - -### 2.2 访问PaddleHub-Serving服务端 - -在使用PaddleHub-Serving部署服务端的模型预测服务后,就可以在客户端访问预测接口以获取结果了,接口url格式为: - -http://0.0.0.0:8866/predict/\/\ - -其中,\为text或image,与模型种类对应,\为模型名。 - -通过发送一个POST请求,即可获取预测结果,下面我们将展示一个具体的demo,以说明使用PaddleHub-Serving部署和使用流程。 - -### 2.3 利用PaddleHub-Serving进行个性化开发 -使用PaddleHub-Serving进行模型服务部署后,可以利用得到的接口进行开发,如对外提供web服务,或接入到应用程序中,以降低客户端预测压力,提高性能,下面展示了一个web页面demo: - -

- - - -

- -## 3 示例-部署一个在线lac分词服务 - -### 3.1 部署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 -} -``` -启动成功界面如图: - -

- - - -

- -这样我们就在8866端口部署了lac的在线分词服务。 -*此处warning为Flask提示,不影响使用* - -### 3.2 访问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)) -``` -运行后得到结果 -
- lac分词结果 - - ```python - { - "results": [ - { - "tag": [ - "TIME", - "v", - "q", - "n" - ], - "word": [ - "今天", - "是", - "个", - "好日子" - ] - }, - { - "tag": [ - "n", - "v", - "TIME", - "v", - "v" - ], - "word": [ - "天气预报", - "说", - "今天", - "要", - "下雨" - ] - } - ] - } - ``` - - - -获取其他PaddleHub-Serving的一键服务部署场景示例,可参阅下列demo - -* [图像分类-基于vgg11_imagent](serving/classification_vgg11_imagenet) - -该示例展示了利用vgg11_imagent完成图像分类服务化部署和在线预测,获取图像分类结果。 - -* [图像生成-基于stgan_celeba](serving/GAN_stgan_celeba) - -该示例展示了利用stgan_celeba生成图像服务化部署和在线预测,获取指定风格的生成图像。 - -* [文本审核-基于porn_detection_lstm](serving/text_censorship_porn_detection_lstm) - -该示例展示了利用porn_detection_lstm完成中文文本黄色敏感信息鉴定的服务化部署和在线预测,获取文本是否敏感及其置信度。 - -* [中文词法分析-基于lac](serving/lexical_analysis_lac) - -该示例展示了利用lac完成中文文本分词服务化部署和在线预测,获取文本的分词结果,并可通过用户自定义词典干预分词结果。 - -* [目标检测-基于yolov3_darknet53_coco2017](serving/object_detection_yolov3_darknet53_coco2017) - -该示例展示了利用yolov3_darknet53_coco2017完成目标检测服务化部署和在线预测,获取检测结果和覆盖识别框的图片。 - -* [中文语义分析-基于simnet_bow](serving/semantic_model_simnet_bow) - -该示例展示了利用simnet_bow完成中文文本相似度检测服务化部署和在线预测,获取文本的相似程度。 - -* [图像分割-基于deeplabv3p_xception65_humanseg](serving/semantic_segmentation_deeplabv3p_xception65_humanseg) - -该示例展示了利用deeplabv3p_xception65_humanseg完成图像分割服务化部署和在线预测,获取识别结果和分割后的图像。 - -* [中文情感分析-基于simnet_bow](serving/semantic_model_simnet_bow) - -该示例展示了利用senta_lstm完成中文文本情感分析服务化部署和在线预测,获取文本的情感分析结果。 diff --git a/demo/serving/bert_service/README.md b/tutorial/bert_service.md similarity index 81% rename from demo/serving/bert_service/README.md rename to tutorial/bert_service.md index 192950128fedc63752424e2a711f641cb5a89bd4..90703dcf75ce6d4c9ab759a91b056851e822559c 100644 --- a/demo/serving/bert_service/README.md +++ b/tutorial/bert_service.md @@ -1,17 +1,17 @@ # Bert Service -## 1. 简介 -### 1.1 什么是Bert Service -`Bert Service`是基于Paddle Serving框架的快速部署模型远程计算服务方案,可将embedding过程通过调用API接口的方式实现,减少了对机器资源的依赖。使用PaddleHub可在服务器上一键部署`Bert Service`服务,在另外的普通机器上通过客户端接口即可轻松的获取文本对应的embedding数据。 +## 简介 +### 什么是Bert Service +`Bert Service`是基于[Paddle Serving](https://github.com/PaddlePaddle/Serving)框架的快速部署模型远程计算服务方案,可将embedding过程通过调用API接口的方式实现,减少了对机器资源的依赖。使用PaddleHub可在服务器上一键部署`Bert Service`服务,在另外的普通机器上通过客户端接口即可轻松的获取文本对应的embedding数据。 整体流程图如下:
-BS流程图 +BS流程图
-### 1.2 为什么使用Bert Service +### 为什么使用Bert Service * 算力有限的集群环境中,可利用一台或几台高性能机器部署`Bert Service`服务端,为全部机器提供在线embedding功能。 * 实际的生产服务器不适宜承担大批量embedding工作,通过API接口可减少资源占用。 @@ -28,9 +28,10 @@ * 删繁就简,专注任务。`Bert Service`基于PaddlePaddle和PaddleHub开发,将模型的下载和安装等管理工作交由PaddleHub,开发者可以专注于主要任务,还可以无缝对接PaddleHub继续进行文本分类、序列标注等下游任务。 +使用Bert Service搭建服务主要分为下面三个步骤: -## 2. 环境准备 -### 2.1 环境要求 +## Step1:环境准备 +### 环境要求 下表是使用`Bert Service`的环境要求,带有*号标志项为非必需依赖,可根据实际使用需求选择安装。 |项目|版本|说明| @@ -43,7 +44,7 @@ |paddle-gpu-serving*|>=0.8.0|在`Bert Service`服务端需依赖此包| |ujson*|>=1.35|在`Bert Service`客户端需依赖此包| -### 2.2 安装步骤 +### 安装步骤 a) 安装PaddlePaddle,利用pip下载CPU版本命令如下。GPU版本、Docker方式安装等其他更具体的安装过程见[开始使用PaddlePaddle](https://paddlepaddle.org.cn/install/quick) ```shell $ # 安装paddlepaddle的CPU版本 @@ -63,7 +64,7 @@ $ pip install ujson ``` -## 3. 支持模型 +### 支持模型 目前`Bert Service`支持的语义模型如下表,可根据需要选择模型进行部署embedding服务,未来还将支持更多模型。 |模型|网络| @@ -83,13 +84,13 @@ $ pip install ujson |[bert_chinese_L-12_H-768_A-12](https://paddlepaddle.org.cn/hubdetail?name=bert_chinese_L-12_H-768_A-12&en_category=SemanticModel)|BERT| -## 4. 服务端(server) -### 4.1 简介 +## Step2:服务端(server) +### 简介 server端接收client端发送的数据,执行模型计算过程并将计算结果返回给client端。 server端启动时会按照指定的模型名称从PaddleHub获取对应的模型文件进行加载,无需提前下载模型或指定模型路径,对模型的管理工作由PaddleHub负责。在加载模型后在指定的端口启动`BRPC`服务,保持端口监听,当接收到数据后便执行模型计算,并将计算结果通过`BRPC`返回并发送至client端。 -### 4.2 启动 +### 启动 使用PaddleHub的命令行工具可一键启动`Bert Service`,命令如下: ```shell $ hub serving start bert_service -m ernie_tiny -p 8866 --use_gpu --gpu 0 @@ -122,19 +123,19 @@ Server[baidu::paddle_serving::predictor::bert_service::BertServiceImpl] is servi -### 4.3 关闭 +### 关闭 通过在启动服务端的命令行页面使用Ctrl+C终止`Bert Service`运行,关闭成功则显示: ```shell Paddle Inference Server exit successfully! ``` -## 5.客户端(client) -### 5.1 简介 +## Step3:客户端(client) +### 简介 client端接收文本数据,并获取server端返回的模型计算的embedding结果。 client端利用PaddleHub的语义理解任务将原始文本按照不同模型的数据预处理方案将文本ID化,并生成对应的sentence type、position、input masks数据,将这些信息封装成json数据,通过http协议按照指定的IP端口信息发送至server端,等待并获取模型生成结果。 -### 5.2 启动 +### 启动 服务端类BSClient初始化方法原型为: ```python BSClient.__init__(self, @@ -159,12 +160,12 @@ BSClient.get_result(self, input_text) |retry|连接失败后的最大重试次数|int|3| |input_text|输入文本,要获取embedding的原始文本|二维list类型,内部元素为string类型的文本|[['样例1'],['样例2']]| -## 6. Demo +## Demo-利用Bert Service部署ernie_tiny在线embedding服务 在这里,我们将展示一个实际场景中可能使用的demo,我们利用PaddleHub在一台GPU机器上部署`ernie_tiny`模型服务,并在另一台CPU机器上尝试访问,获取一首七言绝句的embedding。 -### 6.1 安装环境依赖 +### Step1:安装环境依赖 首先需要安装环境依赖,根据第2节内容分别在两台机器上安装相应依赖。 -### 6.2 启动Bert Service服务端 +### Step2:启动Bert Service服务端 确保环境依赖安装正确后,在要部署服务的GPU机器上使用PaddleHub命令行工具启动`Bert Service`服务端,命令如下: ```shell $ hub serving start bert_service -m ernie_tiny --use_gpu --gpu 0 --port 8866 @@ -174,7 +175,7 @@ $ hub serving start bert_service -m ernie_tiny --use_gpu --gpu 0 --port 8866 Server[baidu::paddle_serving::predictor::bert_service::BertServiceImpl] is serving on port=8866. ``` 这样就启动了`ernie_tiny`的在线服务,监听8866端口,并在0号GPU上进行任务。 -### 6.3 使用Bert Service客户端进行远程调用 +### Step3:使用Bert Service客户端进行远程调用 部署好服务端后,就可以用普通机器作为客户端测试在线embedding功能。 首先导入客户端依赖。 @@ -200,7 +201,7 @@ result = bc.get_result(input_text=input_text) ```python [[0.9993321895599361, 0.9994612336158751, 0.9999646544456481, 0.732795298099517, -0.34387934207916204, ... ]] ``` -客户端代码demo文件见[示例](bert_service_client.py)。 +客户端代码demo文件见[示例](../paddlehub/serving/bert_serving/bert_service.py)。 运行命令如下: ```shell $ python bert_service_client.py @@ -214,30 +215,30 @@ $ python bert_service_client.py -### 6.4 关闭Bert Service服务端 +### Step4:关闭Bert Service服务端 如要停止`Bert Service`服务端程序,可在其启动命令行页面使用Ctrl+C方式关闭,关闭成功会打印如下日志: ```shell Paddle Inference Server exit successfully! ``` 这样,我们就利用一台GPU机器就完成了`Bert Service`的部署,并利用另一台普通机器进行了测试,可见通过`Bert Service`能够方便地进行在线embedding服务的快速部署。 -## 7. FAQ -> Q : 如何在一台服务器部署多个模型? -> A : 可通过多次启动`Bert Service`,分配不同端口实现。如果使用GPU,需要指定不同的显卡。如同时部署`ernie`和`bert_chinese_L-12_H-768_A-12`,分别执行命令如下: -> ```shell -> $ hub serving start bert_service -m ernie -p 8866 -> $ hub serving start bert_service -m bert_chinese_L-12_H-768_A-12 -p 8867 -> ``` +## FAQ +Q : 如何在一台服务器部署多个模型? +A : 可通过多次启动`Bert Service`,分配不同端口实现。如果使用GPU,需要指定不同的显卡。如同时部署`ernie`和`bert_chinese_L-12_H-768_A-12`,分别执行命令如下: +```shell +$ hub serving start bert_service -m ernie -p 8866 +$ hub serving start bert_service -m bert_chinese_L-12_H-768_A-12 -p 8867 +``` -> Q : 启动时显示"Check out http://yq01-gpu-255-129-12-00.epc.baidu.com:8887 in web +Q : 启动时显示"Check out http://yq01-gpu-255-129-12-00.epc.baidu.com:8887 in web browser.",这个页面有什么作用。 -> A : 这是`BRPC`的内置服务,主要用于查看请求数、资源占用等信息,可对server端性能有大致了解,具体信息可查看[BRPC内置服务](https://github.com/apache/incubator-brpc/blob/master/docs/cn/builtin_service.md)。 - -> Q : 为什么输入文本的格式为[["文本1"], ["文本2"], ],而不是["文本1", "文本2", ]? -> A : 因为Bert模型可以对一轮对话生成向量表示,例如[["问题1","回答1"],["问题2","回答2"]],为了防止使用时混乱,每个样本使用一个list表示,一个样本list内部可以是1条string或2条string,如下面的文本: -> ```python -> input_text = [ -> ["你今天吃饭了吗","我已经吃过饭了"], -> ["今天天气怎么样","今天天气不错"], -> ] -> ``` +A : 这是`BRPC`的内置服务,主要用于查看请求数、资源占用等信息,可对server端性能有大致了解,具体信息可查看[BRPC内置服务](https://github.com/apache/incubator-brpc/blob/master/docs/cn/builtin_service.md)。 + +Q : 为什么输入文本的格式为[["文本1"], ["文本2"], ],而不是["文本1", "文本2", ]? +A : 因为Bert模型可以对一轮对话生成向量表示,例如[["问题1","回答1"],["问题2","回答2"]],为了防止使用时混乱,每个样本使用一个list表示,一个样本list内部可以是1条string或2条string,如下面的文本: +```python +input_text = [ + ["你今天吃饭了吗","我已经吃过饭了"], + ["今天天气怎么样","今天天气不错"], +] +``` diff --git a/tutorial/serving.md b/tutorial/serving.md new file mode 100644 index 0000000000000000000000000000000000000000..3ba2a076e50ad04fff8ec940061ea00581ed4ae0 --- /dev/null +++ b/tutorial/serving.md @@ -0,0 +1,217 @@ +# 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得到的模型用于快捷服务部署。 + +### 所需环境 +下表是使用PaddleHub Serving的环境要求及注意事项。 + +|项目|建议版本|说明| +|:-:|:-:|:-:| +|操作系统|Linux/Darwin/Windows|建议使用Linux或Darwin,对多线程启动方式支持性较好| +|PaddleHub|>=1.4.0|无| +|PaddlePaddle|>=1.6.1|若使用GPU计算,则对应使用PaddlePaddle-gpu版本| + +## 使用 +### Step1:启动服务端部署 +Hub-Serving有两种启动方式,分别是使用命令行命令启动,以及使用配置文件启动。 + +#### 命令行命令启动 +启动命令 +```shell +$ hub serving start --modules [Module1==Version1, Module2==Version2, ...] \ + --port XXXX \ + --use_gpu \ + --use_multiprocess +``` + +**参数**: + +|参数|用途| +|-|-| +|--modules/-m|Hub-Serving预安装模型,以多个Module==Version键值对的形式列出
*`当不指定Version时,默认选择最新版本`*| +|--port/-p|服务端口,默认为8866| +|--use_gpu|使用GPU进行预测,必须安装paddlepaddle-gpu| +|--use_multiprocess|是否启用并发方式,默认为单进程方式| + +#### 配置文件启动 +启动命令 +```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" + } + ], + "use_gpu": false, + "port": 8866, + "use_multiprocess": false +} +``` + +**参数**: + +|参数|用途| +|-|-| +|--modules_info|Hub-Serving预安装模型,以字典列表形式列出,其中:
`module`为预测服务使用的模型名
`version`为预测模型的版本
`batch_size`为预测批次大小 +|--use_gpu|使用GPU进行预测,必须安装paddlepaddle-gpu| +|--port/-p|服务端口,默认为8866| +|--use_multiprocess|是否启用并发方式,默认为单进程方式,推荐多核CPU机器使用此方式| + +### Step2:访问服务端 + +在使用PaddleHub Serving部署服务端的模型预测服务后,就可以在客户端访问预测接口以获取结果了,接口url格式为: + +http://0.0.0.0:8866/predict//\ + +其中,\为text或image,与模型种类对应,\为模型名。 + +通过发送一个POST请求,即可获取预测结果,下面我们将展示一个具体的demo,以说明使用PaddleHub Serving部署和使用流程。 + +### Step3:利用PaddleHub Serving进行个性化开发 +使用PaddleHub Serving进行模型服务部署后,可以利用得到的接口进行开发,如对外提供web服务,或接入到应用程序中,以降低客户端预测压力,提高性能,下面展示了一个web页面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 +} +``` +启动成功界面如图: + +

+ + + +

+ +这样我们就在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": [ + "天气预报", "说", "今天", "要", "下雨" + ] + } + ] +} +``` + +## 示例-其他模型的一键部署服务 + +获取其他PaddleHub Serving的一键服务部署场景示例,可参见下列demo + +* [图像分类-基于vgg11_imagent](../demo/serving/module_serving/classification_vgg11_imagenet) + +  该示例展示了利用vgg11_imagent完成图像分类服务化部署和在线预测,获取图像分类结果。 + +* [图像生成-基于stgan_celeba](../demo/serving/module_serving/GAN_stgan_celeba) + +  该示例展示了利用stgan_celeba生成图像服务化部署和在线预测,获取指定风格的生成图像。 + +* [文本审核-基于porn_detection_lstm](../demo/serving/module_serving/text_censorship_porn_detection_lstm) + +  该示例展示了利用porn_detection_lstm完成中文文本黄色敏感信息鉴定的服务化部署和在线预测,获取文本是否敏感及其置信度。 + +* [中文词法分析-基于lac](../demo/serving/module_serving/lexical_analysis_lac) + +  该示例展示了利用lac完成中文文本分词服务化部署和在线预测,获取文本的分词结果,并可通过用户自定义词典干预分词结果。 + +* [目标检测-基于yolov3_darknet53_coco2017](.../demo/serving/serving/object_detection_yolov3_darknet53_coco2017) + +  该示例展示了利用yolov3_darknet53_coco2017完成目标检测服务化部署和在线预测,获取检测结果和覆盖识别框的图片。 + +* [中文语义分析-基于simnet_bow](../demo/serving/module_serving/semantic_model_simnet_bow) + +  该示例展示了利用simnet_bow完成中文文本相似度检测服务化部署和在线预测,获取文本的相似程度。 + +* [图像分割-基于deeplabv3p_xception65_humanseg](../demo/serving/module_serving/semantic_segmentation_deeplabv3p_xception65_humanseg) + +  该示例展示了利用deeplabv3p_xception65_humanseg完成图像分割服务化部署和在线预测,获取识别结果和分割后的图像。 + +* [中文情感分析-基于simnet_bow](../demo/serving/module_serving/semantic_model_simnet_bow) + +  该示例展示了利用senta_lstm完成中文文本情感分析服务化部署和在线预测,获取文本的情感分析结果。