人工智能无疑是计算机世界的前沿领域,而深度学习无疑又是人工智能的研究热点,那么现在都有哪些开源的深度学习工具,他们各自的优缺点又是什么呢?最近 zer0n 和 bamos 在 GitHub 上发表了一篇文章,对 Caffe 、 CNTK 、 TensorFlow 、 Theano 和 Torch 等深度学习工具从网络、模型能力、接口、部署、性能、架构、生态系统、跨平台等方面做了比较。
网络和模型能力
**Caffe** 可能是第一个主流的工业级深度学习工具,它开始于 2013 年底, 具有出色的卷积神经网络实现。在计算机视觉领域 Caffe 依然是最流行的工具包,它有很多扩展,但是由于一些遗留的架构问题,它对递归网络和语言建模的支持很差。此外,在 Caffe 中图层需要使用 C++ 定义,而网络则使用 Protobuf 定义。
CNTK由深度学习热潮的发起演讲人创建, 目前已经发展成一个通用的、平台独立的深度学习系统。在 CNTK 中,网络会被指定为向量运算的符号图,运算的组合会形成层。CNTK 通过细粒度的构件块让用户不需要使用低层次的语言就能创建新的、复杂的层类型。
**TensorFlow** 是一个理想的 RNN(递归神经网络) API 和实现,TensorFlow 使用了向量运算的符号图方法,使得新网络的指定变得相当容易,但 TensorFlow 并不支持双向 RNN 和 3D 卷积,同时公共版本的图定义也不支持循环和条件控制,这使得 RNN 的实现并不理想,因为必须要使用 Python 循环且无法进行图编译优化。
**Theano** 支持大部分先进的网络,现在的很多研究想法都来源于 Theano,它引领了符号图在编程网络中使用的趋势。Theano 的符号 API 支持循环控制,让 RNN 的实现更加容易且高效。
**Torch** 对卷积网络的支持非常好。在 TensorFlow 和 Theano 中时域卷积可以通过 conv2d 来实现,但这样做有点取巧;Torch 通过时域卷积的本地接口使得它的使用非常直观。Torch 通过很多非官方的扩展支持大量的 RNN,同时网络的定义方法也有很多种。但 Torch 本质上是以图层的方式定义网络的,这种粗粒度的方式使得它对新图层类型的扩展缺乏足够的支持。与 Caffe 相比,在 Torch 中定义新图层非常容易,不需要使用 C++ 编程,图层和网络定义方式之间的区别最小。
接口
**Caffe** 支持pycaffe
接口,但这仅仅是用来辅助命令行接口的,而即便是使用pycaffe
也必须使用 protobuf 定义模型。
**CNTK** 的使用方式与 Caffe 相似,也是通过指定配置文件并运行命令行,但 CNTK 没有 Python 或者任何其他高级语言的接口。
**TensorFlow** 支持 Python 和 C++ 两种类型的接口。用户可以在一个相对丰富的高层环境中做实验并在需要本地代码或低延迟的环境中部署模型。
**Theano** 支持 Python 接口。
**Torch** 运行在 LuaJIT 上,与 C++、C#以及 Java 等工业语言相比速度非常快,用户能够编写任意类型的计算,不需要担心性能,唯一的问题就是 Lua 并不是主流的语言。
模型部署
**Caffe** 是基于 C++ 的,因此可以在多种设备上编译,具有跨平台性,在部署方面是最佳选择。
**CNTK** 与 Caffe 一样也是基于 C++ 并且跨平台的,大部分情况下部署非常简单。但是它不支持 ARM 架构,这限制了它在移动设备上的能力。
**TensorFlow** 支持 C++ 接口,同时由于它使用了 Eigen 而不是 BLAS 类库,所以能够基于 ARM 架构编译和优化。TensorFlow 的用户能够将训练好的模型部署到多种设备上,不需要实现单独的模型解码器或者加载 Python/LuaJIT 解释器。但是 TensorFlow 并不支持 Windows,因此其模型无法部署到 Windows 设备上。
**Theano** 缺少底层的接口,并且其 Python 解释器也很低效,对工业用户而言缺少吸引力。虽然对大的模型其 Python 开销并不大,但它的限制摆在那,唯一的亮点就是它跨平台,模型能够部署到 Windows 环境上。
**Torch** 的模型运行需要 LuaJIT 的支持,虽然这样做对性能的影响并不大,但却对集成造成了很大的障碍,使得它的吸引力不如 Caffe/CNTK/TensorFlow 等直接支持 C++ 的框架。
性能
在单 GPU 的场景下,所有这些工具集都调用了 cuDNN,因此只要外层的计算或者内存分配差异不大其表现都差不多。本文的性能测试是基于 Soumith@FB 的 ConvNets 基准测试来做的。
Caffe 简单快速。
CNTK 简单快速。
**TensorFlow** 仅使用了 cuDNN v2,但即使如此它的性能依然要比同样使用 cuDNN v2 的 Torch 要慢 1.5 倍,并且在批大小为 128 时训练 GoogleNet 还出现了内存溢出的问题。
**Theano** 在大型网络上的性能与 Torch7 不相上下。但它的主要问题是启动时间特别长,因为它需要将 C/CUDA 代码编译成二进制,而 TensorFlow 并没有这个问题。此外,Theano 的导入也会消耗时间,并且在导入之后无法摆脱预配置的设备(例如GPU0
)。
**Torch** 非常好,没有 TensorFlow 和 Theano 的问题。
另外,在多 GPU 方面,CNTK 相较于其他的深度学习工具包表现更好,它实现了 1-bit SGD 和自适应的 minibatching。
架构
**Caffe** 的架构在现在看来算是平均水准,它的主要痛点是图层需要使用 C++ 定义,而模型需要使用 protobuf 定义。另外,如果想要支持 CPU 和 GPU,用户还必须实现额外的函数,例如Forward_gpu
和Backward_gpu
;对于自定义的层类型,还必须为其分配一个 int 类型的 id,并将其添加到 proto 文件中。
**TensorFlow** 的架构清晰,采用了模块化设计,支持多种前端和执行平台。
Theano 的架构比较变态,它的整个代码库都是 Python 的,就连 C/CUDA 代码也要被打包为 Python 字符串,这使得它难以导航、调试、重构和维护。
**Torch7** 和 nn 类库拥有清晰的设计和模块化的接口。
跨平台
Caffe、CNTK 和 Theano 都能在所有的系统上运行,而 TensorFlow 和 Torch 则不支持 Windows。
感谢杜小芳对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群(已满),InfoQ 读者交流群(#2))。
评论