对于机器学习科研工作者和工业界从业人员来说,熟练掌握一种机器学习框架是必不可少的技能。随着深度学习技术的快速发展,机器学习框架市场逐渐成熟。当前,活跃的机器学习框架主要集中在PyTorch和TensorFlow这两个平台上。本文将从学术界和工业界的视角出发,总结2019年机器学习框架的发展趋势。
自2012年深度学习再次引起广泛关注以来,各种机器学习框架相继涌现,成为了研究人员和从业者的首选工具。从早期广泛使用的Caffe和Theano,到后来受到推崇的PyTorch和TensorFlow,各种框架层出不穷,使得人们难以判断哪个才是真正的主流框架。
如果你仅通过Reddit的讨论得出结论,可能会认为PyTorch正在快速崛起;然而,根据Francois Chollet的推特内容,TensorFlow或Keras可能是主流框架,PyTorch的势头似乎有所减弱。
回顾2019年,机器学习框架的竞争主要集中在PyTorch和TensorFlow之间。我的分析表明,研究人员正逐步放弃TensorFlow,转向使用PyTorch。然而,在工业界,TensorFlow仍然是首选平台,但这种局面可能不会持续太久。
通过数据分析,我们可以清晰地看到PyTorch在研究领域的主导地位。下图展示了近年来在多个学术会议上仅使用PyTorch的研究论文数量及其占比的变化趋势。每条曲线均显示出PyTorch占比的上升趋势,并且在2019年大多数主要会议上,大多数论文都选择了PyTorch。
这些图表的交互式版本可以通过以下链接访问:链接。
通过更多证据可以验证PyTorch在研究社区中的迅猛增长。以下是PyTorch和TensorFlow的原始统计数据。
通过对比2018年和2019年的数据,可以看出PyTorch的占比显著增加。据统计,69%的CVPR论文、75%以上的NAACL和ACL论文以及50%以上的ICLR和ICML论文都选择了PyTorch。在视觉和语言类会议中,PyTorch的使用频率显著高于TensorFlow,且在ICLR和ICML等通用机器学习会议上,PyTorch同样更受欢迎。
尽管有人认为PyTorch仍处于起步阶段,但在其他学术会议上,TensorFlow的增长率甚至不及整体论文数量的增长率。在NAACL、ICLR和ACL会议上,今年使用TensorFlow的论文数量实际上比去年减少了。
简洁性:PyTorch与NumPy相似,具有很强的Python风格,并且容易与Python生态系统中的其他组件集成。例如,你可以在PyTorch模型的任何位置添加“PDB”断点来进行调试。而在TensorFlow框架中,需要一个运行中的会话才能进行调试,这使得调试变得困难。
易于使用的API:大多数研究人员更喜欢PyTorch提供的API,这在很大程度上是因为PyTorch的设计更为合理,而TensorFlow则需要多次切换API(例如,“layers”->“slim”->“estimators”->“tf.keras”),这限制了其易用性。
卓越的性能:尽管PyTorch的动态图留给优化的空间较少,但已有不少有趣的报道表明,PyTorch的运行速度与TensorFlow相当,甚至更快。不过,这种说法的真实性仍有待验证,但至少在性能方面,TensorFlow并未占据明显优势。
即使TensorFlow在性能方面与PyTorch持平,但PyTorch已经赢得了研究社区中的大多数用户。这意味着更容易找到PyTorch版本的算法实现,而作者也更愿意发布PyTorch版本的代码。因此,如果将代码移植回TensorFlow 2.0平台,这将是一个漫长的过程。
TensorFlow在Google/DeepMind之外总有一批固定用户,但Google最终是否会放开这一点尚不确定。即使是现在,很多Google希望招募的研究人员已经更倾向于PyTorch。此外,PyTorch的统治地位可能会切断Google研究人员与其他研究社区之间的联系。
TensorFlow 2.0是否能够挽回一部分研究者用户还有待观察。虽然其动态图模式(TensorFlow 2.0的动态图模式)很有吸引力,但Keras的API却并非如此。
尽管PyTorch在研究领域占据主导地位,但快速分析工业界的情况会发现,TensorFlow仍然是主流框架。例如,2018年至2019年的数据显示,在招聘网站上,涉及TensorFlow的新职位有1541个,而涉及PyTorch的新职位则有1437个;知名科技媒体“Medium”上有3230篇关于TensorFlow的新文章,而关于PyTorch的新文章只有1200篇;在GitHub上,用TensorFlow编写的项目获得了13700颗星,而用PyTorch编写的项目只有7200颗星。
那么,既然PyTorch在研究人员中如此受欢迎,为什么它在工业界尚未取得同样的成功呢?主要原因有两点:一是惯性,TensorFlow比PyTorch早几年出现,工业界采用新技术的速度较慢;二是TensorFlow更适合生产环境。这主要体现在以下几个方面:
性能优先:工业界更重视性能,而性能的提升对研究人员的意义不大,但对于公司来说却可以节省数百万美元的成本。
部署需求:研究人员通常在自己的机器或专用服务器上进行实验,而工业界在部署方面有更多限制和需求,例如不能使用Python,移动设备上的二进制文件不能包含Python解释器,需要满足各种服务需求等。
TensorFlow专门针对这些需求进行了优化,例如通过计算图的版式和执行引擎本身不需要Python,以及通过TensorFlow Lite和TensorFlow Serving分别处理移动端和服务器端的问题。
在2018年末,发生了两件重要的事件改变了这种局面:
PyTorch引入了即时编译器(JIT)和“TorchScript”,引入了基于图的特性。
TensorFlow宣布在TensorFlow 2.0版本中默认采用动态图模式。
这些举措旨在解决各自框架的弱点。例如,PyTorch引入了TorchScript,可以将PyTorch程序转换为名为“TorchScript”的中间表示(IR),从而获得图模式的所有好处。TensorFlow则在API层面引入了动态图模式,这为TensorFlow带来了PyTorch动态图模式的大部分优势,但也带来了一些缺陷。
以上原因导致了当前机器学习框架市场的现状。PyTorch在研究领域占据主导地位,并试图将这种成功延伸到工业界。而TensorFlow则试图在不牺牲太多生产效率的情况下,阻止其在研究社区中的市场份额流失。PyTorch要在工业界产生重大影响还需要很长时间,因为TensorFlow在工业界已经根深蒂固,且工业界的革新速度较慢。但TensorFlow从1.0过渡到2.0将是一个艰难的过程,这使得公司自然而然地会评估是否采用PyTorch。
未来哪种框架能“笑到最后”取决于以下因素: - 研究人员的倾向对工业界有多大影响? - TensorFlow的动态图模式能否在易用性方面追上PyTorch? - PyTorch能在生产环境中大规模采用吗? - Google在行业中的孤立会影响TensorFlow吗?
我们还没有充分认识到机器学习框架对研究产生的巨大影响。它们不仅使机器学习研究得以继续,还限制了一些研究思路的可行性。目前看来,PyTorch已经达到了研究的“部分最小值”,但我们仍需关注其他框架提供的特性和研究机会。
PyTorch和TensorFlow的核心是自动微分框架。然而,计算高阶导数(如Hessian/Hessian向量积)需要使用“前向形式自动微分”。Jax是目前能够高效计算高阶导数的框架之一,它同时具备“前向传播”和“逆向传播”自动微分功能,这使得我们对高阶导数的计算速度比PyTorch/TensorFlow快几个数量级。
当你运行一个PyTorch/TensorFlow模型时,大部分工作实际上是通过第三方内核完成的。这些内核通常由硬件供应商提供,例如MKLDNN(用于CPU)或cuDNN(用于英伟达GPU)。高级框架将计算图分解成块,可以调用这些计算库。构建这些库需要大量的人工时,且针对特定架构和应用进行优化以获得最佳性能。
然而,最近研究人员对“非标准硬件”、“稀疏/量子化张量”和“新运算符”的关注暴露出依赖这些运算符库的一个缺陷:它们不够灵活。如果想在研究中使用像胶囊网络这样的新算子,或者在机器学习框架目前还不支持的新型硬件加速器上运行模型,现有的解决方案往往不够完善。
对于TensorFlow和PyTorch的未来而言,这是一个激动人心的时刻:它们的设计逐渐趋同,不太可能依靠设计获得决定性的成功。与此同时,这两种机器学习框架都有各自主导的领域——PyTorch在学术界占据主导,而TensorFlow在工业界更受欢迎。
就我个人而言,我认为PyTorch更有可能在未来占据主导地位。机器学习仍然是一个由研究驱动的领域,工业界不能忽视科学研究的成果。只要PyTorch在研究领域占据主导地位,公司就会被迫转向使用PyTorch。
不过,机器学习框架迭代得非常快,机器学习研究本身也处于一场巨大的变革之中。未来五年,使用的模型、硬件和范式可能会与现在有很大不同。也许,随着另一种计算模型占据主导地位,PyTorch与TensorFlow之间的机器学习框架之争也将逐渐平息。
置身于这些错综复杂的利益冲突以及投入在机器学习领域的大量资金中,退一步,也许会有更好的视野。大多数从事机器学习软件工作的人都不是为了赚钱,也不是为了帮助公司的战略计划,而是为了推动机器学习研究,关心人工智能的普及,或者仅仅是为了创造一些有趣的东西。无论你更喜欢TensorFlow还是PyTorch,我们都有一个共同的目标:尽最大努力做出最好的机器学习软件。