近几年来,以深度神经网络(DNN)为代表的深度学习如火如荼,深度学习的研究领域从开始的图像识别(如imagenet比赛)到现在的自然语言处理,几乎有席卷一切机器学习研究领域的趋势。

对于深度神经网络的训练来说,通常网络越深,需要的训练时间越长。对于一些网络结构来说,如果使用串行的X86 处理器来训练的话,可能需要几个月、甚至几年,因此必须要使用并行甚至是异构并行的方法来优化代码的性能才有可能让训练时间变得可以接受。

人类生活的方方面面存在着并行或者并发,边吃饭边看电视,双手同时拔草,甚至吃饭时,嘴巴的动作和手的动作也是并行的。和人类社会广泛存在并行不同的是:计算机编程几乎一直都是串行的,绝大多数的程序只存在一个进程或线程。对于并行和向量化的研究可以追溯到20世纪60年代,但是直到近年来才得到广泛的关注,主要是自2003年以来,能耗和散热问题限制了 X86 CPU频率的提高,从而导致多核和向量处理器的广泛使用。

2003年以前,在摩尔定律的作用下,单核标量处理器的性能持续提升,软件开发人员只需要写好软件,而性能就等待下次硬件的更新,在2003年之前的几十年里,这种“免费午餐”的模式一直在持续。2003年后,主要由于功耗的原因,这种“免费的午餐”已经不复存在。为了生存,各硬件生产商不得不采用各种方式以提高硬件的计算能力,以下是目前最流行的几种方式是。

1)让处理器一个周期处理多条指令,这多条指令可相同可不同。如Intel Haswell处理器一个周期可执行4条整数加法指令、2条浮点乘加指令,同时访存和运算指令也可同时执行。

2)使用向量指令,主要是SIMD和VLIW技术。SIMD技术将处理器一次能够处理的数据位数从字长扩大到128或256位,也就提升了计算能力。

3)在同一个芯片中集成多个处理单元,根据集成方式的不同,分为多核处理器或多路处理器。多核处理器是如此的重要,以至于现在即使是手机上的嵌入式ARM处理器都已经是四核或八核。

4) 使用异构处理器,不同的架构设计的处理器具有不同的特点,如X86 处理器为延迟优化,以减少指令的执行延迟为主要设计考量(当然今天的X86 处理器设计中也有许多为吞吐量设计的影子);如NVIDIA GPU和AMD GPU则为吞吐量设计,以提高整个硬件的吞吐量为主要设计目标。

标量单核的计算能力没有办法接着大幅度提升,而以深度学习为代表的应用对硬件计算能力的需求依旧在提升,这是个实实在在的矛盾。在可见的将来,要解决这个矛盾,软件开发人员只有代码优化和并行可以选择。

从2006年开始,可编程的GPU越来越得到大众的认可,GPU是图形处理单元(Graphics Processing Unit)的简称,最初主要用于图形渲染。自20世纪90年代开始,NVIDIA、AMD(ATI)等GPU生产商对硬件和软件加以改进,GPU的可编程能力不断提高,GPU通用计算比以前的GPGPU(General-Gurpose Computing on Graphics Processing Units)容易许多,另外由于GPU具有比CPU强大的峰值计算能力,近来引起了许多科研人员和企业的兴趣。

在深度学习应用领域,自从cuda-convnet为利用gpu的计算能力设计开始,现在主流的深度学习平台(如caffe, theano)都支持GPU的训练,可以毫不讳言的说:GPU硬件已经是深度学习训练平台的标准配置。

要将使用GPU训练获得的深度学习模型部署给用户使用时,同样需要考虑深度学习算法对硬件计算能力的需求。由于不是每个客户都有GPU硬件,故在目前实际应用中,主要的部署平台是:X86(桌面端)和ARM(移动端),为了提高吞吐量,使用更少的服务器支持更多的访问请求,或提高用户使用体验,为X86 和 ARM处理器优化就变得很有意义。

由于各种各样的原因,大多数软件开发人员并没有很好的并行和代码优化理论和代码可供参考。最近华章出版公司出版的、由异构并行计算领域专家风辰编写的《并行算法设计与性能优化》、《并行编程方法与优化实践》和《科学计算与企业级应用的并行优化》填补了国内这一领域的空白。其中《并行算法设计与性能优化》和《并行编程方法与优化实践》已经上线,可以在京东和当当上购买。

《并行算法设计与代码优化》关注在并行优化和并行计算相关的理论、算法设计及高层次的实践经验;由于这本书填补了国内代码性能优化和并行计算的空白,得到了吴韧老师的强烈推荐。如果读者想要了解代码优化和并行化背后的理论基础,可购买此书。

《并行编程方法与优化实践》关注于C程序设计语言的向量化和并行化扩展及算法到硬件的映射;此书介绍了常见的SSE/AVX/NEON SIMD指令集编程,以及用于GPU的异构并行编程语言CUDA、OpenCL和OpenACC,以及常见的用于多核编程的OpenMP标准。并且以稠密矩阵运算和图像处理为例,介绍了如何使用这些工具优化程序性能。

《科学计算与企业级应用的并行优化》则关注于如何将线性代数、偏微分方程求解、分子动力学和机器学习领域的常见算法优良的在X86和GPU平台上实现出来。