图片 11

如此多的深度学习框架,为什么我选择PyTorch?

在人工智能快速发展的今天,机器学习框架变得炙手可热,它们摇身成为许多研究人员和从业者的新宠。当下,机器学习框架之战有两个主要竞争者:PyTorch
和 TensorFlow。来自康奈尔大学的 Horace He
对二者进行了对比研究,并将研究成果发表在了斯坦福人工智能实验室创办的数字杂志
“The
Gradient”
上。他发现:PyTorch 在学界愈发吃香,而业界的首选仍是 TensorFlow。

2019年,机器学习框架之争进入了新阶段:PyTorch与TensorFlow成为最后两大玩家,PyTorch占据学术界领军地位,TensorFlow在工业界力量依然强大,两个框架都在向对方借鉴,但是都不太理想。

谁没有听说FB的PyTorch和谷歌的TensorFlow之间的争斗? 本文是来自国外Kirill
Dubovikov写的一篇很棒的文章,快速揭秘这2种框架冲突与竞争的根源。

图片 1
小编说:目前研究人员正在使用的深度学习框架不尽相同,本文介绍了6种常见的深度学习框架,PyTorch与他们相比又有哪些优势呢?本文选自《深度学习框架PyTorch:入门与实践》
图片 2

在研究领域不断提高主导地位的 PyTorch

下图展示了在每个顶级研究会议上,单独使用 PyTorch 的论文与
Tensorflow/PyTorch 论文之间的比率——2019 年的每个主要会议都在 PyTorch
中实现了大多数研究。

图片 3

下面是 PyTorch 与 TensorFlow 原始计数的图表,它展现出 PyTorch
在研究界的发展速度之快:

图片 4

在 2018 年,PyTorch 是少数派。现在,它是绝大多数,CVPR 会议中使用
PyTorch 的占 69%,PyTorch 研究在 NAACL 和 ACL 会议中均占 75% 以上,在
ICLR 和 ICML 会议中也有 50% 以上。可以看出,PyTorch
在视觉和语言类会议上的统治地位最强,在诸如 ICLR 和 ICML
之类的通用机器学习会议上也比 TensorFlow 更受欢迎。

那么为什么研究人员如此青睐 PyTorch 呢?Horace 总结出了如下几点原因:

  • 简单。它与 numpy 类似,非常具有 python
    风格,并且可以轻松地与其他 Python 生态系统集成。
  • 很棒的 API。与 TensorFlow 的 API 相比,大多数研究人员更喜欢
    PyTorch 的 API。
  • 性能。尽管事实上 PyTorch
    的动态图提供的优化机会很少,不过,据传闻 PyTorch 的速度甚至快于
    TensorFlow。目前尚不清楚这是否为实,但至少 TensorFlow
    在这一领域还没有取得决定性优势。

作者 Horace 认为 TensorFlow 的研究前景还有待观察。毕竟目前 PyTorch
已经覆盖到很多社区,这意味着 PyTorch
的实现将更容易找到,人们也更有动力在 PyTorch
中发布代码。当然,TensorFlow 在 Google/DeepMind
中还是会始终拥有一定的受众群体,但它的地位仍受到威胁,因为“有人抱怨说
Google 内部的许多研究人员都希望使用 TensorFlow 以外的框架”。

“此外,PyTorch 的统治地位可能会开始切断 Google
研究人员与其他研究社区的联系。他们不仅很难在外部研究的基础上进行构建,而且外部研究人员也不太可能在
Google 发布的代码基础上进行构建。”这是需要警惕的地方。

最后谁能胜出?还得看谁更好的回答几个关键问题。

图片 5

1 PyTorch的诞生

2017年1月,Facebook人工智能研究院(FAIR)团队在GitHub上开源了PyTorch,并迅速占领GitHub热度榜榜首。

作为一个2017年才发布,具有先进设计理念的框架,PyTorch的历史可追溯到2002年就诞生于纽约大学的Torch。Torch使用了一种不是很大众的语言Lua作为接口。Lua简洁高效,但由于其过于小众,用的人不是很多,以至于很多人听说要掌握Torch必须新学一门语言就望而却步(其实Lua是一门比Python还简单的语言)。

图片 6

考虑到Python在计算科学领域的领先地位,以及其生态完整性和接口易用性,几乎任何框架都不可避免地要提供Python接口。终于,在2017年,Torch的幕后团队推出了PyTorch。PyTorch不是简单地封装Lua
Torch提供Python接口,而是对Tensor之上的所有模块进行了重构,并新增了最先进的自动求导系统,成为当下最流行的动态图框架。

PyTorch一经推出就立刻引起了广泛关注,并迅速在研究领域流行起来。图1-2所示为Google指数,PyTorch自发布起关注度就在不断上升,截至2017年10月18日,PyTorch的热度已然超越了其他三个框架(Caffe、MXNet和Theano),并且其热度还在持续上升中。

图片 7
PyTorch 和 Caffe、Theano、MXNet 的 Google 指数对比(类别为科学)

用于生产的 PyTorch 和 TensorFlow

尽管 PyTorch 现在在研究中占据重要地位,但 TensorFlow
仍然是行业内部的主导框架。根据公开数据,TensorFlow
的招募职位多于 PyTorch,GitHub 上 13.7k 的 TensorFlow 星标也多于 7.2k 的
PyTorch 星标。

PyTorch
在业界为什么没有取得与学界同等的受欢迎程度呢?首要答案是一贯性。TensorFlow
早于 PyTorch 出现,而且行业采用新技术的速度比研究人员要慢。另一个原因是
TensorFlow 在生产方面更胜 PyTorch 一筹。

这就要从研究人员和行业的不同需求讲起。研究人员关心他们能够以多快的速度进行研究,该研究通常是在相对较小的数据集(可以容纳在一台计算机上的数据集)上运行的。通常,这与性能方面的考虑无关,而是依靠他们快速实施新想法的能力来决定。与之相反,业界认为性能是重中之重。将运行时间提高
10%
对研究人员而言意义不大,但对公司来说,这可以直接节省数百万美元的费用。

另一个区别在于部署。研究人员在自己的计算机或专用于运行研究工作的服务器集群上进行实验。行业则有很多限制和要求:

  • No Python。一些公司会运行服务器,这些服务器的 Python
    运行时开销太大。
  • 移动。无法在移动二进制文件中嵌入 Python 解释器。
  • 服务。要求功能全面,例如无停机更新模型、在模型之间无缝切换、在预测时进行批处理等。

TensorFlow
恰巧专门针对这些要求而构建,并为所有这些问题提供了解决方案:图形格式和执行引擎本来就不需要
Python,并且 TensorFlow Lite 和 TensorFlow Serving
能够分别解决移动和服务注意事项。

从历史上看,PyTorch 未能满足这些考虑,因此大多数公司目前在生产中使用
TensorFlow。

来自康奈尔大学的Horace
He刚刚在Gradient发布了一篇长文探讨2019年的两大机器学习框架之争,他论述了PyTorch和TensorFlow各自的优劣和发展趋势,但是很明显更看好PyTorch,特别是其在学术领域起到的驱动作用。

竞争的核心是两个框架的相似性太强。 两个框架有哪些相似点?

2 常见的深度学习框架简介

随着深度学习的发展,深度学习框架如雨后春笋般诞生于高校和公司中。尤其是近两年,Google、Facebook、Microsoft等巨头都围绕深度学习重点投资了一系列新兴项目,他们也一直在支持一些开源的深度学习框架。

目前研究人员正在使用的深度学习框架不尽相同,有 TensorFlow
、Caffe、Theano、Keras等,常见的深度学习框架如图2所示。这些深度学习框架被应用于计算机视觉、语音识别、自然语言处理与生物信息学等领域,并获取了极好的效果。本部分主要介绍当前深度学习领域影响力比较大的几个框架,限于笔者个人使用经验和了解程度,对各个框架的评价可能有不准确的地方。

图片 8
常见的深度学习框架

如此多的深度学习框架,为什么我选择PyTorch?。机器学习框架的现状

以上事实折射出机器学习框架的当前状态:PyTorch
拥有研究市场,并且正在尝试扩展到行业领域;TensorFlow
试图在不牺牲太多生产力的情况下,在研究界中尽其所能。TensorFlow
目前在行业中根深蒂固,且行业发展较为缓慢,因此 PyTorch
对行业产生有意义的影响肯定还需要相当长时间。不过,从 TensorFlow 1.0 到
2.0 的过渡将存在一些困难,这也恰好为公司评估 PyTorch 提供了自然机遇。

Horace 认为,未来将取决于谁能够更好地回答以下问题:

研究人员的偏好会在多大程度上影响行业?当前的博士生开始毕业时,他们将携带
PyTorch 技能。关键在于这种偏好是否足够强大,以至于公司会出于招聘目的选择
PyTorch。另一种可能是,毕业生会创办基于 PyTorch 的创业公司吗?

TensorFlow 的 Eager 模式能否赶上 PyTorch 的可用性?TensorFlow Eager
受到性能/内存问题的严重困扰,Google 将在这方面花费大量工程精力。

PyTorch 可以多快达到生产状态?PyTorch
仍然有许多基本问题尚未解决:没有好的量化指标、不支持移动、服务问题等等。在这些问题解决之前,PyTorch
不会成为许多公司的选择。 它能否做出足够的改变?(最新消息:近期 PyTorch
宣布支持量化和移动技术,两者都仍处于试验阶段,表示着 PyTorch
在这方面终于有了重大进展。)

Google 在行业中的孤立会使自身受到伤害吗?Google 推动 TensorFlow
的主要原因之一是帮助其迅速发展的云服务。由于 Google 试图拥有整个 ML
垂直市场,这激励了与 Google 竞争的公司(微软、亚马逊、Nvidia
等),来支持唯一的替代机器学习框架。

最后,Horace
指出,不仅仅是快速发展的框架,机器学习研究本身也处于不断变化的状态。框架不仅会发生变化,而且
5
年内使用的模型/硬件/范例可能与我们今天所使用的一切大不相同。随着另一种计算模型的普及,也许
PyTorch 和 TensorFlow
之间的竞争将变得无关紧要。我们应当将焦点维持在机器学习本身上,无论是喜欢
TensorFlow 还是 PyTorch,试图使机器学习软件达到最佳状态就好。

原文:https://thegradient.pub/state-of-ml-frameworks-2019-pytorch-dominates-research-tensorflow-dominates-industry

以下是全文:

1.是用于高性能数值计算的开源库

2.1 Theano

Theano最初诞生于蒙特利尔大学 LISA
实验室,于2008年开始开发,是第一个有较大影响力的Python深度学习框架。

