在win7环境部署bert-as-service,client端一直运行,且无输出

最近谷歌推出的自然语言处理(NLP)模型BERT很火,由于大学期间做过NLP的相关研究,对NLP相关的内容也比较感兴趣,所以打算部署起来玩一下。

有关BERT环境的部署在网上有很多资料,大致就是先安装Python、TensorFlow等依赖库,在安装之前要注意版本,这个过程安装很顺利,在这里对此就不多作介绍了。

待安装完BERT环境后,就用pip安装了bert-serving-server和bert-serving-client,bert-as-service大致工作原理就是运行一个服务端,然后客户端通过相应的端口去和服务端交互,从而用向量对句子进行表示。bert-as-service的详细介绍请参考链接:https://github.com/hanxiao/bert-as-service。

网上绝大部分资料都是在Linux环境下部署服务端,然后用户通过远程对服务端进行访问,从而完成交互。由于公司对Linux主机和本地的网络通讯进行了限制,Linux主机又都是生产机器,也不能轻易在上面进行尝试,所以只能在本地win7机器上既运行服务端又运行客户端。

在win7上运行服务端的方法在bert-as-service的readme中有做详细的说明,运用如下方式即可:

args = get_args_parser().parse_args(['-model_dir', 'D:/WorkSpace/bert-master/chinese_L-12_H-768_A-12',
                                     '-port', '86500',
                                     '-port_out', '86501',
                                     '-max_seq_len', 'NONE',
                                     '-mask_cls_sep',
                                     '-num_worker', '3',
                                     '-cpu'])
server = BertServer(args)
server.start()

网上介绍的运行客户端的方式如下:

bc = BertClient()
vec = bc.encode(['First do it', 'then do it right', 'then do it better'])
print(vec)

在PyCharm上服务端可以正常运行,但运行客户端时,客户端始终处于运行状态,并未把vec打印出来。

经过阅读BertClient()源码,虽然在同一机器上部署服务端和客户端,但客户端也要明确的指出端口号,否则客户端使用默认的端口号

port=5555, port_out=5556

指明端口号的代码为:

bc = BertClient(port=86500, port_out=86501, show_server_config=True, timeout=10000)
vec = bc.encode(['First do it', 'then do it right', 'then do it better'])
print(vec)

经过上述修改,就可以正常打印出vec了。

在win7环境部署bert-as-service,client端一直运行,且无输出_第1张图片

上述客户端的参数中,timeout是为了避免客户端无限制的等待服务端而做的一个超时限定,timeout的大小视网络延迟情况而定,当然也可以不加。值得注意的是,服务端和客户端无论谁先启动(若客户端先启动,不应添加timeout参数),效果是相同的。有关服务端和客户端通讯的机制请参考博文:https://blog.csdn.net/lengye7/article/details/80370611

 

你可能感兴趣的:(NLP,BERT)