基于AVX2指令集的深度学习混合运算策略
蒋文斌, 王宏斌, 刘湃, 陈雨浩    
华中科技大学 计算机科学与技术学院, 大数据技术与系统国家工程研究中心, 服务计算技术与系统教育部重点实验室, 武汉 430074
摘要:由于图形处理器(GPU)内存容量有限,其所能承载的深度学习网络模型规模受到很大限制。该文提出了一种深度学习混合运算策略,借助于Intel新的单指令多数据AVX2指令集,充分挖掘CPU对GPU的辅助支撑潜力。为节省GPU内存,将中间数据规模较大的网络层放在CPU端计算,并通过AVX2指令集提高CPU端的计算效率。核心技术点包括网络模型的切分与协调、基于AVX2指令的应用代码矢量化等。上述策略最终在Caffe上实现。在包括CIFAR-10、ImageNet在内的典型数据集上的实验结果表明:采用混合运算策略后,Caffe能够正常运行更大型神经网络模型,并保持较高的执行效率。
关键词混合运算    深度学习    AVX2指令集    图形处理器(GPU)内存    Caffe    
Hybrid computational strategy for deep learning based on AVX2
JIANG Wenbin, WANG Hongbin, LIU Pai, CHEN Yuhao    
Services Computing Technology and System Laboratory, National Engineering Research Center for Big Data Technology and System, School of Computer Science and Technology, Huazhong University of Science and Technology, Wuhan 430074, China
Abstract: Small GPU memories usually restrict the scale of deep learning network models that can be handled in the GPU processors. To address this problem, a hybrid strategy for deep learning was developed which also uses the potential of the CPU by means of the new Intel SIMD instruction set AVX2. The neural network layers which need much memory for the intermediate data are migrated to the CPU to reduce the GPU memory usage. AVX2 is then used to improve the CPU efficiency. The key points include coordinating the network partitioning scheme and the code vectorization based on AVX2. The hybrid strategy is implemented on Caffe. Tests on some typical datasets, such as CIFAR-10 and ImageNet, show that the hybrid computation strategy enables training of larger neural network models on the GPU with acceptable performance.
Key words: hybrid computation    deep learning    AVX2 instruction set    GPU memory    Caffe    

深度学习[1]是当前大数据分析处理的一个重要手段。近年来,得益于数据的海量增长、计算硬件性能的飞速提高和计算方法的日益进步,深度学习在图像任务[2]、语音识别[3]、推荐系统[4]和自然语言处理[5]等领域取得了突破性的进展,成为学术界和工业界的一大研究热点。

常用的深度学习系统由于涉及到大量的神经网络前向、后向迭代计算,运算量大,耗时长。图形处理器(GPU)由于其强大的计算能力和在矩阵运算方面具有天然的独特优势,承担了整个计算过程的大部分计算任务。然而,由于GPU端内存容量十分有限(与CPU相比通常要差一个数量级以上),因而,其所能承载的网络模型规模在很大程度上受到限制。而CPU正好相反,其内存容量一般远大于GPU,但计算能力远低于GPU,因此在深度学习系统中往往被忽略,没有发挥出应有的作用。

近年来,Intel推出了CPU上的新的面向向量处理的AVX系列指令集,采用了单指令流多数据流(SIMD)的模式,使得AVX指令可在单一步骤中处理多个片段的数据,从而提高执行任务的吞吐量。该指令集可用于处理神经网络中的大量矩阵运算,从而使得将CPU作为深度学习的有效算力成为可能。同时,由于CPU端内存的容量往往远大于GPU显存,因而更加适合需要占用大量内存的深度神经网络。因此,基于AVX[6]指令集,探索深度学习中CPU和GPU混合运算的策略,发挥CPU在神经网络训练中的计算作用和优势十分有必要。

一般主流深度学习框架如Caffe[7]都有2种计算模式:CPU模式和GPU模式,但只能以其中一种方式训练。而大型神经网络在训练过程中往往要占用很大的内存,单卡GPU有时无法承载。一种解决办法是采用模型并行的方法,用多个GPU来完成模型训练。但模型并行由于其通信开销和模型维护成本都非常高,严重降低了系统的工作效率,现在主流的深度学习系统很少采用。这使得研究人员很多时候只能退而求其次,设计小一些的模型来完成任务,但往往不能获得理想的效果。一个更合理的办法是进一步发挥CPU端的计算和内存资源的辅助作用,采用混合的计算策略,从而提高系统的综合性能。