Theano 是一个 Python
库,可用于定义、优化和计算数学表达式,特别是多维数组(numpy.ndarray)。在解决包含大量数据的问题时,使用
Theano 编程可实现比手写 C 语言更快的速度,而通过 GPU 加速,Theano
甚至可以比基于 CPU 计算的 C 语言快上好几个数量级。Theano
结合了计算机代数系统(Computer Algebra
System,CAS)和优化编译器,还可以为多种数学运算生成定制的 C
语言代码。对于包含重复计算的复杂数学表达式的任务而言,计算速度很重要,因此这种
CAS
和优化编译器的组合是很有用的。对需要将每一种不同的数学表达式都计算一遍的情况,Theano
可以最小化编译/解析的计算量,但仍然会给出如自动微分那样的符号特征。

Theano诞生于研究机构,服务于研究人员,其设计具有较浓厚的学术气息,但在工程设计上有较大的缺陷。一直以来,Theano因难调试、构建图慢等缺点为人所诟病。为了加速深度学习研究,人们在它的基础之上,开发了Lasagne、Blocks、PyLearn2和Keras等第三方框架,这些框架以Theano为基础,提供了更好的封装接口以方便用户使用。

2017年9月28日,在Theano
1.0正式版即将发布前夕,LISA实验室负责人,深度学习三巨头之一的Yoshua
Bengio 宣布Theano即将停止开发:“Theano is
Dead”。尽管Theano即将退出历史舞台,但作为第一个Python深度学习框架,它很好地完成了自己的使命,为深度学习研究人员的早期拓荒提供了极大的帮助,同时也为之后深度学习框架的开发奠定了基本设计方向:
以计算图为框架的核心,采用GPU加速计算。

2017年11月,LISA实验室在 GitHub
上开启了一个初学者入门项目,旨在帮助实验室新生快速掌握机器学习相关的实践基础,而该项目正是使用PyTorch作为教学框架。

点评:由于Theano已经停止开发,不建议作为研究工具继续学习。

自2012年深度学习重新获得突出地位以来,许多机器学习框架也相应成为研究人员和行业从业者的新宠。

2.得到大型科技公司的支持

2.2 TensorFlow

2015年11月10日,Google宣布推出全新的机器学习开源工具TensorFlow。
TensorFlow 最初是由 Google 机器智能研究部门的 Google Brain
团队开发,基于Google
2011年开发的深度学习基础架构DistBelief构建起来的。TensorFlow主要用于进行机器学习和深度神经网络研究,
但它是一个非常基础的系统,因此也可以应用于众多领域。由于Google在深度学习领域的巨大影响力和强大的推广能力,TensorFlow一经推出就获得了极大的关注,并迅速成为如今用户最多的深度学习框架。

TensorFlow在很大程度上可以看作Theano的后继者,不仅因为它们有很大一批共同的开发者,而且它们还拥有相近的设计理念,都是基于计算图实现自动微分系统。TensorFlow
使用数据流图进行数值计算,图中的节点代表数学运算,
而图中的边则代表在这些节点之间传递的多维数组(张量)。

TensorFlow编程接口支持Python和C++。随着1.0版本的公布,Java、Go、R和Haskell
API的alpha版本也被支持。此外,TensorFlow还可在Google
Cloud和AWS中运行。TensorFlow还支持 Windows 7、Windows 10和Windows Server
2016。由于TensorFlow使用C++
Eigen库,所以库可在ARM架构上编译和优化。这也就意味着用户可以在各种服务器和移动设备上部署自己的训练模型,无须执行单独的模型解码器或者加载Python解释器。

作为当前最流行的深度学习框架,TensorFlow获得了极大的成功,对它的批评也不绝于耳,总结起来主要有以下四点。
• 过于复杂的系统设计,TensorFlow
在GitHub代码仓库的总代码量超过100万行。这么大的代码仓库,对于项目维护者来说维护成为了一个难以完成的任务,而对读者来说,学习TensorFlow底层运行机制更是一个极其痛苦的过程,并且大多数时候这种尝试以放弃告终。

频繁变动的接口。TensorFlow的接口一直处于快速迭代之中,并且没有很好地考虑向后兼容性,这导致现在许多开源代码已经无法在新版的TensorFlow上运行,同时也间接导致了许多基于TensorFlow的第三方框架出现BUG。

接口设计过于晦涩难懂。在设计TensorFlow时,创造了图、会话、命名空间、PlaceHolder等诸多抽象概念,对普通用户来说难以理解。同一个功能,TensorFlow提供了多种实现,这些实现良莠不齐,使用中还有细微的区别,很容易将用户带入坑中。

文档混乱脱节。TensorFlow作为一个复杂的系统,文档和教程众多,但缺乏明显的条理和层次,虽然查找很方便,但用户却很难找到一个真正循序渐进的入门教程。
由于直接使用TensorFlow的生产力过于低下,包括Google官方等众多开发者尝试基于TensorFlow构建一个更易用的接口,包括Keras、Sonnet、TFLearn、TensorLayer、Slim、Fold、PrettyLayer等数不胜数的第三方框架每隔几个月就会在新闻中出现一次,但是又大多归于沉寂,至今TensorFlow仍没有一个统一易用的接口。

凭借Google着强大的推广能力,TensorFlow已经成为当今最炙手可热的深度学习框架,但是由于自身的缺陷,TensorFlow离最初的设计目标还很遥远。另外,由于Google对TensorFlow略显严格的把控,目前各大公司都在开发自己的深度学习框架。

点评:不完美但最流行的深度学习框架,社区强大,适合生产环境。

从Caffe和Theano的早期学术成果,到业界支持的大规模PyTorch和TensorFlow,面对如此多的选择,人们很难知道最好的框架是什么。

3.拥有强大而积极的支持社区

2.3 Keras

