整理自微软亚研系统组Workshop

系统级的DL计算优化,微软亚洲研究院如何加速模型开发与训练

近日,微软亚洲研究院副院长周礼栋博士及微软亚洲研究院系统组伍鸣、薛继龙、杨凡、薛卉研究员向我们介绍了人工智能系统与工具。这次分享会也是微软亚研系统组以Workshop的形式第一次介绍他们的前沿研究工作与成果,包括如何在系统层面进行深度学习计算优化、大规模人工智能集群管理平台和可快速搜索超参数及网络架构的NNI。

机器之心的读者可能比较熟悉具体的ML算法与常用的深度学习框架,但对于人工智能系统可能并不是很熟悉。正如周礼栋博士所言:“系统最关键的创新,就是把抽象实现的非常完美。用户其实“看不到”系统,大家看到的似乎都是如视觉等上层层面的突破,永远看不到底层的进步。所以我们一直说,系统的最高境界就是完全不可见的,是隐形的。”


这种“隐形的”系统可以帮助开发者与研究者自动搭建开发环境、建立算法内部逻辑以及优化模型的计算过程与硬件调度等,只有我们完全忽略了这些底层工作,系统才是完美的。由此可见,系统正如周礼栋博士所述“它的意思是把零乱的、复杂的东西变成非常有序的整体。中文翻译的“系统”也很好,不光是音译,还意味着把很多零散的东西联系在一起,成为一个统一的整体。”


其实微软亚研在系统研究上也有很多成果,例如能够在内存里面通过集群处理10亿张图的 GraM 分布式并行图处理引擎;每天能够调度几百万条任务,并用来支持搜索引擎、广告等部门的日常业务的Apollo大数据任务调度系统;还有未来将在微软云计算、人工智能系统里面广泛应用的KV-Direct Key/Value系统等。


这一次微软亚研向我们介绍的三个系统或工具都旨在帮助机器学习开发者更便捷地构建模型与应用。首先微软亚研介绍了深度学习框架后端优化如何加速分布式训练、提升计算单元效率以及降低内存限制等,其次论述了OpenPAI系统及异构集群环境如何更好地支持人工智能业务。最后薛卉研究员讨论了深度学习智能探索如何提供智能化、自动化的深度学习工具包,并帮助用户或者开发者自动地进行数据分析、模型搜索、参数调试和性能分析。后文主要关注于系统层面的DL优化,即优化数据流图映射到实际硬件的过程。


对于深度学习框架后端优化,读者可阅读微软亚研伍鸣和薛继龙的文章:


算力与系统优化


深度学习的计算力主要体现在样本数量、迭代数量与推断速度,它们把控制着模型的性能,同时也是最需要计算力的地方。由于深度模型的表征能力非常大,那么很可能模型的方差非常大,这在没有巨量样本的情况下也就造成了模型欠拟合。其次,更大规模和更复杂的神经网络模型已经被证明非常有效,并在产品中有广泛的使用。


此外,深度模型需要大量的迭代更新以搜索最优解。这主要也是因为参数空间巨大,因此它需要大量样本才能学习到正确的参数。最后,模型的线上推理具有更加极致的性能要求。线上的服务具有硬性的服务等级协议(SLA),所以在实际部署大型模型时,需要手工重新优化在深度学习框架(如TensorFlow)上已经训练好的模型,导致大量额外工程开销的产生。


这些都需要大量的优化以降低算力需求,其实任何方面的优化问题都可以从模型算法和系统两个角度来看待。一方面,我们可以通过设计更紧凑的模型或采用剪枝、量化和低秩近似等方法压缩模型所需的计算资源。这样的优化对特定的算法往往非常有效,但却不容易扩展应用到其它算法中。而另一方面,也就是微软亚洲研究院异构计算组正在进行的研究,则是在系统中实现模型算法无关的优化,这种优化通常可以为更多的应用带来计算优化。


