参考链接
PyTorch VS TensorFlow
介绍
人工神经网络(ANNs)在多种监督学习任务中展现出卓越性能,但手动编程ANN具有挑战性。因此,出现了像TensorFlow和PyTorch这样的框架,旨在简化深度学习模型的创建、服务和扩展。随着近年来对深度学习的兴趣增加,出现了大量的机器学习工具。这些框架提供了神经网络单元、成本函数和优化器,用于组装和训练神经网络模型。在分析大型复杂数据集时,使用人工神经网络进行推断和预测是一种重要方法。TensorFlow和PyTorch是两个广泛使用的支持人工神经网络模型的机器学习框架。
文章内容
文章基于最近的研究比较了PyTorch和TensorFlow两个框架在训练时间、内存使用和易用性方面的有效性和差异。你将了解到:
- PyTorch与TensorFlow的特点
- 性能、准确性、训练以及易用性的对比
- 两者的主要区别
- 一个完整的比较表
TensorFlow 和 PyTorch 的关键特性
TensorFlow 概述
TensorFlow是一个广受欢迎的端到端开源机器学习平台,最初由谷歌大脑团队的研究人员和工程师开发。它支持多种执行平台如CPU、GPU、TPU和移动设备。TensorFlow被多个国际公司和大学采用,提供高层次API Keras以及为边缘设备设计的TensorFlow Lite。此外,TensorFlow Serving支持在生产环境中部署机器学习模型,而Viso Suite平台则为TensorFlow模型提供端到端的自动化服务。
TensorFlow优点
- 支持和库管理:TensorFlow由谷歌支持,并经常发布新功能。它在生产环境中被广泛使用。
- 开源:TensorFlow是一个非常流行的开源平台,广泛的用户都可以使用。
- 数据可视化:TensorFlow提供了一个名为TensorBoard的工具来图形化地可视化数据。它还允许轻松调试节点,减少查看整个代码的工作量,并有效地解决神经网络问题。- - Keras兼容性:TensorFlow与Keras兼容,这允许其用户编写一些高级功能部分,并向TensorFlow提供系统特定的功能(管道,估计器等)。
- 可扩展性强:TensorFlow部署在每台机器上的特点允许其用户开发任何类型的系统。
- 兼容性:TensorFlow与许多语言兼容,如c++、JavaScript、Python、c#、Ruby和Swift。这允许用户在他们感到舒适的环境中工作。
- 架构支持:由于工作模型的并行性,TensorFlow被用作硬件加速库。它在GPU和CPU系统中使用不同的分布策略。TensorFlow也有它的架构TPU,它的计算速度比GPU和CPU快。因此,使用TPU构建的模型可以很容易地以更便宜的速度部署在云上,并以更快的速度执行。然而,TensorFlow的架构TPU只允许执行模型,而不允许训练模型。
TensorFlow缺点
- 基准测试:与竞争对手相比,计算速度是TensorFlow落后的地方。与其他框架相比,它的可用性较差。
- 依赖:尽管TensorFlow减少了代码的长度,使用户更容易访问它,但它增加了使用的复杂性。每一段代码都需要使用任何平台来执行,这增加了执行的依赖性。
- 符号循环:TensorFlow在为不定序列提供符号循环方面滞后。它可以用于确定的序列,这使它成为一个可用的系统。因此,它被称为低级API。
- GPU支持:最初,TensorFlow只有NVIDIA支持GPU, Python支持GPU编程,这是一个缺点,因为在深度学习中有其他语言的增加。TensorFlow分布策略是一种TensorFlow API,用于在多个gpu、多台机器或tpu上分布训练。使用此API,您可以使用最小的代码更改来分发现有模型和训练代码。
PyTorch 概述
PyTorch于2016年首次引入,强调可用性和性能。它提供了一种命令式的python编程风格,支持代码作为模型,使调试变得容易,并且与其他流行的科学计算库保持一致,同时保持高效并支持硬件加速器(如gpu)。开源深度学习框架是一个Python库,可立即执行动态张量计算,并具有自动微分和GPU加速功能,同时保持与当前最快的深度学习库相当的性能。今天,它的大部分核心是用c++编写的,这是PyTorch与其他框架相比可以实现更低开销的主要原因之一。PyTorch 2.0标志着PyTorch框架的一个重大进步,在保持向后兼容性和以python为中心的方法的同时提供了增强的性能。对于移动部署,PyTorch提供了从Python到iOS和Android平台的实验性端到端工作流支持,包括用于移动ML集成和预处理任务的API扩展。PyTorch适合于自然语言处理(NLP)任务,以使用深度学习为智能语言应用提供支持。
此外,PyTorch为ONNX(开放神经网络交换)格式提供原生支持,允许无缝模型导出并与ONNX兼容的平台和工具兼容。多个流行的深度学习软件和面向研究的项目都是基于PyTorch构建的,包括Tesla Autopilot或Uber的Pyro。
PyTorch优势
- PyTorch基于Python: PyTorch以Python为中心或“Python风格”,旨在与Python代码深度集成,而不是作为用其他语言编写的库的接口。Python是数据科学家最常用的语言之一,也是构建机器学习模型和ML研究最常用的语言之一。
- 更容易学习:因为它的语法类似于传统的编程语言,如Python, PyTorch比其他深度学习框架更容易学习。
- 调试:PyTorch可以使用许多广泛可用的Python调试工具之一进行调试(例如,Python的pdb和ipdb工具)。
- 动态计算图:PyTorch支持动态计算图,这意味着网络行为可以在运行时以编程方式更改。这使得优化模型更加容易,并使PyTorch比其他将神经网络视为静态对象的机器学习框架具有主要优势。
- 数据并行:数据并行特性允许PyTorch在多个CPU或GPU核心之间分配计算工作。虽然这种并行性可以在其他机器学习工具中完成,但在PyTorch中要容易得多。
- 社区:PyTorch有一个非常活跃的社区和论坛(discuss.pytorch.org)。它的文档(pytorch.org)非常有条理,对初学者很有帮助;它与PyTorch发布保持同步,并提供一组教程。PyTorch使用起来非常简单,这也意味着开发人员的学习曲线相对较短。
- 分布式训练:PyTorch为集体操作的异步执行和端到端通信提供原生支持,可从Python和c++访问。
PyTorch的缺点:
- 缺乏在生产中服务的模型:虽然这在未来将会改变,但其他框架已经被更广泛地用于实际生产工作(即使PyTorch在研究社区中变得越来越流行)。因此,与其他框架相比,文档和开发者社区更小。
- 有限的监控和可视化界面:虽然TensorFlow也提供了一个强大的可视化工具来构建模型图(TensorBoard),但PyTorch还没有这样的东西。因此,开发人员可以使用许多现有的Python数据可视化工具之一,或外部连接到TensorBoard。
- 没有TensorFlow那么广泛:PyTorch不是一个端到端的机器学习开发工具;实际应用程序的开发需要将PyTorch代码转换为另一个框架,如Caffe2,以便将应用程序部署到服务器、工作站和移动设备上。
TensorFlow与PyTorch的比较
性能比较
下面的性能基准测试旨在通过将PyTorch与流行的基于图的深度学习框架TensorFlow进行比较,来展示PyTorch的单机热切模式性能的整体比较。表中显示了使用32位浮点数的两个模型的训练速度。对于AlexNet、VGG-19、ResNet-50和MobileNet模型,吞吐率以每秒图像数为单位,对于GNMTv2模型,以每秒令牌数为单位,对于NCF模型,以每秒样本数为单位。基准测试表明,与TensorFlow相比,PyTorch的性能更好,这可以归因于这些工具将大部分计算卸载给了相同版本的cuDNN和cuBLAS库。
精度
PyTorch和Tensorflow的精度图(见下文)显示了两个框架的精度有多相似。对于这两个模型,随着模型开始记忆它们正在训练的信息,训练精度不断提高。验证精度表示模型在训练过程中实际学习的程度。对于这两个模型,经过20个epoch后,两个框架中的模型的验证精度平均约为78%。因此,两个框架都能够准确地实现神经网络,并能够在给定相同的模型和数据集进行训练的情况下产生相同的结果。
训练时间和内存使用
上图显示了TensorFlow和PyTorch的训练时间。这表明TensorFlow的训练时间明显更高(TensorFlow的平均训练时间为11.19秒,而PyTorch的平均训练时间为7.67秒)。虽然在谷歌协作实验室中,模型训练时间的持续时间每天都有很大变化,但TensorFlow和PyTorch之间的相对持续时间保持一致。TensorFlow训练期间的内存使用率(1.7 GB RAM)明显低于PyTorch的内存使用率(3.5 GB RAM)。然而,两个模型在训练期间的内存使用情况略有差异,并且在初始加载数据期间的内存使用较高:TensorFlow为4.8 GB, PyTorch为5 GB。
易用性
PyTorch更面向对象的风格使实现模型更耗时。此外,与TensorFlow相比,PyTorch的数据处理规范更直接。另一方面,由于神经网络结构的底层实现,TensorFlow的学习曲线略陡峭。因此,它的低级方法允许更自定义的方法来形成神经网络,允许更专门的特征。此外,非常高级的Keras库运行在TensorFlow之上。因此,作为一个教学工具,非常高级的Keras库可以用于教授基本概念,然后可以通过布局更多的结构来使用TensorFlow来进一步理解概念。
PyTorch与TensorFlow的区别——总结
对于“PyTorch和TensorFlow,哪个更好?”取决于用例和应用,但有几个重要的方面需要考虑:一般来说,TensorFlow和PyTorch的实现表现出相同的准确性。然而,TensorFlow的训练时间明显更高,但内存使用量更低。PyTorch比TensorFlow允许更快地进行原型设计,但如果神经网络需要自定义功能,TensorFlow可能是更好的选择。TensorFlow将神经网络视为静态对象;如果你想改变模型的行为,你必须从头开始。使用PyTorch,神经网络可以在运行时进行调整,使其更容易优化模型。另一个主要区别在于开发人员如何进行调试。使用TensorFlow进行有效调试需要一个特殊的调试器工具,使您能够检查网络节点在每个步骤中如何进行计算。PyTorch可以使用许多广泛可用的Python调试工具之一进行调试。PyTorch和TensorFlow都提供了加速模型开发和减少样板代码数量的方法。然而,PyTorch和TensorFlow之间的核心区别在于PyTorch更“python化”,基于面向对象的方法。同时,TensorFlow提供了更多的选项供选择,从而通常具有更高的灵活性。对于许多熟悉Python的开发人员来说,这是Pytorch比TensorFlow更好的一个重要原因。
特性比较表
特性 | PyTorch | TensorFlow |
---|---|---|
易用性 | 语法更符合Python,调试更容易 | 学习曲线较陡,需要更多模板代码 |
动态计算图 | 运行时更容易修改 | 需要重新编译才能修改 |
GPU 支持 | 设置和使用多GPU更简单 | 多GPU支持更复杂,需要更多设置,有专门的TF API |
社区支持 | 相对较新,发展迅速 | 大型且活跃,资源丰富 |
生态系统 | 与TensorFlow相比库和工具较少 | 拥有广泛的预构建模型和工具库 |
调试 | 由于Python语法和动态计算图,调试更容易 | 由于静态计算图,调试可能更具挑战性 |
研究应用 | 由于其灵活性和易用性,常用于研究 | 由于速度和可扩展性,常用于生产应用 |
数学库 | 使用TorchScript进行张量操作,NumPy进行数值计算 | 使用自有数学库进行张量操作和数值计算 |
Keras 集成 | 没有原生Keras集成 | 有原生Keras集成,简化模型构建和训练 |