本文提出一种借助CPU端资源来提高深度学习系统支撑更大规模神经网络模型能力的方法。通过将中间数据占用内存大的网络层放在CPU端计算以节省大量的GPU内存,使得训练超大型神经网络成为可能。同时基于效率高、成熟度好的AVX2指令集做CPU端的计算加速,有效提高了CPU端网络层的计算效率,从而进一步发挥CPU的潜在作用,提升混合运算策略的综合性能。在Caffe系统上实现了所提出的深度学习混合运算策略,并通过多个典型数据集和网络模型的实验验证了该策略的有效性。

1 相关工作

针对神经网络模型受GPU内存容量限制的问题,Rhu等提出了一个用于神经网络应用的运行时管理器vDNN[8],使用CPU端内存作为临时容器,以减少显存占用,并最大限度地保证训练速度。其优化策略是在训练过程中卸载暂时空置的显存,等到需要时再通过预取操作装载所需数据。Wang等[9]提出了一个动态管理显存的运行时SuperNeurons,使用变量生存期分析、张量的卸载与预取和再计算策略3种内存管理技术,极大降低了神经网络训练消耗的显存大小。Jin等[10]提出一种以网络模型层为单位的更细粒度的CPU-GPU之间的内存协作方法,有效地提升了可支持的模型的规模。

不过,上述工作均没有考虑如何有效利用CPU的计算能力来进一步提升它的协作能力。

Intel一直在致力于如何提升CPU对深度学习任务的支撑能力。早期,推出了专门针对英特尔处理器优化的数学核心函数库MKL[11]、开源的深度学习性能增强库MKL-DNN[12]等,主要考虑从算法库层面优化神经网络相关的计算任务,从而提升CPU端处理神经网络的能力。不过由于CPU本身没有太多变化,其效果并不理想。近年,Intel又推出了更底层的指令集层面的优化措施——AVX及AVX2指令集[6]。该系列指令集采用单指令流多数据流的计算模式,进一步提升了对深度学习这类大数据量、以矩阵计算为特色的计算任务的支撑能力。目前,Caffe、TensorFlow等主流深度学习系统已经开始支持CPU模式下的AVX优化。遗憾是,主流框架下GPU和CPU两种模式仍然是独立的,只能二选一,还不能协同工作。本文的工作旨在通过某种方式将两者结合起来,从而使系统性能发挥得更好。

本文提出基于AVX2指令集的深度学习混合运算策略,对神经网络模型进行合理切分,分别分配到CPU和GPU上计算,同时基于AVX2指令集加速CPU端的计算。不仅利用CPU端内存的容量优势解决了显存不足的问题,也很大程度上减少了混合运算的性能损失。

2 神经网络训练中的混合运算 2.1 神经网络

深度神经网络通常包含输入层、隐藏层和输出层,如图 1所示,输入层接收外部输入信号,经过隐藏层的计算,将信号传递至输出层,在输出层中形成输出结果。

图 1 深度神经网络

在深度神经网络模型的训练过程中,通常使用反向传播(back propagation, BP)[13]算法,将模型训练分为正向传播和误差反向传播2个过程,并进行多次迭代,迭代中会产生特征图、网络参数、梯度图和其他中间数据。其中,特征图是输入信号在前向传播中经多次特征变换在不同特征空间下的表示,网络参数包括网络中各连接的权值和偏置项,梯度图是反向传播中误差对各层梯度图及网络参数的导数,其他中间数据包括一些临时工作区(如cuDNN工作空间)和各种网络层传播计算所需的缓冲区等。

2.2 深度学习混合运算

当前主流深度学习框架在GPU模式下的整个运行过程中,会将所有网络层的特征图、网络参数、梯度图和其他中间数据持续保存在显存中,从而导致巨大的内存占用。这样,一些大型神经网络会因内存不足而无法运行。

