Transformers2.0让你三行代码调用语言模型,兼容TF2.0和PyTorch

能够灵活地调用各种语言模型,一直是 NLP 研究者的期待。近日 HuggingFace 公司开源了最新的 Transformer2.0 模型库,用户可非常方便地调用现在非常流行的 8 种语言模型进行微调和应用,且同时兼容 TensorFlow2.0 和 PyTorch 两大框架,非常方便快捷。

最近,专注于自然语言处理(NLP)的初创公司 HuggingFace 对其非常受欢迎的 Transformers 库进行了重大更新,从而为 PyTorch 和 Tensorflow 2.0 两大深度学习框架提供了前所未有的兼容性。

更新后的 Transformers 2.0 汲取了 PyTorch 的易用性和 Tensorflow 的工业级生态系统。借助于更新后的 Transformers 库,科学家和实践者可以更方便地在开发同一语言模型的训练、评估和制作阶段选择不同的框架。

那么更新后的 Transformers 2.0 具有哪些显著的特征呢?对 NLP 研究者和实践者又会带来哪些方面的改善呢?机器之心进行了整理。

项目地址:https://github.com/huggingface/transformers

Transformers 2.0 新特性

  • 像 pytorch-transformers 一样使用方便;

  • 像 Keras 一样功能强大和简洁;

  • 在 NLU 和 NLG 任务上实现高性能;

  • 对教育者和实践者的使用门槛低。

为所有人提供 SOTA 自然语言处理

  • 深度学习研究者;

  • 亲身实践者;

  • AI/ML/NLP 教师和教育者。

更低的计算开销和更少的碳排放量

  • 研究者可以共享训练过的模型,而不用总是重新训练;

  • 实践者可以减少计算时间和制作成本;

  • 提供有 8 个架构和 30 多个预训练模型,一些模型支持 100 多种语言;

为模型使用期限内的每个阶段选择正确的框架

  • 3 行代码训练 SOTA 模型;

  • 实现 TensorFlow 2.0 和 PyTorch 模型的深度互操作;

  • 在 TensorFlow 2.0 和 PyTorch 框架之间随意移动模型;

  • 为模型的训练、评估和制作选择正确的框架。

现已支持的模型

官方提供了一个支持的模型列表,包括各种著名的预训练语言模型和变体,甚至还有官方实现的一个蒸馏后的 Bert 模型:

1. BERT (https://github.com/google-research/bert)

2. GPT (https://github.com/openai/finetune-transformer-lm)

3. GPT-2 (https://blog.openai.com/better-language-models/)

4. Transformer-XL (https://github.com/kimiyoung/transformer-xl)

5. XLNet (https://github.com/zihangdai/xlnet/)

6. XLM (https://github.com/facebookresearch/XLM/)

7. RoBERTa (https://github.com/pytorch/fairseq/tree/master/examples/roberta)

8. DistilBERT (https://github.com/huggingface/transformers/tree/master/examples/distillation)

快速上手

怎样使用 Transformers 工具包呢?官方提供了很多代码示例,以下为查看 Transformer 内部模型的代码:

  1. import torch
  2. from transformers import *
  3. #Transformers has a unified API
  4. #for 8 transformer architectures and 30 pretrained weights.
  5. #Model | Tokenizer | Pretrained weights shortcut
  6. MODELS = [(BertModel, BertTokenizer, 'bert-base-uncased'),
  7. (OpenAIGPTModel, OpenAIGPTTokenizer, 'openai-gpt'),
  8. (GPT2Model, GPT2Tokenizer, 'gpt2'),
  9. (TransfoXLModel, TransfoXLTokenizer, 'transfo-xl-wt103'),
  10. (XLNetModel, XLNetTokenizer, 'xlnet-base-cased'),
  11. (XLMModel, XLMTokenizer, 'xlm-mlm-enfr-1024'),
  12. (DistilBertModel, DistilBertTokenizer, 'distilbert-base-uncased'),
  13. (RobertaModel, RobertaTokenizer, 'roberta-base')]
  14. #To use TensorFlow 2.0 versions of the models, simply prefix the class names with 'TF', e.g. TFRobertaModel is the TF 2.0 counterpart of the PyTorch model RobertaModel
  15. #Let's encode some text in a sequence of hidden-states using each model:
  16. for model_class, tokenizer_class, pretrained_weights in MODELS:
  17. # Load pretrained model/tokenizer
  18. tokenizer = tokenizer_class.from_pretrained(pretrained_weights)
  19. model = model_class.from_pretrained(pretrained_weights)
  20. # Encode text
  21. input_ids = torch.tensor([tokenizer.encode("Here is some text to encode", add_special_tokens=True)]) # Add special tokens takes care of adding [CLS], [SEP], <s>... tokens in the right way for each model.
  22. with torch.no_grad():
  23. last_hidden_states = model(input_ids)[0] # Models outputs are now tuples
  24. #Each architecture is provided with several class for fine-tuning on down-stream tasks, e.g.
  25. BERT_MODEL_CLASSES = [BertModel, BertForPreTraining, BertForMaskedLM, BertForNextSentencePrediction,
  26. BertForSequenceClassification, BertForMultipleChoice, BertForTokenClassification,
  27. BertForQuestionAnswering]
  28. #All the classes for an architecture can be initiated from pretrained weights for this architecture
  29. #Note that additional weights added for fine-tuning are only initialized

#and need to be trained on the down-stream task

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') for model_class in BERT_MODEL_CLASSES: # Load pretrained model/tokenizer model = model_class.from_pretrained('bert-base-uncased') #Models can return full list of hidden-states & attentions weights at each layer model = model_class.from_pretrained(pretrained_weights, output_hidden_states=True, output_attentions=True) input_ids = torch.tensor([tokenizer.encode("Let's see all hidden-states and attentions on this text")]) all_hidden_states, all_attentions = model(input_ids)[-2:] #Models are compatible with Torchscript model = model_class.from_pretrained(pretrained_weights, torchscript=True) traced_model = torch.jit.trace(model, (input_ids,)) #Simple serialization for models and tokenizers model.save_pretrained('./directory/to/save/') # save model = model_class.from_pretrained('./directory/to/save/') # re-load tokenizer.save_pretrained('./directory/to/save/') # save tokenizer = tokenizer_class.from_pretrained('./directory/to/save/') # re-load #SOTA examples for GLUE, SQUAD, text generation...

Transformers 同时支持 PyTorch 和 TensorFlow2.0,用户可以将这些工具放在一起使用。如下为使用 TensorFlow2.0 和 Transformer 的代码:

  1. import tensorflow as tf
  2. import tensorflow_datasets
  3. from transformers import *
  4. #Load dataset, tokenizer, model from pretrained model/vocabulary
  5. tokenizer = BertTokenizer.from_pretrained('bert-base-cased')
  6. model = TFBertForSequenceClassification.from_pretrained('bert-base-cased')
  7. data = tensorflow_datasets.load('glue/mrpc')
  8. #Prepare dataset for GLUE as a tf.data.Dataset instance
  9. train_dataset = glue_convert_examples_to_features(data['train'], tokenizer, max_length=128, task='mrpc')
  10. valid_dataset = glue_convert_examples_to_features(data['validation'], tokenizer, max_length=128, task='mrpc')
  11. train_dataset = train_dataset.shuffle(100).batch(32).repeat(2)
  12. valid_dataset = valid_dataset.batch(64)
  13. #Prepare training: Compile tf.keras model with optimizer, loss and learning rate schedule
  14. optimizer = tf.keras.optimizers.Adam(learning_rate=3e-5, epsilon=1e-08, clipnorm=1.0)
  15. loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
  16. metric = tf.keras.metrics.SparseCategoricalAccuracy('accuracy')
  17. model.compile(optimizer=optimizer, loss=loss, metrics=[metric])
  18. #Train and evaluate using tf.keras.Model.fit()
  19. history = model.fit(train_dataset, epochs=2, steps_per_epoch=115,
  20. validation_data=valid_dataset, validation_steps=7)
  21. #Load the TensorFlow model in PyTorch for inspection
  22. model.save_pretrained('./save/')
  23. pytorch_model = BertForSequenceClassification.from_pretrained('./save/', from_tf=True)
  24. #Quickly test a few predictions - MRPC is a paraphrasing task, let's see if our model learned the task
  25. sentence_0 = "This research was consistent with his findings.“

sentence_1 = "His findings were compatible with this research.“

sentence_2 = "His findings were not compatible with this research.“

inputs_1 = tokenizer.encode_plus(sentence_0, sentence_1, add_special_tokens=True, return_tensors='pt')

inputs_2 = tokenizer.encode_plus(sentence_0, sentence_2, add_special_tokens=True, return_tensors='pt') pred_1 = pytorch_model(*inputs_1)[0].argmax().item() pred_2 = pytorch_model(*inputs_2)[0].argmax().item() print("sentence_1 is", "a paraphrase" if pred_1 else "not a paraphrase", "of sentence_0") print("sentence_2 is", "a paraphrase" if pred_2 else "not a paraphrase", "of sentence_0")

使用 py 文件脚本进行模型微调

当然,有时候你可能需要使用特定数据集对模型进行微调,Transformer2.0 项目提供了很多可以直接执行的 Python 文件。例如:

  • run_glue.py:在九种不同 GLUE 任务上微调 BERT、XLNet 和 XLM 的示例(序列分类);

  • run_squad.py:在问答数据集 SQuAD 2.0 上微调 BERT、XLNet 和 XLM 的示例(token 级分类);

  • run_generation.py:使用 GPT、GPT-2、Transformer-XL 和 XLNet 进行条件语言生成;

  • 其他可用于模型的示例代码。

GLUE 任务上进行模型微调

如下为在 GLUE 任务进行微调,使模型可以用于序列分类的示例代码,使用的文件是 run_glue.py。

首先下载 GLUE 数据集,并安装额外依赖:

pip install -r ./examples/requirements.txt

然后可进行微调:

  1. export GLUE_DIR=/path/to/glue
  2. export TASK_NAME=MRPC
  3. python ./examples/run_glue.py \
  4. --model_type bert \
  5. --model_name_or_path bert-base-uncased \
  6. --task_name $TASK_NAME \
  7. --do_train \
  8. --do_eval \
  9. --do_lower_case \
  10. --data_dir $GLUE_DIR/$TASK_NAME \
  11. --max_seq_length 128 \
  12. --per_gpu_eval_batch_size=8 \
  13. --per_gpu_train_batch_size=8 \
  14. --learning_rate 2e-5 \
  15. --num_train_epochs 3.0 \
  16. --output_dir /tmp/$TASK_NAME/

在命令行运行时,可以选择特定的模型和相关的训练参数。

使用 SQuAD 数据集微调模型

另外,你还可以试试用 run_squad.py 文件在 SQuAD 数据集上进行微调。代码如下:

  1. python -m torch.distributed.launch --nproc_per_node=8 ./examples/run_squad.py \
  2. --model_type bert \
  3. --model_name_or_path bert-large-uncased-whole-word-masking \
  4. --do_train \
  5. --do_eval \
  6. --do_lower_case \
  7. --train_file $SQUAD_DIR/train-v1.1.json \
  8. --predict_file $SQUAD_DIR/dev-v1.1.json \
  9. --learning_rate 3e-5 \
  10. --num_train_epochs 2 \
  11. --max_seq_length 384 \
  12. --doc_stride 128 \
  13. --output_dir ../models/wwm_uncased_finetuned_squad/ \
  14. --per_gpu_eval_batch_size=3 \
  15. --per_gpu_train_batch_size=3 \

这一代码可微调 BERT 全词 Mask 模型,在 8 个 V100GPU 上微调,使模型的 F1 分数在 SQuAD 数据集上超过 93。

用模型进行文本生成

还可以使用 run_generation.py 让预训练语言模型进行文本生成,代码如下:

  1. python ./examples/run_generation.py \
  2. --model_type=gpt2 \
  3. --length=20 \
  4. --model_name_or_path=gpt2 \

安装方法

如此方便的工具怎样安装呢?用户只要保证环境在 Python3.5 以上,PyTorch 版本在 1.0.0 以上或 TensorFlow 版本为 2.0.0-rc1。

然后使用 pip 安装即可。

pip install transformers

移动端部署很快就到

HuggingFace 在 GitHub 上表示,他们有意将这些模型放到移动设备上,并提供了一个 repo 的代码,将 GPT-2 模型转换为 CoreML 模型放在移动端。

未来,他们会进一步推进开发工作,用户可以无缝地将大模型转换成 CoreML 模型,无需使用额外的程序脚本。

repo 地址:https://github.com/huggingface/swift-coreml-transformers

Transformers2.0让你三行代码调用语言模型,兼容TF2.0和PyTorch相关推荐

  1. Android世界时钟-时间1970-1-1 0:0无法设置的代码调用和原因

    时间1970-1-1 0:0无法设置的代码调用和原因 根因:时间设置从01:01起始,而非00:00起始 1. 从界面布局定位到时间设置DateTimeSettings.java packages/a ...

  2. TensorFlow2.0正式版发布,极简安装TF2.0(CPUGPU)教程

    作者 | 小宋是呢 转载自CSDN博客 [导读]TensorFlow 2.0,昨天凌晨,正式放出了2.0版本. 不少网友表示,TensorFlow 2.0比PyTorch更好用,已经准备全面转向这个新 ...

  3. 如何用三行代码让盒子居中

    flex布局 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF ...

  4. 三行代码接入,社交软件打字时底下弹出的表情布局,自定义ViewPager+页面点标+各种功能的android小框架。...

    (转载请声明出处:http://www.cnblogs.com/linguanh/) 前言: 接上次分享的 ListView 动态加载类,入口:http://www.cnblogs.com/lingu ...

  5. paddlepaddle系列之三行代码从入门到精通

    PaddlePaddle系列之三行代码从入门到精通 前言 这将是PaddlePaddle系列教程的开篇,属于非官方教程.既然是非官方,自然会从一个使用者的角度出发,来教大家怎么用,会有哪些坑,以及如何 ...

  6. 三行代码将Excel转为任意格式的Word

    作者:小小明 需求 有一个Excel文件: 需要按照题目和答案分别生成两个如下格式的word文档: 实现它的核心代码仅三行: tpl = DocxTemplate("xxxx模板.docx& ...

  7. Python图形界面不够美?三行代码全面美化你的Tkinter界面

    文章目录 前言 简单的初探ttkbootstrap,深入了解靠你自己 安装ttkbootstrap 简单的主题调用 结尾 前言 当你构造了自己的图形界面之后,我想下一步要想的就是界面的美化吧.最开始, ...

  8. 三行代码按键消抖 独立按键 矩阵按键 长按 短按 双击

    九层妖塔 起于垒土 直接跳转到三行代码 三行代码按键消抖 独立按键 矩阵按键 长按 短按 双击 一.基本理论 0.按键的常见名词:  ①按键抖动  ②按键稳定闭合时间 1.按键的扫描: 2.按键的消抖 ...

  9. PaddlePaddle 系列之三行代码从入门到精通

    本文介绍 PaddlePaddle 系列之三行代码从入门到精通. 前言 这将是 PaddlePaddle 系列教程的开篇,属于非官方教程.既然是非官方,自然会从一个使用者的角度出发,来教大家怎么用,会 ...

最新文章

  1. texture android,Android OpenGL结合了SurfaceTexture(外部图像)和普...
  2. 小型自动化运维--expect脚本之自动同步
  3. 银光甘特图/日历图/排程控件GTP.NET for Silverlight介绍及正版下载
  4. 不符合条件重新输入 c语言,2016年计算机考试上机应试技巧
  5. 金融贷款逾期的模型构建1
  6. 2019,GMIS归来!杨强、吴恩达等全球重磅嘉宾共话数据智能
  7. sql中实现取得某字段中数字值
  8. 编程题: 将一个矩阵(二维数组)顺时针旋转90度
  9. 考试用计算机反思800字,考试反思作文800字
  10. 2021年中国现制茶饮行业洞察报告
  11. Eclipse设置断点进行调试
  12. 微信小程序demo2
  13. WPF学习(3) – WPF控件
  14. mate10支持html,华为Mate 10再曝光:配置强劲,全面屏十分惊艳
  15. 事务失败返回_分布式事务方案 TCC
  16. Dapper学习 - Dapper.Rainbow(三) - Read
  17. 小火狐进化_第34章 契约小火狐
  18. 格力空调售后服务管理系统
  19. 在家自学html,怎样在家自学英语口语
  20. 《吉他自学三月通》学习指导

热门文章

  1. Navicat中查询哪些表有指定的字段名(技巧)
  2. 丛林谜题JAVA_丛林王座图文全剧情流程攻略_全谜题解答通关流程_3DM单机
  3. vbs结束进程代码_物联网学习教程—Linux系统编程之进程控制
  4. 路由ssr服务器信息不完整,基于Nuxt构建动态路由SSR服务
  5. 二级c语言编程题只要得出答案,计算机二级C语言考试编程题题库答案.docx
  6. 华为数据中心服务器数量,IDC 与华为联合发布《全闪存数据中心白皮书》,目前已有多个应用...
  7. python怎么打开文档_python打开怎么运行
  8. Python 代码尝试
  9. FPGA之道(30)编写自己的vhdl库文件
  10. Verilog中的二维数组及其初始化