论文阅读:vDNN: Virtualized Deep Neural Networks for Scalable, Memory-Efficient Neural Network Design

论文链接:https://arxiv.org/pdf/1602.08124.pdf
总的来说:vDNN的工作能够较好地解决深度神经网络在训练时GPU内存占用高的问题,使得更深层次的神经网络模型能够在单个GPU中进行训练。然而,由于PCIe带宽的限制,当数据移入和移出CPU内存所需的时间比计算DNN的反向传播算法所需的时间长时,vDNN就会产生不可忽略的性能开销。
·摘要:最广泛使用的机器学习框架要求用户仔细调整他们的内存使用,以便深度神经网络(DNN)适合图形处理器的DRAM容量。这种限制阻碍了研究人员研究不同机器学习算法的灵活性,迫使他们要么使用不太理想的网络架构,要么在多个GPU上并行处理。我们提出了一个运行时内存管理器,它虚拟化了dnn的内存使用,这样GPU和CPU内存可以同时用于训练更大的dnn。我们的虚拟化DNN (vDNN)将AlexNet的平均GPU内存使用量减少了高达89%,OverFeat减少了91%,GoogLeNet减少了95%,这显著降低了DNNs的内存需求。在VGG-16上的类似实验,证明了我们的建议的内存效率。VGG-16是迄今为止网络最深、内存消耗最大的dnn之一。vDNN使批量为256(需要28 GB内存)的VGG-16能够在一个包含12 GB内存的NVIDIA Titan X GPU卡上训练,与一个假设的、具有足够内存容纳整个DNN的典型GPU相比,性能损失18%。
Introduction:深度神经网络(DNNs)最近已成功应用于各种应用领域,如计算机视觉[1]、语音识别[2]和自然语言处理[3],这是因为与传统的先进方法相比,它们具有优异的性能。深度学习技术的这种激增导致近年来开发了几个软件框架来分析和促进神经网络的设计[4,5,6,7]。随着开发人员不断添加更多功能和提高计算效率,可用框架的列表不断扩大,以促进深度学习领域的研究。由于图形处理单元(GPU)提供了巨大的计算能力,这些框架为cuDNN等GPU软件库提供了强大的后端支持[8]。事实上,今天几乎每个参与训练神经网络的小组都在部署GPU来加速深度学习[9]。
  虽然这些流行的机器学习框架有助于对数字神经网络的研究,但使用这些框架的一个主要限制是,系统中图形处理器的DARM容量限制最终限制了可以训练的DNN的大小(第二节)。为了解决内存容量瓶颈[10,11],ML从业者必须要么使用不太理想的DNN架构(更小的层数、更小的·batch-size、性能较差但记忆效率较高的卷积算法)或者在多个图形处理器上并行处理DNN[12]。图1突出显示了ImageNet [13]获奖域名的内存消耗趋势是如何随着时间的推移而演变的。例如,AlexNet [1]只包含5个卷积层和2个全连接层,只需要“仅”1.1 GB的内存分配来进行训练,这远远低于最先进的NVIDIA Titan X的12 GB内存容量。另一方面,最近的VGG16 [14]包含16个卷积层和3个全连接层,对于批量256,总共占用28 GB的内存。因为单个GPU只能容纳64个VGG-16的批处理大小,所以批处理256的训练需要跨多个GPU并行化,或者网络必须以较小的批处理顺序执行多次。随着最新的ImageNet获奖网络采用超过100个卷积层[15],深度学习的趋势是走向更大和更深的网络设计[14,16,17,18]。因此,减轻图形处理器严格的物理内存限制变得越来越重要。如下图所示:

本文提出了虚拟深度神经网络,(VDNN):一个运行时内存管理解决方案,虚拟化了深度神经网络在图形处理器GPU和中央处理器CPU内存中的内存使用。我们的vDNN允许ML从业者在可用的图形处理器之外部署更大更深的网络。使它们能够更加专注于算法,同时系统架构和运行时系统透明地管理其数据的分配、放置、移动和释放。虚拟数据网络背后的动机基于以下三个关键观察:
1)通过随机梯度下降法训练的神经网络是多层设计和构造的
2)这些神经网络的训练涉及一系列分层计算,其顺序是静态固定的,并且在整个训练过程中重复数百万到数十亿次迭代;
3)即使图形处理器在任何给定时间只能处理单个层的计算(由于基于SGD的DNN训练的逐层计算特性),流行的ML框架采用网络范围的内存分配策略,因为DNN训练要求网络中所有层的中间特征映射都要备份到图形处理器内存中,以进行梯度更新。也就是说后续的梯度的更新是需要之前的很多层的计算的结果的,否则没法完成计算实现,这样的性质必然会引入的内存的消耗。
现有的方法的缺陷:现有的内存管理方案过度配置内存分配,以适应整个网络层的使用,即使图形处理器只使用这种分配的子集来满足分层要求。我们观察到,对于更深层次的网络,这种内存利用不足的问题变得更加严重,导致53%到79%的分配内存在任何给定时间都没有被使用。
本文的方法:vDNN的目标是保守地分配GPU内存,以立即使用给定层的计算,从而大幅减少最大和平均内存使用,使研究人员能够训练更大的网络。为了实现这一目标,虚拟数据网利用分配的数据结构的数据依赖性,特别是占内存使用量大部分的中间特征映射,并在GPU和CPU内存之间释放或移动这些中间数据。具体来说,VDNN:要么1)如果没有进一步的重用,就积极地从GPU内存中释放这些特征映射,要么2)如果确实存在进一步的重用,但不是立即需要,就向(从)CPU内存卸载(以及以后的预取) 。通过利用数据网络的层间内存访问和重用模式,我们的虚拟数据网络内存管理器智能地将正常的DNN计算与卸载/预取/释放操作重叠,有效地虚拟化了数据网络的内存使用,几乎没有性能损失。vDNN的操作对程序员来说是完全透明的,使他们能够训练更大更深的神经网络,这些网络消耗的内存远远超过当今GPU的物理内存限制。我们工作的主要贡献是:

  • 这项工作是第一次对基于图形处理器的DNN训练进行详细的定量分析,而不是针对DNN推论的高能效加速器的最新文献。
  • 据我们所知,我们的工作是第一个从架构的角度对DNNs的内存访问特性及其对GPU内存系统的影响进行深入表征研究的工作。
  • 这项工作确定了当前ML框架内存管理策略的关键限制,因为它们要求目标DNN的网络范围内存使用与GPU的物理容量完全匹配。我们通过显示当内存分配大小(14GB到67 GB)超过GPU内存预算(NVIDIA的Titan X中为12GB)时,现有框架在训练10个研究的DNN中的6个时失败来证明这一点。
  • 我们提出、实现并评估了一个名为vDNN的运行时内存管理器,它虚拟化了跨CPU和GPU内存的神经网络的内存使用。我们的vDNN解决方案将这6个内存需求网络的平均GPU内存使用量减少了73%至98%,使它们可以在一张泰坦X卡上进行训练。与一个假设的、包含足够内存来容纳整个DNN的虚拟图形处理器相比,虚拟磁盘网络会产生1%到18%的性能开销。

背景介绍:
  这一部分提供了现代DNNs的概述,当前ML框架的内存管理策略,以及它们激励这项工作的关键限制。
