前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一文学会Pytorch版本BERT使用

一文学会Pytorch版本BERT使用

作者头像
用户3946442
发布2022-04-11 18:35:17
5410
发布2022-04-11 18:35:17
举报
文章被收录于专栏:程序媛驿站

一、前言

NLPers最最最最最最常用的Pytorch版本的BERT应该就是这一份了吧:

https://github.com/huggingface/pytorch-pretrained-BERT

这份是刚出BERT的时候出的,暂且叫它旧版。

这是博主在学习使用旧版的时候粗略记过的一些笔记:

https://blog.csdn.net/ccbrid/article/details/88732857

随着BERT的出现,更多的预训练模型(BERT, GPT-2, RoBERTa, XLM, DistilBert, XLNet, CTRL...)也如雨后春笋般涌出

Hugging Face的这款BERT工具也在不管的更新迭代迭代迭代 (。ì _ í。)

现在已经改名叫transformers啦

本文是针对于新版的学习👇

二、BERT相关网址

BERT论文:

https://arxiv.org/abs/1810.04805

Google_BERT代码(tensorflow):

https://github.com/google-research/bert

Pytorch版本的BERT:

https://github.com/huggingface/transformers

(本文记录该工具的使用)

该工具使用文档:

https://huggingface.co/transformers/

BERT部分使用文档:

https://huggingface.co/transformers/model_doc/bert.html#bertmodel

优化器部分使用文档:

https://huggingface.co/transformers/main_classes/optimizer_schedules.html

快速浏览版:

https://github.com/huggingface/transformers#quick-tour

三、安装步骤

1. 要求Python 3.5+, PyTorch 1.0.0+ 或 TensorFlow 2.0.0-rc1

2. 推荐使用虚拟环境 例如:

(可以使用conda env list 查看已有虚拟环境)

代码语言:javascript
复制
conda create -n transformers python=3.6
source activate transformers

3. 首先安装TensorFlow 2.0 and/or PyTorch

(本文PyTorch)

安装PyTorch可访问网址:https://pytorch.org/get-started/locally/#start-locally

在该网址上选择对应的安装环境,可以直接得到如下安装命令:

例如:

代码语言:javascript
复制
conda install pytorch torchvision cudatoolkit=10.1 -c pytorch
代码语言:javascript
复制
由于博主本机的cuda不支持1.4的torch,所以重新安装torch版本。
代码语言:javascript
复制
pip install torch==1.2.0 torchvision==0.4.0 -f https://download.pytorch.org/whl/torch_stable.html

4. 正式安装transformers

代码语言:javascript
复制
pip install transformers

5. (此步可省略)下到本地方便查看源码

代码语言:javascript
复制
git clone https://github.com/huggingface/transformers.git

四、使用方法

1. 必备import

代码语言:javascript
复制
from transformers import BertTokenizer, BertModel, BertForMaskedLM

2. 数据的处理

我们知道,在BERT的输入中,cls是一个,sep是大于等于一个。'[CLS]'必须出现在样本段落的开头,一个段落可以有一句话也可以有多句话,每句话的结尾必须是'[SEP]'。

例如:['[CLS]', 'this', 'is', 'blue', '[SEP]', 'that', 'is', 'red', '[SEP]']

我们需要对输入BERT的数据进行处理

例如:

代码语言:javascript
复制
words = [self.CLS_TOKEN] + words + [self.SEP_TOKEN]

3. Tokenizer

调用tokenizer,使用tokenizer分割输入,将tokens转为ids。如下:

代码语言:javascript
复制
self.bert_tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
words = self.bert_tokenizer.tokenize(''.join(words))
feature = self.bert_tokenizer.convert_tokens_to_ids(sent + [self.PAD_TOKEN for _ in range(max_sent_len - len(sent))])

如果觉得BERT给的token不够用,或希望在BERT给的token中加入自己的token,加入以下代码即可:

例如,想要加入大写字母:

代码语言:javascript
复制
self.bert_tokenizer.add_tokens([chr(i) for i in range(ord("A"), ord("Z") + 1)])
args.len_token = len(self.bert_tokenizer)

此处使用了len_token记录self.bert_tokenizer新的token大小,因为要对模型进行更新。

4. 模型使用

调用BertModel,因为改变了tokenizer所以对模型的token参数进行更新,然后就可以正常使用BERT-Model啦!

代码语言:javascript
复制
self.BertModel = BertModel.from_pretrained('bert-base-chinese')
# 加入了A-Z,重新resize一下大小
self.BertModel.resize_token_embeddings(self.args.len_token) 
outputs = self.BertModel(input_ids=ii, token_type_ids=tti, attention_mask=am)

注:

5.

本文使用了预训练模型bert-base-chinese做例子,其余的预训练模型具体可参考:https://github.com/google-research/bert

6.

若想对Bert进行fine-tuning,如果存在out-of-memory的问题,可能会用到GPU并行:

代码语言:javascript
复制
self.BertModel = nn.DataParallel(self.BertModel, device_ids=args.bert_gpu_ids, output_device=torch.cuda.current_device())

GPU并行的其他注意事项小可爱们可以移步这里:Pytorch | 多GPU并行 DataParallel

作者:西柚媛

编辑:西柚媛

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序媛驿站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二、BERT相关网址
  • 三、安装步骤
  • 四、使用方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档