前几天,量子位发过一篇《忽悠VC指南》。其中有一条建议是,当你伪装AI专家时,最好别谈众人皆知的TensorFlow,那谈什么?web
PyTorch。docker
其实这也不全然都是调侃。和TensorFlow相比,PyTorch确实也有为数很多的拥趸。根据Keras做者François Chollet发布的数据显示:GitHub上的各类深度学习框架中,PyTorch排在第五位。编程
但须要提醒你们的是,PyTorch但是今年1月19日才正式发布。小程序
最近,斯坦福大学研究机器学习的博士生Awni Hannun,围绕PyTorch仍是TensorFlow这个话题,作了一个深刻的比较。量子位把内容传送以下:后端
我写的这份指南,主要对比了PyTorch和TensorFlow之间的区别。但愿对那些想着手开始一个新项目或者考虑转换深度学习框架的人有所帮助。数组
我主要考察了深度学习堆栈的训练和部署时,相关的可编程性和灵活性。在这里,我不会过多的谈论速度、内存占用等方面的权衡。bash
PyTorch更有利于研究人员、爱好者、小规模项目等快速搞出原型。而TensorFlow更适合大规模部署,特别是须要跨平台和嵌入式部署时。服务器
而后我们一项一项分着说。
赢家:PyTorch
PyTorch本质上是Numpy(numerical python,是一个开源的Python科学计算库)的替代者,并且支持GPU、带有高级功能,能够用来搭建和训练深度神经网络。若是你熟悉Numpy、Python以及常见的深度学习概念(卷积层、循环层、SGD等),会很是容易上手PyTorch。
而TensorFlow能够当作是一个嵌入Python的编程语言。你写的TensorFlow代码会被Python编译成一张图,而后由TensorFlow执行引擎运行。我见过好多新手,因为这个增长的间接层而困扰。也正是由于一样的缘由,TensorFlow有一些额外的概念须要学习,例如会话、图、变量做用域(variable scoping)、占位符等。
另外还须要更多的样板代码才能让一个基本的模型运行。因此TensorFlow的上手时间,确定要比PyTorch长。
赢家:PyTorch
建立和运行计算图多是两个框架最不一样的地方。在PyTorch中,图结构是动态的,这意味着图在运行时构建。而在TensorFlow中,图结构是静态的,这意味着图先被“编译”而后再运行。
举一个简单的例子,在PyTorch中你能够用标准的Python语法编写一个for循环结构
for _ in range(T): h = torch.matmul(W, h) + b
此处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数组,这就显得有点冗长。
numpy_var = variable.cpu().data.numpy()
赢家:PyTorch
两个框架均可以构建和绑定用C、C++、CUDA编写的自定义扩展。TensorFlow仍然须要更多的样板代码,尽管这对于支持多类型和设备可能更好。在PyTorch中,你只需为每一个CPU和GPU编写一个接口和相应的实现。两个框架中编译扩展也是直接记性,并不须要在pip安装的内容以外下载任何头文件或者源代码。
TensorBoard是TensorFlow自带的可视化工具,用来查看机器学习训练过程当中数据的变化。经过训练脚本中的几个代码段,你能够查看任何模型的训练曲线和验证结果。TensorBoard做为web服务运行,特别便于对于无头结点上存储的结果进行可视化。
若是没有相似的功能,我可不想用PyTorch。不过还好,借助两个开源项目能够实现。第一个是tensorboard_logger,第二个是crayon。tensorboard_logger库用起来甚至比TensorBoard的“摘要”更容易,尽管想用这个首先得安装TensorBoard。
crayon能够彻底替代TensorBoard,可是须要更多的设置(docker是先决条件)。
Keras是具备可配置后端的高级API。目前TensorFlow、Theano、CNTK都支持。也许不久的未来,PyTorch也会提供支持。做为tf.contrib的一部分,Keras也随TensorFlow一块儿分发。
虽然上面我没有讨论过Keras,但其API特别容易使用,这也是配合常见深度神经网络架构最快的方式。不过,使用API毕竟没有使用PyTorch或者核心TensorFlow那么灵活。
Keras是许多经常使用的深层神经网络架构中运行最快的方法之一。
今年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进行生产部署,因此你须要一个能对二者都支持的框架。
好啦,今天先谈到这里。但愿对你有所帮助~
— 完 —
加入社群
量子位AI社群7群开始招募啦,欢迎对AI感兴趣的同窗,加小助手微信qbitbot2入群;
此外,量子位专业细分群(自动驾驶、CV、NLP、机器学习等)正在招募,面向正在从事相关领域的工程师及研究人员。
进群请加小助手微信号qbitbot2,并务必备注相应群的关键词~经过审核后咱们将邀请进群。(专业群审核较严,敬请谅解)
诚挚招聘
量子位正在招募编辑/记者,工做地点在北京中关村。期待有才气、有热情的同窗加入咱们!相关细节,请在量子位公众号(QbitAI)对话界面,回复“招聘”两个字。
量子位 QbitAI
վ'ᴗ' ի 追踪AI技术和产品新动态
长按二维码向我转帐
受苹果公司新规定影响,微信 iOS 版的赞扬功能被关闭,可经过二维码转帐支持公众号。
微信扫一扫
关注该公众号