1.1.2 深度学习框架比较
深度学习框架通过将深度学习算法模块化封装能够实现模型的快速训练、测试与调优,为技术应用的预测与决策提供有力支持,当前人工智能生态的朝气蓬勃与深度学习框架的百家齐放可谓相辅相成,相互成就。
以Python为代表的深度学习框架主要有谷歌的TensorFlow、Facebook的PyTorch、Theano、MXNET、微软的CNTK等,如何选择和搭建适合的开发环境对今后的学习与提高十分重要。从GitHub查看架构的讨论热度、各大顶级会议的选择而言,TensorFlow和PyTorch无疑是当前受众广、热度高的两种深度学习框架。
1.TensorFlow简介
TensorFlow的前身是2011年Google Brain内部孵化项目DistBelief,它是一个为深度神经网络构建的机器学习系统。经过Google公司内部的锤炼后,在2015年11月9日,对外发布了TensorFlow,并于2017年2月发布了1.0.0版本,这标志着TensorFlow稳定版本的诞生。2018年9月,TensorFlow 1.2版本发布,并将Keras融入TensorFlow,作为TensorFlow的高级API,这也标志着TensorFlow在面向数百万新用户开源的道路上迈出了最重要的一步。2021年5月发布了TensorFlow 2.5.0的正式版,包括对于分布式训练和混合精度新功能的支持、对NumPy API子集的试验性支持以及一些用于监测性能瓶颈的新工具,使得TensorFlow的功能空前强大。
2.PyTorch简介
相比TensorFlow而言,PyTorch则比较年轻。2017年1月,由Facebook人工智能研究院(FAIR)基于Torch推出了PyTorch,并于2018年5月正式公布PyTorch 1.0版本,这个新的框架将PyTorch 0.4与贾扬清的Caffe2合并,并整合ONNX格式,让开发者可以无缝地将AI模型从研究转到生产,而无须处理迁移。新的稳定版是PyTorch 1.9.1,2021年9月对外发布,包含很多新的API,如支持NumPy兼容的FFT操作、性能分析工具,以及对基于分布式数据并行(Distributed Data Paralle,DDP)和基于远程过程调用(Remote Procedure Call,RPC)的分布式训练,PyTorch官方还开源了很多新工具和库,使得PyTorch的众多功能向TensorFlow趋同,同时保有自身原有的特性,竞争力得到极大增强。
3.两种框架的比较
下面对TensorFlow和PyTorch在研究领域的使用现状进行详细分析,统计结果主要是基于5大顶级会议论文的使用率来比较趋势,研究领域的关键统计结果展示如表1-1所示。
表1-1 会议论文中深度学习框架的使用率
从表1-1可以发现,在2019年,研究领域PyTorch的使用率飞速提升,69%的CVPR论文、75%以上的NAACL和ACL论文以及50%以上的ICLR和ICML论文都选择使用PyTorch,可谓迅速获得研究人员的青睐,而TensorFlow则没有如此耀眼的数据。
一个良好的深度学习框架应该具备优化的性能、易于理解的框架与编码、良好的社区支持、并行化的进程以及自动计算梯度等特征,TensorFlow和PyTorch在这些方面都有良好的表现,为了更为细致地比较两者之间的差异优势,下面将对新版TensorFlow 2.5版本和PyTorch 1.9版本先从运行机制、训练模式、可视化情况、生产部署等方面进行差异比较,再通过细化特征进行定性比较,最后归类对应适用场景的建议。
(1)运行机制
两个框架都是在张量上进行运算,并将任意一个模型看成是有向无环图(Direct Acyclic Graph,DAG),但TensorFlow遵循“数据即代码,代码即数据”的理念,当在TensorFlow中运行代码时,DAG是以静态方式定义的,若需要实现动态DAG,则需要借助TensorFlow Fold库;而PyTorch属于更Python化的框架,动态DAG是内置的,可以随时定义、随时更改、随时执行节点,并且没有特殊的会话接口或占位符,相当灵活。
(2)训练模式
在分布式训练中,TensorFlow和PyTorch的一个主要差异特点是数据并行化,使用TensorFlow时,使用者必须手动编写代码,并微调在特定设备上运行的每个操作,以实现分布式训练;而PyTorch则是利用异步执行的本地支持来实现的,其自身在分布式中的训练是比较欠缺的。
(3)可视化情况
在可视化方面,TensorFlow内置的TensorBoard非常强大,能够显示模型图,绘制标量变量,实现图像、嵌入可视化,甚至是播放音频等功能;反观PyTorch的可视化情况,则显得有点差强人意,开发者可以使用Visdom,但是Visdom提供的功能很简单且有限,可视化效果远远比不上TensorBoard。
(4)生产部署
对于生产部署而言,TensorFlow具有绝对的优势,它可以直接使用TensorFlow Serving在TensorFlow中部署模型;而PyTorch没有提供任何用于在网络上直接部署模型的框架,需要使用Flask或者另一种替代方法来基于模型编写一个RESTAPI。
(5)适用场景建议
当需要拥有丰富的入门资源、开发大型生产模型、可视化要求较高、大规模分布式模型训练时,TensorFlow或许是当前最好的选择;而如果想要快速上手、对于功能性需求不苛刻、追求良好的开发和调试体验、擅长Python化的工具时,PyTorch或许是值得尝试的框架。
总之,TensorFlow在保持原有优势的同时进一步融合包括Keras在内的优质资源,极大地增强了易用性与可调试性;而PyTorch虽然年轻,但增长的势头猛烈,并通过融合Caffe2来进一步强化自身优势。两者都在保留原有优势的同时,努力补齐自身短板,这使得在某种程度上两者有融合的趋势,未来哪一种框架更具优势,现在定论必定过早。因此,在选择框架时,可参照上述内容,并结合项目的时效、成本、维护等多方面综合考虑后决定。