Keras是一个高层神经网络API,由纯Python编写而成并使用TensorFlow、Theano及CNTK作为后端。Keras为支持快速实验而生,能够把想法迅速转换为结果。Keras应该是深度学习框架之中最容易上手的一个,它提供了一致而简洁的API,
能够极大地减少一般应用下用户的工作量,避免用户重复造轮子。

严格意义上讲,Keras并不能称为一个深度学习框架,它更像一个深度学习接口,它构建于第三方框架之上。Keras的缺点很明显:过度封装导致丧失灵活性。Keras最初作为Theano的高级API而诞生,后来增加了TensorFlow和CNTK作为后端。为了屏蔽后端的差异性,提供一致的用户接口,Keras做了层层封装,导致用户在新增操作或是获取底层的数据信息时过于困难。同时,过度封装也使得Keras的程序过于缓慢,许多BUG都隐藏于封装之中,在绝大多数场景下,Keras是本文介绍的所有框架中最慢的一个。

学习Keras十分容易,但是很快就会遇到瓶颈,因为它缺少灵活性。另外,在使用Keras的大多数时间里,用户主要是在调用接口,很难真正学习到深度学习的内容。

点评:入门最简单,但是不够灵活,使用受限。

如果从Reddit看,你可能会认为PyTorch风头正盛。但如果你浏览的是机器学习大咖Francois
Chollet的Twitter,你可能会认为TensorFlow/Keras是主流框架。

4.是基于Python的

2.4 Caffe/Caffe2

Caffe的全称是Convolutional Architecture for Fast Feature
Embedding,它是一个清晰、高效的深度学习框架,核心语言是C++,它支持命令行、Python和MATLAB接口,既可以在CPU上运行,也可以在GPU上运行。

Caffe的优点是简洁快速,缺点是缺少灵活性。不同于Keras因为太多的封装导致灵活性丧失,Caffe灵活性的缺失主要是因为它的设计。在Caffe中最主要的抽象对象是层,每实现一个新的层,必须要利用C++实现它的前向传播和反向传播代码,而如果想要新层运行在GPU上,还需要同时利用CUDA实现这一层的前向传播和反向传播。这种限制使得不熟悉C++和CUDA的用户扩展Caffe十分困难。

Caffe凭借其易用性、简洁明了的源码、出众的性能和快速的原型设计获取了众多用户,曾经占据深度学习领域的半壁江山。但是在深度学习新时代到来之时,Caffe已经表现出明显的力不从心,诸多问题逐渐显现(包括灵活性缺失、扩展难、依赖众多环境难以配置、应用局限等)。尽管现在在GitHub上还能找到许多基于Caffe的项目,但是新的项目已经越来越少。

Caffe的作者从加州大学伯克利分校毕业后加入了Google,参与过TensorFlow的开发,后来离开Google加入FAIR,担任工程主管,并开发了Caffe2。Caffe2是一个兼具表现力、速度和模块性的开源深度学习框架。它沿袭了大量的
Caffe 设计,可解决多年来在 Caffe
的使用和部署中发现的瓶颈问题。Caffe2的设计追求轻量级,在保有扩展性和高性能的同时,Caffe2
也强调了便携性。Caffe2
从一开始就以性能、扩展、移动端部署作为主要设计目标。Caffe2 的核心 C++
库能提供速度和便携性,而其 Python 和 C++ API 使用户可以轻松地在
Linux、Windows、iOS、Android ,甚至 Raspberry Pi 和 NVIDIA Tegra
上进行原型设计、训练和部署。

Caffe2继承了Caffe的优点,在速度上令人印象深刻。Facebook
人工智能实验室与应用机器学习团队合作,利用Caffe2大幅加速机器视觉任务的模型训练过程,仅需
1 小时就训练完ImageNet
这样超大规模的数据集。然而尽管已经发布半年多,开发一年多,Caffe2仍然是一个不太成熟的框架,官网至今没提供完整的文档,安装也比较麻烦,编译过程时常出现异常,在GitHub上也很少找到相应的代码。

极盛的时候,Caffe占据了计算机视觉研究领域的半壁江山,虽然如今Caffe已经很少用于学术界,但是仍有不少计算机视觉相关的论文使用Caffe。由于其稳定、出众的性能,不少公司还在使用Caffe部署模型。Caffe2尽管做了许多改进,但是还远没有达到替代Caffe的地步。

点评:文档不够完善,但性能优异,几乎全平台支持(Caffe2),适合生产环境。

2019年,机器学习框架之战主要是PyTorch和TensorFlow的对峙。

5.使用图表来表示数据和操作的流程

2.5 MXNet

MXNet是一个深度学习库,支持C++、Python、R、Scala、Julia、MATLAB及JavaScript等语言;支持命令和符号编程;可以运行在CPU、GPU、集群、服务器、台式机或者移动设备上。MXNet是CXXNet的下一代,CXXNet借鉴了Caffe的思想,但是在实现上更干净。在2014
年的NIPS 上,同为上海交大校友的陈天奇与李沐碰头,讨论到各自在做深度学习
Toolkits 的项目组,发现大家普遍在做很多重复性的工作,例如文件 loading
等。于是他们决定组建 DMLC【Distributied (Deep) Machine Learning
Community】,号召大家一起合作开发
MXNet,发挥各自的特长,避免重复造轮子。

MXNet以其超强的分布式支持,明显的内存、显存优化为人所称道。同样的模型,MXNet往往占用更小的内存和显存,并且在分布式环境下,MXNet展现出了明显优于其他框架的扩展性能。

由于MXNet最初由一群学生开发,缺乏商业应用,极大地限制了MXNet的使用。2016年11月,MXNet被AWS正式选择为其云计算的官方深度学习平台。2017年1月,MXNet项目进入Apache基金会,成为Apache的孵化器项目。

尽管MXNet拥有最多的接口,也获得了不少人的支持,但其始终处于一种不温不火的状态。个人认为这在很大程度上归结于推广不给力及接口文档不够完善。MXNet长期处于快速迭代的过程,其文档却长时间未更新,导致新手用户难以掌握MXNet,老用户常常需要查阅源码才能真正理解MXNet接口的用法。

为了完善MXNet的生态圈,推广MXNet,MXNet先后推出了包括MinPy、Keras和Gluon等诸多接口,但前两个接口目前基本停止了开发,Gluon模仿PyTorch的接口设计,MXNet的作者李沐更是亲自上阵,在线讲授如何从零开始利用Gluon学习深度学习,诚意满满,吸引了许多新用户。

点评:文档略混乱,但分布式性能强大,语言支持最多,适合AWS云平台使用。

根据我的分析,在学术领域,研究人员正逐渐放弃TensorFlow,扎堆涌向PyTorch。与此同时,在工业领域,TensorFlow是首选平台,但这种情况可能不会持续很久。

6.有详细记录

2.6 CNTK

2015年8月,微软公司在CodePlex上宣布由微软研究院开发的计算网络工具集CNTK将开源。5个月后,2016年1月25日,微软公司在他们的GitHub仓库上正式开源了CNTK。早在2014年,在微软公司内部,黄学东博士和他的团队正在对计算机能够理解语音的能力进行改进,但当时使用的工具显然拖慢了他们的进度。于是,一组由志愿者组成的开发团队构想设计了他们自己的解决方案,最终诞生了CNTK。

根据微软开发者的描述,CNTK的性能比Caffe、Theano、TensoFlow等主流工具都要强。CNTK支持CPU和GPU模式,和TensorFlow/Theano一样,它把神经网络描述成一个计算图的结构,叶子节点代表输入或者网络参数,其他节点代表计算步骤。CNTK
是一个非常强大的命令行系统,可以创建神经网络预测系统。CNTK 最初是出于在
Microsoft
内部使用的目的而开发的,一开始甚至没有Python接口,而是使用了一种几乎没什么人用的语言开发的,而且文档有些晦涩难懂,推广不是很给力,导致现在用户比较少。但就框架本身的质量而言,CNTK表现得比较均衡,没有明显的短板,并且在语音领域效果比较突出。

点评:社区不够活跃,但是性能突出,擅长语音方面的相关研究。

PyTorch在研究领域日益占据主导地位

考虑到所有这些因素,我们可以说,在其中一个框架中创建的几乎任何东西都可以以相似的成本在另一个框架中复制。
因此,问题就在于此。

2.7 其他框架

除了上述的几个框架,还有不少的框架,都有一定的影响力和用户。比如百度开源的PaddlePaddle,CMU开发的DyNet,简洁无依赖符合C++11标准的tiny-dnn,使用Java开发并且文档极其优秀的Deeplearning4J,还有英特尔开源的Nervana,Amazon开源的DSSTNE。这些框架各有优缺点,但是大多流行度和关注度不够,或者局限于一定的领域。此外,还有许多专门针对移动设备开发的框架,如CoreML、MDL,这些框架纯粹为部署而诞生,不具有通用性,也不适合作为研究工具。

首先当然是先用数据说话。

你应该使用哪个框架? 每个社区之间的主要区别是什么?

3 为什么选择PyTorch

这么多深度学习框架,为什么选择PyTorch呢?
因为PyTorch是当前难得的简洁优雅且高效快速的框架。在笔者眼里,PyTorch达到目前深度学习框架的最高水平。当前开源的框架中,没有哪一个框架能够在灵活性、易用性、速度这三个方面有两个能同时超过PyTorch。下面是许多研究人员选择PyTorch的原因。


  • 简洁:PyTorch的设计追求最少的封装,尽量避免重复造轮子。不像TensorFlow中充斥着session、graph、operation、name_scope、variable、tensor、layer等全新的概念,PyTorch的设计遵循tensor→variable(autograd)→nn.Module
    三个由低到高的抽象层次,分别代表高维数组(张量)、自动求导(变量)和神经网络(层/模块),而且这三个抽象之间联系紧密,可以同时进行修改和操作。
    简洁的设计带来的另外一个好处就是代码易于理解。PyTorch的源码只有TensorFlow的十分之一左右,更少的抽象、更直观的设计使得PyTorch的源码十分易于阅读。在笔者眼里,PyTorch的源码甚至比许多框架的文档更容易理解。


  • 速度:PyTorch的灵活性不以速度为代价,在许多评测中,PyTorch的速度表现胜过TensorFlow和Keras等框架
    。框架的运行速度和程序员的编码水平有极大关系,但同样的算法,使用PyTorch实现的那个更有可能快过用其他框架实现的。


  • 易用:PyTorch是所有的框架中面向对象设计的最优雅的一个。PyTorch的面向对象的接口设计来源于Torch,而Torch的接口设计以灵活易用而著称,Keras作者最初就是受Torch的启发才开发了Keras。PyTorch继承了Torch的衣钵,尤其是API的设计和模块的接口都与Torch高度一致。PyTorch的设计最符合人们的思维,它让用户尽可能地专注于实现自己的想法,即所思即所得,不需要考虑太多关于框架本身的束缚。


  • 活跃的社区:PyTorch提供了完整的文档,循序渐进的指南,作者亲自维护的论坛
    供用户交流和求教问题。Facebook
    人工智能研究院对PyTorch提供了强力支持,作为当今排名前三的深度学习研究机构,FAIR的支持足以确保PyTorch获得持续的开发更新,不至于像许多由个人开发的框架那样昙花一现。

