提交 4cf88f1b 编写于 作者: D Dong Daxiang 提交者: GitHub

Merge branch 'develop' into fix-issue-628

...@@ -151,7 +151,6 @@ Here, `client.predict` function has two arguments. `feed` is a `python dict` wit ...@@ -151,7 +151,6 @@ Here, `client.predict` function has two arguments. `feed` is a `python dict` wit
- **Distributed Key-Value indexing** supported which is especially useful for large scale sparse features as model inputs. - **Distributed Key-Value indexing** supported which is especially useful for large scale sparse features as model inputs.
- **Highly concurrent and efficient communication** between clients and servers supported. - **Highly concurrent and efficient communication** between clients and servers supported.
- **Multiple programming languages** supported on client side, such as Golang, C++ and python. - **Multiple programming languages** supported on client side, such as Golang, C++ and python.
- **Extensible framework design** which can support model serving beyond Paddle.
<h2 align="center">Document</h2> <h2 align="center">Document</h2>
......
...@@ -156,7 +156,6 @@ print(fetch_map) ...@@ -156,7 +156,6 @@ print(fetch_map)
- 支持 **分布式键值对索引** 助力于大规模稀疏特征作为模型输入. - 支持 **分布式键值对索引** 助力于大规模稀疏特征作为模型输入.
- 支持客户端和服务端之间 **高并发和高效通信**. - 支持客户端和服务端之间 **高并发和高效通信**.
- 支持 **多种编程语言** 开发客户端,例如Golang,C++和Python. - 支持 **多种编程语言** 开发客户端,例如Golang,C++和Python.
- **可伸缩框架设计** 可支持不限于Paddle的模型服务.
<h2 align="center">文档</h2> <h2 align="center">文档</h2>
......
...@@ -20,7 +20,7 @@ This document will take Python2 as an example to show how to compile Paddle Serv ...@@ -20,7 +20,7 @@ This document will take Python2 as an example to show how to compile Paddle Serv
- Set `DPYTHON_INCLUDE_DIR` to `$PYTHONROOT/include/python3.6m/` - Set `DPYTHON_INCLUDE_DIR` to `$PYTHONROOT/include/python3.6m/`
- Set `DPYTHON_LIBRARIES` to `$PYTHONROOT/lib64/libpython3.6.so` - Set `DPYTHON_LIBRARIES` to `$PYTHONROOT/lib64/libpython3.6.so`
- Set `DPYTHON_EXECUTABLE` to `$PYTHONROOT/bin/python3` - Set `DPYTHON_EXECUTABLE` to `$PYTHONROOT/bin/python3.6`
## Get Code ## Get Code
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
-`DPYTHON_INCLUDE_DIR`设置为`$PYTHONROOT/include/python3.6m/` -`DPYTHON_INCLUDE_DIR`设置为`$PYTHONROOT/include/python3.6m/`
-`DPYTHON_LIBRARIES`设置为`$PYTHONROOT/lib64/libpython3.6.so` -`DPYTHON_LIBRARIES`设置为`$PYTHONROOT/lib64/libpython3.6.so`
-`DPYTHON_EXECUTABLE`设置为`$PYTHONROOT/bin/python3` -`DPYTHON_EXECUTABLE`设置为`$PYTHONROOT/bin/python3.6`
## 获取代码 ## 获取代码
......
...@@ -29,7 +29,7 @@ from paddle_serving_server.web_service import WebService ...@@ -29,7 +29,7 @@ from paddle_serving_server.web_service import WebService
uci_service = WebService(name = "uci") uci_service = WebService(name = "uci")
uci_service.load_model_config("./uci_housing_model") uci_service.load_model_config("./uci_housing_model")
uci_service.prepare_server(workdir="./workdir", port=int(9500), device="cpu") uci_service.prepare_server(workdir="./workdir", port=int(9500), device="cpu")
uci_service.run_server() uci_service.run_rpc_service()
#Get flask application #Get flask application
app_instance = uci_service.get_app_instance() app_instance = uci_service.get_app_instance()
``` ```
......
...@@ -29,7 +29,7 @@ from paddle_serving_server.web_service import WebService ...@@ -29,7 +29,7 @@ from paddle_serving_server.web_service import WebService
uci_service = WebService(name = "uci") uci_service = WebService(name = "uci")
uci_service.load_model_config("./uci_housing_model") uci_service.load_model_config("./uci_housing_model")
uci_service.prepare_server(workdir="./workdir", port=int(9500), device="cpu") uci_service.prepare_server(workdir="./workdir", port=int(9500), device="cpu")
uci_service.run_server() uci_service.run_rpc_service()
#获取flask服务 #获取flask服务
app_instance = uci_service.get_app_instance() app_instance = uci_service.get_app_instance()
``` ```
......
# Chinese sentence sentiment classification # Chinese Sentence Sentiment Classification
([简体中文](./README_CN.md)|English) ([简体中文](./README_CN.md)|English)
## Get model files and sample data
```
sh get_data.sh
```
## Install preprocess module
## Get Model
``` ```
pip install paddle_serving_app python -m paddle_serving_app.package --get_model senta_bilstm
python -m paddle_serving_app.package --get_model lac
``` ```
## Start http service ## Start HTTP Service
``` ```
python senta_web_service.py senta_bilstm_model/ workdir 9292 python -m paddle_serving_server.serve --model lac_model --port 9300
python senta_web_service.py
``` ```
In the Chinese sentiment classification task, the Chinese word segmentation needs to be done through [LAC task] (../lac). Set model path by ```lac_model_path``` and dictionary path by ```lac_dict_path```. In the Chinese sentiment classification task, the Chinese word segmentation needs to be done through [LAC task] (../lac).
In this demo, the LAC task is placed in the preprocessing part of the HTTP prediction service of the sentiment classification task. The LAC prediction service is deployed on the CPU, and the sentiment classification task is deployed on the GPU, which can be changed according to the actual situation. In this demo, the LAC task is placed in the preprocessing part of the HTTP prediction service of the sentiment classification task.
## Client prediction ## Client prediction
``` ```
curl -H "Content-Type:application/json" -X POST -d '{"feed":[{"words": "天气不错"}], "fetch":["class_probs"]}' http://127.0.0.1:9292/senta/prediction curl -H "Content-Type:application/json" -X POST -d '{"feed":[{"words": "天气不错"}], "fetch":["class_probs"]}' http://127.0.0.1:9292/senta/prediction
......
# 中文语句情感分类 # 中文语句情感分类
(简体中文|[English](./README.md)) (简体中文|[English](./README.md))
## 获取模型文件和样例数据
``` ## 获取模型文件
sh get_data.sh
```
## 安装数据预处理模块
``` ```
pip install paddle_serving_app python -m paddle_serving_app.package --get_model senta_bilstm
python -m paddle_serving_app.package --get_model lac
``` ```
## 启动HTTP服务 ## 启动HTTP服务
``` ```
python senta_web_service.py senta_bilstm_model/ workdir 9292 python -m paddle_serving_server.serve --model lac_model --port 9300
python senta_web_service.py
``` ```
中文情感分类任务中需要先通过[LAC任务](../lac)进行中文分词,在脚本中通过```lac_model_path```参数配置LAC任务的模型文件路径,```lac_dict_path```参数配置LAC任务词典路径 中文情感分类任务中需要先通过[LAC任务](../lac)进行中文分词。
示例中将LAC任务放在情感分类任务的HTTP预测服务的预处理部分,LAC预测服务部署在CPU上,情感分类任务部署在GPU上,可以根据实际情况进行更改 示例中将LAC任务放在情感分类任务的HTTP预测服务的预处理部分。
## 客户端预测 ## 客户端预测
``` ```
......
#encoding=utf-8
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. # Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
...@@ -12,56 +13,28 @@ ...@@ -12,56 +13,28 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from paddle_serving_server_gpu.web_service import WebService from paddle_serving_server.web_service import WebService
from paddle_serving_client import Client from paddle_serving_client import Client
from paddle_serving_app.reader import LACReader, SentaReader from paddle_serving_app.reader import LACReader, SentaReader
import os import os
import sys import sys
from multiprocessing import Process
#senta_web_service.py
from paddle_serving_server.web_service import WebService
from paddle_serving_client import Client
from paddle_serving_app.reader import LACReader, SentaReader
class SentaService(WebService):
def set_config(
self,
lac_model_path,
lac_dict_path,
senta_dict_path, ):
self.lac_model_path = lac_model_path
self.lac_client_config_path = lac_model_path + "/serving_server_conf.prototxt"
self.lac_dict_path = lac_dict_path
self.senta_dict_path = senta_dict_path
def start_lac_service(self):
if not os.path.exists('./lac_serving'):
os.mkdir("./lac_serving")
os.chdir('./lac_serving')
self.lac_port = self.port + 100
r = os.popen(
"python -m paddle_serving_server.serve --model {} --port {} &".
format("../" + self.lac_model_path, self.lac_port))
os.chdir('..')
def init_lac_service(self):
ps = Process(target=self.start_lac_service())
ps.start()
self.init_lac_client()
def lac_predict(self, feed_data):
lac_result = self.lac_client.predict(
feed={"words": feed_data}, fetch=["crf_decode"])
return lac_result
def init_lac_client(self):
self.lac_client = Client()
self.lac_client.load_client_config(self.lac_client_config_path)
self.lac_client.connect(["127.0.0.1:{}".format(self.lac_port)])
def init_lac_reader(self): class SentaService(WebService):
#初始化lac模型预测服务
def init_lac_client(self, lac_port, lac_client_config):
self.lac_reader = LACReader() self.lac_reader = LACReader()
def init_senta_reader(self):
self.senta_reader = SentaReader() self.senta_reader = SentaReader()
self.lac_client = Client()
self.lac_client.load_client_config(lac_client_config)
self.lac_client.connect(["127.0.0.1:{}".format(lac_port)])
#定义senta模型预测服务的预处理,调用顺序:lac reader->lac模型预测->预测结果后处理->senta reader
def preprocess(self, feed=[], fetch=[]): def preprocess(self, feed=[], fetch=[]):
feed_data = [{ feed_data = [{
"words": self.lac_reader.process(x["words"]) "words": self.lac_reader.process(x["words"])
...@@ -80,15 +53,9 @@ class SentaService(WebService): ...@@ -80,15 +53,9 @@ class SentaService(WebService):
senta_service = SentaService(name="senta") senta_service = SentaService(name="senta")
senta_service.set_config( senta_service.load_model_config("senta_bilstm_model")
lac_model_path="./lac_model", senta_service.prepare_server(workdir="workdir")
lac_dict_path="./lac_dict", senta_service.init_lac_client(
senta_dict_path="./vocab.txt") lac_port=9300, lac_client_config="lac_model/serving_server_conf.prototxt")
senta_service.load_model_config(sys.argv[1])
senta_service.prepare_server(
workdir=sys.argv[2], port=int(sys.argv[3]), device="cpu")
senta_service.init_lac_reader()
senta_service.init_senta_reader()
senta_service.init_lac_service()
senta_service.run_rpc_service() senta_service.run_rpc_service()
senta_service.run_web_service() senta_service.run_web_service()
...@@ -21,15 +21,15 @@ python -m paddle_serving_app.package --list_model ...@@ -21,15 +21,15 @@ python -m paddle_serving_app.package --list_model
python -m paddle_serving_app.package --get_model senta_bilstm python -m paddle_serving_app.package --get_model senta_bilstm
``` ```
11 pre-trained models are built into paddle_serving_app, covering 6 kinds of prediction tasks. 10 pre-trained models are built into paddle_serving_app, covering 6 kinds of prediction tasks.
The model files can be directly used for deployment, and the `--tutorial` argument can be added to obtain the deployment method. The model files can be directly used for deployment, and the `--tutorial` argument can be added to obtain the deployment method.
| Prediction task | Model name | | Prediction task | Model name |
| ------------ | ------------------------------------------------ | | ------------ | ------------------------------------------------ |
| SentimentAnalysis | 'senta_bilstm', 'senta_bow', 'senta_cnn' | | SentimentAnalysis | 'senta_bilstm', 'senta_bow', 'senta_cnn' |
| SemanticRepresentation | 'ernie_base' | | SemanticRepresentation | 'ernie' |
| ChineseWordSegmentation | 'lac' | | ChineseWordSegmentation | 'lac' |
| ObjectDetection | 'faster_rcnn', 'yolov3' | | ObjectDetection | 'faster_rcnn' |
| ImageSegmentation | 'unet', 'deeplabv3' | | ImageSegmentation | 'unet', 'deeplabv3' |
| ImageClassification | 'resnet_v2_50_imagenet', 'mobilenet_v2_imagenet' | | ImageClassification | 'resnet_v2_50_imagenet', 'mobilenet_v2_imagenet' |
...@@ -76,7 +76,7 @@ Preprocessing for Chinese word segmentation task. ...@@ -76,7 +76,7 @@ Preprocessing for Chinese word segmentation task.
[example](../examples/senta/senta_web_service.py) [example](../examples/senta/senta_web_service.py)
- The image preprocessing method is more flexible than the above method, and can be combined by the following multiple classes,[example](../examples/imagenet/image_rpc_client.py) - The image preprocessing method is more flexible than the above method, and can be combined by the following multiple classes,[example](../examples/imagenet/resnet50_rpc_client.py)
- class Sequentia - class Sequentia
......
...@@ -20,14 +20,14 @@ python -m paddle_serving_app.package --list_model ...@@ -20,14 +20,14 @@ python -m paddle_serving_app.package --list_model
python -m paddle_serving_app.package --get_model senta_bilstm python -m paddle_serving_app.package --get_model senta_bilstm
``` ```
paddle_serving_app中内置了11中预训练模型,涵盖了6种预测任务。获取到的模型文件可以直接用于部署,添加`--tutorial`参数可以获取对应的部署方式。 paddle_serving_app中内置了10种预训练模型,涵盖了6种预测任务。获取到的模型文件可以直接用于部署,添加`--tutorial`参数可以获取对应的部署方式。
| 预测服务类型 | 模型名称 | | 预测服务类型 | 模型名称 |
| ------------ | ------------------------------------------------ | | ------------ | ------------------------------------------------ |
| 中文情感分析 | 'senta_bilstm', 'senta_bow', 'senta_cnn' | | 中文情感分析 | 'senta_bilstm', 'senta_bow', 'senta_cnn' |
| 语义理解 | 'ernie_base' | | 语义理解 | 'ernie' |
| 中文分词 | 'lac' | | 中文分词 | 'lac' |
| 图像检测 | 'faster_rcnn', 'yolov3' | | 图像检测 | 'faster_rcnn' |
| 图像分割 | 'unet', 'deeplabv3' | | 图像分割 | 'unet', 'deeplabv3' |
| 图像分类 | 'resnet_v2_50_imagenet', 'mobilenet_v2_imagenet' | | 图像分类 | 'resnet_v2_50_imagenet', 'mobilenet_v2_imagenet' |
...@@ -71,7 +71,7 @@ paddle_serving_app针对CV和NLP领域的模型任务,提供了多种常见的 ...@@ -71,7 +71,7 @@ paddle_serving_app针对CV和NLP领域的模型任务,提供了多种常见的
[参考示例](../examples/senta/senta_web_service.py) [参考示例](../examples/senta/senta_web_service.py)
- 图像的预处理方法相比于上述的方法更加灵活多变,可以通过以下的多个类进行组合,[参考示例](../examples/imagenet/image_rpc_client.py) - 图像的预处理方法相比于上述的方法更加灵活多变,可以通过以下的多个类进行组合,[参考示例](../examples/imagenet/resnet50_rpc_client.py)
- class Sequentia - class Sequentia
......
...@@ -22,9 +22,9 @@ class ServingModels(object): ...@@ -22,9 +22,9 @@ class ServingModels(object):
self.model_dict = OrderedDict() self.model_dict = OrderedDict()
self.model_dict[ self.model_dict[
"SentimentAnalysis"] = ["senta_bilstm", "senta_bow", "senta_cnn"] "SentimentAnalysis"] = ["senta_bilstm", "senta_bow", "senta_cnn"]
self.model_dict["SemanticRepresentation"] = ["ernie_base"] self.model_dict["SemanticRepresentation"] = ["ernie"]
self.model_dict["ChineseWordSegmentation"] = ["lac"] self.model_dict["ChineseWordSegmentation"] = ["lac"]
self.model_dict["ObjectDetection"] = ["faster_rcnn", "yolov3"] self.model_dict["ObjectDetection"] = ["faster_rcnn"]
self.model_dict["ImageSegmentation"] = [ self.model_dict["ImageSegmentation"] = [
"unet", "deeplabv3", "deeplabv3+cityscapes" "unet", "deeplabv3", "deeplabv3+cityscapes"
] ]
......
...@@ -189,7 +189,7 @@ class Client(object): ...@@ -189,7 +189,7 @@ class Client(object):
# create predictor here # create predictor here
if endpoints is None: if endpoints is None:
if self.predictor_sdk_ is None: if self.predictor_sdk_ is None:
raise SystemExit( raise ValueError(
"You must set the endpoints parameter or use add_variant function to create a variant." "You must set the endpoints parameter or use add_variant function to create a variant."
) )
else: else:
...@@ -215,7 +215,7 @@ class Client(object): ...@@ -215,7 +215,7 @@ class Client(object):
return return
if isinstance(feed[key], if isinstance(feed[key],
list) and len(feed[key]) != self.feed_tensor_len[key]: list) and len(feed[key]) != self.feed_tensor_len[key]:
raise SystemExit("The shape of feed tensor {} not match.".format( raise ValueError("The shape of feed tensor {} not match.".format(
key)) key))
if type(feed[key]).__module__ == np.__name__ and np.size(feed[ if type(feed[key]).__module__ == np.__name__ and np.size(feed[
key]) != self.feed_tensor_len[key]: key]) != self.feed_tensor_len[key]:
...@@ -316,7 +316,7 @@ class Client(object): ...@@ -316,7 +316,7 @@ class Client(object):
int_feed_names, int_shape, fetch_names, result_batch_handle, int_feed_names, int_shape, fetch_names, result_batch_handle,
self.pid) self.pid)
else: else:
raise SystemExit( raise ValueError(
"Please make sure the inputs are all in list type or all in numpy.array type" "Please make sure the inputs are all in list type or all in numpy.array type"
) )
......
...@@ -131,7 +131,7 @@ class WebService(object): ...@@ -131,7 +131,7 @@ class WebService(object):
for key in fetch_map: for key in fetch_map:
fetch_map[key] = fetch_map[key].tolist() fetch_map[key] = fetch_map[key].tolist()
result = self.postprocess( result = self.postprocess(
feed=feed, fetch=fetch, fetch_map=fetch_map) feed=request.json["feed"], fetch=fetch, fetch_map=fetch_map)
result = {"result": result} result = {"result": result}
except ValueError: except ValueError:
result = {"result": "Request Value Error"} result = {"result": "Request Value Error"}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册