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

  首先还是对promgramming models的一个简单介绍,这个东西实际上是在编译里面经常出现的东西,我们在编译我们的程序的时候,可以对变量构建出一个计算图,然后可以对这个图进行相应的优化来提高速度或者节省内存。到了DL框架上,这些用处就更加重要了,但是也不是所有的DL框架都有计算图的,因为这其中存在一个research和engineering的权衡。计算图的简单理解就是下图:

  

  

一、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可以容易的写出来,但是在符号式的却很难。

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

二、粗细力度,自动求导

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

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

  自动求导这个概念,简单的理解就是,框架给你提高的OP,你只要用他们做fwd,然后backward会自动定义好,因为这些OP的BP已经有人写好了,并且整个BP的流程也可以推到出来然后建立好。并不是你在定义自己的操作的时候,代码能自动帮你写这个操作的BP。

总结

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

从零开始学习MXnet(四)计算图和粗细粒度以及自动求导的更多相关文章

  1. 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式

    本系列文章导航 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 一.摘要 本篇文章讲解如何使用jQuery获取和操作元素的属性和CSS样式. 其中DOM属性和元素属性的区分值得 ...

  2. pytorch的自动求导机制 - 计算图的建立

    一.计算图简介 在pytorch的官网上,可以看到一个简单的计算图示意图, 如下. import torchfrom torch.autograd import Variable x = Variab ...

  3. PytorchZerotoAll学习笔记(三)--自动求导

    Pytorch给我们提供了自动求导的函数,不用再自己再推导计算梯度的公式了 虽然有了自动求导的函数,但是这里我想给大家浅析一下:深度学习中的一个很重要的反向传播 references:https:// ...

  4. Pytorch学习(一)—— 自动求导机制

    现在对 CNN 有了一定的了解,同时在 GitHub 上找了几个 examples 来学习,对网络的搭建有了笼统地认识,但是发现有好多基础 pytorch 的知识需要补习,所以慢慢从官网 API进行学 ...

  5. [深度学习] pytorch学习笔记(1)(数据类型、基础使用、自动求导、矩阵操作、维度变换、广播、拼接拆分、基本运算、范数、argmax、矩阵比较、where、gather)

    一.Pytorch安装 安装cuda和cudnn,例如cuda10,cudnn7.5 官网下载torch:https://pytorch.org/ 选择下载相应版本的torch 和torchvisio ...

  6. 从零开始学习MXnet(三)之Model和Module

    在我们在MXnet中定义好symbol.写好dataiter并且准备好data之后,就可以开开心的去训练了.一般训练一个网络有两种常用的策略,基于model的和基于module的.今天,我想谈一谈他们 ...

  7. 从零开始学习MXnet(五)MXnet的黑科技之显存节省大法

    写完发现名字有点拗口..- -# 大家在做deep learning的时候,应该都遇到过显存不够用,然后不得不去痛苦的减去batchszie,或者砍自己的网络结构呢? 最后跑出来的效果不尽如人意,总觉 ...

  8. 从零开始学习MXnet(二)之dataiter

    MXnet的设计结构是C++做后端运算,python.R等做前端来使用,这样既兼顾了效率,又让使用者方便了很多,完整的使用MXnet训练自己的数据集需要了解几个方面.今天我们先谈一谈Data iter ...

  9. 从零开始学习MXnet(一)

    最近工作要开始用到MXnet,然而MXnet的文档写的实在是.....所以在这记录点东西,方便自己,也方便大家. 我觉得搞清楚一个框架怎么使用,第一步就是用它来训练自己的数据,这是个很关键的一步. 一 ...

随机推荐

  1. 网站安全检测 漏洞检测 对thinkphp通杀漏洞利用与修复建议

    thinkphp在国内来说,很多站长以及平台都在使用这套开源的系统来建站,为什么会这么深受大家的喜欢,第一开源,便捷,高效,生成静态化html,第二框架性的易于开发php架构,很多第三方的插件以及第三 ...

  2. Leecode刷题之旅-C语言/python-35.搜索插入位置

    /* * @lc app=leetcode.cn id=35 lang=c * * [35] 搜索插入位置 * * https://leetcode-cn.com/problems/search-in ...

  3. POJ1236_A - Network of Schools _强连通分量::Tarjan算法

    Time Limit: 1000MS   Memory Limit: 10000K Description A number of schools are connected to a compute ...

  4. [Cracking the Coding Interview] 4.4 Check Balanced

    Implement a function to check if a binary tree is balanced. For the purpose of this question, a bala ...

  5. Druid时序数据库常见问题及处理方式

    最近将Druid-0.10.0升级到Druid-0.12.1的过程中遇到一些问题,为了后期方便分析问题和及时解决问题,特此写这篇文章将工作中遇到的Druid问题及解决办法记录下来,以供其他人借鉴,其中 ...

  6. 第5模块闯关Bootstrap

    “行(row)”必须包含在 .container (固定宽度)或 .container-fluid (100% 宽度)中,以便为其赋予合适的排列(aligment)和内补(padding). 通过“行 ...

  7. springmvc 处理put,delete请求

    前言:ajax用post编辑,删除提示越权操作状态为500,修改半晌最后大神指点说是:type修改为post和delete模式 最后还是一知半解,但是程序却正常使用了.当然注意我用的mvc,contr ...

  8. 转MySQL详解--索引

    写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将 ...

  9. 部署:阿里云ECS部署Docker CE

    1 部署阿里云ECS,选择CentOS操作系统,并启动实例: 2 部署Docker CE: a.检查centos版本: $ cat /etc/redhat-release CentOS Linux r ...

  10. [电子书] 《Android编程兵书》PDF

    Android编程兵书 内容简介: 这是一本Android开发书籍,内容讲解详细,例子丰富,能帮助读者举一反三.在<Android编程兵书>中,每一个知识点的描述都非常详细,并且每一个知识 ...