bert-as-service 初探

尉迟俊能
2023-12-01

安装

pip install bert-serving-server  # server
pip install bert-serving-client  # client, independent of `bert-serving-server`

要求

(1)Python >= 3.5
(2)Tensorflow >= 1.10
(3)不支持Python2!!!

准备工作

1、从以下列表里面下载好预训练的BERT模型,解压在某个文件夹中,例如:/model/chinese_L-12_H-768_A-12/
| BERT-Base, Uncased | 12-layer, 768-hidden, 12-heads, 110M parameters |
| BERT-Large, Uncased | 24-layer, 1024-hidden, 16-heads, 340M parameters |
| BERT-Base, Cased | 12-layer, 768-hidden, 12-heads , 110M parameters |
| BERT-Large, Cased | 24-layer, 1024-hidden, 16-heads, 340M parameters |
| BERT-Base, Multilingual Cased (New) | 104 languages, 12-layer, 768-hidden, 12-heads, 110M parameters |
| BERT-Base, Multilingual Cased (Old) | 102 languages, 12-layer, 768-hidden, 12-heads, 110M parameters |
| BERT-Base, Chinese | Chinese Simplified and Traditional, 12-layer, 768-hidden, 12-heads, 110M parameters |

使用

2、启动BERT service

bert-serving-start -model_dir /model/chinese_L-12_H-768_A-12/ -num_worker=4 
#可以补充更多的参数,详情见API

3、使用客户端来请求BERT service,得到BERT 句子编码向量

这里需要画个重点:↓

bert_serving返回的embedding向量是没有CLS标记的,
encode里面有n个token就返回n个向量,返回向量维度:(n,768)

from bert_serving.client import BertClient
bc = BertClient()
bc.encode(['我 喜欢 你们','我 喜 欢 你 们','我 喜欢 你'])
#更多细节参考API
#作为BERT的特点之一,可以得到一对句子的编码(通过concatenate符号 ||| ,该符号前后都要加上空格),如下:
bc.encode(['First do it ||| then do it right'])

4、远程使用BERT service
例如用GPU机器开service,然后远程用其他机器请求service:

# on another CPU machine
from bert_serving.client import BertClient
bc = BertClient(ip='xx.xx.xx.xx')  # ip address of the GPU machine
bc.encode(['First do it', 'then do it right', 'then do it better'])

server and client API:

bert-as-service-api

其中遇到的问题和解决办法

1、出现错误: bert-serving-start: 未找到命令…

如下启动BERT service

bert-serving-start -model_dir /model/chinese_L-12_H-768_A-12/ -num_worker=4 

出现错误: bert-serving-start: 未找到命令…
解决:

#执行命令
find / -name bert-serving-start
#找到:/usr/local/anaconda3/bin/bert-serving-start
#去到/usr/local/anaconda3/bin目录下:
cd /usr/local/anaconda3/bin
./bert-serving-start -model_dir '/home/xxx/xxx/model/chinese_L-12_H-768_A-12/ ' -num_worker=4
2、启动service遇到端口占用——zmq.error.ZMQError: Address already in use

执行命令:

./bert-serving-start -model_dir '/home/xxx/xxx/model/chinese_L-12_H-768_A-12/ ' -num_worker=4

出现错误:
zmq.error.ZMQError: Address already in use
原因:因为BERT service 默认了port=5555,port_out=5556,启动service时已经有端口被其他进程占用了,所以我们要在启动service时设置新的port和port_out:

./bert-serving-start -model_dir '/home/xxx/xxx/model/chinese_L-12_H-768_A-12/ ' -num_worker=4 -port=5777 -port_out=5778

显然,在client我们也要设置port和port_out,否则会访问默认的端口:from

bert_serving.client import BertClient
bc = BertClient(port=5777,port_out=5778)
bc.encode(['我 喜欢 你们','我 喜 欢 你 们','我 喜欢 你'])

这里也提醒我们遇到问题时可以多看看BERT service的API,一般都能解决~

 类似资料: