Caffe和MXnet 两个开源库对比

首先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. 网络实现方式



Caffe 是典型的功能(过程)计算方式,它首先按照每一个大功能(可视化、损失函数、非线性激励、数据层)将功能分类并针对部分功能实现相应的父类,再将具体的功能实现成子类,或者直接继承 Layer 类,从而形成了 XXXLayer 的形式。然后将不同的 layer 组合起来就成了 net。下图caffe 的网络结构




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/

[3] [caffe] 的项目架构和源码解析

[4] 如何评价 Tensorflow 和其它深度学习系统

[5] Imagenet Winners Benchmarking

[6] 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值