专栏名称: 机器之心
专业的人工智能媒体和产业服务平台
目录
相关文章推荐
51好读  ›  专栏  ›  机器之心

深度 | PyTorch和TensorFlow哪家强:九项对比读懂各自长项短板

机器之心  · 公众号  · AI  · 2017-08-31 12:42

正文

选自GitHub

作者:Awni Hannun

机器之心编译

参与:Panda


现在是各种机器学习框架群雄争霸的时代,各种各样的比较文章也层出不穷。近日,斯坦福大学计算机科学系博士生 Awni Hannun 也发表了一篇文章,谈了自己对 PyTorch 和 TensorFlow 这两大明星框架的心得体验,并在不同的方面对这两者进行了比较,机器之心对本文进行了编译介绍。


这篇指南主要介绍了我找到的 PyTorch 和 TensorFlow 之间的不同之处。这篇文章的目的是帮助那些想要开始一个新项目或从一种深度学习框架切换到另一种框架的人。本文重点关注的是在设置训练组件和部署深度学习时的可编程性和灵活性。我不会深入到性能方面(速度/内存占用)的比较。


概要


PyTorch 更适用于研究、爱好者和小规模项目的快速原型开发。TensorFlow 更适合大规模部署,尤其是涉及跨平台和嵌入式部署时。


上手时间


获胜者:PyTorch


PyTorch 本质上是支持 GPU 的 NumPy 替代,配备了可用于构建和训练深度神经网络的更高级的功能。所以如果你熟悉 NumPy、Python 和常用的深度学习抽象(卷积层、循环层、SGD 等),那 PyTorch 就很容易学。


另一方面,则可以将 TensorFlow 看作是一种嵌入 Python 的编程语言。当你编写 TensorFlow 代码时,它会被 Python「编译」成图(graph),然后由 TensorFlow 执行引擎运行。我看到过有些 TensorFlow 新手难以理解这额外增加的间接一层工序。同样因为这个原因,TensorFlow 还有一些需要额外学习的概念,比如会话(session)、图、变量范围和占位符。要让基本的模型跑起来也需要更多样板代码。上手 TensorFlow 的时间肯定会比 PyTorch 长。


创建图和调试


获胜者:PyTorch


创建和运行计算图可能是这两个框架差别最大的地方。在 PyTorch 中,图结构是动态的,也就是说图是在运行时创建的。在 TensorFlow 中,图结构是静态的,也就是说图在「编译」之后再运行。举个简单例子,在 PyTorch 中,你可以使用标准的 Python 句法写一个 for 循环:


  1. for _ in range(T):

  2.    h = torch.matmul(W, h) + b



而且 T 可以在这段代码的执行之间改变。在 TensorFlow 中,这需要在构建图时使用控制流操作(control flow operations),比如 tf.while_loop。TensorFlow 确实有 dynamic_rnn 可用于更常见的结构,但创建自定义的动态计算也更加困难。


PyTorch 简单的图构建方式更容易理解,但也许更重要的是也更容易调试。调试 PyTorch 代码就跟调试 Python 代码一样。你可以使用 pdb,并且可以在任何地方设置断点。调试 TensorFlow 则没这么容易。它有两个选择,一是从会话中请求你想检查的变量,而是学会使用 TensorFlow 调试器(tfdbg)。


覆盖度


获胜者:TensorFlow


随着 PyTorch 的发展,我预计这两者之间的差距会缩小至零。但是,TensorFlow 仍然支持一些 PyTorch 并不支持的功能。PyTorch 目前还不具备的特性包括:


  • 沿维度方向的张量翻转(np.flip、 np.flipud、 np.fliplr)

  • 检查张量是否为 NaN 和无穷大(np.is_nan、np.is_inf)

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


而 TensorFlow 支持所有这些。另外比起 PyTorch,TensorFlow 的 contrib 包也有远远更多更高级的函数和模型。


序列化(serialization)


获胜者:TensorFlow


在这两种框架中,保存和加载模型都很简单。PyTorch 有一个非常简单的 API,既可以保存模型的所有权重,也可以 pickle(加工)整个类。TensorFlow 的 Saver 对象也很容易使用,而且也为检查点提供了更多选择。


TensorFlow 在序列化方面的主要优势是整个计算图都可以保存为 protocol buffer。这既包括参数,也包括运算。然后这个图可以用其它支持的语言(C++、Java)加载。对于不支持 Python 的部署环境来说,这是非常重要的功能。而且理论上,这个功能也可以在你修改模型的源代码,但又想运行旧模型时为你提供帮助。


部署


获胜者:TensorFlow


对于小型服务器(比如 Flask 网页服务器)上的部署,两种框架都很简单。


TensorFlow 支持移动和嵌入式部署,而包括 PyTorch 在内的很多深度学习框架都没有这个能力。在 TensorFlow 上,要将模型部署到安卓或 iOS 上需要不小的工作量,但至少你不必使用 Java 或 C++ 重写你模型的整个推理部分。


对于高性能服务器上的部署,还有 TensorFlow Serving 可用。我还没体验过 TensorFlow Serving,所以我不能说它有哪些优缺点。对于严重依赖机器学习的服务,我猜想 TensorFlow Serving 可能就是继续使用 TensorFlow 的充分理由。除了性能方面的优势,TensorFlow Serving 的另一个重要特性是无需中断服务,就能实现模型的热插拔。Zendesk 的这篇博客文章介绍了使用 TensorFlow Serving 部署一个问答机器人的案例:https://medium.com/zendesk-engineering/how-zendesk-serves-tensorflow-models-in-production-751ee22f0f4b







请到「今天看啥」查看全文