在PyTorch推出不到一年的时间内,各类深度学习问题都有利用PyTorch实现的解决方案在GitHub上开源。同时也有许多新发表的论文采用PyTorch作为论文实现的工具,PyTorch正在受到越来越多人的追捧

作为论文实现的工具,PyTorch正在受到越来越多人的追捧 。
如果说 TensorFlow的设计是“Make It Complicated”,Keras的设计是“Make It
Complicated And Hide It”,那么PyTorch的设计真正做到了“Keep it
Simple,Stupid”。简洁即是美。
使用TensorFlow能找到很多别人的代码,使用PyTorch能轻松实现自己的想法。

下图显示了顶级研究会议接受论文中,使用TensorFlow或Pytorch的比率。可以发现,所有的折线都向上倾,并且在2019年,主要会议的论文中,多数使用的都是PyTorch。

在/
Data,我们不断调查开发者社区,以跟踪并预测不同技术领域的未来趋势。特别是对于机器学习而言,这种竞争至关重要。普遍存在的框架将对机器学习社区在未来几年将采取的路径产生巨大影响。

如果觉得仅靠会议论文数据还不够,这里还有一张图来证明PyTorch在研究社区获得关注的速度。

考虑到这一点,我们询问开发人员,他们说他们参与了数据科学或机器学习他们正在使用的两个框架中的哪一个,他们如何使用它们,以及他们在专业领域做了什么。

下图显示了PyTorch和TensorFlow在各类会议上被提及的次数图。

TensorFlow赢得了比赛,但PyTorch是在同一个控制台上玩吗?

2018年,PyTorch获得的关注还比较少。但现在,大多数人都在使用PyTorch:69%的CVPR、75%以上的NAACL和ACL、50%以上的ICLR和ICML使用的也是PyTorch。

在参与ML或DS的3,000名开发人员中,我们看到43%的人使用PyTorch或TensorFlow。

PyTorch在视觉和语言会议方面的优势最为明显,分别以2:1和3:1的比例超过了TensorFlow。此外可以看到,在ICLR和ICML等通用机器学习会议上,PyTorch也比TensorFlow更受欢迎。

这43%不是在两个框架之间平均分配的。
TensorFlow比PyTorch大3.4倍。总共86%的ML开发人员和数据科学家表示他们目前正在使用TensorFlow,而只有11%的人使用PyTorch。

虽然有人认为PyTorch还是一个全新的框架,并试图在TensorFlow主导的世界中分得一杯羹,但是数据告诉我们并非如此。除了ICML,在NAACL、ICLR和ACL等会议上,TensorFlow今年的论文整体上都比去年少。

此外,PyTorch还有超过50%的社区使用TensorFlow。另一方面,只有15%的TensorFlow社区也使用PyTorch。看起来像TensorFlow是必须的,但PyTorch是一个不错的选择。

也就是说,慌的不是PyTorch,而是TensorFlow。

图片 9

为什么研究人员喜欢PyTorch?

谁在使用PyTorch以及谁正在使用TensorFlow? 每个框架最常用的是什么?

简单。PyTorch类似于numpy,非常Python化,很容易就能与Python生态系统的其余部分集成。例如,可以在PyTorch模型中任何地方添加pdb断点。而在TensorFlow中,调试模型需要一个活动会话,整个过程非常麻烦。

以下是其他与众不同的东西:

API。大多数研究人员更喜欢PyTorch的API而不是TensorFlow的API。部分原因是因为PyTorch的设计更好,还有部分是因为TensorFlow切换其API接口过于频繁(比如“layers”-“slim”-“estimators”-“tf.keras”),这阻碍了其自身的发展。

图片 10

表现。尽管PyTorch的动态图给出的优化机会很少,但许多传闻称PyTorch的速度不比TensorFlow慢多少。目前尚不清楚这是否属实,但至少,TensorFlow在这一方面还没有获得决定性的优势。

这是决定性的。与PyTorch相比,TensorFlow正在生产中使用,并且很可能部署到云中,因为TensorFlow用户的后端体验明显更高(4.8年与PyTorch用户的3.8相比)。

TensorFlow未来的研究方向是什么?

与PyTorch相比,它的社区由更多专业机器学习开发人员,软件架构师和公司内部程序员组成。这很可能是由于Google重点关注通过诸如Tensorflow服务等API进行部署,这已经成为许多开发人员在尝试将数据产品推向生产环境时采用TensorFlow的关键动力。

即使TensorFlow在功能上与PyTorch不相上下,但PyTorch已经覆盖了机器学习社区的大部分。这意味着PyTorch实现将更容易找到,作者将更有动力用PyTorch发布代码,而且你的合作者也很可能会更喜欢PyTorch。因此,任何向TensorFlow
2.0的回迁可能会很慢。

另一方面,PyTorch比TensorFlow更多地用于数据分析和业务环境中的特殊模型。在PyTorch社区中,有更多的Python开发人员(即使用Python作为主要语言的开发人员)从事Web应用程序。

TensorFlow在Google/Deepmind中有一批忠实的用户,但不知道Google最终是否会在这一点上动摇。现在,很多Google想招募的研究人员已经开始喜欢上PyTorch了,我也听到抱怨说Google内部很多研究人员希望使用TensorFlow之外的框架。

