属于动态图的未来:横向对比PyTorch与Keras

PyTorch 对机器学习领域的影响正在不断扩大,人们在使用中也在不断将其和其他机器学习框架进行对比。最近,Marc Schmidt 在 Reddit 上撰文对 Keras 和 PyTorch 进行了全面的对比。作者认为,PyTorch 在版本管理和调试等方面具有很大优势。

我可以根据自己作为软件工程师的经验(10 年以上)来给你一些答案。我也参与过很多开源项目,还是几十个开源库的作者,这些库都有成千上万的收藏量和数百万的安装量,因此我对于双方(作者和用户)在私人和商业领域的应用都相当了解。另外,很多人问我为什么使用的是 aetros.com Keras 而非 Pytorch/xy。

让我们定义一些属性来定义库 X 的好坏:


1 星 - 低于平均水平,2 星 - 平均水平,3 星 - 高于平均水平

我来详细解释下这张表。

版本管理


当你使用库(无论开源的还是商业的)并想继续使用该库来开发一个应用时,非常重要的一点是这其中不会有隐藏的变化,而且你的应用程序不会在你更新库(以得到想要的功能或 bug 修复)时发生中断。最坏的情况是,当你更新第三方库时出现了一些 bug,你就得开始进行调试。这不仅会花费很多时间而且令人讨厌。所以,重要的是你要知道库更新前后的变化。最好的情况是,库使用了依据 semver(http://semver.org/)的语义版本控制,这确保了你在更新较小的补丁版本时不会发生中断(至少是在尝试,并不总能行,但这里的意图是好的)。

至少,你标记的每个版本都需要一份更新日志,这样你就能看到 bug(如有)是否已被修复或者一个新功能(如需要)是否已得到实现。我在过去两年里用 Keras 的次数越来越多,并发现了很多被标记好的版本就简单地被称作「新流程发布(New PiPy release)」。可以想象,一个普通的开发者完全不会知道该标签版本发生了哪些变化。这实际上是 Keras 在行业的专业使用方面尚未完备的其中一个原因,同时它对于优秀且使用广泛的库的质量标准也很高。用了 Keras 2 之后,该作者表明他所描述的版本开始变得越来越好了。然而相比于 Pytorch,它仍然给人感觉像是一个自娱自乐的业余项目。参见 https://github.com/fchollet/keras/releases 与 https://github.com/pytorch/pytorch/releases。在看到这样一个详细的 Pytorch 版本说明之后我几乎(幸福地)要哭了。当你在一个专业的环境(对于行业来说,时间就是金钱)中处理它时,这将是你最喜欢的。

在版本管理上,我给 Keras 1 星,因为它的版本管理让我恶心了好几次;我给 Pytorch 3 颗星,因为你可以看到在它后面有一个团队,他们投入了更多的精力来使用户保持信息灵通。对于 Keras,编写这种版本说明更像是一个令人讨厌的流程。我也跟 PyTorch 的一位作者 Adam Paszke 聊了一下,他说他们很注重这个环节,这让我有信心在自己的项目中使用它。

调试


好吧,这也是我喜欢 Pytorch 的一点。写代码意味着总是发现并修复 bug。你的(隐藏在库和概念后面的)代码越不可思议,理解 bug 并找出对应的错误代码行与解决方案的过程就越令你感到痛苦。像 Theano 和 Tensorflow 那样的静态图形库在寻找问题——「不能将 xy 应用于一个非 2D 或 3D 的张量中」或「输入 (233, 3, 44, 55) 与 (233, 3, 55, 44) shape 不相容」——根源方面表现得非常笨拙。你需要检查你的模型并在大脑中计算张量的 shape,也许可以通过注释掉一些层来找到原因。

有了像 Pytorch 一类的动态图像,你就可以在堆栈跟踪中看到哪一行代码导致了错误。你甚至可以在调试器中停掉解释器并看看某个层会产生什么。通过采用断点并逐句检查代码,你发现上述 bug 的速度就可以提高 100 倍。在你遇到 bug 时,这几乎就成为了纯粹的享受,因为你已经知道「只要让调试器高速运行就可以在一秒内解决这个小 bug」。这实际上令我回想起自己刚开始使用真正交互式的、带断点和运行时评估等功能的调试器的日子,那是一种全新的效率体验。其中唯一的限制是你在代码中所建立的抽象逻辑。如果你不能用调试器和 IDE 来调试它,那么你的代码要么是太糟糕要么是过于抽象。

开发体验


在这两个库中,你的深度神经网络运行得都很快。Pytorch 还没有如 Keras 那样高层次的抽象(带有回调函数),而是在网络之外训练抽象等功能。所以你还是需要写一些样板文件。然而,这里(https://github.com/ncullen93/torchsample)Keras 提供的 API 基本上与 Pytorch 的相同。Pytorch 还很青涩,你会遇到一些 DX 方面的问题,比如「如何让卷积层变平,使它与隐藏层兼容」(提示:仅仅「.add(Flatten())」是无法解决的,但我相信 Pytorch 开发者们正在想办法解决它。这是我给 Pytorch 2 颗星而给 Keras 3 颗星的原因。Keras 在开发经验(除了调试)方面非常出色。你可以得到很好的早期效果且能够进行傻瓜式层编写。

上线时间


当我在谈论库的上线时间时其实是在说:我们的开发人员需要多长时间来理解库、发现/修复漏洞、受到库的启发(最后一点尤其重要,因为一个开发者在燃起了对工具的使用兴致后,其开发速度通常会提升 2-5 倍)。两个库都很好,尽管 Keras 出现的时间更早且有更多的网上教程和文档。所以 Pytorch 就比 Keras 少 1 颗星。

社区支持


这个问题很棘手。什么是社区?对于像 Pytorch 和 Keras 之类较小的库,得有一些对其进行宣传并(即使是对垃圾问题)提供有价值的解答以及帮助修复社区 bug 的人,这点非常重要。如果你像 Keras 那样自娱自乐,那么要搞定所有问题是非常困难的。你可以在 Keras 的问题追踪器中很清楚地看到 2,500 个开放的问题,以至于该项目完全不堪重负。相比之下,Pytorch 是由一个 Facebook 的工程师团队进行维护,你可以看到那里的问题更少且社区支持更加活跃。如果你在 Keras 中遇到一个问题,可能要等上几周/月的时间才能(如果可能)得到解决方案。

商业支持


Pytorch 太新了,几乎还没有人提供商业支持。我相信连 Facebook 都不会提供任何资金支持。Keras 则有些不一样。已经有很多使用 Tensorflow/Theano/Keras 来提供开发服务的公司。所以,如果你遇到一个问题并想用钱来解决,则最好用 Keras/Tensorflow。

长期发展


我相信在 Facebook 和谷歌对两个项目的支持下,你大可以说二者会在未来几年内依然存在。尽管我真的希望 Keras 可以得到一支谷歌团队或一个开源组织的支持,这样它就不会仅仅因为大量开放且不断涌入的问题而死掉。

从长远来看,静态图会成为过去,而相对便于使用的库会得到越来越多的使用,因为在正常的软件开发领域,调试和上市时间对于行业的可维护性(机器学习正在朝此方向行进)来说是最重要的。在所有这三个类别中,像 PyTorch 那样的动态图像都将绽放光芒。

你可以对任何任务同时部署 Keras 和 PyTorch。你对谁了解得更深,那么你用它编写异乎寻常的代码就会更快。虽然我倾向于认为 Pytorch 在编写非同寻常的事物方面更加灵活,而你可能认为层代码的编写就不是这样。

结论


我现在更喜欢 Keras,因为我上一次试用 PyTorch 时,它还有几个 GPU 方面的问题,还有另一些问题我没有克服。在 Keras 上,我的项目已经运行了数月,其效果相当不错,尽管我在运行时间更久(并非几天时间)的项目中看到了一些 bug 报告,而且使用静态图的后端来调试 Keras 相当麻烦。在接下来的几个月里,如果 PyTorch 变得越来越稳定,我肯定会转投 PyTorch 阵营。然而我还想试试 Caffe2。

入门工程深度学习框架PyTorchKeras
1