目前越来越多的硬件为AI算法提供加速优化支持。通常,AI硬件可以通过降低工作负载、提升峰值性能、提升计算效率等方法来提供加速优化。降低工作负载 剪枝神经网络有较大的冗余性。细粒度神经网络剪枝是一种解决方法,因为其发现神经网络的权重参数里有很多值接近0,而去掉这些权重并不会降低神经网络的性能。但是在Han等人的工作里,经过剪枝的模型是稀疏化的,这会带来许多不规则的稀疏计算。这样的计算模式在很多硬件上无法获得显著的计算加速效果。所以,后续的很多工作开始"结构化剪枝"。在结构化剪枝里,被去除的权重都是结构化的子集,比如整个卷积核。使用这种方式得到的模型虽然压缩比小于细粒度剪枝,但是其仍然有着规则的计算模式,在各种硬件平台上都能得到提速。后续有很多工作的点在提升结构化剪枝的性能上:有工作如何设计层内的重要性指标,即给定本层压缩率的情况下选择除掉哪些卷积核;有工作如何设计正则化项,通过在训练过程中对权重加入合适的正则化得到剪枝模型;还有工作将剪枝比例的确定问题看作搜索问题,使用搜索算法搜索每层的压缩比例;还有不少工作试图把硬件的延时或能量模型引入剪枝过程。 神经网络架构搜索 最近,神经网络架构搜索(Neural Architecture Search,NAS)领域得到了很多,其最初目标是减少人为设计在架构设计中的比重,而用自动搜索的方式找到适合所针对任务的神经网络架构。为了加速NAS算法的搜索过程,很多工作改进搜索策略的采样效率和评估策略的评估效率。针对更高效的硬件推理,有不少工作在框架上进行了扩展,比如在搜索目标上考虑硬件开销,在搜索空间中加入新的设计维度(操作类型、拓扑连接、宽度、深度、卷积核大小等),联合硬件参数的搜索等。加入了宽度的神经网络架构搜索可以看作模型设计和结构化剪枝两个阶段进行了统一,也可以看作是剪枝算法的一种扩展。事实上,也有工作将神经网络搜索的一些方法应用在剪枝问题上。提升峰值性能 量化:不少研究者开始如何降低神经网络推理和训练过程中数据的表示位宽,我们这里简要介绍针对推理过程的量化研究的发展。最开始,神经网络的计算大多使用32比特浮点数,而实际上,神经网络的权重参数、激活值并不需要这么大的表示精度和位宽。由于浮点计算单元相对定点计算单元的开销较大,人们希望用低位宽的定点数进行定点运算来完成神经网络的推理过程。按照量化算法应用的时间阶段来区分,量化算法可以分为训练后量化(post-training quantization)和考虑量化的训练过程(quantization-aware training)两大类。训练后量化策略在一个预训练的模型上进行分析,选择合适的位宽、截断数、量化中心等,得到量化后的模型。为了提升量化后模型的准确率,考虑量化的训练过程调整权重适应"量化噪声"。不同研究者采用的量化格式不同,可分为均匀量化和非均匀量化,其中非均匀量化由于运算更复杂,使用较少。在均匀量化格式中,早期算法使用无偏置(bias)的量化格式,且量化过程中不引入放大系数(scaling factors),而是使用2的幂次作为表示范围。 计算单元优化:计算单元优化的最主要方法是降低计算单元的比特位宽,这也是与软件层的定点量化方法相匹配的硬件设计。降低比特位宽可以显著降低硬件资源的开销,从而在相同硬件资源的限制下获得更高的峰值性能。以32比特浮点和8比特定点在Xilinx XCKU060 FPGA上的实现为例,8比特定点的乘法器和加法器的硬件逻辑资源开销分别降低至32比特浮点的1/10和1/50。在使用数字信号处理器(DSP)的情况下,一个32比特浮点的乘加器需要2个DSP、800个查找表和1284个寄存器,而一个8比特定点的乘加器只需要1个DSP。 循环展开策略:神经网络的卷积层和全连接层分别占据了大部分的计算量和存储量,其中全连接层可以视为卷积核大小为1×1的卷积层。卷积层通常可以用一个6层循环表示,这6层循环的维度分别是:输入的宽和高,输入和输出通道,以及卷积核的宽和高。为了提高AI加速器的计算并行度,我们可以将某几个循环展开并在硬件上将一定数量的迭代过程并行化。硬件上的并行迭代次数称为循环展开系数(loop unroll parameter),不恰当的循环展开系数会导致严重的系统利用率不足。以一个单层循环为例,假设循环的次数为M且循环展开系数为m,则硬件资源的利用率被限制为m/M[M/m]。如果M无法被m整除,那么利用率将会低于100%。对于一个神经网络层,总的硬件资源利用率是每一个循环的利用率的乘积。对于CNN来说,不同层的循环维度差异很大。以ResNet为例,通道数量在3~2048之间,特征图大小在224×224到7×7之间,卷积核大小在7×7到1×1之间。除了利用率低下的问题之外,循环展开还会影响数据通路和片上存储架构的设计,因此循环展开策略是AI加速器设计的关键特征。目前还没有一种万能的循环展开系数适用于所有的神经网络模型。主流的解决方案是针对每一个神经网络模型进行设计空间探索以获取最优循环展开系数。由于FPGA具备动态重配置的特性,可以基于寻优后的循环展开系数设计硬件参数,从而生成新的硬件架构以部署特定的神经网络模型。对于基于指令集架构的AI加速器,软件编译器会基于硬件设计参数来指导循环展开系数的优化,以提升AI系统的计算效率。提升计算效率 软件编译优化:面向神经网络的软件编译器主要以深度学习框架的神经网络模型作为输入,如Caffe和TensorFlow等。编译过程的不同阶段都需要进行编译优化,而编译过程通常可划分为五个层次:前端、中间表示(IR)、高层级优化、低层级优化、后端。前端将不同深度学习框架的神经网络模型的高级规范表示转换为特定于编译器的中间表示。这些中间表示通常采用有向非循环图的形式,其中每个节点表示一个计算操作,每个边表示操作之间的数据依赖性。因此,可以在这些中间表示上使用面向图的高层级优化方法来融合操作并优化数据布局。除了高层次中间表示,在编译器的优化过程中还采用了多种扩展的中间表示。神经网络的工作负载可以分解为张量运算(例如矩阵-向量和矩阵-矩阵乘法)。而低层级优化方法主要用于优化调度各种张量运算的执行顺序,以增强数据局部性并充分利用硬件平台的并行性。在软件编译阶段有数百个低级优化步骤可供选择和使用,而软件编译的优化问题主要在于决定使用何种优化方法以及如何选择最优的参数(例如循环展开、切分和交换参数,融合策略和矢量化)。最后,后端负责将编译优化的完整实现映射到AI加速器可解析的指令。