针对上述的问题本文提出了一种基于AVX2指令集的混合运算策略,将所有网络层分为2组,分别在GPU端和CPU端进行内存分配和传播计算,并基于AVX2指令集加速CPU端的各网络层的传播计算。如图 2所示是一个线性前馈网络的划分示例,其中左边为GPU组网络层,右边为CPU组网络层。该示例中前2个网络层卷积和池化在GPU上完成(假设这两层占用内存较小,可放到GPU端)。在分组临界处(池化层)同步主存,接着在CPU端进行后续的卷积等操作,并在CPU端内存中为特征图、网络参数和梯度图等分配空间(假设这些层占用较多的内存空间,适合放到CPU端)。

图 2 网络划分示例

在CPU端执行训练操作的同时,由于网络训练过程的串行性,这时GPU端无法同时执行网络训练任务。为了提高GPU的利用率,充分发挥此时GPU的计算能力,将一部分的网络模型的测试工作放在这个时间段在GPU上执行。因为网络模型测试不需要改变模型参数,也不需要额外的内存空间(除少量临时数据外),只需要GPU的计算资源。同样,对于CPU端空闲时间,也可以采取类似的方法进行利用。通过这个办法,可以提升神经网络整体的计算效率。当然,在细节上,需要处理和协调好训练和测试之间的数据访问关系。总体上遵循训练为主的原则,如果训练和测试之间发生了冲突,应该让测试过程暂停,优先保证训练过程的访问。总的来说,相比测试过程,训练过程占用时间明显要多,所以优先保证训练过程有利于提高整体系统的运行效率。也正是因为上述原因,训练过程和测试过程冲突并不明显。本文也考虑了GPU和CPU之间的能力差异性问题,相应地在任务的分配上采取了具有一定倾向性的划分策略,以保证两者之间任务与能力的匹配。

在CPU完成指定层的训练任务后,在下一个分组临界处,数据又同步至GPU,接下来一直到Softmax层均在GPU上计算。混合运算在节省GPU内存的同时会引入两大损失:CPU运算慢带来的损失和CPU/GPU间的数据传输负载,本文的策略将尽可能降低这两类损失。

基于该混合运算策略本文改进Caffe得到ACaffe。在功能和性能上ACaffe满足以下需求:

1) 网络模型所需内存超过GPU内存限制时,ACaffe在混合运算模式下能够继续运行。当神经网络需要占用大于显存容量的内存时,ACaffe并不直接切换到CPU模式,而是通过将部分网络层分配到CPU端计算,使得在GPU上计算的网络层使用的内存总量小于显存容量。

2) ACaffe能够实现较高的GPU利用率。在满足显存容量限制的条件下,将尽可能多的计算量分配到GPU上,以降低CPU运算慢带来的损失。

3) ACaffe能够实现较高的CPU端计算速度。基于AVX2指令集,利用多种优化技术改进CPU端的计算方式,达到较高的加速比,将CPU运算慢带来的性能损失降到最低。

3 基于AVX2指令集的深度学习混合运算策略 3.1 网络划分

本文将所有网络层分为2组,分别在GPU端和CPU端进行内存分配和传播计算,使得GPU组网络层使用的内存总量不大于显存容量。首先统计网络各层的内存使用量和计算量,接着根据网络层内存使用量得到主存同步中的数据传输负载,根据网络层计算量得到CPU计算慢带来的损失,并综合得到选择最佳分组方案的策略。

1) 网络层内存使用量的统计。

网络层的内存使用包括输出特征图、网络参数、梯度信息和其他缓冲区。其中梯度信息包括特征图的误差项和网络参数的梯度。在网络构建阶段统计其大小即可。网络层的输出特征图是通过传播计算所提取出前一层的特征数据,误差项是该特征数据的误差;网络参数包括网络中各连接的权重和偏置项,参数梯度是模型误差对这些参数的导数。在Caffe中,特征图和误差项均使用Blob结构进行存储。其他缓冲区数据包括卷积层特征图经im2col操作后的临时数据、池化层最大池化时所选择数据的索引等,这些都在网络层初始化时设置形状或大小信息后,计入该层的内存占用即可。

2) 网络层计算量的统计。