1.DNN架构
  卷积神经网络是用于高精度计算机视觉任务的最流行的最大似然算法之一。虽然其他类型的网络也在获得牵引力(例如,自然语言处理的递归神经网络),但所有这些神经网络都是通过随机梯度下降(SGD)使用反向传播算法[19]进行训练的。为了说明清楚,并且由于它们在ImageNet竞赛中的先进性能,本文主要集中于在AlexNet [1]、OverBeat[30]、GoogLeNet [17]和VGG [14]中常见的前馈型卷积神经网络。然而,我们工作的关键直觉同样适用于任何表现出分层计算特性并通过SGD训练的神经网络,这将在本节后面详细描述。
  dnn采用多种层的组合设计,大致分为卷积层(CONV)、激活层(ACTV)、池化层和全连接层。神经网络是由这些层的多个实例构成的序列。特别是用于计算机视觉任务的数字神经网络被广泛地构造成以下两个模块:1)检测输入图像中可区分特征的特征提取层,以及2)分析提取的特征并将图像分类到给定图像类别的分类层。特征提取层通常使用卷积池化激活层,并定位为DNN的初始部分。分类层是使用FC层全连接层构建的,位于DNN计算序列的末尾。深度学习的一般趋势是设计具有大量特征提取层的网络,以便为鲁棒的图像分类训练特征的深层结构[14,15,17]。
DNN的训练和推理:也就是前向和后向传播的时候:
  神经网络在用于推理或分类任务之前需要经过训练。训练需要通过执行前向和后向传播算法的操作来学习和更新神经网络各层的权重[19]。遍历的方向,以及必须执行的数学运算,向前和向后传播是不同的。
