0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

BERT模型的PyTorch实现

DPVg_AI_era 来源:未知 作者:李倩 2018-11-13 09:12 次阅读

谷歌NLP模型的官方TensorFlow实现很强,现在,它的PyTorch版本来了!只需简单运行一次转换脚本,就可得到一个PyTorch模型,且结果与原始版本相近,甚至更好。

上周,谷歌最强NLP模型BERT开源了官方TensorFlow代码和预训练模型,引起大量关注。

现在,PyTorch用户的福利来了:一个名为Hugging Face的团队近日公开了BERT模型的谷歌官方TensorFlow库的op-for-op PyTorch重新实现:

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

这个实现可以为BERT加载任何预训练的TensorFlow checkpoint(特别是谷歌的官方预训练模型),并提供一个转换脚本。

BERT-base和BERT-large模型的参数数量分别为110M和340M,为了获得良好的性能,很难使用推荐的batch size在单个GPU上对其进行微调。为了帮助微调模型,这个repo还提供了3种可以在微调脚本中激活技术:梯度累积(gradient-accumulation)、multi-GPU和分布式训练。

其结果如下:

在序列级MRPC分类任务上,该实现使用小型BERT-base模型再现了原始实现的84%-88%的准确率。

在token级的SQuAD 任务上,该个实现使用小型BERT-base模型再现了原始实现的88.52 F1的结果。

作者表示,正致力于在其他任务以及更大的BERT模型上重现结果。

BERT模型的PyTorch实现

这个存储库包含了谷歌BERT模型的官方TensorFlow存储库的op-for-op PyTorch重新实现。谷歌的官方存储库是与BERT论文一起发布的:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding,作者是Jacob Devlin、Ming-Wei Chang、Kenton Lee和Kristina Toutanova。

这个实现可以为BERT加载任何预训练的TensorFlow checkpoint(特别是谷歌的预训练模型),并提供了一个转换脚本(见下文)。

此外,我们将在本周晚些时候添加多语言版本和中文版本的模型代码。

脚本:加载任何TensorFlow检查点

使用convert_tf_checkpoint_to_pytorch.py脚本,你可以在PyTorch保存文件中转换BERT的任何TensorFlow检查点(尤其是谷歌发布的官方预训练模型)。

这个脚本将TensorFlow checkpoint(以bert_model.ckpt开头的三个文件)和相关的配置文件(bert_config.json)作为输入,并为此配置创建PyTorch模型,从PyTorch模型的TensorFlow checkpoint加载权重并保存生成的模型在一个标准PyTorch保存文件中,可以使用 torch.load()导入(请参阅extract_features.py,run_classifier.py和run_squad.py中的示例)。

只需要运行一次这个转换脚本,就可以得到一个PyTorch模型。然后,你可以忽略TensorFlow checkpoint(以bert_model.ckpt开头的三个文件),但是一定要保留配置文件(bert_config.json)和词汇表文件(vocab.txt),因为PyTorch模型也需要这些文件。

要运行这个特定的转换脚本,你需要安装TensorFlow和PyTorch。该库的其余部分只需要PyTorch。

下面是一个预训练的BERT-Base Uncased 模型的转换过程示例:

export BERT_BASE_DIR=/path/to/bert/uncased_L-12_H-768_A-12 python convert_tf_checkpoint_to_pytorch.py --tf_checkpoint_path $BERT_BASE_DIR/bert_model.ckpt --bert_config_file $BERT_BASE_DIR/bert_config.json --pytorch_dump_path $BERT_BASE_DIR/pytorch_model.bin

你可以在这里下载Google的预训练转换模型:

https://github.com/google-research/bert#pre-trained-models

BERT的PyTorch模型

在这个库里,我们提供了三个PyTorch模型,你可以在modeling.py中找到:

BertModel- 基本的BERT Transformer 模型

BertForSequenceClassification- 顶部带有sequence classification head的BERT模型

