作者介绍:
Nathan J,复睿微电子英国研发中心首席架构师,常驻英国剑桥。曾在ARM总部从事十多年的高性能CPU架构研究以及人工智能架构研究。
现如今,深度神经网络正在以越来越大的规模部署,横跨了从云端,自动驾驶到IoT等平台。比如用于图像识别,语音识别及翻译,癌症检测以及自动驾驶中对感知层海量数据的处理等。在很多领域,深度神经网络的精度已经超越人类,它的优越性来源于它对原始数据的特征提取,并通过对大量数据的学习来获取输入空间的有效表征,但是它的高精度是以超高计算复杂度为代价。因此很多厂商都在追逐NPU的算力来解决这些复杂问题,但是随着算力的提高,NPU设计也越来越复杂,将伴随着面积和功耗的增加,这对于那些面积和功耗有很大限制的设备带来了挑战,因此如何提升NPU的能效比就成了亟待解决的问题。
NPU通过数据分区和有效调度,利用数据的重用以及执行分段来提高能效比和硬件利用率,而实现高利用率,数据重用将直接依赖于如何调度深度神经网络的计算和如何将这些计算有效的映射到NPU的硬件单元上。以CNN为例,数据流无非包含三个方面filter(Weight),ifmap和ofmap,如下图。
因此在设计NPU时需要考虑如利用内存的层次结构,决定哪些数据要读到那一层的内存中以及什么时候被处理,如何可以重用filter,ifmap和ofmap,将他们存放在本地内存中,从而大大减少DRAM的访问次数,这将在很大程度上提高NPU的硬件利用率及性能,并减少由于DRAM访问带了的额外功耗。根据数据处理特征可以将数据流分为以下几类:
1)、静态weight
weight静态数据流的设计是通过在PE的RF(Register File)中存取weight,来减少读取weight产生的功耗。weight从DRAM读取到RF并保持静态以供进一步访问,NPU在计算时尽可能多的利用RF中的weight以达到最大程度的重用。通常的实现是将ifmap广播给所有的PE,部分和(Psum)将穿过所有的PE来完成空间上的累加。
2)、静态输出
输出静态数据流的设计是通过将accumulator产生的Psum存放到本地的RF中,以避免将Psum刚写入DRAM再读回,从而减少因Psum读写产生的功耗。通常的实现是流式输入Activation,并将weight广播给所有的PE。
3)、无本地重用
如果考虑到RF会增大面积,可以将所有的数据都存放到Global Buffer中,这样没有任何数据会留在PE的RF,也不会增设RF单元来减小面积,但是增加了PE和Global Buffer的数据交互。具体来说是通过多广播Activation,单广播Weight以及Psum穿过所有的PE进行累加来实现的。
4)、静态行
静态行数据流的目标是将所有的数据类型(Activation, weight, psum)的重用和计算都在RF中完成,来提升总体的能效。它区别于上面的静态weight和静态输出,只是分别对weight和psum进行优化。
具体选用哪种数据流方式要结合NPU微架构的设计。下面总结了来自于几个厂家的NPU,它们分别利用了不同数据流类型来提高能效比。
参考文献:
【1】Vivienne S. Yu-Hsin C. and etc., “Efficient Processing of Deep Neural Networks: A Tutorial and Survey”