tensorflow 指定cpu 但是还会运行 gpu_PyTorch VS TensorFlow 谁最强?这是标星 15000+ Transformers 库的运行结果...

点击上方“AI有道”,选择“星标”公众号

重磅干货,第一时间送达7b812401b0bbd4e60aef9c9a4044c14a.png

作者 | Lysandre Debut译者 | 陆离出品 | AI科技大本营(ID: rgznai100)【导语】自然语言处理预训练模型库 Transformers 实现了几种用于 NLP 任务的最先进的 Transformer 架构,如文本分类、信息提取、问题解答和文本生成等,它经常被研究人员和公司所使用,提供 PyTorch 和 TensorFlow 的前端实现。究竟是 PyTorch 还是 TensorFlow 更有效率地训练和运行 Transformers 模型?作者对不同环境下所展现的性能进行了对比,最终的结果是,无论在 CPU 还是 GPU 上,最终两大框架的表现都差不多。Transformers库:https://github.com/huggingface/transformers自 TensorFlow 发布以来,我们一直在致力于模型产品化的工作,并使其可以用在 TPU 上,逐步适应它的性能。本文对比了我们的模型在几种环境中所展现出来的性能。在 CPU 和 GPU 上比较了 PyTorch(1.3.0)和 TensorFlow(2.0)的推断结果。出于对一些原因的考虑,本文只是关于基准测试和后续性能优化系列文章中的第一篇。此外,我们还在文档中创建了基准测试部分,随着进一步的模型研究,并在不同环境中对它们进行基准测试,该部分还将不断完善。

结果

测试的平均结果显示在下表中,在接下来的讨论部分里将对这些结果进行详细介绍。1eaca4859c96ff9469cbbdc750a3ad06.png     平均推断时间Benchmarking Transformers测试结果:https://url.cn/5hZHCll电子表格中的 N/A 记录表示内存不足或是数列长度不合适。Transformer-XL(Transformer extra-long,Transformer 在模型设计上做了长度方面的延申)没有 TorchScript 结果,因为它当前不能由 TorchScript(TorchScript 是一种从 PyTorch 代码创建可序列化和可优化模型的方法)进行序列化。大多数情况下,TensorFlow 和 PyTorch 的模型在 GPU 和 CPU 上都得到了非常相似的结果。下面是对结果相关的阐述,不仅是 PyTorch 和 TensorFlow 之间的比较,也是模型之间的比较。

测量推理

推理时间是模型投入生产时的一个重要指标。为了评估模型的推理时间,我们对不同批量和不同序列长度的模型进行了对比。我们比较了适当的批量大小[1,2,4,8]和序列长度[8,64,128,256,512,1024]。批量大小仍然很小,因为我们仅仅关注推断设置。BERT和其它类似模型的最大序列长度为 512 或 256(用于 CTRL),因此不能在最后一个序列长度上进行测量。以下是我们在两种不同环境中的测试结果:
  • 在 CPU 上,使用 GCP n1-standard-32,它有 32 个 vCPU 和 120GB 的内存。CPU 的型号是 Intel Xeon@2.3GHz:
  • 在 GPU 上,使用了带有 12 个 vCPU、40GB 内存和一个 V100 的 GPU(16GB 的    VRAM)的定制 GCP 机器;

实验细节和最佳实践

为了最大化性能,我们进行了更进一步的优化:
  • 上述测量使用的 Intel Xeon CPU 带有 AVX 和 AVX2 的扩展,而 TensorFlow 需要从源代码编译之后才能够利用这些扩展,所以只能这么做;
  • 我们通过使用 tf.function 和预先跟踪模型来确保我们没有使用 TensorFlow 的 eager 模式;
  • 我们比较了依赖于库和不依赖于库的工具:PyTorch的 TorchScript 和带有 GPU 的TensorFlow 的 XLA(自动聚类),后面会详细介绍这两个工具;
  • 我们使用了原生的 Python 模块 timeit 来测量推断时间。另外,用repeat=30 和 number=3 来进行每个实验。然后求出30 个值的平均数,就会得到所期望的平均推理时间。通常超过30 个值就会获得非常稳定的结果了;
  • 我们不会使用如 TFX 这样的生产环境,并且我们使用的测量模型的可调用方法是:PyTorch 的nn.module.forward 和 TensorFlow 的 tf.keras.layers.layer.call;
  • 对于 TensorFlow 和 PyTorch,我们会很谨慎地使用适当的 CUDA 版本;