BertForQuestionAnswering- 顶部带有token classification head 的BERT模型,

以下是每类模型的一些细节。

1 . BertModel

BertModel是一个基本的BERT Transformer模型,包含一个summed token、位置和序列嵌入层,然后是一系列相同的self-attention blocks(BERT-base是12个blocks, BERT-large是24个blocks)。

输入和输出与TensorFlow 模型的输入和输出相同。

具体来说,该模型的输入是:

input_ids:一个形状为[batch_size, sequence_length]的torch.LongTensor,在词汇表中包含单词的token索引

token_type_ids:形状[batch_size, sequence_length]的可选torch.LongTensor,在[0,1]中选择token类型索引。类型0对应于句子A,类型1对应于句子B。

attention_mask:一个可选的torch.LongTensor,形状为[batch_size, sequence_length],索引在[0,1]中选择。

模型的输出是由以下内容组成的一个元组:

all_encoder_layers:一个大小为[batch_size, sequence_length,hidden_size]的torch.FloatTensor列表,它是每个注意块末端隐藏状态的完整序列列表(即BERT-base的12个完整序列,BERT-large的24个完整序列)

pooled_output:一个大小为[batch_size, hidden_size]的torch.FloatTensor,它是在与输入(CLF)的第一个字符相关联的隐藏状态之上预训练的分类器的输出,用于训练Next-Sentence任务(参见BERT的论文)。

extract_features.py脚本提供了有关如何使用这类模型的示例,该脚本可用于为给定输入提取模型的隐藏状态。

2 . BertForSequenceClassification

BertForSequenceClassification是一个fine-tuning 模型,包括BertModel,以及BertModel顶部的一个序列级分类器(sequence-level classifier)。

序列级分类器是一个线性层,它将输入序列中第一个字符的最后隐藏状态作为输入(参见BERT论文中的图3a和3b)。

run_classifier.py脚本提供了关于如何使用此类模型的示例,该脚本可用于使用BERT微调单个序列(或序列对)分类器,例如用于MRPC任务。

3. BertForQuestionAnswering

BertForQuestionAnswering是一个fine-tuning 模型,包括BertModel,它在最后隐藏状态的完整序列之上具有token级分类器(token-level classifiers)。

token-level 分类器将最后隐藏状态的完整序列作为输入,并为每个token计算得分,(参见BERT论文的图3c和3d)。

run_squad.py脚本提供了有关如何使用此类模型的示例,该脚本可用于使用BERT微调token分类器,例如用于SQuAD任务。

安装、要求、测试

这段代码在Python 3.5+上进行了测试。必备条件是:

PyTorch (> = 0.4.1)

tqdm

安装dependencies:

pip install -r ./requirements.txt

测试文件夹中包含一系列测试,可以使用pytest运行(如果需要,请安装pytest: pip install pytest)。

你可以使用以下命令运行测试:

python -m pytest -sv tests/大批量训练:梯度积累、多GPU、分布式训练

BERT-base和BERT-large的模型参数分别是110M和340M,为了获得良好的性能(大多数情况下批大小是32),很难在单个GPU上对它们进行微调。

为了帮助对这些模型进行微调,我们介绍了在微调脚本run_classifier.py和run_squad中可以激活的四种技术:优化CPU、梯度积累、multi-gpu和分布式训练。

有关如何使用这些技术的更多细节,你可以阅读这篇关于PyTorch批量训练技巧的文章:

https://medium.com/huggingface/training-larger-batches-practical-tips-on-1-gpu-multi-gpu-distributed-setups-ec88c3e51255

BERT的微调:运行示例

我们展示了与原始实现相同的示例:在MRPC分类语料库上微调sequence级分类器和在问题回答数据集SQuAD上微调token级分类器。

在运行这些示例之前,应该先下载GLUE数据,并将其解压缩到某个目录$GLUE_DIR。还需下载BERT-Base checkpoint,将其解压缩到某个目录$BERT_BASE_DIR,并将其转换为上一节所述的PyTorch版本。

