深度神经网络的模型·硬件联合优化
最近,设计“Eyeriss” DCNN加速器的团队发表了一篇综述性文章“Efficient Processing of Deep Neural Networks: A Tutorial and Survey”[1],涉及神经网络很多内容,对神经网络感兴趣的同学可以好好看看。这个团队对各种Inference加速的思路做了深入分析,我想和大家重点看看DNN模型和硬件的联合优化。
首先看一下这篇文章的主要内容,方便大家阅读:
“Section II 是背景知识,介绍为什么DNNs(深度神经网络)很重要,他们的历史和应用。
Section III 概述目前常见的DNN以及比较流行的DNN模型的基本组成部分。
Section IV 介绍用于DNN研究和开发的各种资源。
Section V 描述了用于DNN处理的各种硬件平台以及各种优化技术,以提高吞吐量并降低能耗,而不影响准确度(其结果是逐比特一致的,或者说bit-match的)。
Section VI 讨论混合信号电路和新的存储器技术如何用于near-data processing,以解决对DNN吞吐量和能耗影响很大的数据搬移问题。
Section VII 描述了可以针对DNN进行的各种算法和硬件联合优化,在尽量少的损失准确度的同时提高吞吐量和降低能耗。
Section VIII 描述了评价各种DNN设计时应考虑的关键指标。”
在进入正题之前,我们可以先简单看看Section V “HARDWARE FOR DNN PROCESSING”。这部分介绍实现DNN inference的硬件平台和优化方法。它们把硬件平台分成两类分别讨论:
“For temporal architectures such as CPUs and GPUs, we will discuss how computational transforms on the kernel can reduce the number of multiplications to increase throughput. ”
“For spatial architectures used in accelerators, we will discuss how dataflows can increase data reuse from low cost memories in the memory hierarchy to reduce energy consumption.”
第一种关注DNN inference在CPU和GPU架构上的优化,主要考虑用一些计算上的转换来减少运算复杂度,特别是DCNN(卷积操作)处理,比如:
Toeplitz矩阵方法:把卷积操作转换为矩阵乘法
FFT方法:卷积运算经过FFT变化之后可以变成矩阵相乘。
Winograd方法可以进一步减少乘法的数量,特别是对于比较小的filter。一般来说,FFT比较适合大于5x5的filter,Winograd比较适合小于3x3的filter。
第二种空间并行结构是现在很多专用的DCNN加速器常用的架构,比如Google TPU用的Systolic Array,Eyeriss的2D Convolution,等等。这部分我计划未来要专门讨论一下,这里大家可以自己先看看,本文的分析还是比较清晰的。
另外,Section VI. NEAR-DATA PROCESSING,也是一个重要的话题,是Deep Learning实现的一个长期趋势,我也打算后面找时间专门讨论一下。
今天我想重点讨论的是Section VII“CO-DESIGN OF DNN MODELS AND HARDWARE”。
传统上,设计DNN模型的时候,主要目标是提高准确度,而不太考虑实现的复杂度。这会导致设计出的DNN网络不利于实现或者部署。这篇文章讨论的DNN模型和硬件联合设计的思路就是为了解决这个问题,在设计和训练网络的时候充分考虑硬件实现。具体包括两大类方法:
Reduce precision of operations and operands. This includes going from floating point to fixed point, reducing the bit-width, moving to the logarithmic domain and weight sharing.
Reduce number of operations and model size. This includes techniques such as compression, pruning and compact network architectures.
下面我们分别来看看这些技术,我会把基本概念列举出来,细节还请读者自己详细阅读原文或原文的参考文献。
A. 降低精度(Reduce Precision)
如果能够把运算(operation)和操作数(operand)的精度需求降低,就可以减少表示这些操作数和相应运算的比特数,从而大大降低运算(datapath)和存储(memory)的代价。比如现在做DNN inference已经从早期需要32bit操作逐渐减少到16bit和8bit,甚至更少。这个问题的本质是把数据量化为一个更小的一组量化级别,而最终的目标是最小化量化误差,也就是量化后数据和原始数据的差异。具体的量化方式包括线性量化和非线性量化。
在线性量化里,早期的工作包括直接把浮点数变为定点数,或者使用动态定点数(Dynamic Fixed Point)。比较值得关注的是目前很多把比特精度进一步降低的努力,包括:Binary Connect (BC),只用-1和+1两个权重(weight),使用这种二值权重,则乘法运算可以用加法运算代替;而它的改进版本Binarized Neural Networks (BNN),同时使用二值的权重和二值激活函数,这样就把乘累加运算(MAC)简化成XNOR运算。当然,这种方法会带来比较大的性能损失。所以之后有很多尝试来减少性能损失,包括Binary Weight Nets(BWN) , XNOR-nets和Quantized Neural Networks(QNN),取得了一定的效果。近期又出现了Ternary Weight Nets (TWN),它给二值权重增加了一个“0”,即“-1,0,1”的表示方法。TWN和32-bit浮点数比较准确度损失只有3.7%。而后面出现的Trained Ternary Quantization (TTQ) 把AlexNet的准确度损失降到了0.6%。
非线性量化的技术包括对数域量化(Log domain quantization)和权重共享(Weight Sharing)。前者主要是对于符合对数分布的数据采取的量化方式,或者利用这个思路对数据进行非线性量化。后者的方法是迫使多个权重共享相同的数值,这样总的不同的权重值的数量就大大降低了。使用这种方法,即需要存储权重值,还需要存储一个索引(index),用来指示在滤波器(filter或者kernel)的某个位置需要使用哪个权重值。而要读取权重,则需要首先读出权重的索引;然后在根据这个索引读出相应的权重值。文章还总结了上述这些方法最终实现的比特宽度以及相应的准确度损失。
B. 减少操作的数量和DNN模型的大小
显然,如果能够用更少的操作或者更小的网络实现相同或者相近的准确度,就可以大大降低实现的难度。这方面的工作可以大致分为下面4类。
1)挖掘激活函数的统计特性(exploiting activation statistics):主要是说利用ReLU做激活函数的时候,会造成很多输出的值是“0”,这就造成的很大的稀疏性( sparsity)。在设计硬件加速器的时候,如果能够充分利用这种稀疏性,就可以利用压缩技术降低存储和访存带宽需求;或者对“0”数据直接跳过,从而减少MAC操作。此外,还可以把一些非常接近“0”的值当成“0”,更进一步增加稀疏性。
2)网络剪枝(network pruning):这已经是一个研究比较广泛的技术,这里就不在深入讨论了。
3)紧凑的网络结构(compact network architectures):
“通过改进网络架构本身可以减少权重和操作的数量。趋势是用一系列较小的卷积层代替较大的卷积层,其总的权重数量较少,使得它们具有相同的有效接收场域(effective receptive field,即滤波器从输入图像中计算输出结果的那个区域) 。这可以在架构设计阶段(训练之前,before-training)或通过在训练好的的网络中分解滤波器(训练之后,after-training)来实现。后者可以利用训练好的网络,避免从头开始训练网络的麻烦,但它没有前者灵活。例如,现有的方法只能将训练好的网络中的一层分解成一系列的层,但没有它们之间的非线性层。”
简单来说,所谓before-training的架构设计,就是一个DNN网络架构优化的问题。这里说的“紧凑”可以比较简单的理解为“效率更高”。我们看到的DCNN发展的历史,也反映了网络架构的不断改进。这里插一幅图,它来自[2]。这幅图总结了经典的DCNN网络架构,显示了它们的复杂度(运算量和权重数)和准确度(图像识别任务)的关系。
从中可以看出:结构设计优秀的网络,即使规模较小(从运算量和权重数量来看),同样可以实现很好的性能。所以,网络架构本身设计是否合理,应该是我们在做模型和硬件联合设计时第一个应该思考的问题。大家有时间还是要好好研究研究这些经典架构。
而after-training的方法,是对一个已经设计和训练好的网络进行进一步优化的过程,主要是一些分解的方法,文中提到的Tensor decomposition,Canonical Polyadic (CP) decomposition和Tucker decomposition,大家可以根据具体情况考虑是否使用。
4)knowledge distillation(这个不知道怎么翻译好):
“使用一个深度网络或对不同模型(即ensemble)的预测结果进行平均,比使用单个较浅网络的准确性更高。当然计算复杂度也更高。knowledge distillation可以将复杂模型(teacher)学到的知识转移到更简单的模型(student)。通过这种方法,学生网络可以实现直接使用相同的数据集进行训练而无法实现的准确性。”
上图显示了最简单的knowledge distillation 。简单来说,就是用teacher DNN(或多个teacher DNNs的ensemble)的class score作为soft target。目标是最小化soft target与student DNN class score之间的平方差。”
knowledge distillation是个挺有意思的话题,看起来也是一个简化DNN网络的有效方法。不过我也没有深入研究,就不瞎说了,大家有兴趣可以关注一下。
最后说一点,这篇文章的作者之前也写过一篇综述文章[3],我在“嵌入式机器学习处理器的技术挑战和机会”曾经介绍过其中比较有意思的内容,大家可以作为参考。
T.S.
参考:
1. Vivienne Sze, Yu-Hsin Chen, Tien-Ju Yang, Joel Emer, "Efficient Processing of Deep Neural Networks: A Tutorial and Survey",arxiv.org/pdf/1703.09039.pdf
2. Eugenio Culurciello,“Neural Network Architecture”,medium.com
3. Vivienne Sze, Yu-Hsin Chen,et al., “Hardware for Machine Learning: Challenges and Opportunities”
公众号输入sze可以快速查看该团队论文。