安装
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:
其中遇到的问题和解决办法
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,一般都能解决~