石永泉,景乃锋
(上海交通大学 电子信息与电气工程学院,上海 200240)
随着大数据、深度学习和云计算的不断发展,神经网络需要处理的数据量越来越大,对硬件算力的要求也日益提高。传统冯·诺依曼体系结构中内存单元和运算单元之间的大量数据流动会导致计算单元的长时间空闲,限制数据处理速度并进一步增加系统功耗[1]。相比传统冯·诺依曼体系结构,存算一体(Processing-in-Memory,PIM)体系结构将权值数据的存储与机器学习和神经网络算法中的向量矩阵乘法(Matrix-Vector Multiplication,MVM)运算在忆阻器件[2]上实现,成为解决访存瓶颈的有效途径。
尽管存算一体体系结构为解决存储墙问题提供了新的思路和方法,但是存算一体神经网络加速器的架构设计依然面临很多挑战。存算一体神经网络加速器架构设计需要对加速器进行精确的建模和仿真,模型中需要包含数据访存、指令译码等细节信息[3],并通过软件模拟器方式实现[4]。然而,对于大规模深度神经网络,软件模拟器仿真的时间开销往往是不可接受的。传统硬件模拟器虽然仿真时间短,但是仅支持单一的网络,灵活性较差[5-6]。本文提出一种基于现场可编程门阵列(Field Programmable Gate Array,FPGA)模拟的阻变神经网络加速器评估方法,同时设计硬件资源的软件分时复用方案,并在DIGILENT ZYBO-Z7 开发板上进行阻变神经网络加速器评估方法的软硬件设计。
忆阻器阵列集成计算和存储功能,一般通过非易失性阻变随机访问存储器(Resistive Random Access Memory,ReRAM)[7]实现。在神经元结构中,突触可以根据其两端的神经元激励发生变化。在忆阻器阵列中,可在ReRAM 器件两端外加电压改变电导[8]进行神经计算。如图1 所示,利用ReRAM 器件的特性,可以外加输入数字电压(INP),将电压进行数模转换(DAC)得到模拟电压值,加在器件两端的模拟电压和器件预编程的电导通过欧姆定律和基尔霍夫定律计算得到流出器件的电流,将电流值进行模数转换(ADC)后得到计算的数字输出结果(OUT),实现存算一体的功能。
图1 ReRAM 阵列向量矩阵乘法运算原理Fig.1 Principle of ReRAM array MVM operation
存算一体神经网络加速器通常进行分层拓扑架构设计。文献[9]对存算一体神经网络加速器进行Chip、Tile、IMA、Crossbar 的四层架构设计。Chip 以集中网络的形式连接多个Tile;Tile 通过共享总线连接多个IMA、累加器等功能单元;IMA 通过共享总线连接多个Crossbar、数模转换器等功能单元。文献[10]给出Chip、Tile、VMM、Crossbar 的分层拓扑架构设计,数据可在Tile 间进行粗粒度的流水,减少Tile 间不必要的数据流动。文献[11]实现Node、Tile、Core 的三层架构设计,其中Core 包含多个流水的MVM 运算单元和三级指令流水线,数据在Core 和Crossbar 中都可进行流水计算,提升内部访存带宽[12]。
相较传统神经网络加速器[13],存算一体神经网络加速器将标量计算尽量放在CPU 上进行,向量计算的向量规模也无需特殊指定。AMBROSI 等[14]于2018 年提出一种存算一体神经网络加速器的指令集,相较传统神经网络加速器指令集[15]增加了在不同层次间进行数据搬运的指令,ANKIT 等[16]于2020 年又加入了进行外积计算的OPA 指令及转置矩阵和向量乘法运算的MVTM指令,但不支持对ReRAM 阵列的在线编程[17-18]。
2.1.1 架构设计
为对神经网络各层运算进行有效的资源分配,提升内部带宽并减少不必要的数据移动,神经网络加速器需要进行分层拓扑架构设计,基于FPGA 模拟的阻变神经网络加速器支持Core、Tile、Crossbar的三层架构。
如图2 所示,Crossbar 主要进行向量和矩阵的乘法运算,每个Crossbar 包含ReRAM 阵列、保存输入输出数据的缓存单元、信号转换器等功能模块。Tile主要进行神经网络的层级运算,包含存放数据的SRAM、一定数量的Crossbar 和用于将Crossbar 的计算结果进行激活操作的向量运算单元(ALU)。Core中主要进行网络级别的运算,包含指令译码模块、一定数量的Tile、加载数据到各自Tile 对应SRAM 的数据加载单元(LU)、保存数据到动态随机访问存储器(Dynamic Random Access Memory,DRAM)的数据回存单元(SU)和进行池化操作的向量运算单元。DRAM 保存编译产生的指令和数据,每个Core 通过各自的指令队列连接在指令发射模块上接收指令,数据通过直接存储器访问(Direct Memory Access,DMA)传递给各个Core。
图2 阻变神经网络加速器架构Fig.2 Architecture of resistive neural network accelerator
2.1.2 指令集设计
由于存算一体神经网络加速器的器件和架构特点以及神经网络的计算特性,因此存算一体神经网络加速器的指令集也有其特殊性。基于FPGA 模拟的阻变神经网络加速器在传统神经网络加速器指令的基础上新增在线编程的LdWGT 指令,用于配置SetTile 等指令,加速器指令集设置如表1 所示。
表1 加速器指令集Table 1 Instruction set of accelerator
在上述架构和指令集模型下,基于FPGA 模拟的阻变神经网络加速器的主要计算流程如图3 所示。
图3 阻变神经网络加速器计算流程Fig.3 Calculation procedure of resistive neural network accelerator
2.2.1 加速器硬件设计
本文设计的加速器包含了阻变神经网络加速器架构的所有主要功能模块,包括DMA、DRAM、指令发射模块、指令队列、指令译码模块、数据加载模块、数据回存模块、SRAM、向量计算单元和向量矩阵乘法运算单元。由于硬件规模的限制,各个Core、Tile、Crossbar 的运算任务只能串行进行,阻变神经网络加速器的向量矩阵乘法运算单元主要通过乘累加树实现。对比图2、图4 中的指令队列接收每个Core 的指令并经由指令译码模块发送到各个功能模块中执行。在指令的执行过程中:所有的Tile 都通过同一数据加载模块和数据回存模块执行Load、Store 指令和SRAM 进行交互;所有的MVM 指令和ALU 指令分别在向量矩阵乘法运算单元和向量计算单元中串行执行。
图4 阻变神经网络加速器硬件结构Fig.4 Hardware structure of resistive neural network accelerator
ReRAM 阵列的规模一般很大,但FPGA 存储和运算资源有限,ALU 和MVM 指令运算能力有限,因此需要将权值矩阵和输入矩阵进行分割重组,每次进行小规模的运算,将运算结果按照数据索引进行相应的累加。通过对FPGA 硬件资源的分时复用完成较大规模ReRAM 阵列的模拟。
通过修改硬件结构可实现分时复用的硬件调度,但由于积累全部ReRAM 阵列规模的输入数据和权重数据计算模块才能开始计算,且硬件上需要增加Buffer 积累数据,同时计算单元在运行时也会长时间空等,造成不必要的性能损失,因此为降低硬件设计的复杂度并提升运行效率,本文设计加速器的软件库支持分时复用的软件调度。
2.2.2 加速器软件库设计
由于硬件设计上的差异,表1 所述的指令集不能直接执行在阻变神经网络加速器上。设计C++软件库将表1 中的指令转换为硬件支持的指令,软件库同时支持硬件资源分时复用的软件调度。
1)指令重新翻译编译器生成的指令是面向ReRAM规模的指令,其读写和运算的数据规模均是ReRAM 规模,而FPGA 上实现的运算模块远达不到该规模,这样的指令送到硬件上执行仅求得小规模的部分和,与最终结果有很大的差距。因此,需要将数据切分为适配FPGA 运算模块的大小进行运算,并对Store、Load、Pooling、Activation 等指令增加index、size 等字段并转换为适配运算模块的指令,保证转换前后的指令进行等价的操作。此外,由于ReRAM 阵列的器件特性,因此LdWGT 等部分指令无法在FPGA 上执行。FPGA 硬件资源有限,多Core 多Tile 的并行计算只能串行进行,Move 等部分指令在串行系统中的功能与在并行系统中的功能有所差异。因此,对上述指令进行如表2 所示的指令转译。
表2 指令转译Table 2 Instruction translation
2)软件分时复用调度不改变硬件结构,而是在运行时对保存在DRAM 上的指令内容和数据排布方式进行调整,硬件上执行的依旧是与算力相匹配的指令。将ReRAM 规模的输入向量和输出向量切分为n个FPGA 乘累加树输入规模的子向量,ReRAM 规模的权值矩阵相应地切分为n×n个FPGA 乘累加树权值规模的子块矩阵。编译生成的一条MVM 指令进行ReRAM 阵列规模的矩阵乘法运算在FPGA 乘累加树上要分成n×n次实现。如图5 所示,运算时主要以输入向量优先的方式进行调度,运行时每次加载一个输入子向量和相同输入通道下的n个子块矩阵,分别进行向量矩阵乘法运算,相应得到n个输出子向量的部分和。阻变神经网络加速器在一个周期内可以获得一个子向量和子块矩阵的向量矩阵乘法的结果,因此一个ReRAM 规模的向量矩阵乘法运算至少需要n×n个周期才能完成。
图5 MVM 运算调度Fig.5 Scheduling of MVM operation
通过指令的重新翻译和MVM 运算的调度,可以灵活地将更多的神经网络框架编译成基于FPGA模拟的阻变神经网络加速器支持的指令集,从而支持更多网络的性能评估。
选取DIGILENT ZYBO-Z7 开发板进行基于FPGA 模拟的阻变神经网络加速器的软硬件设计。DIGILENT ZYBO-Z7 集 成Xilinx ZYNQ-7020 芯 片和ARM Cortex-A9 处理器核。ARM Cortex-A9 处理器上移植Ubuntu 18.04 操作系统对硬件运行时进行控制。FPGA 芯片上实现了主要的运算和控制逻辑,资源使用情况如表3 所示,FPGA 片上存储(BRAM)和乘累加运算资源(DSP)已被充分利用。
表3 FPGA 资源使用情况Table 3 FPGA resources usage
在实验环境的约束下,阻变神经网络加速器工作在100 MHz 主频的时钟下,单周期可以获得1 个1×16 的向量和16×16 的矩阵的乘法运算结果或1×16 的向量运算结果。
3.2.1 阵列性能评估
为评估加速器对阵列仿真的加速性能,选取存算一体神经网络加速器软件模拟器MNSIM[19]进行对比。针对不同规模的ReRAM 阵列,阻变神经网络加速器的仿真时间和加速比如表4 所示。加速器主要通过提供并行的运算单元和流水运算对MVM 操作进行硬件加速,但由于访存延迟无法忽略,因此对于不同规模的阵列,仿真时间并没有成倍增加。MNSIM 软件仿真平台主要通过高主频的CPU 串行完成MVM,随着阵列规模的提升,MNSIM 的仿真时间显著增加,本文提出的阻变神经网络加速器评估方法可加速40.0~252.9 倍。
表4 加速器对不同规模ReRAM 阵列仿真的加速效果Table 4 Acceleration effect of accelerators on ReRAM array simulation of different scales
3.2.2 网络性能评估
为评估加速器对神经网络仿真的加速性能,选取软件模拟器DNN NeuroSim[20]进行对比,为与本文提出的神经网络加速器的功能相匹配,省略了模拟器对功耗和面积的估算。映射VGG-8、Resnet 等深度神经网络,并在Intel®CoreTMi5-8500 处理器上运行模拟器。图6 给出了对比结果,其中纵坐标的执行时间已经过对数处理,对于小规模神经网络,本文提出的神经网络加速器可以获得129.2 倍的加速比。对于深度神经网络Resnet,随着网络层数的提升,本文提出的阻变神经网络加速器评估方法可以获得194.7~234.2倍的加速比。
图6 加速器对神经网络仿真的加速效果Fig.6 Acceleration effect of accelerators on neural network simulation
针对阻变神经网络加速器的软件仿真速度慢、硬件模拟灵活性差等问题,本文提出一种基于FPGA 模拟的阻变神经网络加速器评估方法,通过软件库指令的重新翻译和MVM 运算调度,实现多层次存算一体架构和指令集的行为仿真以及主流神经网络的快速性能评估。实验结果表明,本文评估方法相比MNSIM 和DNN NeuroSim 软件模拟器在仿真过程中运行速度更快。由于ReRAM 器件的非理想特性,ReRAM 阵列在进行向量矩阵乘法运算时会产生误差,因此后续将在基于FPGA 模拟的阻变神经网络加速器评估方法中加入ReRAM 器件的非理想特性模型,以评估其对神经网络预测结果的影响,提升评估方法的精确度和可靠性。