草庐IT

PyTorch 2.0正式版发布!一行代码提速2倍,100%向后兼容

新智元 2023-03-28 原文
PyTorch 2.0正式版终于来了!

去年12月,PyTorch基金会在PyTorch Conference 2022上发布了PyTorch 2.0的第一个预览版本。

跟先前1.0版本相比,2.0有了颠覆式的变化。在PyTorch 2.0中,最大的改进是torch.compile。

新的编译器比以前PyTorch 1.0中默认的「eager mode」所提供的即时生成代码的速度快得多,让PyTorch性能进一步提升。

除了2.0之外,还发布了一系列PyTorch域库的beta更新,包括那些在树中的库,以及包括 TorchAudio、TorchVision和TorchText在内的独立库。TorchX的更新也同时发布,可以提供社区支持模式。

亮点总结

-torch.compile是PyTorch 2.0的主要API,它包装并返回编译后的模型,torch.compile是一个完全附加(和可选)的特性,因此2.0版本是100%向后兼容的。

-作为torch.compile的基础技术,带有Nvidia和AMD GPU的TorchInductor将依赖OpenAI Triton深度学习编译器来生成高性能代码,并隐藏低级硬件细节。OpenAI Triton生成的内核实现的性能,与手写内核和cublas等专门的cuda库相当。

-Accelerated Transformers引入了对训练和推理的高性能支持,使用自定义内核架构实现缩放点积注意力 (SPDA)。API与torch.compile () 集成,模型开发人员也可以通过调用新的scaled_dot_product_attention () 运算符,直接使用缩放的点积注意力内核。

-Metal Performance Shaders (MPS) 后端在Mac平台上提供GPU加速的PyTorch训练,并增加了对前60个最常用操作的支持,覆盖了300多个操作符。

-Amazon AWS优化了基于AWS Graviton3的C7g实例上的PyTorch CPU推理。与之前的版本相比,PyTorch 2.0提高了Graviton的推理性能,包括对Resnet50和Bert的改进。

-跨TensorParallel、DTensor、2D parallel、TorchDynamo、AOTAutograd、PrimTorch和TorchInductor的新原型功能和技术。

编译,还是编译!

​PyTorch 2.0的最新编译器技术包括:TorchDynamo、AOTAutograd、PrimTorch和TorchInductor。所有这些都是用Python开发的,而不是C++(Python与之兼容)。

并且还支持dynamic shape,无需重新编译就能发送不同大小的向量,灵活且易学。

  • TorchDynamo​
它可以借助Python Frame Evaluation Hooks,安全地获取PyTorch程序,这项重大创新是PyTorch过去 5 年来在安全图结构捕获 (safe graph capture) 方面的研发成果汇总。

  • AOTAutograd​
重载PyTorch autograd engine,作为一个 tracing autodiff,用于生成超前的backward trace。

  • PrimTorch​
将 2000+ PyTorch 算子归纳为约 250 个 primitive operator 闭集 (closed set),开发者可以针对这些算子构建一个完整的 PyTorch 后端。PrimTorch 大大简化了编写 PyTorch 功能或后端的流程。

  • TorchInductor​
TorchInductor一个深度学习编译器,可以为多个加速器和后端生成 fast code。对于 NVIDIA GPU,它使用 OpenAI Triton 作为关键构建模块。

PyTorch基金会称,2.0的推出会推动「从C++回到Python」,并补充说这是PyTorch的一个实质性的新方向。

「从第一天起,我们就知道「eager execution」的性能限制。2017年7月,我们开始了第一个研究项目,为PyTorch开发一个编译器。编译器需要使PyTorch程序快速运行,但不能以PyTorch的体验为代价,还要保留灵活易用性,这样的话可以支持研究人员在不同探索阶段使用动态的模型和程序。」

当然了,非编译的「eager mode」使用动态即时代码生成器,在2.0中仍然可用。开发者可以使用porch.compile命令迅速升级到编译模式,只需要增加一行代码。

用户可以看到2.0的编译时间比1.0提高43%。

这个数据来自PyTorch基金会在Nvidia A100 GPU上使用PyTorch 2.0对163个开源模型进行的基准测试,其中包括包括图像分类、目标检测、图像生成等任务,以及各种 NLP 任务。

这些Benchmark分为三类:HuggingFace Tranformers、TIMM和TorchBench。

NVIDIA A100 GPU eager mode torch.compile 针对不同模型的提速表现

据PyTorch基金会称,新编译器在使用Float32精度模式时运行速度提高了21%,在使用自动混合精度(AMP)模式时运行速度提高了51%。

在这163个模型中,torch.compile可以在93%模型上正常运行。

「在PyTorch 2.x的路线图中,我们希望在性能和可扩展性方面让编译模式越走越远。有一些工作还没有开始。有些工作因为带宽不够而办法落地。」

