深度学习Stack

为什么提出NNVM?

深度学习框架现状 - “碎片化”

目前,深度学习应用框架呈现出高度的“碎片化(fragmentation)”倾向,这主要是由于下述两个原因:

1. 深度学习正处于商业应用的前期阶段并具有诱人的商业想象力。诱人的商业前景且尚未出现事实标准的现状,使得有相应实力的公司竞相推出或赞助自己的应用框架,以期在后续的竞争中谋得一席。比如,Google主推TensorFlow, Microsoft主推CNTK, Amazon主推MxNet……

2. 深度学习应用领域多。每个领域的开发者都有自己偏好的框架。如医疗领域的偏好Theano, 传统图像识别的偏好Caffe……

偏偏深度学习又是计算密集型的应用,所以高度依赖于专门的优化,这是要把平台提供商搞死的节奏。为了市场份额,平台提供商不得不一个一个地优化这些框架,以及不断涌出的新框架。感念于斯,平台方面以及一些做框架的先知先觉者开始思考从这个困境中摆脱出来的方法。

深度学习优化趋势 - 优化层次从”operator” 到 “graph”

目前,单硬件引擎的原语(Primitives)层次的优化已经基本上接近尾声,无论是Intel的MKL还是NVIDIA的cuDNN都基本成熟。为了获得更好的软件性能,方向只能往联合优化去走,优化方向从operator level(或者layer level)向到graph level演化,从而充分利用硬件特性压榨干inter operator之间的开销,并在各引擎间灵活切换从而获得额外增益(异质计算,heterogeneous computing)。

什么是NNVM

NNVM被提出来解决这两个问题。NNVM的设计思路是跟LLVM是一样的。

LLVM简介
LLVM提供了一个统一的编译器优化架构,它支持多前端(C, Fortran…)和多目标引擎(X86, ARM, GPU…)。LLVM把所有的前端语言解析到一个统一的抽象语义树格式(Abstract Syntax Tree, AST), 然后使用一个优化器来进行优化。这样每一个硬件引擎只需要针对一个AST实现并努力优化好优化器就够了,大大减少了开发和维护的复杂度。

同样地,NNVM会把各种DL framewok的网络结构翻译成统一的格式,并针对不同的硬件引擎做各种优化。
它的IO模型很简单,你只需要定义一个graph, NNVM帮你搞定从graph中的operator的原语优化到使用什么硬件引擎,如何分配使用内存的所有事情,给你一个overall optimal solution。因为是基于graph做,所以用户不用care operator如何优化,也不用管graph如何优化,这给了优化最大的余地。


NNVM可做的优化内容包括:

1. Operator Compounding。Operator Compounding意图充分利用硬件的特长,对一些相邻的operator进行归并。一个常见的是:把Batch Normalization层和后续的Scale层归并成一个,这个在NVIDIA cuDNN和Intel MKL-DNN中都进行了这样的优化,优化方向是减少内存消耗以及内存传递消耗。

2. Heterogeneous Computing。这个在目前以GPU单IP为主的思路下很少被讨论。但相信像Intel, ARM这样的多IP大厂后续会更愿意提起他。一个很直觉的想法是:现在都是GPU一个哼哧哼哧在那算,CPU只能干等,有什么办法能让CPU帮上忙, 提高资源利用率。更大的一个问题是:目前其实发现并不是所有的算子都是GPU跑比较好,CPU经过MKL-DNN优化后在表现也不错,那怎么发挥协同优势,进一步提高效率。进一步的,如果有TPU, FPGA,Nervana Engine等NPU的情况下,如何进行协同优化?这里面包括identify每个engine的擅长,计算容量,存储容量以及engine间的memory sharing和re-layout方案。

3. Partition。 包括NN graph的子图划分(subgraph partition), 以及scale out(multi-node partition)。

上述三个方面在实现的时候“你中有我,我中有你”, 如果能做好,真正是大功德。我们还需要看到,这些折衷优化需要对硬件平台的深刻掌握才能做好,不然很可能长期流于像BN层和Scale层合并这样的表面优化。在这一领域,platform vendor因为最熟悉硬件平台,能够发挥重要的作用。

当前实践: DMLC-NNVM与Nervana-Graph

目前按照NNVM设计的主要有两个框架。一个是DMLC的NNVM,一个是Intel的Nervana Graph,目前都处于比较初级的阶段。初步比较见下表。

一句多余的话就是,在向上抽象方面,TensorFlow已经做得非常好了(在计算图上Graph/GraphDef, Node的抽象,在数据流上Variable,Tensor的抽象,以及运行时Session的抽象,都很贴切),因此很多人也觉得从API的角度觉得NNVM的存在不是很必要,这个是自顶向下看的角度。从自底向上看的角度,我觉得NNVM还是有必要的,我们可以把它当作Android 系统的HAL层来看,撇开这个HAL层的API谁定义得比较好,应该由谁定义这个问题,我觉得首先需要肯定这个API是存在的必要性。因此可能DMLC-NNVM和Nervana Graph都不会存在,可能最后大家还是回归到TensorFlow, 但是这个NNVM immediate layer的思想应该会被接受下来,然后platform vendor负责优化HAL,应用框架负责usage scenario的稳定局面会最终形成。

