zhuzhishi0 2019-11-19
近日,Reddit的一则热帖引发机器学习社区大量讨论:
NeurIPS 2019使用的机器学习框架:PyTorch 68-> 166,TensorFlow 91-> 74
帖主Horace He是康奈尔大学的学生,他的研究兴趣是编译器和机器学习的交叉。他分析了 NeurIPS 2019论文使用的机器学习框架,发现相比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在深度学习研究,包括机器学习、计算机视觉和自然语言处理各领域都占据了主导地位,这点Yann LeCun也同意。
Yann LeCun:NeurIPS19论文使用深度学习框架中,超过69%提到了PyTorch。PyTorch在深度学习研究(ML/CV/NLP会议)中占据了主导地位。
上图可以看出,各大ML/CV/NLP的顶会上,采用PyTorch的论文持续大幅增长,而TensorFlow增速减缓,甚至略有下降。
考虑到各大顶会录取论文数量年年增长,只看绝对数量不能完全反映实际。上图是采用PyTorch/TensorFlow的论文相对总论文数量的百分比,可以更明显地看出这一趋势。
造成这一趋势的原因是什么?PyTorch真的那么好用,足以让一大批研究人员放弃TensorFlow涌向PyTorch吗?
从Reddit网友的评论来看,改用PyTorch的一致表示“真香”:
过去两年我一直使用Keras/TF,直到最近我才改用PyTorch。现在我真的很喜欢PyTorch,我觉得它更简洁明了。只是我个人的看法。
我喜欢使用PyTorch来设计带有怪异的训练、反向传播图和其他内容的新模型。我觉得使用PyTorch,即使你不能快速部署标准模型,也可以更自由地设计自己的自定义算法。也许这就是为什么它主要用于研究。
我使用Tensorflow/Keras已经有一段时间了。我记得的结论是,Tensorflow在生产部署方面更出色,PyTorch在研究中表现更好。我最近开始使用PyTorch,不得不说我真的很喜欢它,感觉它更“pythonic”。此外,通过诸如ONNX之类的框架,部署(众所周知的模型)也开始变得不成问题。两者我都会继续使用。
Tensorflow 2.0 vs PyTorch是一个艰难的选择。
我喜欢Tensorflow,我也喜欢PyTorch。
TF是基于开发的,PyTorch是基于研究的。
两者都很需要。在我看来,两者是平等的。50-50
很长一段时间以来,TensorFlow有很多PyTorch没有的“面向生产”的特性。例如部署到移动端,能够在没有python环境的情况下运行,有很多方法可以最大化模型的性能(量化等等)。
如果你要在生产中部署模型,那么业界仍然首选TF。除非他们能让PyTorch的production pipeline不那么糟糕,否则这种情况将一直持续下去。
总体来看,网友的体验与Horace He的分析在很大程度上是一致的。但PyTorch究竟好用在哪里呢,Horace He的文章还细致分析了两者各自的特性、优势和不足,并讨论了机器学习框架的未来。
自2012年深度学习重新获得重视以来,许多机器学习框架便争相成为研究人员和行业从业人员的新宠。从早期的学术成果Caffe和Theano到庞大的产业支持的PyTorch和TensorFlow,在这么多选择中,到底最流行的是哪一个?
如果你只浏览Reddit,则可能会假设每个人都在用PyTorch。若从Francois Chollet的Twitter来判断,TensorFlow或Keras可能是主流,而PyTorch却停滞不前。
在2019年,机器学习框架之战还有两个主要竞争者:PyTorch和TensorFlow。分析表明,研究人员正在放弃TensorFlow并大量涌向PyTorch。同时,在行业中,Tensorflow当前是首选平台,但从长远来看可能并非如此。
先来看看数据。下图显示了从2017~2019年,在主要机器学习顶会上,仅提及PyTorch的论文和使用TensorFlow或PyTorch的论文之间的比例。可以看出,所有的线条都在向上倾斜,并且在2019年的每个主要会议上,大多数论文都在PyTorch中实现。
详见:https://chillee.github.io/pytorch-vs-tensorflow/
如果你需要更多证据证明PyTorch在学术界的发展有多快,下面是PyTorch与TensorFlow被提及数量的对比图。
PyTorch和TensorFlow被单独提及的数量
在2018年,PyTorch还是少数。现在,PyTorch已是主流,CVPR使用PyTorch的占 69%,NAACL和ACL中占75%以上,而ICLR和ICML中占50%以上。虽然PyTorch在视觉和语言会议上的统治地位最强(PyTorch与TensorFlow相比是2:1和3:1),但在ICLR和ICML等常规机器学习会议上,PyTorch也比TensorFlow受欢迎。
虽然有人认为PyTorch仍然是一个新兴的框架,试图在TensorFlow主导的世界中开拓一席之地,但数据显示并非如此。除了ICML之外,在任何一次会议上,TensorFlow的增长都与论文的总体增长保持一致。在NAACL、ICLR和ACL,Tensorflow今年的论文数量实际上比去年少。
PyTorch不用担心自己的未来,需要担心的是TensorFlow。
即使TensorFlow在功能方面与PyTorch不相上下,但PyTorch已经覆盖了社区的大部分。这意味着PyTorch将更容易找到,作者将更有动力在PyTorch中发布代码(以便人们使用它),并且你的合作者很可能会更喜欢PyTorch。因此,如果真的发生的话,任何回到Tensorflow 2.0的迁移都可能很慢。
TensorFlow在Google / DeepMind中将始终拥有一定的受众群体,但不知道Google是否最终会放弃。即使是现在,Google想要招募的许多研究人员已经在不同层次上偏爱PyTorch,而且还听到有人抱怨说Google内部的许多研究人员都希望使用TensorFlow以外的框架。
此外,PyTorch的统治地位可能会开始将Google研究人员与其他研究群体隔离开来。他们不仅很难在外部研究的基础上进行构建,而且外部研究人员也不太可能在Google发布的代码基础上进行构建。
尽管PyTorch现在在研究领域占据主导地位,但纵观业界,TensorFlow仍然是主导框架。例如,根据2018年至2019年的招聘网站数据,TensorFlow有1541个新职位,PyTorch有1437个新职位。TensorFlow的Medium文章有3230篇,PyTorch则有1200篇;TensorFlow有13700颗GitHub新星,PyTorch有7200颗,等等。
因此,如果PyTorch在学界中如此流行,为什么它没有在业界获得同样的成功呢?一个显而易见的第一个答案就是懒(inertia)。Tensorflow比PyTorch早几年问世,业界采用新技术的速度比研究人员慢。另一个原因是TensorFlow在生产方面比PyTorch更好。但是,这是什么意思?
要回答这个问题,我们需要知道研究人员和行业的需求有何不同。
研究人员在意他们能够以多快的速度进行研究,该研究通常是在相对较小的数据集(可以放在一台机器上的数据集)上运行的,并且运行在<8个GPU上。通常,研究人员考虑的是速度而非性能,即哪个能让他们快速实践新想法。相反,业界认为性能是重中之重。尽管将运行速度提高10%对研究人员来说毫无意义,但这可以直接为公司节省数百万美元的费用。
另一个区别是部署。研究人员将在自己的计算机或专用于运行研究工作的服务器群集上进行实验。相反,业界有很多限制/要求:
TensorFlow是专门针对这些需求而构建的,并为所有这些问题提供了解决方案:图形格式和执行引擎本来就不需要Python,TensorFlow Lite和TensorFlow Serving服务分别考虑了移动和服务。
从历史上看,PyTorch未能满足这些考虑,因此大多数公司目前在生产中使用TensorFlow。
在 API 级别,TensorFlow eager 模式与 PyTorch 的 eager 模式本质上是相同的。eager 模式为 TensorFlow 提供了 PyTorch 的大部分优势 (易用性、可调试性等)。
然而,这也给了 TensorFlow 带来了同样的缺点。TensorFlow eager 模型不能导出到非 python 环境,不能进行优化,不能在移动设备上运行,等等。
这将 TensorFlow 置于与 PyTorch 相同的位置,它们以本质上相同的方式进行解析 —— 你可以跟踪代码 (tf.function) 或重新解释 Python 代码 (Autograph)。
因此,TensorFlow 的 eager 模式并不能真正做到 “两全其美”。尽管可以使用 tf 将代码转换为静态图,但这不是一个无缝的过程。跟踪代码会受到限制,重新解释 Python 代码本质上需要重写大部分 Python 编译器。当然,通过将范围限制为用于深度学习的 Python 子集,可以大大简化范围。
至此,我们得出了机器学习框架当前的现状:
当然,PyTorch 要在业界产生有意义的影响还需要很长一段时间 ——TensorFlow 太根深蒂固了,而行业变化缓慢。
不过,从 TensorFlow 1.0 过渡到 2.0 会是困难的,这为公司考虑采用 PyTorch 提供了机会。
未来将取决于谁能更好地回答下列问题。
现在这批博士生即将毕业,他们将带上 PyTorch 进入业界。这种偏好是否足够强大,以至于公司会出于招聘目的选择 PyTorch?创业的毕业生会为自己的公司选择 PyTorch 吗 ?
在线社区给我的印象是,TensorFlow Eager 深受性能 / 内存问题的困扰,而 Autograph 系列也有自己的问题。谷歌将花费大量的工程努力,但 TensorFlow 却受历史包袱拖累。
PyTorch 仍有许多基本问题问题没有解决 —— 没有好的量化指标、不支持移动设备、服务性等等。在这些问题解决之前,PyTorch 不会成为许多公司的选择。注:在本文发布的当天,PyTorch 就宣布了对量化和移动的支持。这两种方法都还处于试验阶段,但是对于 PyTorch 来说已经取得了重大进展。
谷歌推动 TensorFlow 的主要原因之一是帮助其迅速发展的云服务。由于谷歌试图拥有整个 ML 垂直市场,这可能激励竞争的公司 (微软、亚马逊、英伟达等) 支持唯一的替代机器学习框架,即 PyTorch。
下一步是什么
机器学习框架在很大程度上影响了ML研究,这一点或许没有得到充分的认识。它们不仅使机器学习研究成为可能,它们还使研究人员能够轻松探索的想法成为可能,或对这些想法加以限制。有多少新生的想法仅仅因为没法简单地在一个框架中表达而粉碎?PyTorch可能已经达到了本地研究的最低要求,但值得探讨的是,其他框架提供了什么,以及它们可能带来哪些研究机会。
高阶微分:
PyTorch和Tensorflow的核心是自动微分框架。也就是说,它们允许对某个函数求导。然而,有许多方法可以实现自动微分,大多数现代ML框架选择的特定实现称为“反向模式自动微分”,更常见的说法是“反向传播”。这个实现被证明对神经网络求导非常有效。
但是,计算高阶导数(Hessian/Hessian向量内积)的情况有所变化。有效地计算这些需要所谓的“前向模式自动微分”。如果没有这种能力,计算Hessian向量内积可能会慢几个数量级。
Jax是由Autograd的同一帮人构建的,具有正向和反向模式自动微分的特性。这使得计算高阶导数的速度比PyTorch/TensorFlow快几个数量级。
然而,Jax提供的不仅仅是高阶导数。Jax开发人员将Jax视为组合任意函数转换的框架,包括vmap(用于自动批处理)或pmap(用于自动并行处理)。
最初的autograd有一批忠实追随者(尽管没有GPU支持,ICML仍然有11篇论文还是使用了它),Jax很可能很快就会形成一个类似的忠实社区,将它用于各种n阶导数。
代码生成
当运行PyTorch/TensorFlow模型时,大部分工作实际上并不是在框架中完成的,而是由第三方内核完成的。这些内核通常由硬件供应商提供,由高级框架可以利用的操作符库组成。比如MKLDNN(用于CPU)或cuDNN(用于Nvidia GPU)。更高级的框架将它们的计算图分解成多个块,然后这些块可以调用这些计算库。这些库代表了数千小时的工作,并且经常针对架构和应用程序进行优化以获得最佳性能。
然而,最近对非标准硬件、稀疏/量化张量和新运算符的兴趣暴露了依赖这些运算符库的一个主要缺陷:它们不灵活。如果你想在研究中使用一个新的运算符,比如胶囊网络,你会怎么做?如果你想在ML框架不支持的新硬件加速器上运行模型,该怎么办?现有的解决方案往往达不到要求。
每一个新的硬件结构、张量类别或运算符都大大增加了这个问题的难度。有很多工具 (Halide, TVM, PlaidML, Tensor Comprehensions, XLA, Taco, etc)可以处理,但是仍没有一个正确的方法。
如果不投入更多的工作来解决这个问题,我们就会有将ML研究过度适合于现有工具的风险。
这些对于TensorFlow和PyTorch的未来来说是激动人心的时刻。它们的设计已经趋同到这样一个地步,以至于任何一个框架都不会凭借其设计而获得决定性的胜利。双方都划出了各自的领域——一方占据研究界,另一方占据工业界。
就我个人而言,在PyTorch和TensorFlow之间,我倾向于PyTorch。机器学习仍然是一个研究驱动的领域。工业界不能忽视研究成果,只要PyTorch主导研究,就会迫使公司转向PyTorch。