NVDLA1引文1.1摘要深度学习推理的大部分计算工作都是基于数学运算,这些运算可以大致分成四个部分:卷积,激活,pooling和normalization。它们的内存访问模式是非常可预测的,并且易于并行化。NVDLA工程是nivida发布的一个标准的,开放的结构,以解决深度学习的计算需求。标准化深度学习硬件加速模块旨在促进机器学习的发展。NVDLA硬件模块提供了一个简单的、灵活的、健壮的推理加速解决方案。它的灵活性使它的feture支持的应用非常广,从低成本的到高性能的覆盖。公布的版本里面包含的了工业级的RTL设计,基于TLMSystemC写的仿真模型(用于软件开发,系统整合及验证),开源的软件包含了firmware,模型的builder。1.2两种实现模型的比较NVDLA硬件利用标准实践与系统的其余部分进行交互连接:一个控制通道实现一个寄存器文件和中断接口,并使用一对标准的AXI总线接口来与内存进行交互。主内存接口是用来连接系统的宽内存系统,包括系统DRAM;这个内存接口应该与系统的CPU和外围I/O设备共享。第二个内存接口是可选的,它允许连接到更高带宽的内存,这些内存可能专门用于NVDLA或计算机视觉子系统。异构内存接口使得在不同类型的主机系统之间提供额外的灵活性。NVDLA的实现一般分为两类:Headless(small)—NVDLA硬件的单元管理是在主系统处理器上进行的。Headed(large)—将高中断频率任务委托给一个与NVDLA子系统紧密耦合的微控制器。下图中的小系统模型显示了一个headlessNVDLA实现的例子;而大系统模型显示了一个headed实现。小系统模型实现了一个对成本更敏感的构建模式。大系统模型的特点是增加了专用的控制协处理器(微控制器)和高带宽的SRAM来支持NVDLA子系统。大系统模型更倾向与高性能的物联网设备,这些设备可以同时运行许多任务。1.2.1小系统NVDLA模型该模型适合于成本敏感的物联网类设备、人工智能和自动化系统,这些设备具有明确的任务,成本、面积和功耗是主要驱动因素。通过NVDLA配置资源来实现节约(在成本、面积、功耗方面)。神经网络模型可以预先编译和性能优化,允许更大的模型被“缩减”并减少负载复杂性;这反过来又支持一个缩小的NVDLA实现,在这个模型中,模型消耗的存储空间更少,系统软件加载和处理的时间也更少。这些专门构建的系统通常每次只执行一个任务,因此,在NVDLA运行时牺牲系统性能通常不是一个很重要的问题。与这些系统相关的相对廉价的切换——有时候,由于处理器架构选择的结果,有时由于使用了一个类似于FreeRTOS的任务管理系统——导致主处理器没有为大量的NVDLA中断服务而负担过重。这就消除了额外的微控制器的需要,主处理器同时执行粗粒度的调度和内存分配,以及细粒度的NVDLA管理。通常,遵循小系统nvdla模型的系统将不包括可选的第二个内存接口。当整体系统性能不那么重要时,没有高速内存接口的影响也不再那么紧要。在这样的系统中,系统内存(通常是DRAM)可能比SRAM消耗更少的电能,这使得使用系统内存作为计算缓存的效率更高。1.2.2大系统NVDLA模型大系统NVDLA模型是一种更好的选择当主要的重点是高性能和多功能性的时候。面向性能的物联网系统可能执行推理在许多不同的网络拓扑;因此,这些系统重要信息保持高度的灵活性。此外,这些系统可能同时执行多个任务,而不是序列化推理操作,因此推论操作不能消耗主机上太多的处理能力。为了满足这些需求,NVDLA硬件包括了第二个(可选的)内存接口来支持专用的高带宽SRAM,并使能一个接口用于专用的控制协处理器(微控制器),以限制主处理器上的中断负载。在实现中包含了一个高带宽的SRAM,它连接到NVDLA上的一个快速内存总线接口端口。这个SRAM被NVDLA用作缓存;(可选地),它可能被其他具有高性能的、与视觉相关的组件共享,从而进一步减少对主系统内存(SysDRAM)的访问。在使用专用的协处理器时,主机处理器仍然处理与管理NVDLA相关的一些任务。例如,尽管协处理器负责调度NVDLA硬件的细粒度程序,主机仍然负责调度NVDLA硬件的粗粒度,负责NVDLA内存访问(必需的)的IOMMU映射等。2硬件架构2.1简介NVDLA提供了CNN(convolutionneuralnetwork卷积神经网络)网络的全流程的硬件加速架构,包含了convolution,deconvolution,fully-connected,activation,pooling,localresponsenormalization。它的灵活可配置行使得它可以适用于各种应用场景,对成本和功耗敏感的可以选择配置成小版本,追求高性能的可以选择高配置。2.2功能描述NVDLA引入了一个模块化的架构旨在简化配置,集成和可移植性。NVDLA硬件由以下组件组成:ConvolutionCore(卷积core)—用于卷积层,优化高性能卷积引擎。SingleDataProcessor(单数据处理器)—用于非线性激活层,激活函数的单点查找引擎。PlanarDataProcessor(平面数据处理器)—用于池化层,平面平均引擎用于polling。ChannelDataProcessor(通道数据处理器)—用于normal层,多通道平均引擎,用于先进的标准化功能。DedicatedMemoryandDataReshapeEngines(专用内存和数据重构引擎)—用于Reshape,对张量重塑和复制操作memory到memory的转换加速。上述的模块是可以单独配置调整的,甚至某个层次不需要可以去掉,或者需要单独增加卷积层的运算能力,而其它层次不做改动。NVDLA实现三种主要的连接关系同系统的其他部分:ConfigurationSpaceBus(CSB)interface:这个接口是同步的、低带宽、低功耗、32位的控制总线,它设计为CPU用来访问NVDLA配置寄存器。在CSB接口中,NVDLA作为slave。CSB实现了一个非常简单的接口协议,因此它可以很容易地转换为AMBA、OCP或任何其他系统总线,并带有一个简单的分隔层。Interruptinterface:NVDLA硬件包括1-bit的端口中断信号。中断信号断言当一个任务完成或者一个错误出现。DataBackbone(DBB)interface:DBB接口连接NVDLA和主系统内存及子系统。它是一种同步、高速和高度可配置的数据总线。可以指定不同的地址大小、不同的数据大小以及根据系统的需求发出不同大小的请求。DBB接口是一个简单的接口协议,类似于AXI(并且可以很容易地在符合AXI的系统中使用)。DBB接口有一个可选的第二连接,当有第二个内存路径可用时,可以使用它。此连接与主DBB接口的设计是相同的,它的目的是使用一个能够提供更高吞吐量和更低访问延迟的片上SRAM。对于NVDLA的系统、功能来讲,第二DBB接口不一定是必要的,删除它还可以节约面积。主控通过配置一个硬件层的寄存器,同时下发“activate”命令启动NVDLA。如果数据处理没有相互关联性(如果下一层的数据运算不依靠上一层的运算结果),则多层的数据是可以同时下发到不同块进行处理的。因为每个子模块的配置寄存器都有“shadowregister”,所以当activelayer完成的时候,第二层的运算可以开始了。当完成activetask,会通过中断告知主控已经完成,然后主控重新启动新的process。通常的神经网络加速器处理一个多层的CNN时,是分层进行计算的,由第i层的FeatureMap预算得到第i+1层的FeatureMap,并存储进DDR或者SRAM,在进行第i+2层网络运算时,需要将之前存储进DDR或SRAM的feature重新读出来,这无形中是一笔极大的带宽消耗。NVDLA的5种计算模块以及一个BridgeDMA是可以并行工作的,为了解决带宽的问题,NVDLA的工作模式有两种,independent和fused。在神经网络里,进程出现卷积-激活-pooling的层间拓扑结构,在fused模式下,NVDLA的卷积加速器的输出可以直接灌入非线性运算单元的输入,非线性运算单元的输出可以直接灌入池化的输入。这三个运算单元可以组装成一个大的流水线,从而节约带宽。当然,fused的工作模式不仅存在于这三个模块之间。NVDLA架构可以通过两种操作模式进行编程:独立模式,融合模式。独立模式:当独立运行时,每个功能块都被配置成什么时候和执行什么,每个块都在其分配的任务上工作(类似于一个深度学习框架中的独立层)。独立操作的开始和结束是由指定的块执行内存到内存操作,进出主系统内存或专用SRAM内存。融合模式:融合操作类似于独立操作,然而,一些块可以组合在一起。这可以通过内存绕过循环从而提高性能,而不是通过小的FIFO来实现块之间的相互交流。(例如,卷积core(convolutioncore)可以将数据传送给单一数据节点处理器(SingleDataPointProcessor),然后传送给平面数据处理器(PlanarDataProcessor),再转换到跨通道数据处理器(Cross-channelDataProcessor))2.3卷积卷积运算在两组数据上工作:一组离线训练的“weights”(在每次推断之间保持不变),另一组输入“feature”数据(随网络的输入而变化)。卷积引擎暴露参数来高效的映射不同大小的卷积到硬件上。NVDLA卷积引擎包括一些优化,以提高在naive(天真)卷积实现上的性能。支持少量的权重压缩,由于节约内存带宽。内建的Winograd卷积支持提高对某个尺寸过滤器的计算效率。Batch卷积,当并行运行多路复用时,可以通过重复使用权重来节省额外的内存带宽。为了避免重复对系统内存的访问,NVDLA卷积引擎有一个内部RAM,用于weight和输入feature的存储,被称为“卷积缓冲区”。这种设计极大的提高了内存效率,而不是每个独立的时间发送一个请求给系统内存控制器来获得所需的weight或者feature。NVDLA卷积模块支持的几个特性:DirectImage-inputWinogradBatching利用这些特性使得卷积运算更加高效。支持sparseweightcompression将节省带宽需求,引入winograd算法的卷积运算对于某些size的filter提升了运算效率。Batchingconvolution通过reuseweights节省额外的带宽。为了避免重复的读DDR,NVDLA接一个“convolutionbuffer”来存储weight和feature,这些设计都大大的提高了memory的效率,降低了系统带宽的需求。2.3.1DirectConvolutionModeDirectConvolutionMode是基本的操作。NVDLA合并了一个广泛的多聚积(MAC)管道,以支持高效的并行直接卷积操作。NVDLA有两个重要的参数影响卷积的性能:Memory的带宽和MAC的效率。CNN网络(例如FC层),需要巨大的带宽需求,NVDLA为了降低带宽的需求做了两个优化:SparseCompression:featuredata和weightdata都可以做稀疏化压缩,带宽需求可以降一半。SecondMemoryInterface:通常SRAM可以提供2~4倍与DDR的带宽,1/10~1/4的latency。第二个影响卷积性能的是MAC的效率。MAC的数量(Atomic-C*Atomic-K).假如输入的featuredata不是C的倍数,或者输出的featuredata不是K的倍数,这样的话就不是全部的MAC都投入运算,这样就会降低MAC的利用率。(一个C=16,K=64,1024个MAC的网络,假如inputfeaturedatachannelnumber=8,outputfeaturedatakernelnu