讨论

PyTorch TensorFlow

在大多数情况下,这两个框架都会得到类似的结果,与 PyTorch 相比,TensorFlow 在CPU 上的速度通常会稍慢一些,而在 GPU 上的速度则稍快一点:
  • 所有的模型中,在 CPU 上,PyTorch 的平均推断时间为 0.748s,而 TensorFlow 的平均推断时间为 0.823s;
  • 所有模型中,在 GPU 上,PyTorch 的平均推断时间为 0.046s,而 TensorFlow 的平均推断时间为 0.043s;
这些结果通过计算平均值来比较所有模型的推断时间。因此,输入值越大,对最终结果的影响就越大。当输入值过大时,PyTorch 就会耗尽内存;当计算平均值时,这些结果会从所有度量中删除,因为这样会使结果向 PyTorch 倾斜。运行过程中,PyTorch 模型往往比 TensorFlow 模型更早地耗尽内存:除了Distilled 模型之外,PyTorch 在输入批量大小达到 8 以及序列长度达到 1024 时会耗尽内存。

TorchScript

TorchScript 是PyTorch 用来创建可序列化模型的一种方法,可以在不同的运行时间上运行,而不需要 Python 的依赖包,如 C++ 环境。我们的测试是通过在 Python 中跟踪模型并在相同的环境中重用这个跟踪模型来完成的。我们通过预先执行前向传递以确保在测量其推断之前来跟踪模型。免责声明:虽然 TorchScript 并不是为了在 Python 环境中提高运行速度而创建的,但是我们的结果表明,使用 TorchScript 的跟踪模型可以提高性能。TorchScript 似乎非常依赖于模型以及输入的大小(批量大小*序列长度)。例如,在XLNet 上使用 TorchScript 可以获得永久性的性能提升,而在 XLM 上使用 TorchScript 则可能会出现问题,因为它在较小输入下才会提高性能,但在较大输入下反而会降低性能。平均来说,使用 TorchScript 跟踪模型的推断速度比使用相同 PyTorch 非跟踪模型的推断速度快 20%。

XLA

XLA 是一个线性代数编译器,它可以提高 TensorFlow 模型的速度,但我们只能在 GPU上使用。它基于TensorFlow 的自动聚类,编译了模型的一些子图。这些结果在速度和内存的使用效率方面得到了提高:大多数内部基准在启用了XLA 后运行速度提高了 1.15 倍。在启用 XLA 后,我们所有模型性能都得到了提高。在某些极端情况下,特别是在较小输入的情况下,推断时间可以减少 70%。

模型及其精炼版本

精炼模型版本在这个测试中表现出色,因为它可以很快就进行基准测试。这两个 Hugging Face-engineered 模型——DistilBERT 和 DistilGPT-2 的推断时间比它们的老师模型减少了一半。

贡献

由于不同的基准测试有不同的设置和相应的工具,这些都不是靠一个组织所能实现的,因此我们也欢迎来自广大社区的基准。Github用户 @tlkh 已经通过在 TensorFlow 的模型上使用 AMP、XLA 和分布式策略实现的基准测试性能做出了重大的贡献,目前也被添加到文档的基准测试部分。

如何做贡献

如果你愿意参与,我们已经在 Github 上设置了主题模板,这样操作起来就会更简单一些。你可以随意打开已有结果的主题,或者打开一个请求并到文档的基准测试部分进行添加。

基准测试脚本

