从零开始学习MXnet(四)计算图和粗细粒度以及自动求导

  这篇其实跟使用MXnet的关系不大,但对于咱们理解深度学习的框架设计仍是颇有帮助的。算法

  首先仍是对promgramming models的一个简单介绍,这个东西其实是在编译里面常常出现的东西,咱们在编译咱们的程序的时候,能够对变量构建出一个计算图,而后能够对这个图进行相应的优化来提升速度或者节省内存。到了DL框架上,这些用处就更加剧要了,可是也不是全部的DL框架都有计算图的,由于这其中存在一个research和engineering的权衡。计算图的简单理解就是下图:框架

  

  

1、Symbolic vs. Imperative Programs 性能

  首先要说的就是符号式程序和命令式程序等区别了,相似于程序语言设计中的区别,可否在程序代码执行的过程当中,可否方便直接的进行修改、分支选择或者循环以及获得中间的输出结果等操做,是区分符号式和命令式的关键,固然这些只是我我的的直观理解。。。。稍微正式点就是:Most symbolic-style programs contain, either explicitly or implicitly, a compile step. This converts the computation graph into a function that can be called. Computation occurs in the last step in the code. The major characteristic of symbolic programs is the clear separation between defining the computation graph and compiling.而后imperative就是你怎么写它怎么跑,你何时写好了让他跑,他就何时开始跑。学习

  符号式的设计方法有不少好处,tenserflow和MXnet都是基于这种方法编写的,首先由于它们均可以构建出计算图,这样以来就能够对计算图进行优化,经过dependency的分析等等,能够大大的提升算法训练的速度和减小内存的须要,甚至于TQ最新的那篇paper,经过手动置顶一些mirror来保存forward的时候的部分feature map而不是所有,最终resnet152训练要求的48G显存降到了6G,并且速度上并无掉太多(我我的实际使用的时候,多是由于miroor设置的很差,降了不少速度。。),可是符号式的缺点也很明显,它给使用者的权限太少了,由于算法在训练的时候,是在定义好的symbil的基础上进行本身的优化,而后传入data开始训练,而后你想在里面作一些奇葩的操做例如循环,if之类的,基本是不可能的。。优化

  因此在咱们作research的时候,专一点在于算法的性能而不是效率低时候,可能torch和chaniner这种 imperative-style program是个不错的选择,在torch框架上,你能够很容易的作出一些mxnet很难进行的动做,可是由于我我的暂时也不是很熟悉它们,并且咱们的重点仍是mxnet,因此我也不强行讲了。下面是一个简单的例子,咱们在imperative program能够容易的写出来,可是在符号式的却很难。google

    a = 2
    b = a + 1
    d = np.zeros(10)
    for i in range(d):
        d += np.zeros(10)

 

2、粗细力度,自动求导 spa

  框架的粗粒度、细粒度和自动求导的概念以前听过不少次了,前二者之前是彻底不懂而且以为很高端,后者是觉得是字面意思而后以为太可怕。。。实际上粗细粒度是对框架提供的一个操做大小的描述,粗粒度操做如:FC,BN,细粒度操做如:elemenwise的sum、mul之类的。设计

  仍是拿Tenserflow和MXnet来讲,前者提供了不少的底层小操做,因此它是一个细粒度的框架,这样的好处是,使用者要想定义本身的操做的时候,就能够经过组合tenserflow里面的op来实现,大大的减少了难度,但这样带来的坏处就是,最终的计算图会又大又复杂,很难去优化。这也是google背书的Tenserflow以前在性能上反而不是MXnet的缘由之一的吧。 MXnet咱们就很熟悉它的那些OP了,基本上都是一些粗粒度的操做,这样咱们在定义本身的OP的时候,只能去默默的写C++代码,个中滋味,就很少说了。。。粗粒度的操做带来的好处固然就是性能的提高。rest

  自动求导这个概念,简单的理解就是,框架给你提升的OP,你只要用他们作fwd,而后backward会自动定义好,由于这些OP的BP已经有人写好了,而且整个BP的流程也能够推到出来而后创建好。并非你在定义本身的操做的时候,代码能自动帮你写这个操做的BP。code

 

总结

    我发现作系统设计这些真的很interesting,要不是个人代码水平太弱鸡,真是分分钟钟想去搞系统啊。。

相关文章
相关标签/搜索