对于系统层面的优化,它主要关注将模型计算图映射到对应的硬件资源。因为如今流行的深度学习系统(包括TensorFlow、PyTorch、CNTK、MxNet、Caffe等)大都采用分层的体系结构设计。在前端提供高级语言(例如Python)的接口抽象,允许用户方便地描述神经网络结构。描述好的模型在被系统运行前,首先会被转换成数据流图(Data-flow Graph)。在这个数据流图中,节点是特定的矩阵操作,而连接不同节点的边则是操作节点的输入和输出矩阵。然后,深度学习系统的后端将这个数据流图映射到实际硬件上进行高效地执行,而大部分系统层面的优化就是在这个阶段完成的。

优化这个深度学习计算的挑战主要在三个方面。第一个是扩展性,也就是如何通过增加计算资源,让计算能力线性增加。微软在这一方面主要考虑如何能够极致的发挥如RDMA、NVLink等的高速网络硬件的能力,以及如何能自动地做分布式的执行规划


其次,微软的研究员关心局部计算,尤其GPU上的计算效率。最后,关注的问题是内存的使用效率,因为许多如GPU等硬件计算单元,它们的内存资源是非常稀缺的,这会限制模型的规模。


加速分布式深度学习训练


分布式训练的主要瓶颈在于多机之间的通信开销。如今计算机网络的硬件技术已经有了很大的发展,InfiniBand的RDMA网卡(Remote Direct Memory Access,这是一种硬件的网络技术,它使得计算机访问远程的内存时无需远程机器上CPU的干预)已经可以提供50~100Gbps的网络带宽和微秒级的传输延迟,目前许多以深度学习为目标应用的GPU机群都部署了这样的网络。那么针对深度学习的应用负载,如何才能更好地利用RDMA硬件的能力?


首先,我们来分析一下深度学习应用的几个特点:


  • 张量Tensor)是深度学习计算中最主要的数据结构,大量的计算开销都是花在对张量的处理上。张量是一种比较简单的数据结构,主要由meta-data和payload两部分组成。Payload就是基本元素的数组,而meta-data就是张量的shape信息。这种简单的数据结构在传输的时候其实不太需要复杂的序列化和反序列化的功能。
  • 在相当多的情况下,张量都是密集的,并且其大小也是比较大的,也就是说在传输这样的Tensor的时候并不需要对其进行额外的批处理。
  • 深度学习的训练过程是迭代的。在不同的迭代之间,数据流图和很多张量的shape信息并不发生改变,并且其中不少的shape信息是可以在运行时前就静态决定的。


基于以上几个特点,我们可以对数据流图进行分析,找到那些可以静态决定shape信息的张量,以便在接收端预先为其分配RDMA可访问的内存空间,并将其相应的可远程访问的地址传送给发送端。这样一来,在运行时,发送端可以通过单边的RDMA请求将Tensor的数据直接传输到接收端,从而完全避免了没有必要的额外内存拷贝,达到零拷贝的通信过程。


下面展示了利用RDMA优化分布式的深度学习训练。左图中,微软系统是数据流优化的这一层,实际的系统可以整合到TensorFlow里,微软设计了从CNN、RNN到全连接的很多种类型的神经网络结构。图中的红色是微软的数据,蓝色是原始的数据,可以看到,不同的应用类型下,微软可以取得两到八倍的加速。



右图显示了一个完整的应用。它是一个机器翻译的系统,输入数据来源于网上公开的一个翻译数据集,图中显示了其收敛的速度,可以看到微软的技术带来的两到三倍的加速。