训练LLM提速2倍

此外,性能是PyTorch 2.0的另一个主要重点,也是开发人员一直不吝于宣传的一个重点。

事实上,新功能的亮点之一是Accelerated Transformers,之前被称为Better Transformers。

另外,PyTorch 2.0正式版包含了一个新的高性能PyTorch TransformAPI实现。

PyTorch项目的一个目标,是让最先进的transformer模型的训练和部署更加容易、快速。

Transformers是帮助实现现代生成式人工智能时代的基础技术,包括GPT-3以及GPT-4这样的OpenAI模型。

在PyTorch 2.0 Accelerated Transformers中,使用了自定义内核架构的方法(也被称为缩放点积注意力SDPA),为训练和推理提供高性能的支持。

由于有多种类型的硬件可以支持Transformers,PyTorch 2.0可以支持多个SDPA定制内核。更进一步,PyTorch集成了自定义内核选择逻辑,将为给定的模型和硬件类型挑选最高性能的内核。

加速的影响非同小可,因为它有助于使开发人员比以前的PyTorch迭代更快地训练模型。

新版本能够实现对训练和推理的高性能支持,使用定制的内核架构来处理缩放点积注意力(SPDA) ,扩展了推理的快速路径架构。

与fastpath架构类似,定制内核完全集成到PyTorch TransformerAPI中--因此,使用本地Transformer和MultiHeadAttention API将使用户能够:

-看到速度明显提升;

-支持更多的用例,包括使用交叉注意的模型、Transformer解码器和训练模型;

-继续将快速路径推理用于固定和可变序列长度的变形器编码器和自注意力机制的用例。

为了充分利用不同的硬件模型和Transformer用例,支持多个SDPA自定义内核,自定义内核选择逻辑将为特定模型和硬件类型挑选最高性能的内核。

除了现有的Transformer API,开发者还可以通过调用新的scaled_dot_product_attention()操作符直接使用缩放点积注意力关注内核,加速PyTorch 2 Transformers与torch.compile()集成。

为了在使用模型的同时,还能获得PT2编译的额外加速(用于推理或训练),可以使用model = torch.compile(model)对模型进行预处理。

目前,已经使用自定义内核和torch.compile()的组合,在训练Transformer模型,特别是使用加速的PyTorch 2 Transformer的大型语言模型方面取得实质性加速提升。

使用自定义内核和 torch.compile来提供对大型语言模型训练显著加速

HuggingFace Transformers的主要维护者Sylvain Gugger在PyTorch项目发表的一份声明中写道「只需添加一行代码,PyTorch 2.0就能在训练Transformers模型时提供1.5倍至2.0倍的速度。这是自混合精度训练推出以来最令人兴奋的事情!」

PyTorch和谷歌的TensorFlow是两个最流行的深度学习框架。世界上有数千家机构正在使用PyTorch开发深度学习应用程序,而且它的使用量正在不断增加。

PyTorch 2.0的推出将有助于加速深度学习和人工智能应用的发展,Lightning AI的首席技术官和PyTorch Lightning的主要维护者之一Luca Antiga表示:

「PyTorch 2.0 体现了深度学习框架的未来。不需要用户干预即可捕获PyTorch 程序,开箱即用的程序生成,以及巨大的设备加速,这种可能性为人工智能开发人员打开了一个全新的维度。」

参考资料:

https://pytorch.org/blog/pytorch-2.0-release/

https://venturebeat.com/ai/pytorch-2-0-brings-new-fire-to-open-source-machine-learning/

https://www.datanami.com/2023/03/15/new-pytorch-2-0-compiler-promises-big-speedup-for-ai-developers/


有关PyTorch 2.0正式版发布!一行代码提速2倍,100%向后兼容的更多相关文章

  1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  2. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  3. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  4. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  5. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  6. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  7. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  8. 程序员如何提高代码能力? - 2

    前言作为一名程序员,自己的本质工作就是做程序开发,那么程序开发的时候最直接的体现就是代码,检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知,程序开发的水平提升是一个循序渐进的过程,每一位程序员都是从“菜鸟”变成“大神”的,所以程序员在程序开发过程中的代码能力也是根据平时开发中的业务实践来积累和提升的。提高代码能力核心要素程序员要想提高自身代码能力,尤其是新晋程序员的代码能力有很大的提升空间的时候,需要针对性的去提高自己的代码能力。提高代码能力其实有几个比较关键的点,只要把握住这些方面,就能很好的、快速的提高自己的一部分代码能力。1、多去阅读开源项目,如有机会可以亲自参与开源

  9. ruby-on-rails - 如何在发布新的 Ruby 或 Rails 版本时收到通知? - 2

    有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:

  10. 7个大一C语言必学的程序 / C语言经典代码大全 - 2

    嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来

随机推荐