这个示例代码基于微软研究意译语料库(MRPC)调优了BERT-Base,在单个K-80上运行只需不到10分钟。

export GLUE_DIR=/path/to/glue python run_classifier.py --task_name MRPC --do_train --do_eval --do_lower_case --data_dir $GLUE_DIR/MRPC/ --vocab_file $BERT_BASE_DIR/vocab.txt --bert_config_file $BERT_BASE_DIR/bert_config.json --init_checkpoint $BERT_PYTORCH_DIR/pytorch_model.bin --max_seq_length 128 --train_batch_size 32 --learning_rate 2e-5 --num_train_epochs 3.0 --output_dir /tmp/mrpc_output/

基于原始实现的超参数进行测试,评估结果达到84%到88%。

第二个示例是基于SQuAD问题回答任务微调BERT-Base。

export SQUAD_DIR=/path/to/SQUAD python run_squad.py --vocab_file $BERT_BASE_DIR/vocab.txt --bert_config_file $BERT_BASE_DIR/bert_config.json --init_checkpoint $BERT_PYTORCH_DIR/pytorch_model.bin --do_train --do_predict --do_lower_case --train_file $SQUAD_DIR/train-v1.1.json --predict_file $SQUAD_DIR/dev-v1.1.json --train_batch_size 12 --learning_rate 3e-5 --num_train_epochs 2.0 --max_seq_length 384 --doc_stride 128 --output_dir ../debug_squad/

使用之前的超参数进行训练,得到如下结果:

{"f1": 88.52381567990474, "exact_match": 81.22043519394512}在GPU上微调BERT-large

上面列出的选项允许在GPU上很容易地对BERT-large进行微调,而不是像原始实现那样使用TPU。

例如,针对SQuAD任务微调BERT-large模型,可以在服务器上用4个k-80在18个小时内完成。我们的结果与TensorFlow的实现结果相似(实际上是略高):

{"exact_match": 84.56953642384106, "f1": 91.04028647786927}

为了得到这些结果,我们使用了以下组合:

多GPU训练(在多GPU服务器上自动激活),

梯度累积

在CPU上执行优化步骤,将Adam的平均值存储在RAM中。

以下是我们在此次运行中使用的超参数的完整列表:

python ./run_squad.py --vocab_file $BERT_LARGE_DIR/vocab.txt --bert_config_file $BERT_LARGE_DIR/bert_config.json --init_checkpoint $BERT_LARGE_DIR/pytorch_model.bin --do_lower_case --do_train --do_predict --train_file $SQUAD_TRAIN --predict_file $SQUAD_EVAL --learning_rate 3e-5 --num_train_epochs 2 --max_seq_length 384 --doc_stride 128 --output_dir $OUTPUT_DIR/bert_large_bsz_24 --train_batch_size 24 --gradient_accumulation_steps 2 --optimize_on_cpu

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 谷歌
    +关注

    关注

    27

    文章

    5852

    浏览量

    103248
  • tensorflow
    +关注

    关注

    13

    文章

    313

    浏览量

    60242
  • pytorch
    +关注

    关注

    2

    文章

    760

    浏览量

    12828

原文标题:横扫各项NLP任务的BERT模型有了PyTorch实现!提供转换脚本