提升计算单元运算效率


 
不少具有实际应用价值的模型都非常复杂,由它们所转换出来的数据流图通常是由成千上万的操作节点构成,其中包含了很多运算量非常小的节点,大量这样的操作节点会引入以下一些运行时开销,并且这样的开销会非常显著。


  • 深度学习系统运行时需要根据数据流图中节点的依赖关系来调度节点的执行,因此对于由许多小的操作节点构成的计算流图来说,系统调度所带来的额外开销就会相对比较大;
  • 对于在GPU上运行的计算来说,每个操作节点的实现都对应着一个GPU的内核函数,而这个内核函数的每一次执行需要CPU调用显卡驱动来启动,因此也带来了常数量级的额外开销。
  • 计算量小的操作节点往往难以挖掘出足够的数据并行性,因此不能充分利用处理器硬件中的计算资源。


解决这一问题的主要思路是内核融合(Kernel Fusion)。一些手工的优化方法就运用了这一思想,比如NVIDIA基于CuDNN的RNN库函数。它把整个循环神经网络实现成一个GPU的内核函数,因此获得了非常好的性能。然而它的缺点也非常明显,那就是不够灵活和通用,无法应用在其它网络或一些变种的循环神经网络中。而微软更加关注的是如何在深度学习的系统中自动地对任意的网络模型实施优化。


以下是微软做内核融合带来的大幅性能提升的实验。这是一个标准循环神经网络LSTM模型的例子,这个模型中,微软通过自动内核融合的方式,可以把整个模型所有的算子融合成一个内核函数,从而基本消除了所有框架本身的额外开销。


右边是微软性能比较数据,最右的黄色柱是微软的结果,跟原始的TensorFlow比,有10倍的加速,中间是XLA,这是TensorFlow里面自己开发的编译优化系统,可以看到微软的优化比XLA的优化效果更好。


克服设备内存资源限制


 
设备内存的大小往往限制了可以处理的模型规模,解决这一问题的一个思路是对模型进行压缩和量化。如今学术界和工业界已经有大量的研究工作提出不同的压缩和量化的方法,然而,在实际的应用场景中使用压缩和量化仍然是个繁琐的迭代过程。


例如在量化这一常见的压缩算法中,我们只需储存 k 个聚类中心 c_j,而原权重矩阵只需要记录各自聚类中心的索引就行。在韩松 ICLR 2016 的最佳论文中,他用如下一张图非常形象地展示了量化的概念与过程。


如上所示权重矩阵的所有参数可以聚类为 4 个类别,不同的类别使用不同的颜色表示。上半部分的权重矩阵可以取聚类中心,并储存在 centroids 向量中,随后原来的权重矩阵只需要很少的空间储存对应的索引。下半部是韩松等研究者利用反向传播的梯度对当前 centroids 向量进行修正的过程。这种量化过程能大量降低内存的需求,因为我们不再需要储存 FP64 或 FP32 的数据,而只需要储存 INT8 或更少占位的数据。


显然,这样一个繁琐的过程需要一个好的工具来使之变得方便,这也是微软亚洲研究院系统组正在关注的一个问题。他们正在尝试扩展TensorFlow的API来使用户可以在模型脚本中直接控制量化和压缩的方法、对象、程度和过程。


除了这些基本概念与方法,微软亚洲研究院薛继龙研究员还展示了自动化优化框架的基本情况。对于LSTM模型,他在GPU和TensorFlow框架下迭代100步,并发现每一次迭代平均大概需要23毫秒左右。而开发者在增加代码“from tensorflow.contrib import wolong”,并调用微软的自动优化系统后,系统会自动将该LSTM的1000多个小算子融合成了一个大的GPU的内核。而该LSTM在相同框架和硬件下每一次迭代平均达到了2毫秒左右,效率有了非常大的提升。

对于这一自动优化框架的GitHub开源情况,周礼栋博士表示:“我们再把它整理一下,看怎么把它变成一个开源的方式。有不同的方式可以包装这样一个库,我们也要考虑怎么打包使得它能够更容易使用,而且让更多人可以跟我们一起来贡献。”

工程分布式机器学习调度优化算法人工智能系统微软亚洲研究院
3
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

调度技术

