提交 fcf2ac86 编写于 作者: 走神的阿圆's avatar 走神的阿圆

update bert_as_service

上级 f0c62693
# Bert as Service
# Bert Service
## 1. 简介
### 1.1 什么是embedding
Embedding是指将一个维数为所有词数量的高维空间转换到维数较低的连续向量空间的过程,每个单词或词组被设置为实数域的向量。通过embedding能够在降低输入维度的同时保留其含义,常用于NLP任务的上游任务中。
### 1.2 什么是Bert as Service
Bert as Service是基于Paddle Serving框架的快速部署模型远程计算服务方案,可将embedding过程通过调用API接口的方式实现,减少了对机器资源的依赖。使用PaddleHub可在服务器上一键部署`Bert as Service`服务,在另外的普通机器上通过客户端接口即可轻松的获取文本对应的embedding数据。
### 1.1 什么是Bert Service
`Bert Service`是基于Paddle Serving框架的快速部署模型远程计算服务方案,可将embedding过程通过调用API接口的方式实现,减少了对机器资源的依赖。使用PaddleHub可在服务器上一键部署`Bert Service`服务,在另外的普通机器上通过客户端接口即可轻松的获取文本对应的embedding数据。
整体流程图如下:
<div align="center">
......@@ -12,32 +11,37 @@ Bert as Service是基于Paddle Serving框架的快速部署模型远程计算服
</div>
### 1.3 为什么使用Bert as Service
* 算力有限的集群环境中,可利用一台或几台高性能机器部署`Bert as Service`服务端,为全部机器提供在线embedding功能。
### 1.2 为什么使用Bert Service
* 算力有限的集群环境中,可利用一台或几台高性能机器部署`Bert Service`服务端,为全部机器提供在线embedding功能。
* 实际的生产服务器不适宜承担大批量embedding工作,通过API接口可减少资源占用。
* 专注下游深度学习任务,可利用PaddleHub的`Bert as Service`大幅减少embedding代码。
* 专注下游深度学习任务,可利用PaddleHub的`Bert Service`大幅减少embedding代码。
`Bert as Service`具有几个突出的优点:
* 代码精短,易于使用。简单的pip安装方式,服务端仅需一行命令即可启动,客户端仅需一行代码即可获取embedding结果。
* 更高性能,更高效率。通过Paddle AnalysisPredictor API对模型的计算图进行优化,提升了计算速度并减小了显存占用,性能数据可参照[`Bert as Service`性能数据](https://github.com/ShenYuhan/PaddleHub/tree/bert_service/demo/serving/bert_as_service#7-%E6%80%A7%E8%83%BD)
* 更高性能,更高效率。通过Paddle AnalysisPredictor API对模型的计算图进行优化,提升了计算速度并减小了显存占用。
* 随"机"应变,灵活扩展。可根据机器资源选择不同数量的服务端,并根据实际需求快速、灵活地进行增减,同时支持各张显卡执行不同的模型计算任务。
* 删繁就简,专注任务。`Bert as Service`基于PaddlePaddle和PaddleHub开发,将模型的下载和安装等管理工作交由PaddleHub,开发者可以专注于主要任务,且可无缝对接PaddleHub继续进行文本分类、序列标注等下游任务。
* 删繁就简,专注任务。`Bert Service`基于PaddlePaddle和PaddleHub开发,将模型的下载和安装等管理工作交由PaddleHub,开发者可以专注于主要任务,还可以无缝对接PaddleHub继续进行文本分类、序列标注等下游任务。
## 2. 环境准备
### 2.1 环境要求
下表是使用`Bert as Service`的环境要求,带有*号标志项为非必需依赖,可根据实际使用需求选择安装。
下表是使用`Bert Service`的环境要求,带有*号标志项为非必需依赖,可根据实际使用需求选择安装。
|项目|版本|说明|
|:-:|:-:|:-:|
|操作系统|Linux|目前仅支持Linux操作系统|
|PaddleHub|>=1.3.0|无|
|PaddlePaddle|>=1.6.0|若使用GPU计算,则对应使用PaddlePaddle-gpu版本|
|PaddleHub|>=1.4.0|无|
|PaddlePaddle|>=1.6.1|若使用GPU计算,则对应使用PaddlePaddle-gpu版本|
|GCC|>=4.8|无|
|CUDA*|>=8|若使用GPU,需使用CUDA8以上版本|
|paddle-gpu-serving*|>=0.6.4|在`Bert as Service`服务端需依赖此包|
|ujson*|>=1.35|在Bert as Service客户端需依赖此包|
|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)
......@@ -85,7 +89,7 @@ server端启动时会按照指定的模型名称从PaddleHub获取对应的模
### 4.2 启动
使用PaddleHub的命令行工具可一键启动`Bert as Service`,命令如下:
```shell
$ hub serving start bert_serving -m bert_chinese_L-12_H-768_A-12 -p 8866 --use_gpu --gpu 0
$ hub serving start bert_service -m ernie_tiny -p 8866 --use_gpu --gpu 0
```
启动成功则显示
```shell
......@@ -159,7 +163,7 @@ def connect(input_text,
### 6.1 安装环境依赖
首先需要安装环境依赖,根据第2节内容分别在两台机器上安装相应依赖。
### 6.2 启动`Bert as Serving`服务端
### 6.2 启动`Bert Serving`服务端
确保环境依赖安装正确后,在要部署服务的GPU机器上使用PaddleHub命令行工具启动`Bert as Service`服务端,命令如下:
```shell
$ hub serving start bert_serving -m bert_chinese_L-12_H-768_A-12 --use_gpu --gpu 0 --port 8866
......@@ -168,9 +172,10 @@ $ hub serving start bert_serving -m bert_chinese_L-12_H-768_A-12 --use_gpu --gpu
```shell
Server[baidu::paddle_serving::predictor::bert_service::BertServiceImpl] is serving on port=8866.
```
这样就启动了`bert_chinese_L-12_H-768_A-12`的在线服务,监听8866端口,并在0号GPU上进行任务。
### 6.3 使用`Bert as Serving`客户端进行远程调用
这样就启动了`ernie_tiny`的在线服务,监听8866端口,并在0号GPU上进行任务。
### 6.3 使用`Bert Serving`客户端进行远程调用
部署好服务端后,就可以用普通机器作为客户端测试在线embedding功能。
首先导入客户端依赖。
```python
from paddlehub.serving.bert_serving import bert_service
......@@ -204,41 +209,16 @@ $ python bert_as_service.py
</div>
### 6.4 关闭Bert as Serving服务端
如要停止`Bert as Serving`服务端程序,可在其启动命令行页面使用Ctrl+C方式关闭,关闭成功会打印如下日志:
### 6.4 关闭`Bert Serving`服务端
如要停止`Bert Serving`服务端程序,可在其启动命令行页面使用Ctrl+C方式关闭,关闭成功会打印如下日志:
```shell
Paddle Inference Server exit successfully!
```
这样,我们就利用一台GPU机器就完成了Bert as Service的部署,并利用另一台普通机器进行了测试,可见通过`Bert as Service`能够方便地进行在线embedding服务的快速部署。
## 7. 性能
测试环境:
PaddlePaddle:
PaddleHub:
paddle-gpu-serving: 0.7.X
GPU: k40
module: bert_chinese_L-12_H-768_A-12
max_seq_len: 128
batch: 1000
测试结果如下表(单位:秒):
|batch size|总时间|预处理时间|json序列化|连接http|发送request|client端等待|server端op耗时|读取http信息|json反序列化|qps|
|:-|:-|:-|:-|:-|:-|:-|:-|:-|:-|:-|
|1| 35.763| 2.281| 0.055| 0.022| 0.531| 29.614| 28.411| 0.078| 0.108| 27.96186|
|2| 58.793| 4.167| 0.101| 0.024| 0.533| 50.828| 48.793| 0.096| 0.201| 34.0176552|
|4| 83.653| 7.92| 0.18| 0.026| 0.528| 71.83| 69.605| 0.112| 0.416| 47.8165756|
|8| 153.168| 15.741| 0.337| 0.03| 0.558| 132.468| 129.014| 0.162| 0.819| 52.2302309|
|16| 293.131| 31.14| 0.662| 0.034| 0.612| 255.693| 249.737| 0.252| 1.598| 54.5831045|
|32| 595.6| 62.734| 1.315| 0.043| 0.712| 523.998| 513.075| 0.432| 3.196| 53.7273338|
|64| 1170.068| 125.199| 2.68| 0.056| 0.78| 1030.275| 1009.219| 0.95| 6.992| 54.6976757|
|128| 2326.037| 253.642| 5.263| 0.069| 1.028| 2042.25| 2002.016| 3.024| 14.112| 55.0292192|
|256|5147.78| 508.69| 10.619| 0.08| 1.181| 4586.019| 4505.11| 8.142| 29.378| 49.7301749|
## 8. FAQ
这样,我们就利用一台GPU机器就完成了Bert Service的部署,并利用另一台普通机器进行了测试,可见通过`Bert Service`能够方便地进行在线embedding服务的快速部署。
## 7. FAQ
> Q : 如何在一台服务器部署多个模型?
> A : 可通过多次启动`Bert as Service`,分配不同端口实现。如果使用GPU,需要指定不同的显卡。如同时部署`ernie`和`bert_chinese_L-12_H-768_A-12`,分别执行命令如下:
> A : 可通过多次启动`Bert Service`,分配不同端口实现。如果使用GPU,需要指定不同的显卡。如同时部署`ernie`和`bert_chinese_L-12_H-768_A-12`,分别执行命令如下:
> ```shell
> $ hub serving start bert_serving -m ernie -p 8866
> $ hub serving start bert_serving -m bert_serving -m bert_chinese_L-12_H-768_A-12 -p 8867
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册