机器之心报道 机器之心编辑部 PyTorch官方:我们这次的新特性太好用了,所以就直接叫2。0了。 前段时间,PyTorch团队在官方博客宣布Pytorch1。13发布,包含BetterTransformer稳定版等多项更新。在体验新特性的同时,不少人也在期待下一个版本的推出。 出乎意料的是,这个新版本很快就来了,而且是跨越式的2。0版! 新版本的重要进步体现在速度和可用性,而且完全向后兼容。PyTorch团队表示,PyTorch2。0是他们向2。x系列迈出的第一步,其稳定版预计在2023年3月初发布。 首先,PyTorch2。0引入了torch。compile,这是一种编译模式,可以在不更改模型代码的情况下加速模型。在163个涵盖视觉、NLP和其他领域的开源模型中,该团队发现使用2。0可以将训练速度提高3876。 其次,PyTorch2。0是100向后兼容的:代码库一样,API一样,写模型的方式也一样。团队之所以称它为2。0,是因为它有一些标志性的新特性,包括: TorchDynamo可以从字节码分析生成FX图; AOTAutograd可以以aheadoftime的方式生成反向图; PrimTorch引入了一个小型算子集,使后端更容易; TorchInductor:一个由OpenAITriton支持的DL编译器。 PyTorch2。0将延续PyTorch一贯的优势,包括Python集成、命令式风格、API简单等等。此外,PyTorch2。0提供了相同的eagermode开发和用户体验,同时从根本上改变和增强了PyTorch在编译器级别的运行方式。该版本能够为DynamicShapes和分布式运行提供更快的性能和更好的支持。 在官方博客中,PyTorch团队还公布了他们对于整个2。0系列的展望: 以下是详细内容。 PyTorch2。X:速度更快、更加地Python化、一如既往地dynamic PyTorch2。0官宣了一个重要特性torch。compile,这一特性将PyTorch的性能推向了新的高度,并将PyTorch的部分内容从C移回Python。torch。compile是一个完全附加的(可选的)特性,因此PyTorch2。0是100向后兼容的。 支撑torch。compile的技术包括研发团队新推出的TorchDynamo、AOTAutograd、PrimTorch和TorchInductor。 TorchDynamo使用PythonFrameEvaluationHooks安全地捕获PyTorch程序,这是一项重大创新,是研究团队对快速可靠地获取图进行5年研发的结果; AOTAutograd重载PyTorch的autograd引擎作为一个跟踪autodiff,用于生成aheadoftime向后跟踪; PrimTorch将约2000多个PyTorch算子规范化为一组约250个原始算子的闭集,开发人员可以将其作为构建完整PyTorch后端的目标。这大大降低了编写PyTorch特性或后端的障碍; TorchInductor是一种深度学习编译器,可为多个加速器和后端生成快速代码。对于NVIDIAGPU,它使用OpenAITriton作为关键构建块。 TorchDynamo、AOTAutograd、PrimTorch和TorchInductor是用Python编写的,并支持dynamicshapes(即能够发送不同大小的张量而无需重新编译),这使得它们具备灵活、易于破解的特性,降低了开发人员和供应商的使用门槛。 为了验证这些技术,研发团队在各种机器学习领域测试了163个开源模型。实验精心构建了测试基准,包括各种CV任务(图像分类、目标检测、图像生成等)、NLP任务(语言建模、问答、序列分类、推荐系统等)和强化学习任务,测试模型主要有3个来源: 46个来自HuggingFaceTransformers的模型; 来自TIMM的61个模型:一系列SOTAPyTorch图像模型; 来自TorchBench的56个模型:包含来自github的精选流行代码库。 然后研究者测量加速性能并验证这些模型的准确性。加速可能取决于数据类型,研究团队选择测量float32和自动混合精度(AMP)的加速。 在163个开源模型中,torch。compile在93的情况下都有效,模型在NVIDIAA100GPU上的训练速度提高了43。在float32精度下,它的平均运行速度提高了21,而在AMP精度下,它的运行速度平均提高了51。 目前,torch。compile还处于早期开发阶段,预计2023年3月上旬将发布第一个稳定的2。0版本。 TorchDynamo:快速可靠地获取图 TorchDynamo是一种使用FrameEvaluationAPI(PEP0523中引入的一种CPython特性)的新方法。研发团队采用数据驱动的方法来验证其在GraphCapture上的有效性,并使用7000多个用PyTorch编写的Github项目作为验证集。TorchScript等方法大约在50的时间里都难以获取图,而且通常开销很大;而TorchDynamo在99的时间里都能获取图,方法正确、安全且开销可忽略不计(无需对原始代码进行任何更改)。这说明TorchDynamo突破了多年来模型权衡灵活性和速度的瓶颈。 TorchInductor:使用definebyrunIR快速生成代码 对于PyTorch2。0的新编译器后端,研发团队从用户编写高性能自定义内核的方式中汲取灵感:越来越多地使用Triton语言。此外,研究者还想要一个编译器后端使用与PyTorcheager类似的抽象,并且具有足够的通用性以支持PyTorch中广泛的功能。 TorchInductor使用pythonicdefinebyrunlooplevelIR自动将PyTorch模型映射到GPU上生成的Triton代码和CPU上的COpenMP。TorchInductor的corelooplevelIR仅包含约50个算子,并且是用Python实现的,易于破解和扩展。 AOTAutograd:将Autograd重用于aheadoftime图 PyTorch2。0的主要特性之一是加速训练,因此PyTorch2。0不仅要捕获用户级代码,还要捕获反向传播。此外,研发团队还想要复用现有的经过实践检验的PyTorchautograd系统。AOTAutograd利用PyTorch的torchdispatch可扩展机制来跟踪Autograd引擎,使其能够aheadoftime捕获反向传递(backwardspass)。这使TorchInductor能够加速前向和反向传递。 PrimTorch:稳定的原始算子 为PyTorch编写后端具有挑战性。PyTorch有1200多个算子,如果考虑每个算子的各种重载,则有2000多个。 在PrimTorch项目中,研发团队致力于定义更小且稳定的算子集,将PyTorch程序缩减到这样较小的算子集。目标是定义两个算子集: Primops:约有250个相当低级的算子。这些算子适用于编译器,需要将它们重新融合在一起以获得良好的性能; ATenops:约有750个规范算子。这些算子适用于已经在ATen级别集成的后端或没有编译功能的后端(无法从较低级别的算子集(如Primops)恢复性能)。 用户体验 PyTorch2。0引入了一个简单的函数torch。compile,它会返回一个编译后的模型。 compiledmodeltorch。compile(model) compiledmodel保存对模型的引用,并将forward函数编译为一个更优化的版本。在编译模型时,PyTorch2。0给了几项设置来调整它: deftorch。compile(model:Callable,,mode:Optional〔str〕default,dynamic:boolFalse,fullgraph:boolFalse,backend:Union〔str,Callable〕inductor,advancedbackendoptionsgohereaskwargskwargs)torch。dynamo。NNOptimizedModule mode指定编译器在编译时应该优化的内容。 default是一种预设模式,它试图在不花费太长时间或使用额外内存的情况下高效编译。 其他模式,如reduceoverhead,可以大大降低框架开销,但要消耗少量额外内存。maxautotune编译很长时间,试图为你提供它所能生成的最快的代码。 dynamic模式指定是否为DynamicShapes启用代码路径。某些编译器优化不能应用于动态形状的程序。明确你想要一个带有动态形状还是静态形状的编译程序,将有助于编译器提供更好的优化代码。 fullgraph类似于Numba的nopython。它将整个程序编译成一个图,或者给出一个错误提示,解释为什么它不能这样做。大多数用户不需要使用这种模式。如果你非常注重性能,那么你可以尝试使用它。 backend指定使用哪个编译器后端。默认情况下使用TorchInductor,但还有其他一些可用的工具。 编译体验想要在默认模式中提供最大的好处和最大的灵活性。 常见问答 1、什么是PT2。0? 2。0是最新的PyTorch版本。PyTorch2。0提供相同的eager模式开发体验,同时通过torch。compile添加编译模式。这种编译模式有可能在训练和推理期间加速模型。 2、为什么是2。0而不是1。14? PyTorch2。0就是计划中的1。14。我们发布了大量新特性,我们相信这些新特性会改变用户使用PyTorch的方式,因此称其为PyTorch2。0。 3、如何安装2。0?有什么额外要求吗? 安装最新的nightlies: CUDA11。7 pip3installnumpypretorch〔dynamo〕torchvisiontorchaudioforcereinstallextraindexurlhttps:download。pytorch。orgwhlnightlycu117 CUDA11。6 pip3installnumpypretorch〔dynamo〕torchvisiontorchaudioforcereinstallextraindexurlhttps:download。pytorch。orgwhlnightlycu116 CPU pip3installnumpypretorchtorchvisiontorchaudioforcereinstallextraindexurlhttps:download。pytorch。orgwhlnightlycpu 4、2。0代码是否向后兼容1。X? 是的,使用2。0不需要修改PyTorch工作流程。一行代码modeltorch。compile(model)就可以优化模型,以使用2。0堆栈,并与其余PyTorch代码一起顺利运行。这是一个可选择项,不需要使用新的编译器。 5、默认启用2。0吗? 不,必须通过使用单个函数调用优化模型从而在PyTorch代码中显式启用2。0。 6、如何将PT1。X代码迁移到PT2。0? 代码应该按原样工作,无需任何迁移。如果想使用2。0中引入的新编译模式特性,那么可以从优化模型开始: modeltorch。compile(model) 虽然加速主要是在训练期间观察到的,但如果你的模型运行速度比eager模式快,也可以将它用于推理。 importtorchdeftrain(model,dataloader):modeltorch。compile(model)forbatchindataloader:runepoch(model,batch)definfer(model,input):modeltorch。compile(model)returnmodel(input) 7、是否有任何不该使用PT2。0的应用程序? 当前版本的PT2。0仍处于实验阶段,并且处于nightlies版本。其中的动态形状支持还处于早期阶段,所以可以等到2023年3月稳定版发布后再使用该功能。 8、运行PyTorch2。0时,代码有何不同? 开箱即用,PyTorch2。0与PyTorch1。x相同,模型以eager模式运行,即Python的每一行都逐个执行。 在2。0中,如果用modeltorch。compile(model)将模型打包,则模型在执行之前会经过3个步骤: 1)图获取:首先将模型重写为子图块。可由TorchDynamo编译的子图被压平,其他子图(可能包含控制流代码或其他不受支持的Python结构)将回退到Eager模式。 2)Graphlowering:所有PyTorch操作都被分解为特定于所选后端的组成内核。 3)图编译,内核调用其相应的低级设备专用操作。 9、2。0目前支持哪些编译器后端? 默认和最完整的后端是TorchInductor,但是TorchDynamo有一个不断增长的后端列表,可以通过调用torchdynamo。listbackends()。找到 10、2。0版本的分布式训练能力如何? Compiled模式下的DDP和FSDP,比FP32中的Eager模式快15、AMP精度快80。PT2。0做了一些额外的优化,以确保DDP的通信计算overlap与Dynamo的部分图创建良好协作。想要确保使用staticgraphFalse运行DDP,更多细节参见:https:devdiscuss。pytorch。orgttorchdynamoupdate9makingddpworkwithtorchdynamo860 11、为什么我的代码用2。0的CompiledModel运行变慢? 性能下降最可能的原因是graphbreak太多。例如,类似模型前向trigger中的输出语句这样的东西会触发graphbreak。详见:https:pytorch。orgdocsmasterdynamofaq。htmlwhyaminotseeingspeedups 12、以前运行的代码在2。0中崩溃了,该如何调试? 参见:https:pytorch。orgdocsmasterdynamofaq。htmlwhyismycodecrashing 参考链接:https:pytorch。orggetstartedpytorch2。0 亚马逊云科技深度学习实战训练营 对于刚入行的开发者来说,上手深度学习并不总是一件容易的事。 想要短期提升上手能力?机器之心联合亚马逊云科技开设《深度学习实战训练营》线上实战营。实战营为期3周,共6次课程,还有6次课后作业,实战营期间讲师将在答疑群中随时解决同学的疑问,全程免费,欢迎希望上手实操深度学习的同学加入学习。 11月22日开营,请参与的同学务必扫码加入课后答疑群,亚马逊云科技账号注册、学习疑问、作业提交等详情均在答疑群中为大家说明。 最后附上实战营日程安排: THEEND 转载请联系本公众号获得授权 投稿或寻求报道:contentjiqizhixin。com