Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleHub
提交
9cba4bc3
P
PaddleHub
项目概览
PaddlePaddle
/
PaddleHub
大约 1 年 前同步成功
通知
282
Star
12117
Fork
2091
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
200
列表
看板
标记
里程碑
合并请求
4
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleHub
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
200
Issue
200
列表
看板
标记
里程碑
合并请求
4
合并请求
4
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
9cba4bc3
编写于
12月 12, 2019
作者:
走神的阿圆
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update bert_as_service
上级
fcf2ac86
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
47 addition
and
48 deletion
+47
-48
demo/serving/README.md
demo/serving/README.md
+1
-1
demo/serving/bert_service/README.md
demo/serving/bert_service/README.md
+32
-31
demo/serving/bert_service/bert_service_client.py
demo/serving/bert_service/bert_service_client.py
+1
-3
demo/serving/bert_service/img/bs.png
demo/serving/bert_service/img/bs.png
+0
-0
paddlehub/commands/serving.py
paddlehub/commands/serving.py
+3
-3
paddlehub/serving/bert_serving/bert_service.py
paddlehub/serving/bert_serving/bert_service.py
+10
-10
未找到文件。
demo/serving/README.md
浏览文件 @
9cba4bc3
...
...
@@ -3,7 +3,7 @@
利用PaddleHub-Serving可以完成模型服务化部署,主要包括利用Bert as Service实现embedding服务化,利用预测模型实现预测服务化。
## 2. Bert as Service
*
[
Bert as Service介绍与示例
](
./bert_as
_service
)
*
[
Bert as Service介绍与示例
](
bert
_service
)
该示例展示了利用Bert as Service进行远程embedding服务化部署和在线预测,获取文本embedding结果。
...
...
demo/serving/bert_
as_
service/README.md
→
demo/serving/bert_service/README.md
浏览文件 @
9cba4bc3
...
...
@@ -64,20 +64,23 @@ $ pip install ujson
## 3. 支持模型
目前
`Bert as Service`
支持的语义模型如下表,可根据需要选择模型进行部署embedding服务,未来还将支持更多模型。
|模型|网络|数据集|
|:-|:-:|:-|
|
[
ERNIE
](
https://paddlepaddle.org.cn/hubdetail?name=ERNIE&en_category=SemanticModel
)
|ERNIE|百科类、资讯类、论坛对话类数据等中文语料|
|
[
roberta_wwm_ext_chinese_L-12_H-768_A-12
](
https://paddlepaddle.org.cn/hubdetail?name=roberta_wwm_ext_chinese_L-12_H-768_A-12&en_category=SemanticModel
)
|BERT|中文维基百科、百科、新闻、问答等|
|
[
roberta_wwm_ext_chinese_L-24_H-1024_A-16
](
https://paddlepaddle.org.cn/hubdetail?name=roberta_wwm_ext_chinese_L-24_H-1024_A-16&en_category=SemanticModel
)
|BERT|中文维基百科、百科、新闻、问答等|
|
[
bert_wwm_ext_chinese_L-12_H-768_A-12
](
https://paddlepaddle.org.cn/hubdetail?name=bert_wwm_ext_chinese_L-12_H-768_A-12&en_category=SemanticModel
)
|BERT|中文维基百科、百科、新闻、问答等|
|
[
bert_uncased_L-12_H-768_A-12
](
https://paddlepaddle.org.cn/hubdetail?name=bert_uncased_L-12_H-768_A-12&en_category=SemanticModel
)
|BERT|英文维基百科|
|
[
bert_uncased_L-24_H-1024_A-16
](
https://paddlepaddle.org.cn/hubdetail?name=bert_uncased_L-24_H-1024_A-16&en_category=SemanticModel
)
|BERT|英文维基百科|
|
[
bert_cased_L-12_H-768_A-12
](
https://paddlepaddle.org.cn/hubdetail?name=bert_cased_L-12_H-768_A-12&en_category=SemanticModel
)
|BERT|英文维基百科|
|
[
bert_cased_L-24_H-1024_A-16
](
https://paddlepaddle.org.cn/hubdetail?name=bert_cased_L-24_H-1024_A-16&en_category=SemanticModel
)
|BERT|英文维基百科|
|
[
bert_multi_cased_L-12_H-768_A-12
](
https://paddlepaddle.org.cn/hubdetail?name=bert_multi_cased_L-12_H-768_A-12&en_category=SemanticModel
)
|BERT|英文维基百科|
|
[
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|中文维基百科|
目前
`Bert Service`
支持的语义模型如下表,可根据需要选择模型进行部署embedding服务,未来还将支持更多模型。
|模型|网络|
|:-|:-:|
|
[
ERNIE
](
https://paddlepaddle.org.cn/hubdetail?name=ERNIE&en_category=SemanticModel
)
|ERNIE|
|
[
ernie_tiny
](
https://paddlepaddle.org.cn/hubdetail?name=ernie_tiny&en_category=SemanticModel
)
|ERNIE|
|
[
ernie_v2_eng_large
](
https://paddlepaddle.org.cn/hubdetail?name=ernie_v2_eng_large&en_category=SemanticModel
)
|ERNIE|
|
[
ernie_v2_eng_base
](
https://paddlepaddle.org.cn/hubdetail?name=ernie_v2_eng_base&en_category=SemanticModel
)
|ERNIE|
|
[
roberta_wwm_ext_chinese_L-12_H-768_A-12
](
https://paddlepaddle.org.cn/hubdetail?name=roberta_wwm_ext_chinese_L-12_H-768_A-12&en_category=SemanticModel
)
|BERT|
|
[
roberta_wwm_ext_chinese_L-24_H-1024_A-16
](
https://paddlepaddle.org.cn/hubdetail?name=roberta_wwm_ext_chinese_L-24_H-1024_A-16&en_category=SemanticModel
)
|BERT|
|
[
bert_wwm_ext_chinese_L-12_H-768_A-12
](
https://paddlepaddle.org.cn/hubdetail?name=bert_wwm_ext_chinese_L-12_H-768_A-12&en_category=SemanticModel
)
|BERT|
|
[
bert_uncased_L-12_H-768_A-12
](
https://paddlepaddle.org.cn/hubdetail?name=bert_uncased_L-12_H-768_A-12&en_category=SemanticModel
)
|BERT|
|
[
bert_uncased_L-24_H-1024_A-16
](
https://paddlepaddle.org.cn/hubdetail?name=bert_uncased_L-24_H-1024_A-16&en_category=SemanticModel
)
|BERT|
|
[
bert_cased_L-12_H-768_A-12
](
https://paddlepaddle.org.cn/hubdetail?name=bert_cased_L-12_H-768_A-12&en_category=SemanticModel
)
|BERT|
|
[
bert_cased_L-24_H-1024_A-16
](
https://paddlepaddle.org.cn/hubdetail?name=bert_cased_L-24_H-1024_A-16&en_category=SemanticModel
)
|BERT|
|
[
bert_multi_cased_L-12_H-768_A-12
](
https://paddlepaddle.org.cn/hubdetail?name=bert_multi_cased_L-12_H-768_A-12&en_category=SemanticModel
)
|BERT|
|
[
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)
...
...
@@ -87,7 +90,7 @@ server端接收client端发送的数据,执行模型计算过程并将计算
server端启动时会按照指定的模型名称从PaddleHub获取对应的模型文件进行加载,无需提前下载模型或指定模型路径,对模型的管理工作由PaddleHub负责。在加载模型后在指定的端口启动
`BRPC`
服务,保持端口监听,当接收到数据后便执行模型计算,并将计算结果通过
`BRPC`
返回并发送至client端。
### 4.2 启动
使用PaddleHub的命令行工具可一键启动
`Bert
as
Service`
,命令如下:
使用PaddleHub的命令行工具可一键启动
`Bert Service`
,命令如下:
```
shell
$
hub serving start bert_service
-m
ernie_tiny
-p
8866
--use_gpu
--gpu
0
```
...
...
@@ -111,7 +114,7 @@ Server[baidu::paddle_serving::predictor::bert_service::BertServiceImpl] is servi
|参数|说明|是否必填|
|:--:|:--:|:----:|
|hub serving start bert_servi
ng|启动
`Bert as
Service`
服务端。|必填项|
|hub serving start bert_servi
ce|启动
`Bert
Service`
服务端。|必填项|
|--module/-m|指定启动的模型,如果指定的模型不存在,则自动通过PaddleHub下载指定模型。|必填项|
|--port/-p|指定启动的端口,每个端口对应一个模型,可基于不同端口进行多次启动,以实现多个模型的服务部署。|必填项|
|--use_gpu|若指定此项则使用GPU进行工作,反之仅使用CPU。注意需安装GPU版本的PaddlePaddle。|非必填项,默认为不指定|
...
...
@@ -120,7 +123,7 @@ Server[baidu::paddle_serving::predictor::bert_service::BertServiceImpl] is servi
</div>
### 4.3 关闭
通过在启动服务端的命令行页面使用Ctrl+C终止
`Bert
as
Service`
运行,关闭成功则显示:
通过在启动服务端的命令行页面使用Ctrl+C终止
`Bert Service`
运行,关闭成功则显示:
```
shell
Paddle Inference Server
exit
successfully!
```
...
...
@@ -137,7 +140,6 @@ client端利用PaddleHub的语义理解任务将原始文本按照不同模型
def
connect
(
input_text
,
model_name
,
max_seq_len
=
128
,
emb_size
=
768
,
show_ids
=
False
,
do_lower_case
=
True
,
server
=
"127.0.0.1:8866"
,
...
...
@@ -151,7 +153,6 @@ def connect(input_text,
|input_text|输入文本,要获取embedding的原始文本|二维list类型,内部元素为string类型的文本|[['样例1'],['样例2']]|
|model_name|指定使用的模型名称|string|"ernie"|
|max_seq_len|计算时的样例长度,样例长度不足时采用补零策略,超出此参数则超出部分会被截断|int|128|
|emb_size|返回的embedding数据长度,需要与模型计算的embedding长度相等|int|768|
|show_ids|是否展现数据预处理后的样例信息,指定为True则显示样例信息,反之则不显示|bool|False|
|do_lower_case|是否将英文字母转换成小写,指定为True则将所有英文字母转换为小写,反之则保持原状|bool|True|
|server|要访问的server地址,包括ip地址及端口号|string|"127.0.0.1:8866"|
...
...
@@ -159,22 +160,22 @@ def connect(input_text,
## 6. Demo
在这里,我们将展示一个实际场景中可能使用的demo,我们利用PaddleHub在一台GPU机器上部署
`
bert_wwm_ext_chinese_L-12_H-768_A-12
`
模型服务,并在另一台CPU机器上尝试访问,获取一首七言绝句的embedding。
在这里,我们将展示一个实际场景中可能使用的demo,我们利用PaddleHub在一台GPU机器上部署
`
ernie_tiny
`
模型服务,并在另一台CPU机器上尝试访问,获取一首七言绝句的embedding。
### 6.1 安装环境依赖
首先需要安装环境依赖,根据第2节内容分别在两台机器上安装相应依赖。
### 6.2 启动
`Bert Serving`
服务端
确保环境依赖安装正确后,在要部署服务的GPU机器上使用PaddleHub命令行工具启动
`Bert
as
Service`
服务端,命令如下:
### 6.2 启动
Bert Service
服务端
确保环境依赖安装正确后,在要部署服务的GPU机器上使用PaddleHub命令行工具启动
`Bert Service`
服务端,命令如下:
```
shell
$
hub serving start bert_servi
ng
-m
bert_chinese_L-12_H-768_A-12
--use_gpu
--gpu
0
--port
8866
$
hub serving start bert_servi
ce
-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上进行任务。
### 6.3 使用
`Bert Serving`
客户端进行远程调用
部署好服务端后,就可以用普通机器作为客户端测试在线embedding功能。
### 6.3 使用
Bert Service
客户端进行远程调用
部署好服务端后,就可以用普通机器作为客户端测试在线embedding功能。
首先导入客户端依赖。
```
python
...
...
@@ -188,17 +189,17 @@ input_text = [["西风吹老洞庭波"], ["一夜湘君白发多"], ["醉后不
```
python
result
=
bert_service
.
connect
(
input_text
=
input_text
,
model_name
=
"
bert_chinese_L-12_H-768_A-12
"
,
model_name
=
"
ernie_tiny
"
,
server
=
"127.0.0.1:8866"
)
```
最后即可得到embedding结果(此处只展示部分结果)。
```
python
[[
0.9993321895599361
,
0.9994612336158751
,
0.9999646544456481
,
0.732795298099517
,
-
0.34387934207916204
,
...
]]
```
客户端代码demo文件见
[
示例
](
./bert_as
_service_client.py
)
。
客户端代码demo文件见
[
示例
](
bert
_service_client.py
)
。
运行命令如下:
```
shell
$
python bert_
as_service
.py
$
python bert_
service_client
.py
```
运行过程如下图:
...
...
@@ -209,12 +210,12 @@ $ python bert_as_service.py
</div>
### 6.4 关闭
`Bert Serving`
服务端
如要停止
`Bert Servi
ng
`
服务端程序,可在其启动命令行页面使用Ctrl+C方式关闭,关闭成功会打印如下日志:
### 6.4 关闭
Bert Service
服务端
如要停止
`Bert Servi
ce
`
服务端程序,可在其启动命令行页面使用Ctrl+C方式关闭,关闭成功会打印如下日志:
```
shell
Paddle Inference Server
exit
successfully!
```
这样,我们就利用一台GPU机器就完成了
Bert Service
的部署,并利用另一台普通机器进行了测试,可见通过
`Bert Service`
能够方便地进行在线embedding服务的快速部署。
这样,我们就利用一台GPU机器就完成了
`Bert Service`
的部署,并利用另一台普通机器进行了测试,可见通过
`Bert Service`
能够方便地进行在线embedding服务的快速部署。
## 7. FAQ
> Q : 如何在一台服务器部署多个模型?
...
...
demo/serving/bert_
as_service/bert_as
_service_client.py
→
demo/serving/bert_
service/bert
_service_client.py
浏览文件 @
9cba4bc3
...
...
@@ -12,9 +12,7 @@ if __name__ == "__main__":
]
# 调用客户端接口bert_service.connect()获取结果
result
=
bert_service
.
connect
(
input_text
=
input_text
,
model_name
=
"bert_chinese_L-12_H-768_A-12"
,
server
=
"127.0.0.1:8866"
)
input_text
=
input_text
,
model_name
=
"ernie_tiny"
,
server
=
"127.0.0.1:8866"
)
# 打印embedding结果
for
item
in
result
:
...
...
demo/serving/bert_
as_
service/img/bs.png
→
demo/serving/bert_service/img/bs.png
浏览文件 @
9cba4bc3
文件已移动
paddlehub/commands/serving.py
浏览文件 @
9cba4bc3
...
...
@@ -181,8 +181,8 @@ class ServingCommand(BaseCommand):
str
+=
"sub command:
\n
"
str
+=
"start
\n
"
str
+=
"
\t
Start PaddleHub-Serving if specifies this parameter.
\n
"
str
+=
"start bert_servi
ng
\n
"
str
+=
"
\t
Start Bert
as
Service if specifies this parameter.
\n
"
str
+=
"start bert_servi
ce
\n
"
str
+=
"
\t
Start Bert Service if specifies this parameter.
\n
"
str
+=
"option:
\n
"
str
+=
"--modules/-m [module1==version, module2==version...]
\n
"
str
+=
"
\t
Pre-install modules via this parameter list.
\n
"
...
...
@@ -204,7 +204,7 @@ class ServingCommand(BaseCommand):
ServingCommand
.
show_help
()
return
False
if
args
.
sub_command
==
"start"
:
if
args
.
bert_service
==
"bert_servi
ng
"
:
if
args
.
bert_service
==
"bert_servi
ce
"
:
ServingCommand
.
start_bert_serving
(
args
)
else
:
ServingCommand
.
start_serving
(
args
)
...
...
paddlehub/serving/bert_serving/bert_service.py
浏览文件 @
9cba4bc3
...
...
@@ -20,18 +20,21 @@ import ujson
import
random
from
paddlehub.common.logger
import
logger
if
sys
.
version_info
[
0
]
==
2
:
_ver
=
sys
.
version_info
is_py2
=
(
_ver
[
0
]
==
2
)
is_py3
=
(
_ver
[
0
]
==
3
)
if
is_py2
:
import
httplib
else
:
if
is_py3
:
import
http.client
as
httplib
class
BertService
(
object
):
class
BertService
():
def
__init__
(
self
,
profile
=
False
,
max_seq_len
=
128
,
model_name
=
"bert_uncased_L-12_H-768_A-12"
,
emb_size
=
768
,
show_ids
=
False
,
do_lower_case
=
True
,
process_id
=
0
,
...
...
@@ -40,7 +43,6 @@ class BertService(object):
self
.
process_id
=
process_id
self
.
reader_flag
=
False
self
.
batch_size
=
16
self
.
embedding_size
=
emb_size
self
.
max_seq_len
=
max_seq_len
self
.
profile
=
profile
self
.
model_name
=
model_name
...
...
@@ -53,7 +55,7 @@ class BertService(object):
self
.
feed_var_names
=
''
self
.
retry
=
retry
def
connect
(
self
,
server
=
'127.0.0.1:8
866
'
):
def
connect
(
self
,
server
=
'127.0.0.1:8
010
'
):
self
.
server_list
.
append
(
server
)
def
connect_all_server
(
self
,
server_list
):
...
...
@@ -64,7 +66,7 @@ class BertService(object):
if
self
.
reader_flag
==
False
:
module
=
hub
.
Module
(
name
=
self
.
model_name
)
inputs
,
outputs
,
program
=
module
.
context
(
trainable
=
True
,
max_seq_len
=
128
)
trainable
=
True
,
max_seq_len
=
self
.
max_seq_len
)
input_ids
=
inputs
[
"input_ids"
]
position_ids
=
inputs
[
"position_ids"
]
segment_ids
=
inputs
[
"segment_ids"
]
...
...
@@ -131,6 +133,7 @@ class BertService(object):
return
'retry'
elif
self
.
load_balance
==
'bind'
:
try
:
self
.
con_index
=
int
(
self
.
process_id
)
%
len
(
self
.
server_list
)
cur_con
=
httplib
.
HTTPConnection
(
...
...
@@ -184,7 +187,6 @@ class BertService(object):
copy_time
=
time
.
time
()
-
copy_start
request
=
{
"instances"
:
request
}
request
[
"max_seq_len"
]
=
self
.
max_seq_len
request
[
"emb_size"
]
=
self
.
embedding_size
request
[
"feed_var_names"
]
=
self
.
feed_var_names
request_msg
=
ujson
.
dumps
(
request
)
if
self
.
show_ids
:
...
...
@@ -219,7 +221,6 @@ class BertService(object):
def
connect
(
input_text
,
model_name
,
max_seq_len
=
128
,
emb_size
=
768
,
show_ids
=
False
,
do_lower_case
=
True
,
server
=
"127.0.0.1:8866"
,
...
...
@@ -228,7 +229,6 @@ def connect(input_text,
bc
=
BertService
(
max_seq_len
=
max_seq_len
,
model_name
=
model_name
,
emb_size
=
emb_size
,
show_ids
=
show_ids
,
do_lower_case
=
do_lower_case
,
retry
=
retry
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录