此外,这种Pythonic框架的多功能性使研究人员能够测试几乎没有摩擦的想法,因此,它是最先进的尖端解决方案的首选框架。

此外,PyTorch的统治地位很可能会切断谷歌研究人员与其他研究社区的联系。他们不仅难以在外部研究的基础上进行构建,而且外部研究人员也不太可能在谷歌发布的代码基础上进行构建。

延伸阅读:Google I/O大会结束了,这个小细节却被大家忽视了!

TensorFlow
2.0是否能重新俘获回之前的粉丝还有待观察。尽管eager模式很吸引人,但对于Keras
API而言并非如此。

在今年的5月份Google
I/O大会上,除了介绍Coral的性能以及其硬件开发产品,Google还在会上展示了基于Coral硬件(Coral
Dev Board),由国内团队开发出的移动端App——Model Play。据悉,Model Play
是面向全球 AI 开发者的 AI 模型共享市场。

用于产业的PyTorch和TensorFlow

图片 11

虽然PyTorch目前在研究领域占据主导地位,但稍微注意一下就会发现TensorFlow仍然是占据主导地位的框架。

Model Play 不仅为全球开发者提供了 AI 模型展示交流的平台,更能搭配含 Edge
TPU 的 Coral Dev Board 进行使用,加速 ML
推理,通过手机实时预览模型运行效果。

例如,根据2018年到2019年的数据,TensorFlow在招聘的页面上有1541个新工作岗位,而PyTorch有1437个,TensorFlow在Medium上有3230个新文章,而PyTorch有1200篇,TensorFlow在GitHub有13.7K标星,而PyTorch有7.2K。

那为什么PyTorch现在已经如此受研究人员欢迎了,但它在工业上还没有同样的成功呢?

显而易见的第一个答案就是使用习惯。TensorFlow比PyTorch早几年问世,而产业接受新技术的速度要比研究人员慢。

另一个原因就是TensorFlow在产业适应方面优于PyTorch,什么意思呢?要回答这个问题,我们需要知道研究人员和工业界的需求有何不同。

研究人员关心的是他们在研究中迭代的速度有多快,这通常是在相对较小的数据集上,并在8个GPU上就可以运行。这通常不是出于对性能的考虑,而是更关注可以快速实现自己的想法。

而工业界则认为性能是最优先考虑的。虽然运行时速度提高10%对研究人员来意义不大,但这可以直接为公司节省数百万美元。

另一个区别是部署。研究人员一般在自己的机器上或某个专门用于运行研究工作的服务器集群上进行实验。但是在产业上,部署则有一连串的限制与要求。

没有Python。运行Python对服务器的开销太大了;

移动。你不能在移动终端二进制文件中嵌入Python解释器;

服务。需要包罗万象的功能:不用停机更新的模型,在模型之间无缝切换,批处理在预测时间,等等。

TensorFlow就是特别针对这些需求构建的,并为所有这些问题提供了解决方案:网络图格式和执行引擎本身不需要Python,而TensorFlow
Lite和TensorFlow Serving可以分别处理移动终端和服务器需求。

从历史上看,PyTorch在满足这些需求方面做得还不够,因此大多数公司目前在生产中都还是使用TensorFlow。

架构「融合」

2018年末,两件大事彻底改变了这一局面:PyTorch引入了JIT编译器和“TorchScript”,从而引入了基于图的特性;TensorFlow宣布他们将在2.0版本中默认转移到Eager模式。

显然,这些举措都是为了解决PyTorch和TensorFlow各自的弱点。那么这些特性到底是什么,它们能提供什么呢?

PyTorch TorchScript

PyTorch JIT是PyTorch的一个中间表示(intermediate
representation,IR),称为TorchScript。Torchscript是PyTorch的“图”表示。你可以通过使用跟踪或脚本模式将常规PyTorch模型转换为TorchScript。跟踪接受一个函数和一个输入,记录用该输入执行的操作,并构造IR。

虽然很简单,但是跟踪也有它的缺点。例如,它不能捕获未执行的控制流。例如,如果它执行了true块,它就不能捕获条件块的false块。

Script模式接受一个函数/类,重新解释Python代码并直接输出TorchScript
IR。这允许它支持任意代码,但是它实际上需要重新解释Python。

一旦PyTorch模型进入了这个IR,我们就可以获得图模式的所有优势。我们既可以在C++中部署PyTorch模型,而不依赖Python,或者对其进行优化。

TensorFlow Eager

在API级别上,TensorFlow Eager模式基本上与PyTorch
Eager模式相同,后者最初由Chainer推出,这为TensorFlow提供了PyTorchEager模式的大部分优势

然而,这也给TensorFlow带来了同样的缺点。TensorFlow
Eager模型不能导出到非python环境中,也不能进行优化,不能在移动设备上运行。

这将TensorFlow置于与PyTorch相同的位置,它们的解析方式基本相同——你可以跟踪代码或重新解释Python代码。

因此,TensorFlow的Eager模式并不能真正做到“两全其美”。虽然可以使用tf.function注释将eager
code转换为静态图,但这永远不会是一个无缝转换的流程(PyTorch的TorchScript也有类似的问题)。跟踪基本上是有限的,重新解释Python代码实际上需要重写Python编译器的大部分内容。

当然,通过限制在深度学习中使用的Python子集,范围可以大大简化。

在默认启用Eager模式时,TensorFlow将强迫用户做出选择——为了便于使用而Eager执行,并且需要为部署而重写,或者根本不使用急于执行。

虽然这与PyTorch的情况相同,但PyTorch的TorchScript的可选择加入特性可能比TensorFlow的“默认Eager”更容易接受。