Neural Network Virtual Machine的更多相关文章

  1. [SDK2.2]Windows Azure Virtual Network (5) 重启、关闭、开启VNet中Virtual Machine

    <Windows Azure Platform 系列文章目录> 我们知道,Windows Azure VM的IP分为以下两种:Internal IP Address和Public VIP ...

  2. Windows Azure Virtual Network (5) 设置Azure Virtual Machine固定Private IP

    <Windows Azure Platform 系列文章目录> 注意:本文介绍的是Global Azure (http://www.windowsazure.com),如果你使用的是由世纪 ...

  3. Windows Azure Virtual Network (6) 设置Azure Virtual Machine固定公网IP (Virtual IP Address, VIP) (1)

    <Windows Azure Platform 系列文章目录> 注意:本文介绍的是Global Azure (http://www.windowsazure.com),如果你使用的是由世纪 ...

  4. Windows Azure Virtual Network (7) 设置Azure Virtual Machine固定公网IP (Virtual IP Address, VIP) (2)

    <Windows Azure Platform 系列文章目录> 本文介绍的是,当用户在创建Azure Virtual Machine的时候,忘记绑定公网IP,需要重新绑定公网IP的具体操作 ...

  5. Python -- machine learning, neural network -- PyBrain 机器学习 神经网络

    I am using pybrain on my Linuxmint 13 x86_64 PC. As what it is described: PyBrain is a modular Machi ...

  6. machine learning 之 Neural Network 1

    整理自Andrew Ng的machine learning课程week 4. 目录: 为什么要用神经网络 神经网络的模型表示 1 神经网络的模型表示 2 实例1 实例2 多分类问题 1.为什么要用神经 ...

  7. machine learning 之 Neural Network 2

    整理自Andrew Ng的machine learning 课程 week5. 目录: Neural network and classification Cost function Backprop ...

  8. machine learning 之 Neural Network 3

    整理自Andrew Ng的machine learning课程week6. 目录: Advice for applying machine learning (Decide what to do ne ...

  9. CheeseZH: Stanford University: Machine Learning Ex4:Training Neural Network(Backpropagation Algorithm)

    1. Feedforward and cost function; 2.Regularized cost function: 3.Sigmoid gradient The gradient for t ...

随机推荐

  1. SoapUI工具做get请求和post请求接口测试

    转载自:https://www.cnblogs.com/hong-fithing/p/7617366.html 此篇主要介绍SoapUI工具做常用的两种请求接口测试,分别是get请求和post请求. ...

  2. python解决四舍五入问题

    小数问题是计算机编程中大部分语言都会遇到的问题,尤其是在内容中涉及到评分.金额计算等等,本人一般在解决需求中固定小数位的数字计算时,都会先将其放大整10的倍数至整数,然后计算.存储,只有在显示的时候再 ...

  3. 一本通之 一堆迷宫 (Dungeon Master&走出迷宫&走迷宫)

    一本通在线崩溃....... . 有图有真相 这是个三维迷宫,其实和二位迷宫差不多,只是方向多加了2个. 但这个题的输入十分恶心,一度被坑的用cin.ignore(),但还是不过... 它的正确输入方 ...

  4. 在linux中输出每个group的用户成员

    先提供使用文件一步一步获取相关信息: 1. 获取所有的用户: awk -F: '{print $1 > "1.txt"}' /etc/passwd 2. 获取每个用户, 及其 ...

  5. (转)并发编程 – Concurrent 用户指南

    原文出处: 高广超 译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新:http://tutorials.jenkov.com/java-util-concurrent/in ...

  6. angular4中引入quill editor

    1. npm install --save-dev @types/quill  安装types 2.npm install ng2-quill-editor --save 安装quill 3.配置ts ...

  7. 图片转成base64位 页面中图片展示

    <img src="data:image/gif;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABG ...

  8. RN-进阶

    ActivityIndicator 显示一个圆形的loading的提示符 react-native-tab-navigator npm install react-native-tab-navigat ...

  9. Problem A: Apple(高斯消元)

    可以发现具有非常多的方程, 然后高斯消元就能85分 然而我们发现这些方程组成了一些环, 我们仅仅设出一部分变量即可获得N个方程, 就可以A了 trick 合并方程 #include <cstdi ...

  10. 图表相同数据会自动合并问题(finereport)

    finereport中,对于图表的操作,当遇到需要显示多个重复分类下的多个值时,由于自动合并相同数据,无法达到效果反复查询手册无果后,困扰好久,终想到了一个解决的办法:1.给查询的数据添加个列序号,每 ...