网络层的计算量指网络一次迭代各层执行的运算次数,主要与处理的数据量和传播计算的类型有关。实现中使用输出特征图的大小乘上一个倍乘因子c来得到网络层的计算量,其中c表示产生一个输出元素需要执行的运算次数。例如,每产生一个输出元素,卷积层和池化层需要执行一个卷积核或池化核大小的计算,全连接层需要执行输入特征图大小的计算。结合网络结构特点和实验数据即可确定各网络层中c的值。例如,对于卷积层,每个输出元素由输入特征图中相应的一个卷积核大小的区块与卷积核点乘并求和得到,可知卷积层中c的值为卷积核的大小。

3) 网络分组决策。

根据网络各层的内存使用量得到CPU和GPU间数据同步的传输负载,根据网络层计算量得到分配在CPU端的计算量,进而评估主存同步和CPU运算慢带来的损失。从图 2所示的网络划分示例可以看出,CPU端计算量由CPU组网络层的计算量组成,CPU/GPU数据传输负载由分组临界处网络层的内存占用组成。

评估网络分组的性能损失。假设网络中第i层到第j层(layers[i, i+1, …, j])为CPU组网络层,其他网络层为GPU组网络层,则损失COST为

$ \mathrm{COST}=\text { computation } \cdot \alpha+\text { memory } \cdot \gamma $ (1)

其中:computation为layers[i, i+1, …, j]的计算总量,memory为网络层layers[i-1]和layers[j+1]的内存占用之和,α为CPU端计算量在损失中的权重因子,γ为CPU或GPU数据传输在损失中的权重因子(本文根据实验数据将αγ分别设为0.6和0.4)。

网络划分主要分为对连续网络层的内存使用总量、计算总量的计算和对各种分组方案的损失评估。对于连续网络层layers[i, i+1, …, j],令memi, j表示使用的内存总量,compi, j表示其计算量。首先初始化各memi, i和compi, i,然后以式(2)和(3)作为状态转移方程,通过动态规划方法求解出所有memi, j和compi, j。得到所有连续网络层组的内存使用总量和计算总量后,再判断各种分组方案是否满足显存限制,并应用式(1)评估其性能损失。

$ {{\rm{me}}{{\rm{m}}_{i, j}} = {\rm{me}}{{\rm{m}}_{i, j - 1}} + {\rm{me}}{{\rm{m}}_{j, j}}} $ (2)
$ {{\rm{com}}{{\rm{p}}_{i, j}} = {\rm{com}}{{\rm{p}}_{i.j - 1}} + {\rm{com}}{{\rm{p}}_{j, j}}} $ (3)
3.2 基于AVX2指令集的CPU运算加速

由于深度学习中CPU的运算速度远不如GPU,分配部分网络层到CPU端计算之后,Caffe的训练速度将大大降低。对此本文采取了代码矢量化、通用代码优化等一系列措施来加速CPU端的计算。

1) 代码矢量化。

使用Intel开发的性能分析工具VTune Amplifier分析Caffe训练过程中的热点函数,发现耗时最多的是默认BLAS库ATLAS的函数ATL_sgemm(),该函数执行单精度的矩阵相乘。因此BLAS函数是一大优化点。将Intel MKL设置为Caffe的BLAS库,迭代速度就有大幅提升。

使用OpenMP[14]的simd制导指令使for循环矢量化。编译器在使用OpenMP进行线程并行时会避免循环中的自动矢量化,而通过omp simd制导指令则可以使网络层的for循环计算在线程级并行的同时进行SIMD加速。

2) 通用代码优化。

通用代码删除是一种常用的标量优化技巧。本文在嵌套循环中将最内层的计算尽可能消除或提升到上层循环,从而减少计算量。

现代处理器基本都采用了流水线和超标量等技术,可以实现指令级并行。通过将循环展开,每次迭代做多次运算,同时尽量降低运算之间的相关性,可以利用指令级并行的特性显著减少循环执行的时间。

3.3 OpenMP多线程并行