机器学习框架的现状

PyTorch在研究领域领先,并试图扩展到工业领域。而TensorFlow正试图在不牺牲太多产业优势的情况下,更多的参与到研究领域。

PyTorch要在行业中产生有意义的影响肯定还需要很长时间,毕竟TensorFlow在产业界的影响力已经根深蒂固。然而,从TensorFlow
1.0到2.0的转换为企业评估PyTorch提供了一个绝佳的机会。

至于未来,将取决于谁能最好地解决以下问题。

研究者偏好对产业的影响有多大?随着当前一批博士研究生开始毕业,他们也许会带上用惯的PyTorch。这种势头是否足够明显,以至于公司会选择PyTorch用于招聘的条件?同时毕业生会在PyTorch的基础上创业吗?

TensorFlow的Eager模式在可用性上能赶上PyTorch吗?就网上的反应来看,TensorFlow
Eager严重受到性能/内存方面问题的困扰,而且Autograph也有自己的问题。谷歌将花费大量的工程努力,但TensorFlow还是背负着历史包袱

PyTorch满足产业需求的速度有多快?PyTorch还有许多没有解决的基本问题——没有好的量化支持、不支持移动等等。在这些问题得到解决之前,PyTorch甚至不会成为许多公司的选择。PyTorch能否为企业提供一个足够吸引人的故事来进行转型?注意:PyTorch已经宣布支持量化和移动。虽然两者都还处于试验阶段,但代表了PyTorch在这方面的重大进展。

谷歌在行业中的孤立会伤害TensorFlow吗?谷歌推动TensorFlow的主要原因之一是帮助其蓬勃发展的云服务。由于谷歌试图拥有整个机器学习垂直领域,这促使谷歌与之竞争的公司支持只能支持PyTorch。

下一步怎么走?

机器学习框架在多大程度上影响了机器学习的研究呢?

它不仅使机器学习研究成为可能,更让研究人员能够更轻松地探索。有多少新的想法因为没有简单的方法在框架中表达而被扼杀?PyTorch已经达到了研究的本地极小值,但是值得研究的其他框架提供了什么?还有什么样的研究机会?

计算高阶导数的问题

PyTorch和TensorFlow的核心是自动差异化框架,它能对某个函数求导。实现自动微分的方法有很多,大多数现代机器学习框架所选择的方法被称为“逆向模式自动微分”,也就是通常所说的“反向传播”。对神经网络的衍生而言,这种实现是非常有效的。

然而,在计算高阶导数(Hessian/Hessian Vector
Products)时,就出问题了。有效地计算需要“正向模式自动微分”,如果没有这个功能,Hessian
Vector Products的计算速度就会降低一个数量级。

Jax是由最初建造Autograd的同一批人创建的,它具有正向和反向模式自动分化的功能,这使得计算高阶导数的速度比PyTorch/TensorFlow的更快。

并且,Jax不仅能计算高阶导数,Jax开发人员将Jax视为组成任意函数转换的框架,包括vmap或pmap。

Jax最初的使用者主要是大学毕业生(尽管没有GPU支持,但ICML有11篇论文使用了它),但相信Jax很快就会找到一个类似的忠实粉丝社区,用它来做各种n阶导数。

不够灵活!

当运行PyTorch/TensorFlow模型时,大部分工作实际上并不是在框架本身中完成的,而是由第三方内核完成的。这些内核通常由硬件供应商提供,类似于MKLDNN或cuDNN,由高级框架可以利用的操作符库组成。高级框架将计算图表分解成块,然后调用计算库。这些库代表了数千小时的工作量,并针对体系结构和应用程序进行优化以获得最佳性能。

然而,最近非标准硬件、稀疏/量子化张量和新运算符的流行暴露了依赖这些运算符库的一个缺陷:它们不够灵活!如果你想在研究中使用像胶囊网络这样的新操作怎么办?现有的解决方案还不够完善。正如本文所说,现有的胶囊网络在GPU上的实现比最优实现慢2个数量级。

每个新的硬件体系结构、张量或算子的类别,都大大增加了问题的难度。目前已经有许多处理工具,如Halide、TVM、PlaidML、TensorComprehensions、XLA、Taco等,但是正确的方法还没找到。

如果没有解决这个问题,我们就会面临机器学习研究与工具过度匹配的风险。

机器学习框架的未来

对于TensorFlow和PyTorch的未来,他们的设计已经趋于一致,任何一个框架都不会凭借其设计而取得最终胜利,每一方也都有自己的地盘——一方拥有研究,另一方拥有工业。

就我个人而言,在PyTorch和TensorFlow之间,我会觉得PyTorch更有胜算。因为机器学习仍然是一个研究驱动的领域,工业界不能忽视研究成果,只要PyTorch在研究领域占据主导地位,企业就只有被迫转型。

然而,跑得足够快的不仅仅是框架。机器学习研究本身也处于一个巨大的变革中。不仅框架发生了变化,5年来使用的模型、硬件、范式与我们今天使用的截然不同。未来也许PyTorch和TensorFlow之间的战争将变得无关紧要,因为另一种计算模型或将占据主导地位。

在所有这些相互冲突的利益中,机器学习投入了大量资金,退一步想想其实也不错。大多数从事机器学习软件的工作不是为了赚钱,也不是为了协助公司的战略计划,而是想要推进机器学习的研究,关心人工智能民主化,也或许他们只是想创造一些很酷的东西。

所以,不管你更喜欢TensorFlow还是PyTorch,它们的目的只有一个,就是想让机器学习做到最好。