Neural Network Virtual Machine
深度学习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的更多相关文章
- [SDK2.2]Windows Azure Virtual Network (5) 重启、关闭、开启VNet中Virtual Machine
<Windows Azure Platform 系列文章目录> 我们知道,Windows Azure VM的IP分为以下两种:Internal IP Address和Public VIP ...
- Windows Azure Virtual Network (5) 设置Azure Virtual Machine固定Private IP
<Windows Azure Platform 系列文章目录> 注意:本文介绍的是Global Azure (http://www.windowsazure.com),如果你使用的是由世纪 ...
- Windows Azure Virtual Network (6) 设置Azure Virtual Machine固定公网IP (Virtual IP Address, VIP) (1)
<Windows Azure Platform 系列文章目录> 注意:本文介绍的是Global Azure (http://www.windowsazure.com),如果你使用的是由世纪 ...
- Windows Azure Virtual Network (7) 设置Azure Virtual Machine固定公网IP (Virtual IP Address, VIP) (2)
<Windows Azure Platform 系列文章目录> 本文介绍的是,当用户在创建Azure Virtual Machine的时候,忘记绑定公网IP,需要重新绑定公网IP的具体操作 ...
- 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 ...
- machine learning 之 Neural Network 1
整理自Andrew Ng的machine learning课程week 4. 目录: 为什么要用神经网络 神经网络的模型表示 1 神经网络的模型表示 2 实例1 实例2 多分类问题 1.为什么要用神经 ...
- machine learning 之 Neural Network 2
整理自Andrew Ng的machine learning 课程 week5. 目录: Neural network and classification Cost function Backprop ...
- machine learning 之 Neural Network 3
整理自Andrew Ng的machine learning课程week6. 目录: Advice for applying machine learning (Decide what to do ne ...
- 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 ...
随机推荐
- 使用OwnCloud搭建自己的云盘
使用OwnCloud搭建自己的云盘 1.用途 ownCloud是一款开源的私有云框架,可以通过它实现个人网盘的功能,ownCloud提供了各个平台的文件同步客户端,因此搭建好ownCloud之后即可使 ...
- 微信小程序计算金额长度异常解决办法
今天在做微信小程序,在测试的时候偶然出现了一些问题,如下图. 心中的一阵不爽猛然袭来,完全是搞事情哈! 然后经过一番探索,用toFixed方法搞定了,此方法是对值进行四舍五入的. 解决后点了一大堆控制 ...
- linux 线程同步
参考链接:https://blog.csdn.net/daaikuaichuan/article/details/82950711#font_size5font_2 一,互斥锁 #include &l ...
- catkin-make: command not found 错误解决
参考网址:https://answers.ros.org/question/212492/catkin_make-command-not-found/ zc@ubuntu:~ $ source /op ...
- centos7安装nginx,以及使用node测试反向代理
1.添加nginx的安装源 vi /etc/yum.repos.d/nginx.repo 2.输入下面内容,并保存退出 [nginx] name=nginx repo baseurl=http://n ...
- aspose.cells 复制单元格
将第1行至第27行复制到第28行 cells.CopyRows(cells, 0, i*27, 27);
- 搭建Mock Server
1.为什么要搭建mock-server? 为了更好的分工合作,让前端能在不依赖后端环境的情况下进行开发,其中一种手段就是为前端开发者提供一个 web 容器,这个本地环境就是 mock-server. ...
- C&C++类型定义typedef
1.声明 1.1结构声明: struct { int n; double x,y; }; 1.2带结构标志的声明 struct point{ double x,y; }; 1.3定义结构类型 1.3. ...
- .net core2.2
GetCurrentDirectory returns the worker directory of the process started by IIS rather than the app's ...
- Layout-3相关代码:3列布局代码演化[二]
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...