前向传播:前向传播是从第一层(输入)到最后一层(输出)执行的,而反向传播是在相反的方向(最后一层到第一层)执行的,在图2中从右到左。直观地,前向传播逐层遍历网络,并对给定输入执行前述特征提取和分类任务,从而导致图像分类。在前向传播过程中,每个图层对其输入要素图应用数学运算(X),并将结果存储为输出要素图(Y)。对于线性前馈DNNs,层(n1)的结果Y直接用作层(n)的输入X(图2)。因此,前向传播的计算流程是一个序列化的过程,因为只有在前一层(n1)完成计算并将其输出Y转发到层(n)的输入X时,层(n)才能启动其层的操作。非线性网络拓扑可以包含一对多(分叉)和多对一(连接)层间依赖关系,但前向传播仍然涉及一系列逐层计算,如图3所示。请注意,由于这种层间数据依赖性,GPU在任何给定时间只能处理单层的计算。因此,所需的最低每层内存分配取决于层的输入输出关系及其数学函数1。卷积神经网络占据了大多数存储效率高的卷积算法(例如,cuDNN [8]2中的隐式GEMM)需要三种数据结构,即前向传播的输入/输出特征映射(X和Y)和层的权重(W)。然而,使用基于快速傅立叶变换的卷积算法需要额外的临时工作空间缓冲区来管理变换后的地图。
Backward Propagation:对于未完全训练的dnn,推断的图像类别可能不正确。结果,在正向传播结束时,损耗函数被用来导出推断误差的大小。具体地说,损失函数的梯度是相对于最后一层(N)的输出导出的: cuDNN(4.0版)提供了六种不同的卷积算法。隐式GEMM需要最少的内存分配,因为不需要额外的工作空间。另一方面,基于快速傅立叶变换的卷积算法由于需要额外的数据结构来存储变换到频域的特征映射而导致更大的存储器分配。更多细节见[8,32]。这个链式规则类似地用于导出权重的梯度,以更新网络模型。类似于前向传播,后向传播也是逐层对相应的入射梯度图dYs执行的。一旦反向传播到达第一层,就使用权重梯度来调整权重,以便为下一个分类任务减少预测误差。因此,训练一个网络包括前向和后向传播,这需要重复数百万到数十亿次的迭代。由于基于SGDbased的反向传播的随机性质,网络输入通常用数百个图像进行批处理(例如,128个和256个图像用于最佳性能AlexNet和VGG-16),这增加了内存分配大小,但有助于网络模型更好地收敛到最优解。
Motivation: Scalable and Memory-Efficient DNN Design:为了帮助神经网络的设计和部署,近年来已经开发了各种各样的最大似然框架,包括Caffe、Torch、Neon、TensorFlow和Anano[9]。这些框架提供了丰富的功能,加上它们使用图形处理器加速DNN训练和推理的能力,极大地简化了实现神经网络的过程。尽管它们很灵活,但流行的ML框架在分配和管理内存的方式上受到严重限制。
  为了说明ML框架在管理内存方面的缺点,考虑图2所示的例子。当使用现有的多层框架训练DNN时,网络所有层所需的内存必须在物理GPU内存容量内。这种GPU端、网络范围内存分配策略的关键原因是为了获得性能优势。更具体地说,基于页面迁移的虚拟化解决方案为页面分配提供CPU和GPU内存(无论虚拟化功能是否由未来的CUDA运行时扩展或编程模型(如OpenMP (4.0) [33])提供),都必须通过PCIe传输页面,这涉及到几个延迟密集型过程,如系统调用的CPU中断、页面表更新、TLB更新/击落以及实际的页面传输。单个4 KB页面到图形处理器的页面延迟为20到50秒,这意味着使用页面迁移的PCIe带宽利用率为80到200兆字节/秒,而直接存储器存取启动的cudaMemcpy在16兆字节/秒的最大PCIe带宽中平均达到12.8兆字节/秒。由于对于非常深的网络来说,通过PCIe传入/传出的数据量可能是几十千兆字节(图15),所以当依赖页面迁移来训练DNN时,ML框架将遭受巨大的性能损失。我理解是这里因为需要对应的内存的页面的换入换出的操作,其中的各种不同的操作之间可能涉及有页面的内存的换入换出的延迟。请注意,由于反向传播算法的逐层梯度更新规则(链规则的属性,第二-B节),每个层的特征映射(X)稍后在其自己的反向传播过程中被重用。这意味着在反向计算完成之前,所有Xs在GPU内存中必须仍然可用。图4显示了基于其功能的内存使用量,以及随着网络变得更加深入,要素地图的重要性不断增加。因为更深层次的网络需要跟踪更大数量的Xs,所以为要素地图分配的内存比例随着图层数量的增加而单调增加。然而,不管神经网络的深度如何,网络本身的训练仍然是逐层进行的。因此,基准的全网络内存分配策略既极其浪费,又不可扩展,因为它没有考虑逐层的DNN训练。图5显示了前向传播期间VGG-16的每层内存使用情况,提供了以下主要观察结果。首先,与每个图层的权重(右轴)相比,中间要素地图和工作空间(左轴)会导致更高的内存使用量。第二,这些中间数据结构大多集中在特征提取层,在后面的分类器层不太重要。第三,尽管与这些中间数据相比,权重的大小较小,但由于它们的完全连通性,权重主要集中在分类器层。最后是:每层内存使用量远小于基线策略(图1)所需的28GB内存,这表明使用细粒度、分层内存管理策略可以节省大量内存。总结就是:首先卷积层和池化层相应会占据更大的内存空间、中间的数据结构是更加重要的,这些中间数据结构大多集中在特征提取层,在后面的分类器层不太重要。尽管与这些中间数据相比,权重的大小较小,但由于它们的完全连通性,权重主要集中在分类器层上。本身卷积的提出就是为了减少全连接层的权重的个数太多的原因。每层内存使用量远小于基线策略(图1)所需的28GB内存,这表明使用细粒度、分层内存管理策略可以节省大量内存。

VIRTUALIZED DNN
  我们的虚拟化DNN (vDNN)内存管理器的设计目标是虚拟化DNNs的内存使用,同时使用GPU和CPU内存,同时最大限度地降低其对性能的影响。vDNN对程序员来说是完全透明的,因为数据的分配、放置、移动和释放是由系统架构和运行时系统无缝协调的。这样的抽象使得ML从业者能够更加专注于他们的ML算法,而不必担心GPU内存管理的低级细节。虚拟数据网主要优化特征提取层的内存使用因为大部分内存使用集中在这些层上,占AlexNet上内存使用的81%和VGG-16 (256)上的96%。更具体地说,我们将这些特征提取层的特征映射作为目标,因为这些中间数据结构占了GPU内存使用的大部分(图4和图5)。虚拟神经网络的直觉也可以应用于权重和分类层,但节省内存的好处较少。
