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 ...
随机推荐
- 备份原有yum源,设置为自建yum源的脚本
#脚本开始 #!/bin/bash cd /etc/yum.repos.d/ tar -zcvf yum.bak.tar.gz CentOS-* rm -rf CentOS* touch /etc/y ...
- 【转】计算机信息系统安全保护等级划分准则(GB 17859-1999)
计算机信息系统安全保护等级划分准则(GB 17859-1999) 概述 计算机信息系统安全保护等级划分准则(GB 17859-1999) 1 范围 本标准规定了计算机系统安全保护能力的五个等级,即: ...
- 二、易语言 api 相关
1. 取窗口句柄 对应的api: FindWindow (寻找顶级窗口) 2.取窗口矩形(位置) 对应的api: GetWindowRect(取窗口矩形) 3.取窗口标题 对应的api: Get ...
- windows下配置apache+https
通过https反向代理映射到http地址,可实现以https的方式,访问普通的http网站.主要涉及到以下三个配置文件的修改:httpd.confhttpd-ssl.confhttpd-vhosts. ...
- kill -9 ,kill -12,kill -15
https://www.cnblogs.com/liuhouhou/p/5400540.html Linux kill -9 和 kill -15 的区别 大家对kill -9 肯定非常熟悉,在工作中 ...
- VS2017编译GDAL(64bit)+解决C#读取Shp数据中文路径的问题
编译GDAL过程比较繁琐,查阅了网上相关资料,同时通过实践,完成GDAL的编译,同时解决了SHP数据中文路径及中文字段乱码的问题,本文以“gdal-2.3.2”版本为例阐述整个编译过程. 一.编译准备 ...
- 7.12 vowels.c 程序
7.12 vowels.c 程序 #vowels.c -- 使用多重标签 #include <stdio.h> int main(void) { char ch; int a_ct, e_ ...
- js中的数据类型、以及浅拷贝和深拷贝
一.js中的数据类型 1.基本类型(值类型):Undefined.Boolean.String.Number.Symbol 2.引用类型:函数.数组.对象.null.new Number(10)都是对 ...
- Windows 上安装 MySQL(8.0.11)
1.接下来我们需要配置下 MySQL 的配置文件 打开刚刚解压的文件夹 C:\web\mysql-8.0.11 ,在该文件夹下创建 my.ini 配置文件,编辑 my.ini 配置以下基本信息: [m ...
- 使用SimpleDateFormat类来实现时间跟字符串的转化
使用Date和SimpleDateFormat类表示时间 1.Date类 需要处理日期和时间的相关数据时可以使用 java.util 包中的 Date 类,这个类最主要的作用就是获取当前时间.下面看看 ...

