diff --git a/demo/serving/module_serving/lexical_analysis_lac/README.md b/demo/serving/module_serving/lexical_analysis_lac/README.md new file mode 100644 index 0000000000000000000000000000000000000000..8c0441ee2b346546e31e8335255f7d2178c8e03f --- /dev/null +++ b/demo/serving/module_serving/lexical_analysis_lac/README.md @@ -0,0 +1,149 @@ +# 部署词法分析服务-以lac为例 +## 简介 +`Lexical Analysis of Chinese`,简称`LAC`,是一个联合的词法分析模型,能整体性地完成中文分词、词性标注、专名识别任务。关于`LAC`的具体信息请参见[LAC](https://paddlepaddle.org.cn/hubdetail?name=lac&en_category=LexicalAnalysis)。 + +使用PaddleHub Serving可以部署一个在线词法分析服务,可以将此接口用于词法分析、在线分词等在线web应用。 + +这里就带领大家使用PaddleHub Serving,通过简单几步部署一个词法分析在线服务。 + +## Step1:启动PaddleHub Serving +启动命令如下 +```shell +$ hub serving start -m lac +``` +启动时会显示加载模型过程,启动成功后显示 +```shell +Loading lac successful. +``` +这样就完成了一个词法分析服务化API的部署,默认端口号为8866。 + +## Step2:测试语言模型在线API +### 不使用自定义词典 +在服务部署好之后,我们可以进行测试,用来测试的文本为`今天是个好日子`和`天气预报说今天要下雨`。 +首先指定编码格式及引入需要的包: +```python +>>> # coding: utf8 +>>> import requests +>>> import json +``` +准备的数据格式为: +```python +{"text": [text_1, text_2, ...]} +``` +**NOTE:** 字典的key为"text"。 + +根据文本和数据格式,代码如下: +```python +>>> # 指定用于用于预测的文本并生成字典{"text": [text_1, text_2, ... ]} +>>> text_list = ["今天是个好日子", "天气预报说今天要下雨"] +>>> text = {"text": text_list} +``` + +## Step3:获取并验证结果 +接下来发送请求到词法分析API,并得到结果,代码如下: +```python +# 指定预测方法为lac并发送post请求 +>>> url = "http://127.0.0.1:8866/predict/text/lac" +>>> r = requests.post(url=url, data=text) +``` +`LAC`模型返回的结果为每个文本分词后的结果,我们尝试打印接口返回结果: +```python +# 打印预测结果 +>>> print(json.dumps(r.json(), indent=4, ensure_ascii=False)) +{ + "msg": "", + "results": [ + { + "tag": [ + "TIME", "v", "q", "n" + ], + "word": [ + "今天", "是", "个", "好日子" + ] + }, + { + "tag": [ + "n", "v", "TIME", "v", "v" + ], + "word": [ + "天气预报", "说", "今天", "要", "下雨" + ] + } + ], + "status": "0" +} +``` +这样我们就完成了对词法分析的预测服务化部署和测试。 + +完整的测试代码见[lac_serving_demo.py](./lac_serving_demo.py)。 + +### 使用自定义词典 +`LAC`模型在预测时还可以使用自定义词典干预默认分词结果,这种情况只需要将自定义词典以文件的形式附加到request请求即可,数据格式如下: +```python +{"user_dict": user_dict.txt} +``` +根据数据格式,具体代码如下: +```python +>>> # 指定自定义词典{"user_dict": dict.txt} +>>> file = {"user_dict": open("dict.txt", "rb")} +>>> # 请求接口时以文件的形式附加自定义词典,其余和不使用自定义词典的请求方式相同,此处不再赘述 +>>> url = "http://127.0.0.1:8866/predict/text/lac" +>>> r = requests.post(url=url, files=file, data=text) +``` + +完整的测试代码见[lac_with_dict_serving_demo.py](./lac_with_dict_serving_demo.py)。 + +### 客户端请求新版模型的方式 +对某些新版模型,客户端请求方式有所变化,更接近本地预测的请求方式,以降低学习成本。 +以lac(2.1.0)为例,使用上述方法进行请求将提示: +```python +{ + "Warnning": "This usage is out of date, please use 'application/json' as content-type to post to /predict/lac. See 'https://github.com/PaddlePaddle/PaddleHub/blob/release/v1.6/docs/tutorial/serving.md' for more details." +} +``` +对于lac(2.1.0),请求的方式如下: +```python +# coding: utf8 +import requests +import json + +if __name__ == "__main__": + # 指定用于预测的文本并生成字典[text_1, text_2, ... ] + text = ["今天是个好日子", "天气预报说今天要下雨"] + # 以key的方式指定text传入预测方法的时的参数,此例中为"texts" + # 对应本地部署,则为lac.analysis_lexical(text=[text1, text2]) + data = {"texts": text, "batch_size": 1} + # 指定预测方法为lac并发送post请求 + url = "http://127.0.0.1:8866/predict/lac" + # 指定post请求的headers为application/json方式 + headers = {"Content-Type": "application/json"} + + r = requests.post(url=url, headers=headers, data=json.dumps(data)) + + # 打印预测结果 + print(json.dumps(r.json(), indent=4, ensure_ascii=False)) +``` +对结果的解析等与前种方式一致,显示如下: +```python +{ + "results": [ + { + "tag": [ + "TIME", "v", "q", "n" + ], + "word": [ + "今天", "是", "个", "好日子" + ] + }, + { + "tag": [ + "n", "v", "TIME", "v", "v" + ], + "word": [ + "天气预报", "说", "今天", "要", "下雨" + ] + } + ] +} +``` +此Demo的具体信息和代码请参见[LAC Serving_2.1.0](./lac_2.1.0_serving_demo.py)。 diff --git a/demo/serving/module_serving/lexical_analysis_lac/lac_serving_demo.py b/demo/serving/module_serving/lexical_analysis_lac/lac_serving_demo.py new file mode 100644 index 0000000000000000000000000000000000000000..96a585bfd12e0e2a650908fb25289cd6452923d9 --- /dev/null +++ b/demo/serving/module_serving/lexical_analysis_lac/lac_serving_demo.py @@ -0,0 +1,20 @@ +# coding: utf8 +import requests +import json + +if __name__ == "__main__": + # 指定用于预测的文本并生成字典{"text": [text_1, text_2, ... ]} + text = ["今天是个好日子", "天气预报说今天要下雨"] + # 以key的方式指定text传入预测方法的时的参数,此例中为"data" + # 对应本地部署,则为lac.analysis_lexical(data=text, batch_size=1) + # 若使用lac版本低于2.2.0,需要将`text`参数改为`texts` + data = {"text": text, "batch_size": 1} + # 指定预测方法为lac并发送post请求,content-type类型应指定json方式 + url = "http://127.0.0.1:8866/predict/lac" + # 指定post请求的headers为application/json方式 + headers = {"Content-Type": "application/json"} + + r = requests.post(url=url, headers=headers, data=json.dumps(data)) + + # 打印预测结果 + print(json.dumps(r.json(), indent=4, ensure_ascii=False)) diff --git a/docs/tutorial/serving.md b/docs/tutorial/serving.md index d1c1fe8a866dfff38069f0dc3f9876aef32bd3a1..204730feeed9f706b4dc0b605245bc1487b289c0 100644 --- a/docs/tutorial/serving.md +++ b/docs/tutorial/serving.md @@ -20,6 +20,7 @@ $ hub serving start --modules [Module1==Version1, Module2==Version2, ...] \ --use_gpu \ --use_multiprocess \ --workers \ + --gpu \ ``` **参数**: @@ -30,7 +31,8 @@ $ hub serving start --modules [Module1==Version1, Module2==Version2, ...] \ |--port/-p|服务端口,默认为8866| |--use_gpu|使用GPU进行预测,必须安装paddlepaddle-gpu| |--use_multiprocess|是否启用并发方式,默认为单进程方式,推荐多核CPU机器使用此方式
*`Windows操作系统只支持单进程方式`*| -|--workers|在并发方式下指定的并发任务数,默认为`2*cpu_count-1`,其中`cpu_count`为CPU核数| +|--workers|在并发方式下指定的并发任务数,默认为`2*cpu_count-1`,其中`cpu_count`为CPU核数| +|--gpu|指定使用gpu的卡号,如`1,2`代表使用1号显卡和2号显卡,默认仅使用0号显卡| **NOTE:** --use_gpu不可与--use_multiprocess共用。 @@ -65,7 +67,8 @@ $ hub serving start --config config.json }, "port": 8866, "use_multiprocess": false, - "workers": 2 + "workers": 2, + "gpu": "0,1,2" } ``` @@ -79,6 +82,8 @@ $ hub serving start --config config.json |use_gpu|使用GPU进行预测,必须安装paddlepaddle-gpu| |use_multiprocess|是否启用并发方式,默认为单进程方式,推荐多核CPU机器使用此方式
*`Windows操作系统只支持单进程方式`*| |workers|启动的并发任务数,在并发模式下才生效,默认为`2*cpu_count-1`,其中`cpu_count`代表CPU的核数| +|gpu|指定使用gpu的卡号,如`1,2`代表使用1号显卡和2号显卡,默认仅使用0号显卡| +**NOTE:** --use_gpu不可与--use_multiprocess共用。 ### Step2:访问服务端