肖涵博士的bert-as-service
安裝:
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?。。?/p>
準備工作
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
#可以補充更多的參數(shù),詳情見API
3、使用客戶端來請求BERT service,得到BERT 句子編碼向量
from bert_serving.client import BertClient
bc = BertClient()
bc.encode(['我 喜歡 你們','我 喜 歡 你 們','我 喜歡 你'])
#更多細節(jié)參考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、出現(xiàn)錯誤: bert-serving-start: 未找到命令...
如下啟動BERT service
bert-serving-start -model_dir /model/chinese_L-12_H-768_A-12/ -num_worker=4
出現(xiàn)錯誤: bert-serving-start: 未找到命令...
解決:
#執(zhí)行命令
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
執(zhí)行命令:
./bert-serving-start -model_dir '/home/xxx/xxx/model/chinese_L-12_H-768_A-12/ ' -num_worker=4
出現(xiàn)錯誤:
zmq.error.ZMQError: Address already in use
原因:因為BERT service 默認了port=5555,port_out=5556,啟動service時已經(jīng)有端口被其他進程占用了,所以我們要在啟動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,一般都能解決~