本文最早发表于本人博客:博客
随着深度学习研究热潮的持续发酵,各种开源深度学习框架层出不穷,其中包括:Caffe、CNTK、MXNet、Neon、TensorFlow、Theano 和 Torch (著名开源深度学习框架 Keras 相当于是 TensorFlow 和 Theano 的简化接口,这里就不并列了)。在这些深度学习框架中,我个人是支持 TensorFlow 的。以前我的观点不是这样,当时的我觉得 TensorFlow 没有什么厉害的。TensorFlow 刚出来的时候,我还和 Mentor 思远大大一顿吐槽。不过我最近转变观点,觉得 TensorFlow 比较牛逼。
TensorFlow 和 其他框架的对比
在详细地论证我的观点前,我先整理下 Tensor Flow 和其他深度学习框架的对比。
在分布式计算方面,Tensor Flow 最终还是赶上了。2016年2月27日,Google 终于公布了 Tensor Flow的 分布式运行方案。对于大规模深度学习来说,巨大的数据规模使得单机很难 Hold 得住了。这时需要分布式计算使得多台服务器协同工作共同训练一个模型出来。Google 开源 Tensor Flow 时只有单机版本,是当时人们吐槽的第一槽点。目前分布式深度学习框架有 CNTK、MXNet 和 Tensor Flow。分布式运行方案使得 Tensor Flow 挤身为数不多的分布式深度学习框架俱乐部。
在性能方面,Tensor Flow 的速度是比较慢的。去年 Tensor Flow 刚刚公布的,人们第一吐槽只有单机版本,第二吐槽没有官方和其他深度学习框架的对比结果。一些研究者们做了一些对比之后发现,Tensor Flow 真的不快,Google 不发布官方和其他深度学习框架的对比结果是正确的策略。最近zer0n和bamos在GitHub上发表的一篇文章(译文在此)在速度方面给 Tensor Flow 打了3星,另一个3星的框架是公认很慢的Theano。zer0n和bamos指出 Tensor Flow 仅使用了cuDNN v2,并指出即使 Torch 也只使用 cuDNN v2,也比 Tensor Flow 快。微软在 CNTK 的项目主页默默地挂出了此图(PS: 当时TensorFlow 还不能分布式计算)。在此图中,TensorFlow 的速度仅仅比 Theano 快一点。
在关注度方面,我们发现 TensorFlow 远远超过其他深度学习框架。按照北京时间 2016 年 3 月 6 日的数据,TensorFlow 在 GitHub 上 Stars 数将近 20000, Forks 数也超过了 6500。下图是 TensorFlow 和其他深度学习开源工具的 Stars 和 Forks,可以看出差距非常明显。再联想到 TensorFlow 去年才开源,就能体会 TensorFlow 人气之高了。
到生产一线去
我为什么还看好 TensorFlow 的未来呢?因为我个人认为 TensorFlow 会是直接面向生产环境的深度学习平台。我做出这个判断基于三个理由。
第一个理由是 TensorFlow Serving。2016年2月,TensorFlow 取得了两个重要的进展。一个是TensorFlow的分布式运行方案。这个在上节已经提到过了。另一个是TensorFlow Serving。Google 在16年2月17日开源了 TensorFlow Serving,TensorFlow Serving 可以将深度学习模型变成对外提供的服务。现在用深度学习模型对外提供服务的方案有以下几步。
1.工程师们得训练模型。工程师按照自己对数据的理解,选择合适的深度学习框架将模型训练处理。
2.工程师们将训练好的模型导出。怎么让用户也能享受这个已经导出模型呢?总不能将模型远程给人家吧。因此我们有了第三步。
3.工程师选择一个合适的服务器框架,编写代码导入模型并建立对外服务。
有了 TensorFlow 和 TensorFlow Serving, 我们可以用 TensorFlow 训练和导出模型,然后把模型导入 TensorFlow Serving。TensorFlow Serving 就能对外提供预测服务了。相当于 TensorFlow 系列把整个用深度学习模型对外提供服务的方案全包了。Google软件工程师Noah Fiedel的说法,“TensorFlow Serving是一个高性能、开源的机器学习服务系统,为生产环境及优化TensorFlow而设计。它更适合运行多个大规模模型,并支持模型生命周期管理、多种算法实验及有效地利用GPU资源。TensorFlow Serving能够让训练好的模型更快、更易于投入生产环境使用”。
TensorFlow Serving 的出现使得 TensorFlow 具有深度学习平台的雏形。一个深度学习框架也许只需要考虑如何把模型训练好。而一个生产级别的深度学习平台除了训练模型(Model Training)外还涉及很多相关的数据处理周期,例如Data ingress, Filtering (Sampling), Cleaning,Egress,Storage,Serving等等。
第二个理由是 TensorBoard。TensorBoard 是一款可视化工具,目的是为了方便 TensorFlow 程序的理解、调试与优化。工程师们可以用 TensorBoard 来展现你的 TensorFlow 图像,绘制图像生成的定量指标图以及附加数据。下图是一个展示模型结构示例 (微信不支持gif图片,想看gif效果的同学可以点击阅读原文,到我博客上看),大家可以感受下。
由于生产环境面对很多水平不一的工程师们,在生产环境中使用的开源项目提供一个易用的接口就显得很重要了。TensorFlow 除了提供Python/C++两种编程接口之外,还提供了图形化的可视化工具 TensorBoard 。有了 TensorBoard, 你用鼠标就能定义神经网络结构和训练过程了!据我所知,目前只有微软的商用机器学习平台 Azure Machine Learning 允许鼠标定义训练过程,但没有到定义模型结构的程度。易用性是生产级别的深度学习平台的重要要求, TensorFlow Board 体现了 TensorFlow 会朝着这个方向做更多的工作。
第三个理由是 TensorFlow 的异构性。简单地说,异构性是指 TensorFlow 能够在不同类型设备构成的网络中进行训练和预测。这也就是媒体们说的,有了 TensorFlow , 你甚至可以用手机训练深度学习模型。实际情况是没有谁真的用手机训练深度学习模型。异构性的目的是应付复杂的生产环境。一家公司不管大还是小集群,设备可能有不同来源。有些是之前买的,有些是最近买的,还有些可能是从隔壁部门借的,因此需要深度学习框架能够在这些不同类型组成的异构网络中训练和使用模型。TensorFlow 的异构性使得它能够应付复杂的实际生产环境。
上述三点理由都是指向 TensorFlow 是直接面向生产环境的。一旦 TensorFlow 全面地进入不同机构的生产环境,这些机构会变成 TensorFlow 发挥影响力的节点,将极大地增强 TensorFlow 的影响力。这体现在三点上:1)著名机构使用 TensorFlow 本身就会带来的影响力;2)进入一家机构的算法工程师,不管是通过职前自学还是公司培训,最终都学会 TensorFlow 。就像我师兄张星星说的,“不少工程师希望去 Google 工作吧,那他们去工作前一定会学学 TensorFlow 的”;3)从这家公司离职人又将使用方法经验带到别的机构。相反地,如果一款深度学习框架没有进入生产环境,只是作为个人调研和实验的工具,工程师就没有直接理由了解和使用它了。各种深度学习框架中,TensorFlow 的官方最具有面向生产环境的意识。这可能和 TensorFlow 曾经或者现在在 Google 内部生产环境中实际使用有关。
当然 TensorFlow 也有被扯后腿的地方。TensorFlow的性能和 CNTK、Neon 和 Torch等工具相比还有差距。如果 TensorFlow 的性能没有得到大幅度地改善,会对工业界的吸引力会大打折扣,这对 TensorFlow 普及会产生很大的伤害。除了这个大缺点,TensorFlow 还有一个小缺点: TensorFlow 不能部署在 Windows 操作系统上。不过我不认为这是什么缺点。哈哈,准备去微软的苗苗、小狮子和奔奔不准打我。
深度学习框架大战正在进行,谁将夺取“深度学习工业标准”的荣耀,我们拭目以待。
ps:感谢黄申师弟教我用 TensorFlow, 让我稍微有点底气写文章。