当前位置: 首页 > 科技观察

2019深度学习框架决战:PyTorch横扫AI峰会,再夺NeurIPS2019!

时间:2023-03-12 00:16:38 科技观察

最近Reddit上的一篇热帖引发了机器学习社区的热烈讨论:NeurIPS2019使用的机器学习框架:PyTorch68->166,TensorFlow91->74主帖HoraceHe是康奈尔大学的学生大学。我的研究兴趣是编译器和机器学习的交叉领域。他分析了NeurIPS2019论文中使用的机器学习框架,发现与2018年相比,今年使用PyTorch的论文从68篇增加到166篇,使用TensorFlow的论文从91篇减少到74篇。论文方面,与2018年相比,使用PyTorch的论文数量明显增加,而TensorFlow则略有下降。在所有提到TensorFlow/PyTorch的论文中,PyTorch占了69%,这印证了他上个月写的一篇名为《2019年机器学习框架的状态》的文章指出,PyTorch的增长在研究领域已经大大超过了TensorFlow,研究人员正在放弃TensorFlow和大量涌向PyTorch。同时,在业界,目前Tensorflow仍然是首选的框架,但从长远来看可能就不是这样了。这份对比PyTorch和Tensorflow成长的综合分析在当时引起了热议,但也有人质疑:这些结果是否只适用于NLP会议?现在,从NeurIPS大会的分析结果来看,答案是否定的。也有人仍然认为动态图/PyTorch只在NLP社区流行。显然,事实并非如此。从这些分析结果来看,PyTorch在深度学习研究中占据主导地位,包括机器学习、计算机视觉和自然语言处理,YannLeCun对此表示认同。YannLeCun:超过69%的NeurIPS19论文使用了提到PyTorch的深度学习框架。PyTorch主导了深度学习研究(ML/CV/NLP会议)。从上图可以看出,在各大ML/CV/NLP的顶级会议上,使用PyTorch的论文持续大幅增加,而TensorFlow的增速放缓甚至略有下降。考虑到各大顶级会议接收的论文数量逐年增加,仅看绝对数量并不能完全反映实际情况。上图显示了使用PyTorch/TensorFlow的论文占论文总数的百分比,可以更清楚地看出这一趋势。Reddit网友:从TensorFlow到PyTorch,出现这种趋势的原因是什么?PyTorch真的那么好用,足以让大量研究人员放弃TensorFlow涌向PyTorch吗?从Reddit网友的评论来看,转用PyTorch的一致表达是“真香”:这两年一直在用Keras/TF,最近才转用PyTorch。现在我非常喜欢PyTorch,我觉得它更简洁明了。只是我个人的意见。我喜欢使用PyTorch来设计具有怪异训练、反向传播图等的新模型。我觉得使用PyTorch,即使您不能快速部署标准模型,您也可以更自由地设计自己的自定义算法。也许这就是为什么它主要用于研究。我使用Tensorflow/Keras有一段时间了。我记得的结论是Tensorflow更适合生产部署,而PyTorch更适合研究。我最近开始使用PyTorch,不得不说我真的很喜欢它,感觉更“pythonic”。此外,借助ONNX等框架,部署(众所周知的模型)也开始变得不成问题。我将继续使用两者。Tensorflow2.0vsPyTorch是一个艰难的选择。我喜欢Tensorflow,我也喜欢PyTorch。TF是基于开发的,PyTorch是基于研究的。两者都需要。在我看来,两者是平等的。50-50长期以来,TensorFlow具有许多PyTorch所没有的“生产就绪”功能。比如部署到mobile,能够在没有python环境的情况下运行,有很多方法可以最大化模型的性能(量化等)。如果您要将模型部署到生产环境中,TF仍然是业界的首选。除非他们能让PyTorch的生产管道不那么糟糕,否则这种情况将继续下去。总体而言,网友们的感受与HoraceHe的分析基本一致。但是PyTorch到底好在哪里呢?HoraceHe的文章也仔细分析了两者各自的特点、优缺点,并探讨了机器学习框架的未来。2019年机器学习框架之争,PyTorch还是TensorFlow?自2012年深度学习重拾风头以来,众多机器学习框架竞相成为研究者和行业从业者的新宠。从早期的学术成果Caffe和Theano,到巨大的产业支持PyTorch和TensorFlow,那么多选择中,哪一个最受欢迎?如果你只浏览Reddit,你可能会认为每个人都使用PyTorch。从FrancoisChollet的Twitter来看,TensorFlow或Keras可能是主流,而PyTorch则停滞不前。2019年,机器学习框架大战又多了两个主要竞争者:PyTorch和TensorFlow。分析表明,研究人员正在放弃TensorFlow,大量涌向PyTorch。同时,在业界,Tensorflow目前是首选平台,但从长远来看可能并非如此。PyTorch在研究领域日益占据主导地位让我们从数据开始。下图是2017年到2019年主要机器学习会议上只提到PyTorch的论文和使用TensorFlow或PyTorch的论文的比例。可以看出,所有的线都是向上倾斜的,在2019年的每个主要会议上,大多数论文是在PyTorch中实现的。详情参见:https://chillee.github.io/pytorch-vs-tensorflow/如果你需要更多的证据来证明PyTorch在学术界的发展有多快,这里有一张PyTorch和TensorFlow的提及次数对比图.PyTorch和TensorFlow分别被提及的数量是在2018年,PyTorch仍然是少数。现在,PyTorch是主流,69%的CVPR使用PyTorch,75%以上的NAACL和ACL,50%以上的ICLR和ICML。虽然PyTorch在视觉和语言会议上拥有最强的统治力(PyTorchvs.TensorFlow2:1和3:1),但在ICLR和ICML等常规机器学习会议上,PyTorch也比TensorFlow更受欢迎。虽然有人认为PyTorch仍然是一个新兴框架,试图在TensorFlow主导的世界中开辟出一席之地,但数据表明并非如此。TensorFlow在除ICML以外的任何会议上的增长都与论文的整体增长相匹配。在NAACL、ICLR和ACL上,Tensorflow今年的论文实际上比去年少了。PyTorch不用担心它的未来,需要担心的是TensorFlow。为什么研究人员喜欢PyTorch?简单的。它类似于numpy,非常pythonic,并且很容易与Python生态系统的其余部分集成。例如,只需在PyTorch模型的任意位置插入一个pdb断点,它就会起作用。在TensorFlow中,调试模型需要一个活跃的会话,而且最终会变得更加棘手。很棒的AP??I。大多数研究人员更喜欢PyTorch的API而不是TensorFlow的API。一个原因是PyTorch设计得更好,另一个原因是TensorFlow通过多次切换API(例如'layers'->'slim'->'estimators'->'tf.keras')削弱了自己。表现。尽管PyTorch的动态图提供的优化机会很少,但有很多传言称PyTorch与TensorFlow一样快,甚至比TensorFlow更快。目前尚不清楚这是否属实,但至少TensorFlow在这方面并未取得决定性优势。TensorFlow研究的未来是什么?尽管TensorFlow在功能上与PyTorch不相上下,但PyTorch已经覆盖了很大一部分社区。这意味着PyTorch将更容易找到,作者将更有动力在PyTorch中发布代码(以便人们使用它),并且您的合作者可能更喜欢PyTorch。因此,任何迁移回Tensorflow2.0的过程都可能很慢,如果真的发生的话。TensorFlow在谷歌/DeepMind永远会有观众,但不知道谷歌最终会不会放弃。即使是现在,许多谷歌想要招募的研究人员已经在不同层面上更喜欢PyTorch,而且你已经听到抱怨说谷歌内部的许多研究人员想要使用TensorFlow以外的框架。此外,PyTorch的主导地位可能会开始将谷歌研究人员与其他研究社区隔离开来。它们不仅难以建立在外部研究的基础上,而且外部研究人员也不太可能建立在谷歌发布的代码之上。用于生产的PyTorch和TensorFlow尽管PyTorch现在在研究领域占据主导地位,但从行业角度来看,TensorFlow仍然是主导框架。例如,根据2018年至2019年的招聘网站数据,TensorFlow新增职位1541个,PyTorch新增职位1437个。TensorFlow有3,230篇Medium文章,PyTorch有1,200篇;TensorFlow有13,700个GitHub新星,PyTorch有7,200个,依此类推。那么,如果PyTorch在学术界如此受欢迎,为什么它在工业界没有取得同样的成功呢?一个显而易见的第一个答案是惯性(inertia)。Tensorflow比PyTorch早几年问世,业界采用新技术的速度比研究人员慢。另一个原因是TensorFlow在生产中优于PyTorch。但是,这是什么意思?要回答这个问题,我们需要了解研究人员和行业的需求有何不同。研究人员关心的是他们进行研究的速度有多快,通常是在相对较小的数据集(可以放在一台机器上的数据集)上,并在<8个GPU上运行。通常,研究人员考虑的是速度而不是性能,这使他们能够快速实施新想法。相反,业界将性能视为重中之重。虽然10%的加速对于研究人员来说可能毫无意义,但它可以直接为公司节省数百万美元。另一个区别是部署。研究人员将在他们自己的计算机或专用于运行研究工作的服务器集群上进行实验。相反,这个行业有很多限制/要求:没有Python。有的公司是跑服务器的,跑Python的高开销是承受不起的。移动。无法在移动二进制文件中嵌入Python解释器。服务。一组全面的功能,例如无需停机即可更新模型、无缝切换模型、在预测时进行批处理等。TensorFlow专为这些需求而构建,并为所有这些需求提供解决方案:图形格式和执行引擎本身不需要Python,TensorFlowLite和TensorFlowServing分别考虑移动和服务。从历史上看,PyTorch未能满足这些考虑,因此大多数公司目前在生产中使用TensorFlow。TensorflowEager在API级别,TensorFloweager模式与PyTorch的eager模式本质上是相同的。Eager模式为TensorFlow提供了PyTorch的大部分优势(易用性、可调试性等)。然而,这给TensorFlow带来了同样的缺点。TensorFloweager模型无法导出到非python环境、优化、在移动设备上运行等。这将TensorFlow置于与PyTorch相同的位置,它们以基本相同的方式解析-您可以跟踪代码(tf.function)或重新解释Python代码(亲笔签名)。因此,TensorFlow的eager模式并不能真正做到“两全其美”。虽然可以使用tf将代码转换为静态图,但这并不是一个无缝的过程。跟踪代码是有限的,重新解释Python代码本质上需要重写大部分Python编译器。当然,通过将其限制为用于深度学习的Python子集,可以大大简化范围。PyTorch称霸研究界,TensorFlow称霸行业至此,我们得出了机器学习框架的现状:PyTorch占领了研究界,并试图将其在研究领域的成功推广到行业。TensorFlow正试图在不牺牲太多生产能力的情况下阻止其在研究领域的损失。当然,PyTorch还需要很长时间才能在行业中产生有意义的影响——TensorFlow过于根深蒂固,行业变化缓慢。然而,从TensorFlow1.0到2.0的过渡将是困难的,这为公司提供了一个考虑采用PyTorch的机会。未来将取决于谁能更好地回答以下问题。研究人员的偏好对行业有多大影响?现在这批博士生即将毕业,他们将把PyTorch带入行业。这种偏好是否足以让公司选择PyTorch来进行招聘?创业的毕业生会为他们的公司选择PyTorch吗?TensorFlow的eager模式能否在可用性方面赶上PyTorch?我对在线社区的印象是TensorFlowEager存在性能/内存问题,而Autograph系列也有其自身的问题。谷歌将花费大量的工程精力,但TensorFlow却被历史包袱压得喘不过气来。PyTorch将多快达到生产状态?PyTorch还有很多根本性的问题没有解决——没有很好的量化指标,没有对移动设备的支持,可服务性等等。在这些问题解决之前,PyTorch不会是很多公司的选择。注:本文发表当天,PyTorch宣布支持量化和移动。这两种方法仍处于实验阶段,但PyTorch已经取得了重大进展。谷歌在行业中的孤立会伤害到它吗?谷歌推动TensorFlow的主要原因之一是帮助其蓬勃发展的云服务。由于谷歌试图拥有整个ML垂直领域,这可能会激励竞争公司(微软、亚马逊、Nvidia等)支持唯一的替代机器学习框架,即PyTorch。机器学习框架的下一步:高阶微分和代码生成机器学习框架的下一步机器学习框架对ML研究的影响程度可能未被充分认识。它们不仅支持机器学习研究,还支持研究人员可以轻松探索或限制的想法。有多少新生的想法仅仅因为无法在框架中轻松表达而被粉碎?PyTorch可能已经满足本地研究的最低要求,但值得探索其他框架提供的内容以及它们可能带来的研究机会。高阶微分:PyTorch和Tensorflow的核心是自动微分框架。也就是说,它们允许区分功能。然而,实现自动微分的方法有很多种,大多数现代ML框架选择的具体实现方式称为“反向模式自动微分”,通常称为“反向传播”。这种实现已被证明对神经网络分化非常有效。但是,计算高阶导数(Hessian/Hessian向量内积)的情况发生了变化。有效地计算这些需要所谓的“正向模式自动微分”。如果没有此功能,计算Hessian向量内积可能会慢几个数量级。Jax由Autograd的同一批人构建,具有正向和反向模式自动微分功能。这使得计算高阶导数比PyTorch/TensorFlow快几个数量级。然而,Jax提供的不仅仅是高阶导数。Jax开发人员将Jax视为组合任意函数转换的框架,包括vmap(用于自动批处理)或pmap(用于自动并行处理)。最初的autograd有忠实的追随者(ICML中有11篇论文使用它,尽管缺乏GPU支持),Jax可能很快就会形成一个类似的忠实社区,将它用于各种n阶导数。代码生成在运行PyTorch/TensorFlow模型时,大部分工作实际上并不是在框架中完成的,而是由第三方内核完成的。这些内核通常由硬件供应商提供,由高级框架可以利用的运算符库组成。像MKLDNN(用于CPU)或cuDNN(用于NvidiaGPU)。更高级的框架将它们的计算图分解成块,然后可以调用这些计算库。这些库代表了数千小时的工作,并且通常针对架构和应用程序的最佳性能进行了优化。然而,最近对非标准硬件、稀疏/量化张量和新运算符的兴趣暴露了依赖这些运算符库的一个主要缺点:它们不灵活。如果你想在你的研究中使用一个新的算子,比如胶囊网络,你会怎么做?如果您想在ML框架不支持的新硬件加速器上运行您的模型怎么办?现有的解决方案往往达不到要求。每一个新的硬件结构、张量类或算子都大大增加了这个问题的难度。有很多工具(Halide、TVM、PlaidML、TensorComprehensions、XLA、Taco等)可以处理它,但仍然没有一种正确的方法。如果不投入更多工作来解决这个问题,我们就会冒着将ML研究过度拟合到现有工具的风险。机器学习框架的未来对于TensorFlow和PyTorch的未来来说,这是激动人心的时刻。他们的设计已经收敛到这样一个程度,以至于两个框架都没有凭借其设计赢得决定性的胜利。双方各自开辟了自己的领域——一个占研究,一个占产业。就个人而言,在PyTorch和TensorFlow之间,我倾向于PyTorch。机器学习仍然是一个研究驱动的领域。工业界不能忽视研究成果,只要PyTorch主导研究,公司就会被迫转向PyTorch。然而,不仅仅是框架在快速发展。机器学习研究本身正处于快速变化的状态。不仅框架会发生变化——5年后使用的模型/硬件/范例可能与我们今天使用的非常不同。也许PyTorch与TensorFlow之争将变得无关紧要,因为另一种计算模型已经站稳脚跟。我们大多数人从事机器学习工作并不是为了赚钱,也不是为了协助公司制定战略计划。我们进行机器学习是因为我们关心——关于推进机器学习研究,关于人工智能的民主化,或者只是关于构建有趣的东西。无论您喜欢TensorFlow还是PyTorch,我们都会努力使机器学习软件达到最佳状态。