PyTorch还是TensorFlow?这有一份新手指南

简介:

当你假装AI专家时,不要谈众人皆知的TensorFlow,那谈什么?


PyTorch。


其实这也不全然都是调侃。和TensorFlow相比,PyTorch确实也有为数不少的拥趸。根据Keras作者François Chollet发布的数据显示:GitHub上的各种深度学习框架中,PyTorch排在第五位。


但需要提醒大家的是,PyTorch可是今年1月19日才正式发布。


 二季度深度学习框架排名


最近,斯坦福大学研究机器学习的博士生Awni Hannun,围绕PyTorch还是TensorFlow这个话题,做了一个深入的比较。量子位把内容传送如下:


我写的这份指南,主要对比了PyTorch和TensorFlow之间的区别。希望对那些想着手开始一个新项目或者考虑转换深度学习框架的人有所帮助。


我主要考察了深度学习堆栈的训练和部署时,相关的可编程性和灵活性。在这里,我不会过多的谈论速度、内存占用等方面的权衡。


先放结论


PyTorch更有利于研究人员、爱好者、小规模项目等快速搞出原型。而TensorFlow更适合大规模部署,特别是需要跨平台和嵌入式部署时。


然后咱们一项一项分着说。



上手时间


赢家:PyTorch


PyTorch本质上是Numpy的替代者,而且支持GPU、带有高级功能,可以用来搭建和训练深度神经网络。如果你熟悉Numpy、Python以及常见的深度学习概念(卷积层、循环层、SGD等),会非常容易上手PyTorch。


而TensorFlow可以看成是一个嵌入Python的编程语言。你写的TensorFlow代码会被Python编译成一张图,然后由TensorFlow执行引擎运行。我见过好多新手,因为这个增加的间接层而困扰。也正是因为同样的原因,TensorFlow有一些额外的概念需要学习,例如会话、图、变量作用域(variable scoping)、占位符等。


另外还需要更多的样板代码才能让一个基本的模型运行。所以TensorFlow的上手时间,肯定要比PyTorch长。


图创建和调试


赢家:PyTorch


创建和运行计算图可能是两个框架最不同的地方。在PyTorch中,图结构是动态的,这意味着图在运行时构建。而在TensorFlow中,图结构是静态的,这意味着图先被“编译”然后再运行。


举一个简单的例子,在PyTorch中你可以用标准的Python语法编写一个for循环结构:



此处T可以在每次执行代码时改变。而TensorFlow中,这需要使用“控制流操作”来构建图,例如tf.while_loop。TensorFlow确实提供了dynamic_rnn用于常见结构,但是创建自定义动态计算真的更加困难。


PyTorch中简单的图结构更容易理解,更重要的是,还更容易调试。调试PyTorch代码就像调试Python代码一样。你可以使用pdb并在任何地方设置断点。调试TensorFlow代码可不容易。要么得从会话请求要检查的变量,要么学会使用TensorFlow的调试器(tfdbg)。


全面性


赢家:TensorFlow


随着PyTorch逐渐成熟,我预计这部分的差距会趋近于零。但目前,TensorFlow还是有一些PyTorch不支持的功能。它们是:


  • 沿维翻转张量(np.flip, np.flipud, np.fliplr)

  • 检查无穷与非数值张量(np.is_nan, np.is_inf)

  • 快速傅里叶变换(np.fft)


这些TensorFlow都支持。另外,TensorFlow的contrib软件包中,有更多PyTorch没有的高级功能和模型。


序列化


赢家:TensorFlow


两种框架下保存和加载模型都很简单。PyTorch有一个特别简单的API,可以保存模型的所有权重或pickle整个类。TensorFlow的Saver对象也很易用,而且为检查提供了更多的选项。


TensorFlow序列化的主要优点是可以将整个图保存为protocol buffer。包括参数和操作。然而图还能被加载进其他支持的语言(C++、Java)。这对于部署堆栈至关重要。理论上,当你想改动模型源代码但仍希望运行旧模型时非常有用。


部署


赢家:TensorFlow


对于小规模的服务器端部署(例如一个Flask web server),两个框架都很简单。

对于移动端和嵌入式部署,TensorFlow更好。不只是比PyTorch好,比大多数深度学习框架都要要。使用TensorFlow,部署在Android或iOS平台时只需要很小的工作量,至少不必用Java或者C++重写模型的推断部分。


对于高性能服务器端的部署,还有TensorFlow Serving能用。除了性能之外,TensorFlow Serving一个显著的优点是可以轻松的热插拔模型,而不会使服务失效。


文档

赢家:平手


对于两个框架,我都在文档中找到所需的一切。Python API被很好的记录,以及有足够的案例和教程来学习框架。


一个特例是,PyTorch的C库大多数没有文档。不过,这只有在你编写一个定制化的C扩展时才有影响。


数据加载

赢家:PyTorch


PyTorch中用于加载数据的API设计的很棒。接口由一个数据集、一个取样器和一个数据加载器构成。数据加载器根据取样器的计划,基于数据集产生一个迭代器。并行化数据加载简单的就像把num_workers参数传递给数据加载器一样简单。


