在移动端部署深度学习模型需要高效精确的推理方案[1]。通用矩阵乘法是深度神经网络(Deep Neural Network, DNN)的核心, 也是深度学习推理计算中比较耗时的部分。实现卷积计算的一种主流方法是将其转换为通用矩阵乘计算。此外, 循环神经网络(Recurrent Neural Network, RNN)中也包含大量通用矩阵乘计算。因此, 矩阵乘法的加速设计对边缘设备中的深度学习推理具有重要意义。
目前, 商用的深度学习应用大多使用32 bit单精度浮点数进行训练和推理。研究显示, 使用更低的数值精度执行深度学习推理可以保持相同的准确性, 如图像分类等很多应用只需8 bit整数或更低定点数值精度即可取得可接受的推理准确性[2-4]。百度在深度学习基准测试工具DeepBench[5]中将深度推理的最低精度需求确定为8 bit相乘和32 bit累加, 本文以该精度要求作为设计参照, 基于低成本的片上可编程系统, 设计并实现一种整数矩阵乘法加速器。针对不同规模矩阵乘法的计算需求, 充分利用数据的重用性, 采用在片上保存中间累加结果的方式, 使加速器具备高性能的同时降低外部DRAM的访问需求。对于形状不规则的矩阵乘, 采取矩阵分块可变的设计, 使加速器可以采用灵活的分块方案, 从而提高其性能。
1 相关工作文献[6]指出, 在对矩阵乘法器进行设计时只需固定带宽, 其所需的存储单元大小随矩阵规模的增大而成比例增长。文献[7]提出一种基于广播的二维阵列并行矩阵乘法器结构, 但该乘法器将输入、输出矩阵都存储在片上, 使得所需的存储空间随着矩阵维数的增加而增加, 因此, 其难以处理规模较大的矩阵。文献[8]对上述矩阵乘法器进行改进, 将输入矩阵存储在片上, 每个输出矩阵分块在计算完成后传输至外部存储器, 降低了存储空间需求, 但其仍不能处理大规模矩阵。文献[9]设计一种软硬件协同的定点矩阵乘加速结构, 其采用多处理单元并行的方式, 每个处理单元负责一个矩阵分块相乘, 通过片上通信网络实现数据加载。该矩阵乘加速器优化了与外部DRAM间的通信, 取得了较好的加速效果, 但其仅支持对维数为64倍数的矩阵进行计算。
在浮点矩阵乘加速方面, 文献[10-11]设计基于广播的二维阵列并行结构浮点矩阵乘加速器, 并取得了较好的加速效果, 但该加速器的高带宽要求限制了其性能提升。文献[12]提出一种基于FPGA/SOPC的脉动阵列矩阵乘结构, 但该结构仅能对较小规模的矩阵乘计算进行测试。
与传统通用矩阵乘不同, 深度学习应用中的矩阵乘计算包含大量规模小且形状不规则的矩阵乘[13]。文献[14]提出一种基于Intel HARPv2 Xeon与FPGA平台的可定制矩阵乘计算框架。该框架针对深度学习计算进行优化, 采用运行时可配置的存储交错机制, 优化前小规模矩阵的计算效率低于20%, 而优化后计算效率提升了2.7倍以上; 对于AlexNet卷积神经网络[15], 优化后各层计算取得了1.3倍~4倍的性能提升。该研究基于面向数据中心的高端CPU+FPGA平台, 支持深度学习训练和推理, 但难以应用于低成本的边缘端设备。
2 矩阵乘算法在本文中, (子)矩阵用大写字母表示, 标量用希腊小写字母表示。矩阵乘C=AB可以表示为:
| $ {\gamma _{i, j}} = \sum\limits_{k = 0}^{N - 1} {{\alpha _{i, k}}} \times {\beta _{k, j}}, 0 \le i < M, 0 \le j < R $ |
矩阵A、B和C的大小分别为M×N、N×R和M×R。上述计算表达式可由算法1描述。
算法1 矩阵乘算法
1.for i ← 1 to M do
2.for j ← 1 to R do
3.for k ← 1 to N do
4.γi, j←γi, j+αi, k×βk, j
在算法1中, 3个循环的位置可以交换。根据k循环位置的不同, 矩阵乘可分为内积、中间积和外积3种方式。
3 加速器设计本文加速器架构如图 1所示。
|
Download:
|
| 图 1 加速器架构 | |
加速器主要由以下5个模块构成:
1) ARM Cortex-A9 CPU:运行在CPU上的程序控制任务执行模块, 通过通用接口与加速器的控制器进行通信。
2) 控制器:负责接收CPU发出的任务信息, 将任务分发到处理单元(Processing Unit, PU)执行模块, 并将数据传输需求发送到定制AXI Master接口。
3) 定制AXI Master接口:负责所有的外部DRAM数据访问, 包括矩阵A、B读入和矩阵C写出。
4) 定制AXI Lite Slave接口:负责CPU与控制器之间的通信。
5) 处理单元PU:负责分块层次的矩阵计算。
3.1 PU结构PU负责分块层次的运算, 总体结构如图 2所示, 其主要包括nr×nr大小的由处理引擎(Processing Engine, PE)组成的二维阵列和矩阵A、B数据缓存。为便于说明, 本文以nr×nr=4×4规模的PU为例进行讨论。
|
Download:
|
| 图 2 PU结构 | |
假定矩阵C、A和B都存放到片上, 大小分别为4×4、4×n和n×4, C=AB的计算可表示为:
| $ \left( {\begin{array}{*{20}{l}} {{\gamma _{0, 0}}}&{{\gamma _{0, 1}}}&{{\gamma _{0, 2}}}&{{\gamma _{0, 3}}}\\ {{\gamma _{1, 0}}}&{{\gamma _{1, 1}}}&{{\gamma _{1, 2}}}&{{\gamma _{1, 3}}}\\ {{\gamma _{2, 0}}}&{{\gamma _{2, 1}}}&{{\gamma _{2, 2}}}&{{\gamma _{2, 3}}}\\ {{\gamma _{3, 0}}}&{{\gamma _{3, 1}}}&{{\gamma _{3, 2}}}&{{\gamma _{3, 3}}} \end{array}} \right) + = \sum\limits_{i = 0}^{n - 1} {\left( {\begin{array}{*{20}{c}} {{\alpha _{0, i}}}\\ {{\alpha _{1, i}}}\\ {{\alpha _{2, i}}}\\ {{\alpha _{3, i}}} \end{array}} \right)} \left( {\begin{array}{*{20}{c}} {{\beta _{i, 0}}}&{{\beta _{i, 1}}}&{{\beta _{i, 2}}}&{{\beta _{i, 3}}} \end{array}} \right) $ |
C的第i次更新操作为:
| $ \left(\begin{array}{cccc}{\gamma_{0, 0}+\alpha_{0, i} \beta_{i, 0}} & {\gamma_{0, 1}+\alpha_{0, 1} \beta_{i, 1}} & {\cdots} & {\gamma_{0, 3}+\alpha_{0, i} \beta_{i, 3}} \\ {\gamma_{1, 0}+\alpha_{1, i} \beta_{i, 0}} & {\gamma_{1, 1}+\alpha_{1, 1} \beta_{i, 1}} & {\cdots} & {\gamma_{1, 3}+\alpha_{1, i} \beta_{i, 3}} \\ {\vdots} & {\vdots} & {} & {\vdots} \\ {\gamma_{3, 0}+\alpha_{3, i} \beta_{i, 0}} & {\gamma_{3, 1}+\alpha_{3, 1} \beta_{i, 1}} & {\cdots} & {\gamma_{3, 3}+\alpha_{3, i} \beta_{i, 3}}\end{array}\right) $ |
将C的每次更新操作称为rank-1更新。矩阵A和B的相乘过程如下:A矩阵的第1列通过行总线广播到PE阵列, B矩阵的第1行通过列总线广播到PE阵列, 每个PE进行乘加计算, 更新后存储在其内部的C矩阵中作为中间结果。以此类推, 经过n次rank-1更新后得到C矩阵。
3.1.2 PE结构PE是基本的运算单元, 主要包括乘加部件、本地存储器(用于存储矩阵C的中间结果)、行列通信接口以及Cast模块, 其结构如图 3所示。
|
Download:
|
| 图 3 PE结构 | |
PE接收行广播总线上的矩阵A元素值αi, j和列广播总线上的矩阵B元素值βk, j, 并从本地读取矩阵C的中间结果γi, j, 计算γi, j+=αi, k×βk, j, 将γi, j存储到本地, 完成一次矩阵C中间结果的更新操作。
多路选择器MUX的作用是在计算一个新的矩阵C元素时, 将第一次累加值设为0。
Cast模块用于内部32 bit累加结果到8 bit输出的转换, 其根据具体深度神经网络量化方法而定。在得到矩阵C的最终分块结果后, 通过列输出总线写到外部DRAM中。
3.1.3 矩阵数据缓存矩阵A、B数据缓存采用乒乓存储设计, 将存储空间分为2个部分, 同时进行计算和读取新数据, 以保证计算效率。
3.1.4 PU控制逻辑PU的控制逻辑采用分布式结构, 每个PE有相同的控制器, 执行预定的通信、存储和计算操作。PU的全局控制和握手信号仅限于粗粒度地对PE进行启动和停止, 而无需设置PE的内部状态。
3.2 定制AXI Master接口模块由于矩阵存储在外部DRAM中, 因此高效的片内外通信对加速器的性能有重要影响。本文设计定制AXI Master接口连接到DDR存储控制器以进行数据传输, 接口模块的读写地址信息由控制器发送, 该方式具有较高的传输效率, 且不影响CPU的工作。
4 矩阵乘在加速器上的映射 4.1 映射算法对矩阵进行分块, 将A矩阵划分为大小为Si×N的分块PAi, B矩阵划分为大小为N×Sj的分块PBj。PAi与PBj相乘得到大小为Si×Sj的C的分块PCi, j。以串行方式执行PAi与PBj的相乘操作, 即得到整个C矩阵。分块矩阵乘过程如图 4所示。
|
Download:
|
| 图 4 分块矩阵乘过程 | |
PAi与PBj相乘采用rank-1更新方案, 如图 5所示。矩阵A的分块PAi可看作N个Si×1的列向量PAi, k, 矩阵B的分块PBj可看作N个1×Sj的行向量PBj, k。相应的列、行向量相乘得到矩阵C的分块PCi, j的一层, N层相加得到PCi, j的最终结果。
|
Download:
|
| 图 5 rank-1更新操作过程 | |
分块是将大规模矩阵乘计算映射到固定规模加速器的常用方式。分块的大小有Si和Sj 2个参数。文献[7-8]设置Si=Sj=nr。此时, 矩阵A、B的每个元素均重用nr次, 每个周期的带宽需求是2×nr个元素, 矩阵C的存储需求是nr×nr个中间结果。因此, 上述分块方案的优点是存储空间需求较低, 但同时引起了带宽要求随阵列规模的增大而线性增长的问题。采用该方案, 在阵列规模增大到某值时, 带宽要求会成为计算性能提升的制约因素。
为充分重用片上数据, 本文对上述方案进行改进, 设置Si=μ×nr, Sj=ν×nr。此时, 矩阵A的每个元素重用ν×nr次, 矩阵B的每个元素重用μ×nr次, 每个周期的带宽需求是
对应本文分块方案, 需要采用分时计算的方式, 在nr×nr阵列上完成Si×1的列向量PAi, k与1×Sj的行向量PBj, k相乘, 分时计算调度如图 6所示。将PAi, k分为大小为nr×1的分块, 将PBj, k分为大小为1×nr的分块, 首先固定PAi, k的一个分块, 依次与Sj/nr个PBj, k的分块相乘, 然后固定PAi, k的下一个分块, 该过程共需(Si/nr)×(Sj/nr)次分块相乘, 最终完成列、行向量相乘。
|
Download:
|
| 图 6 列、行向量相乘在处理单元上的映射过程 | |
深度学习中的矩阵乘计算既包括规模较大的矩阵乘, 也存在某一维度值较小的矩阵乘。若将Si和Sj设置为较小的值, 可高效执行不同规模的矩阵乘计算。相应地, 片上数据重用次数少, 带宽要求高, 也会引起功耗的增加。若将Si和Sj设置为较大的值, 则在执行某一维度值较小的矩阵乘时, 效率会大幅下降。
在初始设计中, 编译时即确定分块大小。虽然在执行大矩阵相乘时, 计算部件接近峰值性能, 但在处理小规模矩阵时, 性能出现了明显下降。为此, 本文在矩阵乘运行时支持动态调整分块大小, 具体为:处理器支持分块大小可变, 矩阵分块由运行在CPU上的程序实现, 程序将分块计算参数等信息发送至控制器, 处理器只负责按照控制器分发的任务信息执行分块层次的矩阵相乘。该设计优先保证计算性能, 其次尽可能降低带宽需求, 从而降低功耗。
在处理器内部设有分块计算参数的存储地址, 控制器将分块任务信息(包括Si和Sj)发送至处理器, 处理器根据分块任务信息控制有限状态机的状态转换以完成计算, 然后通知控制器发送下一个分块任务信息。
5 实验结果与分析 5.1 实验设置本文实验平台为ZedBoard开发板, 开发环境为Xilinx Vivado 2017.3, 开发板硬件参数设置如表 1所示。
|
下载CSV 表 1 开发板硬件参数设置 |
本文在bare-metal和Linux 2种环境下测试加速器的性能。加速器包括1个~3个PU, PU配置如下:RAMA/RAMB使用1个36 KB BRAM, 设计成双缓冲工作方式, 每个缓冲区大小为256×64 bit。PU阵列规模为8×8, PE内部存储器RAMC使用1个18 KB BRAM, 为512×32 bit。在该PU配置下, 片上存储空间对分块大小的约束为:Si≤2 048, Sj≤2 048, SiSj≤32 768。
5.2 性能分析使用DeepBench中用来测试边缘端设备通用矩阵乘性能的数据集对本文加速器进行测试。该数据集由深度学习中应用广泛的通用矩阵乘计算组成, 包括规模小且形状不规则的矩阵乘。DeepBench调用Google公司的gemmlowp低精度矩阵乘库进行整数矩阵乘测试, 精度为8 bit相乘和32 bit累加。
5.2.1 bare-metal环境下的测试结果在bare-metal环境下, 本文加速器配置1个PU, 对其与gemmlowp库在双核ARM Cortex-A9 CPU上的性能进行对比, 结果如表 2所示, 其中, 双核Cortex-A9 CPU的工作频率为667 MHz。从表 2可以看出, 与2 ARM Cortex-A9 CPU相比, 本文加速器平均达到了2.79倍的加速比, 且其效率保持在85%以上。加速器共有64个PE, 每个PE有1个乘加单元, 工作频率为100 MHz, 理论计算性能峰值为12.8 GOPS。序号2、3、5和7测试的实测性能与峰值性能比值达到97.4%以上, 实测性能与峰值性能的差距主要来源于在分块计算开始前的数据传输时间和分块计算结束后矩阵C分块写到DRAM的时间, PU乘加单元停止工作。序号4和6测试的实测性能与峰值性能比值分别为90.6%和93.0%, 效率下降的原因是N的值较小, 使传输时间占总时间的比例增加。序号1测试的实测性能与峰值性能比值为85.6%, 效率下降的主要原因是M值较小且不是8的倍数, 导致传输无效数据的时间过长。
|
下载CSV 表 2 bare-metal环境下2种矩阵乘性能对比结果 |
1个PU配置的加速器资源占用情况如表 3所示, LUT为查找表, FF为触发器。为便于分析和调试, 实验中配置了3个AXI Master接口模块区分矩阵A、B和C数据, 增加了资源消耗。在实际应用中, 1个AXI Master接口模块即可满足通信需求。
|
下载CSV 表 3 bare-metal环境下1个PU配置加速器的资源使用情况 |
本文测试涉及的矩阵乘相应带宽需求如表 4所示。由于输入、输出分开, 而输入带宽需求小于输出带宽需求, 因此最大带宽需求为输出带宽800 MB/s。输出数据量远小于输入数据量, 因此, 虽然输出带宽需求较高, 但输出时间占总时间的比例很小, 只要满足输入带宽需求就可取得较高的计算效率。
|
下载CSV 表 4 bare-metal环境下1个PU配置加速器的带宽需求情况 |
在Linux环境下, 本文选用Xillybus[16]作为加速器和ARM处理器之间的数据传输方案。Xillybus由IP核和相应的Linux驱动组成, 在ZedBoard开发板上可提供最大速率约为300 MB/s的数据传输能力。Xillybus的IP核与加速器之间通过FIFO连接。
加速器配置1个~3个PU, 其与2 ARM Cortex-A9 CPU的性能对比结果如表 5所示。3个PU配置加速器的资源使用和带宽需求情况分别如表 6、表 7所示。从表 5可以看出, 针对不同规模的矩阵乘, 与2 ARM Cortex-A9 CPU相比, 加速器达到了2.92倍~7.23倍的加速比。在1个PU配置下, 加速器性能相对于bare-metal环境下的相同配置出现了不同程度的下降, 主要原因是Xillybus提供的带宽不能满足加速器的需求以及存在数据传输延迟。在序号4和6的测试中, N值较小, 传输时间占总时间的比例较大, 带宽受限和数据传输延迟引起了较大程度的性能下降。2个PU配置的加速器相对于1个PU配置, 有1.18倍~1.98倍的性能提升, 3个PU配置的加速器相对于1个PU配置, 有1.19倍~2.79倍的性能提升。
|
下载CSV 表 5 Linux环境下2种矩阵乘性能对比结果 |
|
下载CSV 表 6 Linux环境下3个PU配置加速器的资源使用情况 |
|
下载CSV 表 7 Linux环境下3个PU配置加速器的带宽需求情况 |
由于本文的定制AXI Master接口模块暂不支持多PU同时工作, 因此bare-metal环境下只进行了1个PU配置的加速器测试。对比bare-metal和Linux 2种环境下的测试结果, bare-metal环境下数据传输延迟较小, 如果定制AXI Master接口模块能够支持多PU同时工作, Zynq 7020上可部署3个PU, 使加速比达到8.4。在Linux环境下, 可通过替换更高性能的数据传输模块进一步提升加速器的性能。
6 结束语针对深度学习推理中对不同规模整数矩阵乘法的计算需求, 本文设计一种基于Zynq SoC平台的整数矩阵乘法加速器。量化深度神经网络时以整数而非浮点运算进行推理, 能够大幅降低功耗并缩短网络延迟。本文的研究成果对在低成本的片上可编程系统中实现实时神经网络推理具有参考意义。下一步将优化该加速器的时序设计以提高其工作频率。
| [1] |
JACOB B, KLIGYS S, CHEN Bo, et al.Quantization and training of neural networks for efficient integer-arithmetic-only inference[EB/OL].[2018-07-20].https://arxiv.org/pdf/1712.05877.pdf.
( 0)
|
| [2] |
DETTMERS T.8-bit approximations for parallelism in deep learning[EB/OL].[2018-07-20].https://arxiv.org/pdf/1511.04561.pdf.
( 0)
|
| [3] |
GYSEL P, MOTAMEDI M, GHIASI S.Hardware-oriented approximation of convolutional neural networks[EB/OL].[2018-07-20].https://arxiv.org/pdf/1604.03168.pdf.
( 0)
|
| [4] |
HAN Song, MAO Huizi, DALLY W J.Deep compression: compressing deep neural networks with pruning, trained quantization and huffman coding[EB/OL].[2018-07-20].https://arxiv.org/pdf/1510.00149.pdf.
( 0)
|
| [5] |
NARANG S, DIAMOS G.An update to DeepBench with a focus on deep learning inference[EB/OL].[2018-07-20].https://svail.github.io/DeepBench-update.
( 0)
|
| [6] |
JANG J, CHOI S, PRASANNA V K K.Area and time efficient implementations of matrix multiplication on FPGAs[C]//Proceedings of IEEE International Conference on Field-programmable Technology.Washington D.C., USA: IEEE Press, 2002: 93-100. https://ieeexplore.ieee.org/document/1188669/
( 0)
|
| [7] |
CAMPBELL S J, KHATRI S P.Resource and delay efficient matrix multiplication using newer FPGA devices[C]//Proceedings of the 16th ACM Great Lakes Symposium on VLSI.New York, USA: ACM Press, 2006: 308-311.
( 0)
|
| [8] |
EL-ATFY R, DESSOUKY M A, EL-GHITANI H.Accelerating matrix multiplication on FPGAs[C]//Proceedings of the 2nd International Design and Test Workshop.Washington D.C., USA: IEEE Press, 2007: 203-204. https://ieeexplore.ieee.org/document/4437460
( 0)
|
| [9] |
DAVE N, FLEMING K, KING M, et al.Hardware accele-ration of matrix multiplication on a Xilinx FPGA[C]//Proceedings of IEEE/ACM International Conference on Formal Methods and Models for Codesign.Washington D.C., USA: IEEE Press, 2007: 97-100. https://ieeexplore.ieee.org/document/4231782
( 0)
|
| [10] |
田翔, 周凡, 陈耀武, 等. 基于FPGA的实时双精度浮点矩阵乘法器设计[J]. 浙江大学学报(工学版), 2008, 42(9): 1611-1615. DOI:10.3785/j.issn.1008-973X.2008.09.027 ( 0)
|
| [11] |
张婷.嵌入式环境下浮点矩阵乘法的FPGA加速关键技术研究[D].长沙: 湖南大学, 2013. http://cdmd.cnki.com.cn/Article/CDMD-10532-1014168361.htm
( 0)
|
| [12] |
马邺晨, 李醒飞. 用于导航解算的矩阵运算硬件加速器设计[J]. 计算机工程, 2014, 40(8): 259-263. DOI:10.3969/j.issn.1000-3428.2014.08.049 ( 0)
|
| [13] |
Intel Corporation.Intel Xeon Phi delivers competitive performance for deep learning and getting better fast[EB/OL].[2018-07-20].https://software.intel.com/en-us/articles/intel-xeon-phi-delivers-competitive-performance-for-deep-learningand-getting-better-fast.
( 0)
|
| [14] |
MOSS D J M, KRISHNAN S, NURVITADHI E, et al.A customizable matrix multiplication framework for the Intel HARPv2 Xeon+ FPGA platform: a deep learning case study[C]//Proceedings of 2018 ACM/SIGDA International Symposium on Field-Programmable Gate Arrays.New York, USA: ACM Press, 2018: 107-116.
( 0)
|
| [15] |
KRIZHEVSKY A, SUTSKEVER I, HINTON G E.ImageNet classification with deep convolutional neural networks[C]//Proceedings of the 25th International Conference on Neural Information Processing Systems.New York, USA: ACM Press, 2012: 1097-1105. https://www.mendeley.com/catalogue/imagenet-classification-deep-convolutional-neural-networks/
( 0)
|
| [16] |
Xillybus.Xillybus host application programming guide for Linux[EB/OL].[2018-07-20].http://xillybus.com/downloads/doc/xillybus_host_programming_guide_linux.pdf.
( 0)
|
2019, Vol. 45

0)