A. Design Principle:前面的部分强调了这样一个事实,即每个单独层的内存需求远远小于基线网络范围内存分配策略实际提供的内存需求。vDNN采用基于滑动窗口的分层内存管理策略,运行时内存管理器从其内存池中保守地分配内存,以立即使用当前由GPU处理的层。当前层不需要的中间数据结构针对内存释放,以减少内存使用。
Forward Propagation:如第二节所讨论的,深层网络必须跟踪大量的内部前向传播过程中提取的特征图(Xs)。然而,一旦给定层(n)的前向计算完成,层(n)的X就不被重用,直到GPU回到相同层(n)的相应后向计算。因为层(n)的X的重用距离在毫秒到秒的数量级(例如,AlexNet和VGG-16 (64)的第一层分别超过60毫秒和1200毫秒),所以深度网络最终分配大量的Xs,这些Xs有效地驻留在GPU内存中而没有立即使用(图6)。因此,处理这些Xs进行内存优化对于有效利用GPU内存至关重要,因为这些中间数据占内存分配的很大一部分(图4)。因此,如果目标是释放内存,vDNN有条件地通过系统互连(例如,PCIe、NVLINK [35])将这些中间Xs卸载到CPU内存。第三节-C详细说明了vDNN内存传输策略,该策略决定了选择哪些层来卸载其X。一旦卸载操作完成,vDNN将从内存池中释放卸载的X,以减少GPU内存使用。但是,在评估卸载图层输入的可行性时,必须小心。这是因为,对于非线性网络拓扑,多个图层可能是先前计算的图层输出要素图(Y)的使用者。例如,图3中的层(2)和层(3)都使用层(1)的输出Y作为其输入X。卸载并因此释放层(2)的输入X,在到达层(3)的正向计算是有问题的,因为这两个层共享输入X的相同数据结构。因此,vDNN以数据流图的形式跟踪层间依赖性(例如,图3中的Refcnt),并且仅当当前处理层是其输入特征映射的最后消费者时,才允许启动卸载/释放操作。图7是前向传播期间线性DNN的示例执行流程,突出显示了何时释放层的X变得安全。
Backward Propagation:与前向传播类似,虚拟数据网积极地发布不需要用于训练剩余层的后向计算的数据结构。在层(n)的反向传播期间,层(n+1)的Y和dY不再需要,因为GPU已经完成了该层的梯度更新(图8)。同样,通过利用逐层DNN反向传播,一旦该层的反向计算完成,vDNN立即释放该层的Y和dY。不发布x和dX,因为前一层的反向传播需要这些值来进行梯度推导。请注意,如果一个层已经将其X卸载到主机内存,vDNN应该保证在梯度更新启动之前,卸载的数据被复制回GPU内存。原始地按需复制回数据将会使X的内存复制操作背后的反向计算序列化。因此,vDNN为层(n)的卸载特征映射启动预取操作,该操作与层(m)的反向计算重叠,n < m,因此预取在其实际使用之前启动,隐藏预取延迟。
B. Core Operations And Its Design:vDNN被原型化为cuDNN之上的一层[8]。每一层都跟踪输入/输出特征映射的跨层数据依赖性,以便对虚拟数据网络卸载和释放操作进行适当的调度。vDNN使用两个独立的CUDA流[36]将正常的DNN计算与vDNN的内存分配、移动和释放操作重叠。流计算是CUDA流,它连接到cuDNN句柄,并对所有图层的向前和向后计算。streammemory管理vDNN的三个关键组件;内存分配/释放、卸载和预取
Memory Allocation/Release:CUDA库只支持同步内存分配,这意味着对cudaMalloc()或cudaFree()的任何调用都会在一个节点内的所有GPU之间强制执行额外的同步。为了安全地启用vDNN内存操作,同时不陷入同步CUDA应用编程接口的陷阱,我们采用了NVIDIA发布的开源异步内存分配/发布应用编程接口库[37]。当程序启动时,vDNN内存管理器分配有一个大小与物理GPU内存容量相当的内存池。每当vDNN分配(和释放)数据结构时,底层内存管理器将从这个内存池中保留(和释放)内存区域,而不必调用cudaMalloc()或cudaFree()。
Memory Offload:卸载输入特征映射是vDNN节省内存的关键因素之一。当选择一个层进行卸载时,vDNN首先使用cudaMallocHost()分配一个固定的主机端内存区域。流内存使用cudaMemcpyAsync()通过PCIe启动该层的X到固定内存的非阻塞内存传输,并将其与同一层的cuDNN正向计算重叠。如果流存储器卸载了它的特征映射,当前的vDNN实现在每个层的前向计算结束时同步流计算和流存储器。这种方法保证了卸载的数据在下一层开始前向计算之前从内存池中安全释放,最大限度地提高了卸载的内存节省优势。因为CONV层和池化层的Xs是只读数据结构,重叠层(n)的卸载操作与同一层的前向传播不会产生任何正确性问题。ACTV层已经被重构为一个原位算法,并且只使用Y和dy进行梯度更新,避免了内存卸载的需要(第二部分)。图9概述了vDNN的卸载操作。这里,一旦层(1)完成,基线系统能够立即启动层(2)的正向计算。对于vDNN,第(2)层的执行被停止,因为流计算必须等到流存储器的卸载操作完成,阻塞第(2)层的计算。但是,第(3)层的计算没有延迟,因为第(2)层的卸载延迟完全隐藏在延迟中,以计算同一层的前向传播。
Memory Prefetch:与卸载类似,将卸载的Xs预取回GPU内存是使用cudaMemcpyAsync()实现的,以将数据传输与反向传播的计算重叠。然而,streammemorylaunches以与前向传播的卸载操作相反的顺序启动预取操作(图9)。如第三节所述,预取的一般规则是将层(n)的卸载数据的内存复制操作与层(m)的反向计算重叠,层标识m始终高于n,以最大化预取和延迟隐藏的好处。换句话说,当GPU开始层(m)的反向传播时,vDNN在前面的层中确定预取的最佳层(n < m)。如果预取层(n)和重叠层(m)之间的距离太远,vDNN卸载的内存节省优势将会降低,因为这些预取数据的重用时间在未来将会很远。换句话说,过早预取数据将再次次优地利用GPU内存,因为预取的数据将再次驻留在GPU内存中,而不会立即使用。我们精心设计了vDNN预取算法,以避免这一缺陷,并平衡卸载的内存节省优势和预取的及时性。图10是确定预取最佳候选层的vDNN预取算法的伪代码。在流计算开始一个层的反向计算之前,vDNN首先搜索一个需要预取其X的潜在层。如果搜索操作成功(第11行),要预取的层标识由查找预取层例程返回,并用于通过流存储器启动其预取操作。与卸载类似,vDNN同步流计算和流内存,这样下一层的反向计算就会停止,直到预取操作完成。因此,在第(n)层反向计算期间启动的任何预取操作都保证在第(n-1)层计算之前准备就绪。当预取延迟比重叠计算更长时,这种好处当然是以潜在的性能损失为代价的,我们将在第五章详细介绍这一点。

