赞
踩
目录
二、将google谷歌bert预训练模型转换为pytorch版本
这个是谷歌google发布的唯一一个中文模型,可以在google官网上下载该模型,如下图。
下载后,包含如下图所示的几个文件:
google开源了bert源码,并且要求是tensorflow的版本是1.11.0,因此可以训练模型进行微调。
这个是哈工大讯飞联合实验室发布的中文预训练bert模型,可以在官网链接下载,我下载的是pytorch版本,如下图红色框。
下载后,包含如下图几个文件:
下载 pytorch 版本的中文bert模型可以使用 transformers 库中的API快速使用bert模型,具体的API可以参考BERT-transformers官网。另外,Transformers is tested on Python 3.6+, and PyTorch 1.1.0+ or TensorFlow 2.0+。详情参考安装链接
注:使用 transformers 运行 bert 模型的时候,要把下载的 pytorch 版的模型的文件名字改一下,即把 bert_config.json 改名为 config.json,Transformers加载Pytorch模型时会自动调用,之后可以通过Transformers正常使用。
如果对transformers不太熟悉,可以看一下transformers的简介上和transformers简介下
使用convert_tf_checkpoint_to_pytorch.py脚本,该脚本下载链接,将TensorFlow checkpoint(以bert_model.ckpt开头的三个文件)和相关的配置文件(bert_config.json)作为输入,并为此配置创建PyTorch版本模型。
调用该代码的命令为,注:要运行这个特定的转换脚本,你需要安装TensorFlow和PyTorch。该库的其余部分只需要PyTorch。
- cd G:\Python\Lib\site-packages\transformers #进入到convert_tf_checkpoint_to_pytorch.py所在的路径
- python convert_tf_checkpoint_to_pytorch.py --tf_checkpoint_path=chinese_L-12_H-768_A-12/bert_model.ckpt --bert_config_file=chinese_L-12_H-768_A-12/bert_config.json --pytorch_dump_path=chinese_L-12_H-768_A-12/pytorch_model.bin
运行一次这个转换脚本,可以得到一个PyTorch版本模型。可以忽略TensorFlow checkpoint(以bert_model.ckpt开头的三个文件),但要保留配置文件(bert_config.json)和词汇表文件(vocab.txt),因为PyTorch模型也需要这些文件。将bert_config.json复制粘贴重命名为config.json,否则执行pytorch_transformers代码会报错valueerror:unable to parse /chinese_L-12_H-768_A-12/config.json as a url or as a local path。
运行完脚本后,文件中生成了pytorch_model.bin文件,如下图:
接下来可以用transformers来调用bert模型,输入如下代码
- import torch
- from transformers import BertTokenizer,BertModel
-
- tokenizer = BertTokenizer.from_pretrained('bert\chinese_L-12_H-768_A-12')
- model = BertModel.from_pretrained('bert\chinese_L-12_H-768_A-12')
- input_ids = torch.tensor(tokenizer.encode("自然语言处理")).unsqueeze(0) # Batch size 1
- print(input_ids)
- outputs = model(input_ids)
- # last_hidden_states = outputs[0] # The last hidden-state is the first element of the output tuple
- sequence_output = outputs[0]
- pooled_output = outputs[1]
- print(sequence_output)
- print(sequence_output.shape) ## 字向量
- print(pooled_output.shape) ## 句向量
运行结果如下图:
谷歌google公开了tensorflow版本的预训练bert模型和代码,可以用于生成词向量。还有更简单的方法:直接调用封装好的库bert-as-service。bert-as-service是腾讯AI Lab 开源的一个bert服务,它让用户可以以调用服务的方式使用bert模型,而不需要关注bert的实现细节。bert-as-service分为客户端和服务端,用户可以从python代码中调用服务,也可以通过http方式访问。
使用pip命令安装,客户端和服务端可以安装在一台机器上,也可以安装在不同的机器上。
本文采用的方法是在同一台机器上配置,虽然网上绝大部分资料都是在Linux环境下部署服务端,然后用户通过远程对服务端进行访问,从而完成交互。但是由于学校对Linux主机和本地的网络通讯进行了限制,Linux主机又都是生产机器,也不能轻易在上面进行尝试,所以只能在本地win10机器上既运行服务端又运行客户端。
- pip install bert-serving-server # 服务端
- pip install bert-serving-client # 客户端,与服务端互相独立
服务器的运行环境为 python >= 3.5 且 tensorflow >= 1.10
客户端可以运行于 python2 或 python3
以谷歌google中文bert预训练模型即chinese_L-12_H-768_A-12为例
在服务器端使用bert-serving-start命令启动服务
bert-serving-start -model_dir chinese_L-12_H-768_A-12/ -num_worker=2
其中,-model_dir是预训练模型的路径,-num_worker是线程数,表示同时可以处理多少个并发请求
如果启动后电脑很卡的话,可以去掉-num_worker参数,即输入如下命令启动服务:
bert-serving-start -model_dir chinese_L-12_H-768_A-12/
如果启动成功,服务器端会显示,如下图所示:
可以在pycharm中编写代码获取词向量的表示
- from bert_serving.client import BertClient
- bc = BertClient()
- vec = bc.encode(['你'])
服务端可以正常启动,但是在pycharm上运行客户端时一直没有反应,始终处于运行状态,未能把vec打印出来。
解决办法:虽然在同一机器上部署服务端和客户端,但是客户端也要明确的指出端口号,代码如下:
bc = BertClient(port=5555, port_out=5556, show_server_config=True, timeout=10000)
查看端口号的方法,在启动服务端的时候会给出下面的信息,其中包含有端口号,如下图:
timeout是为了避免客户端无限制的等待服务端而做的一个超时限定,timeout的大小视网络延迟情况而定,也可以不加。
在bert官网链接上下载源码后,需要对bert源码进行修改做文本分类的任务,可以参考博客链接进行修改,github。参考博客链接做多分类,github。
https://blog.csdn.net/qq_34832393/article/details/90414293
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。