和本文的发布和文档中的基准测试页一起,我们在示例部分添加了一个新脚本:benchmarks.py,它是用于获取下面详细结果的脚本。它可以使用XLA 或 TorchScript 在 TensorFlow 或 PyTorch 上运行基准测试,并将结果保存到 CSV 文件当中。

接下来的计划对模型进行基准测试只是提高性能的第一步。我们相信这篇介绍性的文章可能有助于比较模型的当前状态,特别是在研究 PyTorch 和 TensorFlow 之间的差异时。当我们深入研究 Transformers 生产方面时,一定会致力于性能改进。对于 Pythorch 和 TensorFlow 的自动化脚本、新架构和定制 TPU 培训,请密切关注后续文章。原文链接:https://medium.com/huggingface/benchmarking-transformers-pytorch-and-tensorflow-e2917fb891c2

推荐阅读

(点击标题可跳转阅读)

完备的 AI 学习路线,最详细的资源整理!

干货 | 公众号历史文章精选

我的深度学习入门路线

我的机器学习入门路线图

6fa043b9b66f80b6ead3fad2e93a4327.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

after不显示_web前端入门到实战:css实现单行、多行文本超出显示省略号

前言:项目中我们经常遇到这种需求,需要对单行、多行文本超出显示为省略号。这篇文章主要总结了小编解决此问题的方法,有不足之处欢迎大家指正。单行文本省略.ellipsis-line {border: 1px solid #f70505;padding: 8px;width: 400px;overflow: …

linux下查看内存使用情况

基本内存术语解读 1> free -m 同样是做为缓存,buffers和cache又有啥区别呢? 于是又查了些资料,发现buffers实际应该是叫“缓冲”,其英文解释是:A buffer is something that has yet to be "written" to d…

redistemplate使用_如何使用 SpringBoot + Redis 优雅的解决接口幂等性问题

# 前言在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求,我们来解释一下幂等的概念:任意多次执行所产生的影响均与一次执行的影响相同。按照这个含义,最终的含义就是 对数据库的影响只能是一次性的,不能重复处理。如何…

jdbctemplate 开启事务_SpringBoot 系列教程之事务隔离级别知识点小结

上一篇博文介绍了声明式事务Transactional的简单使用姿势,最文章的最后给出了这个注解的多个属性,本文将着重放在事务隔离级别的知识点上,并通过实例演示不同的事务隔离级别下,脏读、不可重复读、幻读的具体场景I. 基础知识在进入…

东风小康为什么是dfsk_助力地摊经济瑞驰纯电动物流车和东风小康微型货车厚积薄发...

核心提示:小康集团旗下瑞驰纯电动物流车及东风小康微型货车深耕多年,其中瑞驰纯电动物流车2015年上市,连续多年销量位列中国行业第一。近日,地摊经济成为热门,疫情常态化下,地摊经济、小店经济对于快速恢复…

链表中删除选定结点的优雅操作!

一般我们在进行单向链表链表的结点删除操作时,都是通过相应的结构体指针进行链表的遍历,然后找 到需要删除的节点,为了完成删除操作,我们需要在寻找该节点时,不断地记录下这个节点前面的节点 (prev),来保证当特定结点被删除后,我们还可以将断开的链表重新连起来,下面给出一段…

python抢货程序_Python自动化xpath实现自动抢票抢货代码示例

本篇文章小编给大家分享一下Python自动化xpath实现自动抢票抢货代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。 总代码: for i in range(51,56): driver.imp…

Ubuntu安装pycharm并且激活

下载pycharm: https://www.jetbrains.com/pycharm/download/#sectionlinux 选择专业版下载,然后提取,也就是解压 进入解压后目录,再进入bin目录,打开终端执行命令 ./pycharm.sh pycharm就启动了 激活Pycharm: 编辑hosts文件&am…

二阶矩阵转置怎么求_矩阵求导术(下)

点击上方“Datawhale”,选择“星标”公众号第一时间获取价值内容本文承接上篇 https://zhuanlan.zhihu.com/p/24709748,来讲矩阵对矩阵的求导术。使用小写字母x表示标量,粗体小写字母表示列向量,大写字母X表示矩阵。矩阵对矩阵的求…

c语言中x的n次方怎么表示_线性代数的本质及其在人工智能中的应用

线性代数是 AI 专家必须掌握的知识,这已不再是个秘密。如果不掌握应用数学这个领域,你永远就只能是「门外汉」。当然,学习线性代数道阻且长。数学,尤其是线性代数常与枯燥、复杂和毫无意义的事物联系起来。不过你还可以另辟蹊径。…

django 实现电子支付功能

思路:调用第三方支付 API 接口实现支付功能。本来想用支付宝来实现第三方网站的支付功能的,但是在实际操作中发现支付宝没有 Python 接口,网上虽然有他人二次封装的的 Python 接口,但是对我这个小白白来说上手还是有点难度&#x…

android中怎么保存checkbox中的checked属性_第二十四天HTML中的form表单

form表单用于收集用户信息,如:登录、注册等场景;所有要提交的数据都必须放在form标签中action:提交地址、动作,与input标签中typy标签的submit属性相关联。 ,提交地址是action的地址method:提交方法&#x…

Python中曲率与弯曲的转换_1000R曲率更具沉浸感!三星T55曲面显示器评测

在曲面屏的设计上,三星一直在突破极限,比如在2017年推出的49英寸超宽带鱼屏C49HG90,引来众人围观,非常震撼。而在曲率方面,我们常见的有1800R和1500R,但是三星并不满足,于日前推出了一款曲率达到…

opencv resize_opencv-python库基础操作(一)

点赞再看,养成习惯!点赞再看,养成习惯!点赞再看,养成习惯!opencv-python库基础操作0.安装opencv-pythonpip install opencv-python进行下载并安装不过在python中导入opencv库的时候需要"import cv2&qu…

百旺智能编码_【百旺】票字版开票软件操作指南已为您备好,请查阅!

为确保小规模纳税人继续享受税收优惠政策,请广大用户及时对开票软件进行升级~按照国家税务总局要求,从增值税发票税控开票软件五月补丁开始,将停止对增值税发票税控开票软件(税控盘版)“税”字版(以下简称“税”字版)的软件升级更新服务&…

mysql binlog 备份_做好mysql运维,必须熟练掌握备份和恢复,实战一次不行多来几次...

原文:https://www.toutiao.com/i6855460778359816715/平台:头条作者:程序员不就是0和1一、 备份恢复策略进行备份或恢复操作时需要考虑一些因素:1、确定要备份的表的存储引擎是事务型还是非事务型,两种不同的存储引擎备…

在过程中要正式批准可交付成果_干货!软考高项项目管理知识体系5大过程组47个过程...

现在应该很多小伙伴都在紧张的复习软考中,为了让大家更加高效的复习,今天给大家分享软考高级信息系统项目管理师的考试重点,项目管理知识体系的5大过程组47个过程。考高项的朋友都知道,47个过程是非常重要的,必须要理解…

android 组件化_Android 组件化路由框架设计(仿Arouter)

前言在组件化开发中一个必须要面对的问题就是组件间页面跳转,实现的方法有很多,简单的可以通过反射获取,但是比较耗费性能,也可以通过隐式跳转,但是随着页面的增多,过滤条件会随之增多,后期维护…

1668智能下数教程视频_你需要的教程合集更新

最近又收集了一波网络安全资源,在文章最底部。花了将近一天时间整理,只求各位小哥哥能点个在看,分享给身边的朋友。网络安全 --职业发展(渗透的最底部)2019网络安全初识与职业发展https://pan.baidu.com/s/1CAzO8IWxzBj-bOZlJ2eFVg 提取码&am…

关于java中nextline读取空白行的问题

最近在做java作业, 发现了一个问题, 就是nextline其实会接收缓冲区的\r, 使得在程序运行时nextline像是跳过了一样, 其实不然, 它只是读取了上一个enter时的\r, 如我的如下功能代码 public void run() {Scanner scan new Scanner(System.in);int ord, book_order;int flag 0;…