Caffe网络层的前向和反向传播中有大量的for循环计算,可使用OpenMP的制导指令“parallel for”进行并行加速。为了避免操作系统移动线程,设置OpenMP的CPU亲和性环境变量KMP_AFFINITY为“compact, granularity=fine”。紧凑放置相邻的线程可以提高GEMM操作的性能,因为所有线程共享相同的末级高速缓存,从而可以重复使用之前预取的缓存行。下面介绍几处OpenMP多线程并行实现细节。

1) 卷积层。

Caffe中是通过im2col的方法将卷积计算转化为矩阵运算。首先将一个卷积核对应到特征图的部分按计算顺序摊开成一个列向量,于是输入特征图就转换成一个“输出单通道特征图大小×卷积核大小”形状的矩阵。同样将各卷积核摊开形成一个“卷积核大小×输出通道数”形状的矩阵,然后应用矩阵相乘即可完成计算输出形状为“输出单通道特征图大小×输出通道数”的矩阵。

首先对im2col并行化。Caffe中im2col_cpu的实现中,在计算当前操作输入数据的偏移时引入了循环依赖,这会阻碍OpenMP的多线程并行。对数据索引和计算操作进行改写可以消除循环依赖,并对最外层循环使用OpenMP的“parallel for”制导指令将迭代分配到多个线程处理,并采用动态调度策略。

然后并行化矩阵相乘。由于每次处理的都是一个批次的数据,因此批次中的多份数据可以交给不同的线程进行GEMM操作。当然,需要处理好多线程中会存在的数据竞争问题。

2) 池化层。

Caffe中池化操作的实现中,在计算当前操作输入数据和输出数据的偏移时引入了循环依赖。本文改用循环索引来计算偏移从而消除依赖,使得同一批次的多份数据可以交给不同的线程处理。

3) Softmax层。

在多项逻辑回归中,Softmax函数以K个不同的线性函数计算的结果作为输入,使用式(4)计算样本向量x属于第l个分类的概率。由于K个类别的概率相互独立可以分别计算,因此分配给多个线程来处理。此外,考虑到创建线程的开销,当K小于当前活动线程数时,设置当前并行域的线程数为K

$ P(y=l | x)=e^{x^{T} w_{l}} / \sum\limits_{k=1}^{K} e^{x^{T} w_{k}} $ (4)

4) 全连接层(内积层)。

内积层前向传播的计算是对输入特征图进行加权求和。Caffe中CPU端应用如图 3所示的矩阵运算,使用一次矩阵相乘操作完成,其中M为输入数据的批次大小,K为通道数与输入特征图大小之积。由于只有单次计算,不方便应用OpenMP以并行加速。于是将输入数据的计算拆分成M份,每份大小为(1×K),分别交给不同的线程处理,反向传播亦是如此,使得内积层传播时间大大减少。

图 3 Caffe内积操作

此外还有诸多网络层如ReLU层、反卷积层、Sigmoid层、Dropout层、Eltwise层等,以及Caffe封装的基础数学函数,都可以采用OpenMP并行优化。

3.4 训练与测试并行

将网络进行划分后,中间数据占用内存大的网络层被放到CPU端进行计算,占用内存小的网络层则继续在GPU端计算以利用GPU运算速度快的优势。在传统的网络划分中,数据在CPU端进行计算时,GPU处于等待数据同步的空闲阶段。为了充分利用GPU资源,采用训练与测试并行的策略,具体做法为:在CPU进行网络层的计算时,使用GPU进行网络的测试,网络划分如图 2所示。由于测试网络已经准备就绪,因此测试时GPU内存也得到了充分利用。同时,因为测试网络的数据块比训练网络的数据块小,且GPU运算速度远大于CPU,所以测试网络的时间比CPU进行网络层的计算所需时间少,即在CPU完成计算准备将数据同步到GPU上时,GPU已完成测试网络的计算并准备就绪,因此对测试结果没有影响。

4 测试与分析

为验证提出方法的有效性,本文针对常用的典型数据集和神经网络模型,从多个方面测试了ACaffe运行超出GPU限定内存容量的神经网络模型的能力和效率。

4.1 测试环境

测试平台使用的服务器型号为浪潮NF5280M4,具体配置为:CPU Xeon(R) E5-2680 @ 2.40 GHz×2,GPU Tesla P100×2,内存256 GB,操作系统为Ubuntu14.04 LTS。为了避免环境冲突使用Docker容器作为运行环境,基础镜像为bvlc/caffe:gpu,通过nvidia-docker工具在容器中使用显卡驱动。