我在TensorFlow中没有发现特别有用的数据加载工具。很多时候,并不总能直接把准备并行运行的预处理代码加入TensorFlow图。以及API本身冗长难学。


设备管理


赢家:TensorFlow


TensorFlow的设备管理非常好用。通常你不需要进行调整,因为默认的设置就很好。例如,TensorFlow会假设你想运行在GPU上(如果有的话)。而在PyTorch中,即使启用了CUDA,你也需要明确把一切移入设备。


TensorFlow设备管理唯一的缺点是,默认情况下,它会占用所有的GPU显存。简单的解决办法是指定CUDA_VISIBLE_DEVICES。有时候大家会忘了这一点,所以GPU在空闲的时候,也会显得很忙。


在PyTorch中,我发现代码需要更频繁的检查CUDA是否可用,以及更明确的设备管理。在编写能够同时在CPU和GPU上运行的代码时尤其如此。以及得把GPU上的PyTorch变量转换为Numpy数组,这就显得有点冗长。



自定义扩展

赢家:PyTorch


两个框架都可以构建和绑定用C、C++、CUDA编写的自定义扩展。TensorFlow仍然需要更多的样板代码,尽管这对于支持多类型和设备可能更好。在PyTorch中,你只需为每个CPU和GPU编写一个接口和相应的实现。两个框架中编译扩展也是直接记性,并不需要在pip安装的内容之外下载任何头文件或者源代码。


关于TensorBoard



TensorBoard是TensorFlow自带的可视化工具,用来查看机器学习训练过程中数据的变化。通过训练脚本中的几个代码段,你可以查看任何模型的训练曲线和验证结果。TensorBoard作为web服务运行,特别便于对于无头结点上存储的结果进行可视化。


如果没有类似的功能,我可不想用PyTorch。不过还好,借助两个开源项目可以实现。第一个是tensorboard_logger,第二个是crayon。


tensorboard_logger库用起来甚至比TensorBoard的“摘要”更容易,尽管想用这个首先得安装TensorBoard。


crayon可以完全替代TensorBoard,但是需要更多的设置(docker是先决条件)。


关于Keras


Keras是具有可配置后端的高级API。目前TensorFlow、Theano、CNTK都支持。也许不久的将来,PyTorch也会提供支持。作为tf.contrib的一部分,Keras也随TensorFlow一起分发。


虽然上面我没有讨论过Keras,但其API特别容易使用,这也是配合常见深度神经网络架构最快的方式。不过,使用API毕竟没有使用PyTorch或者核心TensorFlow那么灵活。


Keras是许多常用的深层神经网络架构中运行最快的方法之一。


关于TensorFlow Fold


今年2月,谷歌推出了TensorFlow Fold。这个库建立在TensorFlow智商,允许构建更多的动态图。这个库的主要优势是动态批处理。动态批处理可以自动对不同大小的输入进行批量计算(例如解析树上的循环网络)。


可编程性方面,语法不像PyTorch那么简单,当然在某些情况下,批处理带来的性能提升还是值得考虑。


好了,以上就是来自Awni Hannun的分享。希望对大家有所帮助,另外兼听则明,量子位继续搬运几条reddit上读者的评论。


读者Reiinakano:


我不觉得“文档”环节双方平分秋色。

官方的TensorFlow文档很差劲。比方,在PyTorch文档中,对于迁移学习的讲解,使用了实际、有用的代码,而且还解释了构建的方式。而在TensorFlow的文旦中,整个讲解就是运行了一个bash scripts,没有任何实际代码。


读者ThaHypnotoad:


PyTorch还有很长的路要走。前几天我发现int tensor没有neg()定义。不过,我更讨厌调试静态图。所以我选择忍受PyTorch成长的烦恼。


读者trias10:


另一个缺点是,PyTorch没有对Windows的官方支持,而TensorFlow有。很多场合(通常是金融和保险行业)使用Windows进行开发和原型设计,用Linux进行生产部署,所以你需要一个能对两者都支持的框架。


好啦,今天先谈到这里。希望对你有所帮助~


原文发布时间为:2017-08-24