文章出处:【微信号:AI_era,微信公众号:新智元】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Pytorch模型训练实用PDF教程【中文】

    模型部分?还是优化器?只有这样不断的通过可视化诊断你的模型,不断的对症下药,才能训练出一个较满意的模型。本教程内容及结构:本教程内容主要为在 PyTorch 中训练一个
    发表于 12-21 09:18

    Pytorch模型如何通过paddlelite部署到嵌入式设备?

    Pytorch模型如何通过paddlelite部署到嵌入式设备?
    发表于 12-23 09:38

    怎样去解决pytorch模型一直无法加载的问题呢

    rknn的模型转换过程是如何实现的?怎样去解决pytorch模型一直无法加载的问题呢?
    发表于 02-11 06:03

    pytorch模型转化为onxx模型的步骤有哪些

    首先pytorch模型要先转化为onxx模型,然后从onxx模型转化为rknn模型直接转化会出现如下问题,环境都是正确的,论坛询问后也没给出
    发表于 05-09 16:36

    怎样使用PyTorch Hub去加载YOLOv5模型

    在Python>=3.7.0环境中安装requirements.txt,包括PyTorch>=1.7。模型和数据集从最新的 YOLOv5版本自动下载。简单示例此示例从
    发表于 07-22 16:02

    通过Cortex来非常方便的部署PyTorch模型

    个研究模型储存在 PyTorch Hub],从 NLP 到计算机视觉。所有这些都可以通过 Cortex 来实现,使用的过程和我们刚才演示的一样。原作者:Caleb Kaiser
    发表于 11-01 15:25

    Pytorch模型转换为DeepViewRT模型时出错怎么解决?

    我正在寻求您的帮助以解决以下问题.. 我在 Windows 10 上安装了 eIQ Toolkit 1.7.3,我想将我的 Pytorch 模型转换为 DeepViewRT (.rtm) 模型,这样
    发表于 06-09 06:42

    如何将PyTorch模型与OpenVINO trade结合使用?

    无法确定如何转换 PyTorch 掩码 R-CNN 模型以配合OpenVINO™使用。
    发表于 08-15 07:04

    pytorch模型转换需要注意的事项有哪些?

    什么是JIT(torch.jit)? 答:JIT(Just-In-Time)是一组编译工具,用于弥合PyTorch研究与生产之间的差距。它允许创建可以在不依赖Python解释器的情况下运行的模型
    发表于 09-18 08:05

    图解BERT预训练模型

    BERT的发布是这个领域发展的最新的里程碑之一,这个事件标志着NLP 新时代的开始。BERT模型打破了基于语言处理的任务的几个记录。在 BERT 的论文发布后不久,这个团队还公开了
    的头像 发表于 11-24 10:08 3289次阅读

    PyTorch教程15.9之预训练BERT的数据集

    电子发烧友网站提供《PyTorch教程15.9之预训练BERT的数据集.pdf》资料免费下载
    发表于 06-05 11:06 0次下载
    <b class='flag-5'>PyTorch</b>教程15.9之预训练<b class='flag-5'>BERT</b>的数据集

    PyTorch教程15.10之预训练BERT

    电子发烧友网站提供《PyTorch教程15.10之预训练BERT.pdf》资料免费下载
    发表于 06-05 10:53 0次下载
    <b class='flag-5'>PyTorch</b>教程15.10之预训练<b class='flag-5'>BERT</b>

    PyTorch教程16.6之针对序列级和令牌级应用程序微调BERT

    电子发烧友网站提供《PyTorch教程16.6之针对序列级和令牌级应用程序微调BERT.pdf》资料免费下载
    发表于 06-05 10:51 0次下载
    <b class='flag-5'>PyTorch</b>教程16.6之针对序列级和令牌级应用程序微调<b class='flag-5'>BERT</b>

    PyTorch教程16.7之自然语言推理:微调BERT

    电子发烧友网站提供《PyTorch教程16.7之自然语言推理:微调BERT.pdf》资料免费下载
    发表于 06-05 10:52 0次下载
    <b class='flag-5'>PyTorch</b>教程16.7之自然语言推理:微调<b class='flag-5'>BERT</b>

    PyTorch教程-15.9。预训练 BERT 的数据集

    实验室在 SageMaker Studio Lab 中打开笔记本 为了预训练第 15.8 节中实现BERT 模型,我们需要以理想的格式生成数据集,以促进两项预训练任务:掩码语言建模和下一句预测
    的头像 发表于 06-05 15:44 551次阅读