4.2 测试方案

实验测试的目标是验证混合运算策略能否在牺牲较小的、可接受的计算速度的情况下,节省较大的GPU内存。为此从以下3个方面进行了测试。

1) 测试混合运算策略能否按照配置的GPU内存限制划分网络。进行了6组实验,分别是“ResNet50 on ImageNet”“ResNet101 on ImageNet”“ResNet152 on ImageNet”“DenseNet121 on ImageNet”“DenseNet161 on ImageNet”和“DenseNet201 on ImageNet”。其中“ResNet50 on ImageNet”表示实验使用网络模型ResNet50在数据集ImageNet进行训练和测试,其他5组类似。6组实验的模型所需内存均超过了单卡GPU的显存容量。

2) 测试ACaffe基于AVX2指令集加速后混合运算模式速度的提升。进行了8组实验,分别是“LeNet on MNIST” “CIFAR10_full on CIFAR-10” “ResNet20 on CIFAR-10” “ResNet56 on CIFAR-10” “ResNet110 on CIFAR-10”“ResNet50 on ImageNet”“ResNet101 on ImageNet”和“ResNet152 on ImageNet”。

3) 测试不同显存限制下混合运算策略的表现。进行了5组实验,分别是“LeNet on MNIST”“ResNet56 on CIFAR-10”“ResNet110 on CIFAR-10”“ResNet50 on ImageNet”和“ResNet101 on ImageNet”。

4.3 结果分析

表 1展示了Caffe和ACaffe使用单卡GPU训练ResNet50、ResNet101、ResNet152、DenseNet121、DenseNet161和DenseNet201时的表现。可以看出,Caffe使用单卡GPU所无法训练的ResNet和DenseNet系列网络结构,在ACaffe上均能正常运行,且显存的利用率较高。由此可知,混合运算策略在满足GPU内存限制的情况下,能够将尽可能多的网络层内存分配在GPU上以充分利用GPU加速计算,网络划分效果较好。

表 1 Caffe与ACaffe对比
实验 Caffe能否
正常运行
ACaffe能否
正常运行
ACaffe显存
占用率/%
ResNet50 on ImageNet 95.87
ResNet101 on ImageNet 99.16
ResNet152 on ImageNet 99.72
DenseNet121 on ImageNet 98.53
DenseNet161 on ImageNet 99.21
DenseNet201 on ImageNet 99.65

图 4展示了8组实验中Caffe与ACaffe的混合运算速度对比。这里为方便对比,将不同实例中的Caffe的迭代速度取为基准速度。ACaffe速度为相比该基准速度的相对速度。可以看出,使用不同数据集、不同规模的网络,在混合运算模式下,ACaffe的训练速度相比Caffe均有10倍以上的提升。特别地,对于Caffe自带的CIFAR-10数据集示例CIFAR10_full,ACaffe的加速比将近20,效果明显。

图 4 Caffe与ACaffe的混合运算模式迭代速度对比

图 5展示了5组实验中不同显存限制下ACaffe的性能对比。这里为方便对比,同样将不同实例中的不限制显存时ACaffe的迭代速度取为基准速度,限制显存的ACaffe速度为相比该基准速度的相对速度。模型使用内存总量在ACaffe创建网络时的记录中读取,然后在Solver或Net的配置文件中配置GPU内存容量“gpu_memory”为相应大小即可实现显存限制。可以看出,在小数据集上,ACaffe混合运算模式下在牺牲较小的训练速度的情况下可以较大程度节省GPU内存。而在处理较大的数据集(如ImageNet)时速度下降较多。其主要原因是较大训练集经处理后的样本图片相对较大,在处理大型特征图时使用GPU相对CPU的性能优势会比处理小型特征图时更加明显,从而加大了混合运算中CPU运算慢带来的性能损失。

图 5 不同显存限制ACaffe性能对比