本文来自云栖社区合作伙伴“数据派THU”,了解相关信息可以关注“数据派THU”微信公众号

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
29天前
|
并行计算 PyTorch TensorFlow
Ubuntu安装笔记(一):安装显卡驱动、cuda/cudnn、Anaconda、Pytorch、Tensorflow、Opencv、Visdom、FFMPEG、卸载一些不必要的预装软件
这篇文章是关于如何在Ubuntu操作系统上安装显卡驱动、CUDA、CUDNN、Anaconda、PyTorch、TensorFlow、OpenCV、FFMPEG以及卸载不必要的预装软件的详细指南。
2668 3
|
2月前
|
数据挖掘 PyTorch TensorFlow
|
30天前
|
PyTorch TensorFlow 算法框架/工具
Jetson环境安装(一):Ubuntu18.04安装pytorch、opencv、onnx、tensorflow、setuptools、pycuda....
本文提供了在Ubuntu 18.04操作系统的NVIDIA Jetson平台上安装深度学习和计算机视觉相关库的详细步骤,包括PyTorch、OpenCV、ONNX、TensorFlow等。
38 1
Jetson环境安装(一):Ubuntu18.04安装pytorch、opencv、onnx、tensorflow、setuptools、pycuda....
|
30天前
|
并行计算 PyTorch TensorFlow
环境安装(一):Anaconda3+pytorch1.6.0+cuda10.0+cudnn7.6.4+tensorflow1.15+pycocotools+pydensecrf
这篇文章详细介绍了如何在Anaconda环境下安装和配置深度学习所需的库和工具,包括PyTorch 1.6.0、CUDA 10.0、cuDNN 7.6.4、TensorFlow 1.15、pycocotools和pydensecrf,并提供了pip国内镜像源信息以及Jupyter Notebook和Anaconda的基本操作。
86 0
环境安装(一):Anaconda3+pytorch1.6.0+cuda10.0+cudnn7.6.4+tensorflow1.15+pycocotools+pydensecrf
|
3月前
|
机器学习/深度学习 PyTorch TensorFlow
conda、anaconda、pip、pytorch、tensorflow有什么关联?
conda、anaconda、pip、pytorch、tensorflow有什么关联?
|
2月前
|
机器学习/深度学习 数据挖掘 TensorFlow
解锁Python数据分析新技能,TensorFlow&PyTorch双引擎驱动深度学习实战盛宴
在数据驱动时代,Python凭借简洁的语法和强大的库支持,成为数据分析与机器学习的首选语言。Pandas和NumPy是Python数据分析的基础,前者提供高效的数据处理工具,后者则支持科学计算。TensorFlow与PyTorch作为深度学习领域的两大框架,助力数据科学家构建复杂神经网络,挖掘数据深层价值。通过Python打下的坚实基础,结合TensorFlow和PyTorch的强大功能,我们能在数据科学领域探索无限可能,解决复杂问题并推动科研进步。
58 0
|
2月前
|
机器学习/深度学习 数据挖掘 TensorFlow
从数据小白到AI专家:Python数据分析与TensorFlow/PyTorch深度学习的蜕变之路
【9月更文挑战第10天】从数据新手成长为AI专家,需先掌握Python基础语法,并学会使用NumPy和Pandas进行数据分析。接着,通过Matplotlib和Seaborn实现数据可视化,最后利用TensorFlow或PyTorch探索深度学习。这一过程涉及从数据清洗、可视化到构建神经网络的多个步骤,每一步都需不断实践与学习。借助Python的强大功能及各类库的支持,你能逐步解锁数据的深层价值。
62 0
|
3月前
|
UED 开发者
哇塞!Uno Platform 数据绑定超全技巧大揭秘!从基础绑定到高级转换,优化性能让你的开发如虎添翼
【8月更文挑战第31天】在开发过程中,数据绑定是连接数据模型与用户界面的关键环节,可实现数据自动更新。Uno Platform 提供了简洁高效的数据绑定方式,使属性变化时 UI 自动同步更新。通过示例展示了基本绑定方法及使用 `Converter` 转换数据的高级技巧,如将年龄转换为格式化字符串。此外,还可利用 `BindingMode.OneTime` 提升性能。掌握这些技巧能显著提高开发效率并优化用户体验。
59 0
|
3月前
|
机器学习/深度学习 PyTorch TensorFlow
深度学习框架之争:全面解析TensorFlow与PyTorch在功能、易用性和适用场景上的比较,帮助你选择最适合项目的框架
【8月更文挑战第31天】在深度学习领域,选择合适的框架至关重要。本文通过开发图像识别系统的案例,对比了TensorFlow和PyTorch两大主流框架。TensorFlow由Google开发,功能强大,支持多种设备,适合大型项目和工业部署;PyTorch则由Facebook推出,强调灵活性和速度,尤其适用于研究和快速原型开发。通过具体示例代码展示各自特点,并分析其适用场景,帮助读者根据项目需求和个人偏好做出明智选择。
65 0
|
5月前
|
机器学习/深度学习 人工智能 算法
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
乐器识别系统。使用Python为主要编程语言,基于人工智能框架库TensorFlow搭建ResNet50卷积神经网络算法,通过对30种乐器('迪吉里杜管', '铃鼓', '木琴', '手风琴', '阿尔卑斯号角', '风笛', '班卓琴', '邦戈鼓', '卡萨巴', '响板', '单簧管', '古钢琴', '手风琴(六角形)', '鼓', '扬琴', '长笛', '刮瓜', '吉他', '口琴', '竖琴', '沙槌', '陶笛', '钢琴', '萨克斯管', '锡塔尔琴', '钢鼓', '长号', '小号', '大号', '小提琴')的图像数据集进行训练,得到一个训练精度较高的模型,并将其
71 0
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
下一篇
无影云桌面