调度在计算机中是分配工作所需资源的方法。资源可以指虚拟的计算资源,如线程、进程或数据流;也可以指硬件资源,如处理器、网络连接或扩展卡。 进行调度工作的程序叫做调度器。调度器通常的实现使得所有计算资源都处于忙碌状态,允许多位用户有效地同时共享系统资源,或达到指定的服务质量。 see planning for more details

核函数技术

核函数包括线性核函数、多项式核函数、高斯核函数等,其中高斯核函数最常用,可以将数据映射到无穷维,也叫做径向基函数(Radial Basis Function 简称 RBF),是某种沿径向对称的标量函数。最常应用于SVM支持向量机中

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

剪枝技术

剪枝顾名思义,就是删去一些不重要的节点,来减小计算或搜索的复杂度。剪枝在很多算法中都有很好的应用,如:决策树,神经网络,搜索算法,数据库的设计等。在决策树和神经网络中,剪枝可以有效缓解过拟合问题并减小计算复杂度;在搜索算法中,可以减小搜索范围,提高搜索效率。

收敛技术

在数学,计算机科学和逻辑学中,收敛指的是不同的变换序列在有限的时间内达到一个结论(变换终止),并且得出的结论是独立于达到它的路径(他们是融合的)。 通俗来说,收敛通常是指在训练期间达到的一种状态,即经过一定次数的迭代之后,训练损失和验证损失在每次迭代中的变化都非常小或根本没有变化。也就是说,如果采用当前数据进行额外的训练将无法改进模型,模型即达到收敛状态。在深度学习中,损失值有时会在最终下降之前的多次迭代中保持不变或几乎保持不变,暂时形成收敛的假象。

规划技术

人工智能领域的「规划」通常是指智能体执行的任务/动作的自动规划和调度,其目的是进行资源的优化。常见的规划方法包括经典规划(Classical Planning)、分层任务网络(HTN)和 logistics 规划。

TensorFlow技术

TensorFlow是一个开源软件库,用于各种感知和语言理解任务的机器学习。目前被50个团队用于研究和生产许多Google商业产品,如语音识别、Gmail、Google 相册和搜索,其中许多产品曾使用过其前任软件DistBelief。

张量技术

张量是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 维空间内,有 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换。称为该张量的秩或阶(与矩阵的秩和阶均无关系)。 在数学里,张量是一种几何实体,或者说广义上的“数量”。张量概念包括标量、矢量和线性算子。张量可以用坐标系统来表达,记作标量的数组,但它是定义为“不依赖于参照系的选择的”。张量在物理和工程学中很重要。例如在扩散张量成像中,表达器官对于水的在各个方向的微分透性的张量可以用来产生大脑的扫描图。工程上最重要的例子可能就是应力张量和应变张量了,它们都是二阶张量,对于一般线性材料他们之间的关系由一个四阶弹性张量来决定。

机器翻译技术

机器翻译(MT)是利用机器的力量「自动将一种自然语言(源语言)的文本翻译成另一种语言(目标语言)」。机器翻译方法通常可分成三大类:基于规则的机器翻译(RBMT)、统计机器翻译(SMT)和神经机器翻译(NMT)。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

映射技术

映射指的是具有某种特殊结构的函数,或泛指类函数思想的范畴论中的态射。 逻辑和图论中也有一些不太常规的用法。其数学定义为:两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,y称为元素x在映射f下的象,记作:y=f(x)。x称为y关于映射f的原象*。*集合A中所有元素的象的集合称为映射f的值域,记作f(A)。同样的,在机器学习中,映射就是输入与输出之间的对应关系。

逻辑技术

人工智能领域用逻辑来理解智能推理问题;它可以提供用于分析编程语言的技术,也可用作分析、表征知识或编程的工具。目前人们常用的逻辑分支有命题逻辑(Propositional Logic )以及一阶逻辑(FOL)等谓词逻辑。

推荐文章
暂无评论
暂无评论~