为验证上述结论,本文选取“ResNet56 on CIFAR-10”和“ResNet50 on ImageNet”两个典型实例,进行了对比实验。二者网络模型结构相似而数据集不同。“ResNet56 on CIFAR-10”实验中GPU模式和CPU模式的速度比为42,“ResNet50 on ImageNet”实验中GPU模式和CPU模式的速度比为137,明显大于前者,与结论一致。

5 结论

现有典型深度学习框架都需要用户在设计深度神经网络时仔细考虑GPU内存的限制。本文提出了一种基于AVX指令集的CPU/GPU混合运算策略来降低深度学习应用中GPU内存的消耗,提高系统可支持的神经网络的规模。基于Caffe系统实现了所提出的策略。实验表明,所提出策略可以以较小的速度损失代价换得较大的显存使用量的降低,从而可以正常训练原本GPU模式下无法运行的大型神经网络。CPU端由于采用了AVX指令集及其相关的优化措施,计算效率有了很大的提升,从而保证整体系统的效率。该方法使得在单卡GPU上借助CPU的协作高效运行超大型神经网络成为可能,是一种在不增加硬件成本的前提下,提高系统整体支撑能力的行之有效的方法。

参考文献
[1]
LECUN Y, BENGIO Y, HINTON G E, et al. Deep learning[J]. Nature, 2015, 521(7553): 436-444.
[2]
KRIZHEVSKY A, SUTSKEVER I, HINTON G E, et al. ImageNet classification with deep convolutional neural networks[C]//International Conference on Neural Information Processing Systems. New York, USA: NIPS, 2012: 1097-1105.
[3]
GRAVES A, SCHMIDHUBER J. Framewise phoneme classification with bidirectional LSTM and other neural network architectures[J]. Neural Networks, 2005, 18(5-6): 602-610.
[4]
DAVIDSON J, LIEBALD B, LIU J N, et al. The YouTube video recommendation system[C]//Proceedings of the Fourth ACM Conference on Recommender Systems. Barcelona, Spain: ACM, 2010: 293-296.
[5]
COLLOBERT R, WESTON J, BOTTOU L, et al. Natural language processing (almost) from scratch[J]. Journal of Machine Learning Research, 2011, 12(1): 2493-2537.
[6]
LOMONT C. Introduction to Intel® advanced vector extensions[R/OL]. (2011-06-21). https://software.intel.com/en-us/articles/introduction-to-intel-advanced-vector-extensions/.
[7]
JIA Y Q, SHELHAMER E, DONAHUE J, et al. Caffe: Convolutional architecture for fast feature embedding[C]//Proceedings of the 22nd ACM international Conference on Multimedia. Orlando, USA: ACM, 2014: 675-678.
[8]
RHU M, GIMELSHEIN N, CLEMONS J, et al. vDNN: Virtualized deep neural networks for scalable, memory-efficient neural network design[C]//Proceedings of the 49th Annual IEEE/ACM International Symposium on Microarchitecture. Taipei, China: IEEE, 2016: 18.
[9]
WANG L N, YE J M, ZHAO Y Y, et al. Superneurons: Dynamic GPU memory management for training deep neural networks[C]//Proceedings of the 23rd ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming. Vienna, Austria: ACM, 2018: 41-53.
[10]
JIN H, LIU B, JIANG W B, et al. Layer-centric memory reuse and data migration for extreme-scale deep learning on many-core architectures[J]. ACM Transactions on Architecture and Code Optimization, 2018, 15(3): 37.
[11]
WANG E D, ZHANG Q, SHEN B, et al. Intel math kernel library[M]//WANG E D, ZHANG Q, SHEN B, et al. High-Performance Computing on the Intel® Xeon PhiTM. Cham: Springer, 2014: 167-188.
[12]
RODRIGUEZ A, SEGAL E, MEIRI E, et al. Lower numerical precision deep learning inference and training[R/OL]. (2018-01-19). https://software.intel.com/en-us/articles/accelerate-lower-numerical-precision-inference-with-intel-deep-learning-boost.
[13]
HECHT-NIELSEN R. Theory of the backpropagation neural network[M]//WECHSLER H. Neural Networks for Perception. New York: Academic, 1992.
[14]
CHANDRA R, DAGUM L, KOHR D, et al. Parallel programming in OpenMP[M]. San Francisco: Morgan Kaufmann, 2001.