首先Github上caffe2的star为5.2k,mxnet为10.4k。本文首先对两个库有个整体的比较,再针对一些两者设计的不同数据结构、计算方式、gpu 的选择方式等方面做了比较详细的讨论。表格 1 是两者的一些基本情况的记录和比较。其中示例指的是官方给出的 example 是否易读易理解,这个表主观因素比较明显,仅供参考。
库名称 | 开发语言 | 支持接口 | 安装难度 | 文档风格 | 示例 | 支持模型 | 上手难易 |
---|---|---|---|---|---|---|---|
Caffe | c++/cuda | c++/python/matlab | *** | * | *** | CNN | ** |
MXNet | c++/cuda | python/R/Julia | ** | *** | ** | CNN/RNN |
- 安装难度: *(简单) --> ***(复杂)
- 文档风格: *(一般) --> ***(好看、全面)
- 示例: *(给的少) --> ***(给的多、全)
- 上手难易: *(易) --> ***(难)
1. 基本数据结构
库名称 | 数据结构名称 | 设计方式 |
---|---|---|
Caffe | Blob | 存储的数据可以看成 N 维的 c 数组,有 (n,k,h,w) 四个维数,一个 blob 里面有两块数据空间保存前向和后向求导数据 |
MXNet | NDArray | 提供 cpu/gpu 的矩阵和矢量计算,能够自动并行 |
caffe 的数据存储类 blob,当把数据可以看成是一个 N 维的 c 数组,它们的存储空间连续。例如存储图片是 4 维 (num, channel, height, width), 变量 (n,k,h,w) 在数组中存储位置为 ((n*K+k)*H+h)*W+w。blob 有以下三个特征 [4]:
- 两块数据,一个是原始 data,一个是求导值 diff
- 两种内存分配方式,一种是分配在 cpu 上,一种是分配在 gpu 上,通过前缀 cpu、gpu 来区分
- 两种访问方式,一种是不能改变数据,一种能改变数据
Caffe 精妙的地方在于一个 blob 保存前向和后向的数据。虽然就代码本身而言,前向数据是因为输入数据不同而改变,后向求导是因为求导不同而改变,根据 SRP 原则,在一个类里面因为两个原因而改变了数据这种是不合适的设计。但是从逻辑层面,前向数据的改变引起了反向求导的不同,它们实际上是一起在改变,本身应该是一个整体。所以我很喜欢这个设计,虽然基本上其他框架中都是将两个数据给分离出来,caffe2 也不知是否保留。
MXNet 的 NDArray 类似 numpy.ndarray,也支持把数据分配在 gpu 或者 cpu 上进行运算。但是与 numpy 和 caffe 不同的是,当在操作 NDArray,它能自动的将需要执行的数据分配到多台 gpu 和 cpu 上进行计算,从而完成高速并行。在调用者的眼中代码可能只是一个单线程的,数据只是分配到了一块内存中,但是背后执行的过程实际上是并行的。将指令 (加减等) 放入中间引擎,然后引擎来评估哪些数据有依赖关系,哪些能并行处理。定义好数据之后将它绑定到网络中就能处理它了。
2. 网络实现方式
MXNet 是符号计算和过程计算混合,它设计了 Symbol 大类,提供了很多符号运算的接口,每个 symbol 定义了对数据进行怎样的处理,symbol 只是定义处理的方式,这步还并未真正的执行运算。其中一个需要注意的是 symbol 里面有 Variable,它作为承载数据的符号,定义了需要传递什么样的数据给某个 Variable,并在后续的操作中将数据绑定到 Variable 上。下面的代码是一个使用示例,它实现了将激励函数连接到前面定义好的 net 后面,并给出了这一个 symbol 的名字和激励函数类型,从而构造出 net。下图左边部分是定义 symbol 的合集,中间将数据绑定到 Variable 上之后变成了右边真正的执行流程图。
net = mx.symbol.Activation(data=net, name='relu1', act_type="relu")
3. 小结
上面针对两个框架的不同方面进行了一些分析与比较,可以看出 TensorFlow 和 MXNet 有一些相似的地方,都是想做成更加通用的深度学习框架,貌似 caffe2 也会采用符号计算 ,说明以后的框架会更加的偏向通用性和高效。近日亚马逊开源神经机器翻译框架 Sockeye:基于 Apache MXNet 的 NMT 平台
参考:
[1] http://mxnet.readthedocs.org/en/latest/index.html
[2] http://caffe.berkeleyvision.org/
[5] Imagenet Winners Benchmarking
[6]