C. vDNN Memory Transfer Policy:确定卸载其特征图的最佳层是一个多维优化问题,必须考虑:1) GPU内存容量,2)使用的卷积算法和整体逐层内存使用,以及3)网络范围的性能。前两个因素决定了我们是否能够训练网络(我们称之为网络的可训练性),而最后一个因素决定了整体的训练生产率。如果VDNN对所有层都使用最节省内存的算法(例如,cuDNN [8]中的隐式GEMM,它不需要任何磁盘空间分配),同时对所有层进行卸载/预取,则GPU内存使用将是最低的。然而,与每层采用最快卷积算法的基线相比,性能可能会受到影响;性能损失主要来自1)由于卸载/预取可能引起的额外等待时间,以及2)存储器最佳隐式GEMM算法和性能最佳卷积算法之间的性能差异。使用最快的算法,没有任何卸载/预取,将导致最高可能的性能,但是更快算法的工作空间的潜在内存开销和驻留在GPU内存中的累积Xs可能会溢出GPU内存。鉴于优化分层内存使用及其性能本身是一个多维优化问题,在整个网络中选择最佳超参数并不重要。因此,我们采用了以下基于启发式的内存传输策略,这些策略缩小了参数选择的范围,简化了优化问题,同时在实践中仍然表现稳健。
Static vDNN:特征提取层主要由CONV层和ACTV层组成,并带有间歇性的池层,以降低特征地图的维度。然而,超过70%到80%的(前向/后向)计算时间花费在深度神经网络的CONV层上。因此,我们评估了两种利用这种计算特性的静态vDNN内存传输选项。我们探索的第一个选项是让vDNN内存管理器卸载所有层的所有Xs。这项政策,vDNNall,是我们最节省内存的解决方案,因为所有的Xs都从GPU上卸载和释放,大大减少了设备内存的使用。第二个vDNN策略是只卸载CONV层的Xs,并将其余层的Xs保留在GPU内存中。vDNN CONVpolicy 基于这样的观察,即conv层比ACTV/池层具有更长的计算延迟,更有可能有效地隐藏卸载/预取的延迟。vDNNconvis的性能普遍高于vDNNall也就不足为奇了。但是视频处理器的优点是消耗最少的图形处理器内存,大大提高了DNN的可训练性。我们随后评估了这两种静态策略的内存使用和性能,采用了内存优化和性能优化卷积算法。
Dynamic vDNN:虽然静态虚拟神经网络简单且易于实现,但它没有考虑决定DNN可训练性和性能的系统架构组件(例如,最大计算浮点运算和内存带宽、内存大小、有效PCIe带宽等)。对于可轻松容纳在GPU内存中的DNN,vDNNallnor和vDNNconvis都不是最佳的,因为最佳方法是将所有内存分配都驻留在GPU中,而不进行任何卸载,并采用尽可能最快的卷积算法。另一方面,大而深的网络可能没有使用更快的卷积算法的奢侈。因此,能够在图形处理器上安装这样的网络是虚拟神经网络能够实现的最佳优化。因此,我们开发了一个动态的虚拟神经网络策略,在运行时自动确定卸载层和卷积算法,以平衡DNN的可训练性和性能。动态虚拟神经网络利用了DNN训练的几个特性。首先,我们利用训练所需的相同前向/后向传播过程的数百万到数十亿次迭代。英伟达的cuDNN提供了一个运行时应用编程接口,可以对给定层的所有可用卷积算法进行实验,评估每种算法的性能和内存使用情况。当前的最大似然框架利用这个应用编程接口来经历一个初始概要分析阶段,以确定为每个CONV层部署的最佳算法,从而获得最佳性能。这种剖析的开销在几十秒的数量级,相对于DNN训练所需的几天到几周来说,这是可以忽略的。我们的动态虚拟数据网络通过一些额外的分析过程来增强这个分析阶段,以选择最佳的卸载层和最佳的每层算法。一旦基线轮廓阶段完成,并且为所有CONV层导出了最快的卷积算法,动态虚拟神经网络采用以下附加轮廓过程:1)首先,使用内存优化、无浪费的算法对所有CONV层的单个训练通道测试静态虚拟磁盘阵列。这个初始通道决定了目标DNN是否可以训练,因为它需要最少的图形处理器内存。2)如果vDNNallpassed,则启动另一个训练阶段,所有CONV层采用最快的算法,但没有任何卸载。这样的配置,如果成功通过,将被用于整个训练过程的其余部分,因为它提供了最高的性能,同时保证了可训练性。如果此分析阶段因内存超额预订而失败,将使用相同的最快算法测试两个额外的训练通道,但分别为vDNNconvand和vDNN启用vDNN卸载。如果成功,vDNN将使用成功的配置进行剩余的培训。如果vDNNconvand和vDNNallfails都失败,我们将继续下面的下一个分析过程,以进一步减少内存使用。3)最后一个阶段基于贪婪算法,该算法试图局部减少层的内存使用,在可训练性和性能方面寻求全局最优状态。遍历每一层时,vDNN首先计算使用最快的算法是否会溢出GPU内存预算。如果是这样,那么给定层的卷积算法将被局部降级为性能较差但记忆效率较高的算法,直到它达到记忆最优的隐式GEMM。这种基于贪婪的方法首先尝试vDNNCONVwith,每个conv层最初使用自己的性能优化算法。如果vDNNconvfails失败,则使用内存效率更高的vDNNall启动另一轮培训。如果虚拟磁盘阵列也无法通过这种贪婪算法,那么虚拟磁盘阵列将返回到第一个虚拟磁盘阵列解决方案,在整个网络中应用内存优化的无磁盘阵列算法。虽然其他可能的设置可能更好地平衡性能和可训练性,但我们发现,我们的动态虚拟神经网络性能具有竞争力,而不必穷尽搜索全局最佳参数选择。
IV. METHODOLOGY
A. vDNN Memory Manager:我们实现了一个主机端内存管理器,它与最新最快版本的cuDNN 4.0 [8]交互,充当GPU后端。构成DNN特征提取层的所有层都是使用cuDNN实现的,每个层的执行都是使用两个CUDA流来协调的,流计算和流存储在第三章B节中讨论。分类层保持不变,并使用火炬中使用的相同cuBLAS例程。vDNN的应用编程接口非常类似于Torch和Caffe,提供了目标DNN及其每个层组成的高级抽象。虽然Torch、Caffe和Anano的内存分配方案之间有细微的差异,但先前的工作[9]定量地证明了所有三个框架都表现出相当的性能和内存需求3。因此,我们选择Torch的内存管理策略作为基线,与vDNN进行比较,因为它在学术界和工业界(如Facebook和Google DeepMind)都有广泛的部署。该基线策略采用了第二节-第三节中讨论的网络范围内的分配策略。但是,我们使用以下策略进一步改进了该基线策略,以减少反向传播阶段的内存消耗[38,39]:我们不是为所有单独的层分配单独的dY和dX,而是只分配这些数据结构中每一个所需的最低数量,并在每一层的反向计算完成后重用它们(图2)。
最后是实验的结果部分和相关工作!实验部分就不说了,相关工作中其说到了基于网络剪枝的方法来进行优化对应的深度学习的训练权重值的大小,因为网络剪枝可以减少涉及的参数的数量。
总结
  现有的机器学习框架要求用户仔细管理他们的GPU内存使用,以便网络范围的内存需求符合物理GPU内存大小。我们提出了vDNN,这是一个可扩展的、内存高效的运行时内存管理器,它虚拟化了网络中CPU和GPU内存的内存使用。我们的vDNN解决方案将AlexNet的平均GPU内存使用量减少了高达89%,OverFeat减少了91%,GoogLeNet减少了95%,大大提高了DNNs的内存效率。与VGG-16 (256)相似的实验结果是,与口头基线相比,以18%的性能损失为代价,平均减少90%的内存使用。我们还研究了虚拟神经网络到超深度神经网络的可扩展性,表明虚拟神经网络可以训练数百层的网络,而不会有任何性能损失。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值