Transformers 中使用 TorchScript | 四
作者|huggingface
编译|VK
来源|Github
注意:这是我们使用TorchScript进行实验的开始,我们仍在探索可变输入大小模型的功能。它是我们关注的焦点,我们将在即将发布的版本中加深我们的分析,提供更多代码示例,更灵活的实现以及将基于python的代码与已编译的TorchScript进行基准测试的比较。
根据Pytorch的文档:“TorchScript是一种从PyTorch代码创建可序列化和可优化模型的方法”。Pytorch的两个模块JIT和TRACE允许开发人员导出他们的模型,这些模型可以在其他程序中重用,例如面向效率的C++程序。
我们提供了一个接口,该接口允许将transformers模型导出到TorchScript,以便他们可在与基于Pytorch的python程序不同的环境中重用。在这里,我们解释如何使用我们的模型,以便可以导出它们,以及将这些模型与TorchScript一起使用时要注意的事项。
导出模型需要两件事:
- 虚拟化输入以执行模型正向传播。
- 需要使用
torchscript标志实例化该模型。
这些必要性意味着开发人员应注意几件事。这些在下面详细说明。
含义
TorchScript标志和解绑权重
该标志是必需的,因为该存储库中的大多数语言模型都在它们的Embedding层及其Decoding层具有绑定权重关系。TorchScript不允许导出绑定权重的模型,因此,有必要事先解绑权重。
这意味着以torchscript标志实例化的模型使得Embedding层和Decoding层分开,这意味着不应该对他们进行同时训练,导致意外的结果。
对于没有语言模型头(Language Model head)的模型,情况并非如此,因为那些模型没有绑定权重。这些型号可以在没有torchscript标志的情况下安全地导出。
虚拟(dummy)输入和标准长度
虚拟输入用于进行模型前向传播。当输入值在各层中传播时,Pytorch跟踪在每个张量上执行的不同操作。然后使用这些记录的操作创建模型的“迹"。
迹是相对于输入的尺寸创建的。因此,它受到虚拟输入尺寸的限制,并且不适用于任何其他序列长度或批次大小。尝试使用其他尺寸时,会出现如下错误,如:
The expanded size of the tensor (3) must match the existing size (7) at non-singleton dimension 2
因此,建议使用至少与最大输入大小相同的虚拟输入大小来跟踪模型。在推理期间对于模型的输入,可以执行填充来填充缺少的值。作为模型
将以较大的输入大小来进行跟踪,但是,不同矩阵的尺寸也将很大,从而导致更多的计算。
建议注意每个输入上完成的操作总数,并密切关注各种序列长度对应性能的变化。
在Python中使用TorchScript
以下是使用Python保存,加载模型以及如何使用"迹"进行推理的示例。
保存模型
该代码段显示了如何使用TorchScript导出BertModel。在这里实例化BertModel,根据BertConfig类,然后以文件名traced_bert.pt保存到磁盘
from transformers import BertModel, BertTokenizer, BertConfig
import torch
enc = BertTokenizer.from_pretrained("bert-base-uncased")
# 标记输入文本
text = "[CLS] Who was Jim Henson ? [SEP] Jim Henson was a puppeteer [SEP]"
tokenized_text = enc.tokenize(text)
# 输入标记之一进行掩码
masked_index = 8
tokenized_text[masked_index] = '[MASK]'
indexed_tokens = enc.convert_tokens_to_ids(tokenized_text)
segments_ids = [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1]
# 创建虚拟输入
tokens_tensor = torch.tensor([indexed_tokens])
segments_tensors = torch.tensor([segments_ids])
dummy_input = [tokens_tensor, segments_tensors]
# 使用torchscript标志初始化模型
# 标志被设置为True,即使没有必要,因为该型号没有LM Head。
config = BertConfig(vocab_size_or_config_json_file=32000, hidden_size=768,
num_hidden_layers=12, num_attention_heads=12, intermediate_size=3072, torchscript=True)
# 实例化模型
model = BertModel(config)
# 模型设置为评估模式
model.eval()
# 如果您要使用from_pretrained实例化模型,则还可以设置TorchScript标志
model = BertModel.from_pretrained("bert-base-uncased", torchscript=True)
# 创建迹
traced_model = torch.jit.trace(model, [tokens_tensor, segments_tensors])
torch.jit.save(traced_model, "traced_bert.pt")
载入模型
该代码段显示了如何加载以前以名称traced_bert.pt保存到磁盘的BertModel。
我们重新使用之前初始化的dummy_input。
loaded_model = torch.jit.load("traced_model.pt")
loaded_model.eval()
all_encoder_layers, pooled_output = loaded_model(dummy_input)
使用跟踪模型进行推理
使用跟踪模型进行推理就像使用其__call__ 方法一样简单:
traced_model(tokens_tensor, segments_tensors)
原文链接:https://huggingface.co/transformers/torchscript.html
欢迎关注磐创AI博客站:
http://panchuang.net/
OpenCV中文官方文档:
http://woshicver.com/
欢迎关注磐创博客资源汇总站:
http://docs.panchuang.net/
Transformers 中使用 TorchScript | 四的更多相关文章
- C#中的线程四(System.Threading.Thread)
C#中的线程四(System.Threading.Thread) 1.最简单的多线程调用 System.Threading.Thread类构造方法接受一个ThreadStart委托,改委托不带参数,无 ...
- ORACLE中CONSTRAINT的四对属性
ORACLE中CONSTRAINT的四对属性 summary:在data migrate时,某些表的约束总是困扰着我们,让我们的migratet举步维艰,怎样利用约束本身的属性来处理这些问题呢?本文具 ...
- iOS中常用的四种数据持久化方法简介
iOS中常用的四种数据持久化方法简介 iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data 1.属性列表涉及到的主要类:NSUserDefaults,一般 ...
- js中this的四种使用方法
0x00:js中this的四种调用模式 1,方法调用模式 2,函数调用模式 3,构造器调用模式 4,apply.call.bind调用模式 0x01:第一种:方法调用模式 (也就是用.调用的)this ...
- {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session
Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...
- C#中datagridviewz中SelectionMode的四个属性的含义
C#中datagridviewz中SelectionMode的四个属性的含义 DataGridViewSelectionMode.ColumnHeaderSelect 单击列头就可以选择整列DataG ...
- Django中模型(四)
Django中模型(四) 五.创建对象 1.目的 向数据库中添加数据.当创建对象时,Django不会对数据库进行读写操作,当调用save()方法时,才与数据库交互,将对象保存到数据库中 2.注意 __ ...
- Android中Activity的四种启动方式
谈到Activity的启动方式必须要说的是数据结构中的栈.栈是一种只能从一端进入存储数据的线性表,它以先进后出的原则存储数据,先进入的数据压入栈底,后进入的数据在栈顶.需要读取数据的时候就需要从顶部开 ...
- Python实现接口测试中的常见四种Post请求数据
前情: 在日常的接口测试工作中,模拟接口请求通常有两种方法, 利用工具来模拟,比如fiddler,postman,poster,soapUI等 利用代码来模拟,使用到一些网络模块,比如HttpClie ...
随机推荐
- 移动端使用mint-ui组件loadmore填坑
链接地址为 https://mint-ui.github.io/docs/#/en2/loadmore ,这里需要注意引入的方式,我这里是用cdn的方式引入的.请结合官方API阅读本文章. 2.在 ...
- 探究 Go 语言 defer 语句的三种机制
Golang 的 1.13 版本 与 1.14 版本对 defer 进行了两次优化,使得 defer 的性能开销在大部分场景下都得到大幅降低,其中到底经历了什么原理? 这是因为这两个版本对 defer ...
- 最强加密算法?AES加解密算法Matlab和Verilog实现
目录 背景 AES加密的几种模式 基本运算 AES加密原理 Matlab实现 Verilog实现 Testbench 此本文首发于公众号[两猿社],重点讲述了AES加密算法的加密模式和原理,用MATL ...
- iOS中的分类和扩展
一.什么是分类? 概念:分类(Category)是OC中的特有语法,它是表示一个指向分类的结构体指针.根据下面源码组成可以看到它没有属性列表,原则上是不能添加成员变量(其实可以借助运行时功能,进行关联 ...
- 一起了解 .Net Foundation 项目 No.12
.Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. Cecil Cecil 是 ...
- 零基础HTML及CSS编码总结
任务目的 针对设计稿样式进行合理的HTML架构,包括以下但不限于: * 掌握常用HTML标签的含义.用法 能够基于设计稿来合理规划HTML文档结构 理解语义化,合理地使用HTML标签来构建页面 掌握基 ...
- leetcode 219
固定长度的滑动窗口+set class Solution { public: bool containsNearbyDuplicate(vector<int>& nums, int ...
- springmvc 的@ResponseBody 如何使用JSONP?
JSONP解释 在解释JSONP之前,我们需要了解下”同源策略“这个概念,这对理解跨域有帮助.基于安全的原因,浏览器是存在同源策略机制的,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载额文 ...
- Flutter 裁剪类组件 最全总结
注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 ClipRect ClipRect组件使用矩形裁剪子组件, ...
- 第一篇:解析Linux是什么?能干什么?它的应用领域!
不得不说的前言(不看完睡觉会尿床):饿货们~!你说你们上学都学了点啥?这不懂那也不懂,快毕业了啥也不会.专业课程不学好毕业了也找不到好工作.爸妈给你养大,投资了多少钱.你毕业后随便找了个什么鸡毛工作开 ...