One - One Code All

Blog Content

bert安装和demo

机器学习 Python   2018-07-28 23:46:02

Bert模型是Google在2018年10月发布的语言表示模型,Bert在NLP领域横扫了11项任务的最优结果,可以说是现今最近NLP中最重要的突破。Bert模型的全称是Bidirectional Encoder Representations from Transformers,是通过训练Masked Language Model和预测下一句任务得到的模型。关于Bert具体训练的细节和更多的原理,有兴趣的读者可以去看在arXiv上的原文。


服务端/客户端可配置参数说明


服务端可配置参数


支持GPU、CPU计算,通过-cpu参数指定,默认为false,即默认是使用GPU进行计算;

支持设置工作线程数,通过-num_worker,最好设置为对应的cpu或gpu核数

指定预训练模型的路径,通过-model_dir,通常将预训练好的BERT模型下载下来放到该目录,该项是必须指定的

指定微调模型的路径,通过-tuned_model_dir,通常将微调好的BERT模型生成到该目录

指定checkpoint文件,通过-ckpt_name,默认文件名为bert_model.ckpt,常与预训练模型在同一目录

指定配置文件,通过-config_name,默认文件名为bert_config.json,常与预训练模型在同一目录

指定临时的graph文件,通过-graph_tmp_dir,默认是/tmp/XXXXXX

指定最大序列长度,通过-max_seq_len,使用None来动态加载(mini)batch做为最大序列长度,默认取值25,实际在我的机器上面设置20即可,否则服务启动的时候会卡住

指定每个worker能够处理的最大序列数,通过-max_batch_size,默认256

指定高优先级处理的batch大小,通过-priority_batch_size,默认值16

指定客户端向服务端push数据的端口号,通过-port,默认5555

指定服务端向客户端发布结果的的端口号,通过-port_out,默认5556

指定服务端接受http请求的端口号,通过-http_port,无默认值

指定池化-采样策略,通过-pooling_strategy,默认取值REDUCE_MEAN,取值限制在:NONE, REDUCE_MEAN, REDUCE_MAX, REDUCE_MEAN_MAX, CLS_TOKEN, FIRST_TOKEN, SEP_TOKEN, LAST_TOKEN ,为了获取sequence中的每个token应该将其置为NONE

指定池化-采样层,通过-pooling_layer,默认取值[-2], -1表示最后一层, -2 倒数第二层, [-1, -2] 表示连接最后两层的结果

指定XLA compiler 进行graph的优化,通过-xla,默认取值false


客户端可配置参数


指定bert服务端的ip,通过-ip指定,默认是localhost

指定客户端向服务端push数据的端口号,通过-port,默认5555,需与服务端配置一致

指定服务端向客户端发布结果的的端口号,通过-port_out,默认5556,需与服务端配置一致

指定 sentence编码格式,通过-output_fmt ,默认ndarray,也可使用list

指定是否在开始连接的时候显示服务端配置,通过-show_server_config

指定是否要求服务端与客户端版本保持一致性,通过-check_version,默认取值false

指定multi-casting模式下客户端的uuid以对多个客户端进行区分,通过-identity,默认取值None

指定客户端接受操作的超时时间,默认-1(没有超时限制),单位ms


安装

pip install bert-tensorflow, bert-serving-server,  bert-serving-client

安装确认

import tensorflow as tf
s=tf.constant(1)

from bert import modeling


启动服务

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

model_dir后面的参数是bert预训练模型所在的文件夹。num_worker的数量应该取决于你的CPU/GPU数量。


启动服务时将参数 pooling_strategy 设置为 None :

bert-serving-start -pooling_strategy NONE -model_dir /root/bert_models/chinese_L-12_H-768_A-12/

这时的返回是语料中每个 token 对应 embedding 的矩阵




下载bert预训练模型


Google提供了多种预训练好的bert模型,从下方链接下载 Google 发布的预训练模型(https://github.com/google-research/bert#pre-trained-models),解压到某个路径下,比如: /tmp/english_L-12_H-768_A-12/

你可以使用包括 BERT-Base, Multilingual 和 BERT-Base, Chinese 在内的任意模型。


根据 NLP 任务的类型和规模不同,Google 提供了多种预训练模型供选择:


BERT-Base, Chinese: 简繁体中文, 12-layer, 768-hidden, 12-heads, 110M parameters【我下载的是这个】

BERT-Base, Multilingual Cased: 多语言(104 种), 12-layer, 768-hidden, 12-heads, 110M parameters

BERT-Base, Uncased: 英文不区分大小写(全部转为小写), 12-layer, 768-hidden, 12-heads, 110M parameters

BERT-Base, Cased: 英文区分大小写, 12-layer, 768-hidden, 12-heads , 110M parameters

中文效果更好的哈工大版 BERT:Chinese-BERT-wwm


下载一个Pre-trained BERT Model,再启动一个BERT服务

下载地址: https://github.com/hanxiao/bert-as-service

下载的压缩文件进行解压,可以看到文件里有五个文件,其中bert_model.ckpt开头的文件是负责模型变量载入的,而vocab.txt是训练时中文文本采用的字典,最后bert_config.json是BERT在训练时,可选调整的一些参数。


客户端测试

客户端不需要安装tensorflow

from bert_serving.client import BertClient
bc = BertClient()
bc.encode(['一二三四五六七八', '今天您吃了吗?'])


测试demo

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





上一篇:django.models设置主键primary_key
下一篇:mac多屏鼠标切换CatchMouse

The minute you think of giving up, think of the reason why you held on so long.