Going Deeper with Embedded FPGA Platform for Convolutional Neural Network

image-20221118201757729

题目:Going Deeper with Embedded FPGA Platform for Convolutional Neural Network

日期&会议:Proceedings of the 2016 ACM/SIGDA International Symposium on Field-Programmable Gate Arrays(FPGA)

文章主要做的事情:

在嵌入式FPGA平台上加速CNNs,为Image-Net大型图像分类开发了CNN加速器。

对CNN模型有一些深度分析,表明了卷积层是以计算为中心的,全连接是以存储为中心的。

开发了动态精度数据量化方法和对所有层有效的卷积器用以提高带宽和资源的利用率。

数据放置策略进一步提高了额外的存储带宽利用。

INTRODUCTION

motivation + contribution

在CV领域图像分类是一个基本的问题-->CNN对图像分类的精度很高;while/but 基于CNN的方法需要很多计算和存储资源--> but嵌入式FPGA没有办法提供这些资源,但是又有高精度和实时目标检测的需求->为了解决资源与需求的矛盾前人提出了一些方法--> but这些方法有弊端,只实现了小模型,大模型有很严峻的带宽问题;只研究了卷积层,没有研究全连接层-->我们提出了一些方法解决上述问题:

  • 动态精度数据量化的自动流,探索各种数据量化配置

  • 对FC层进行了一系列的优化:应用了SVD(Singular Value Decomposition,奇异值分解)到全连接的权重矩阵,减少了85.8%的内存占用,提出了一些数据放置策略和计算策略

  • 在嵌入式FPGA上为Image-Net大型分类提出了CNN的加速器设计

BACKGROUND

Primer on CNN

image-20221120161234203

Image-Net Dataset

本文使用ILSVRC 2014训练数据集对所有CNN模型进行训练,并使用ILSVRC 2014验证集对模型进行评估。

State-of-the-Art CNN Models

image-20221120161339052

Model Compression

前人有一些研究是使用剪枝和分解(Network pruning and decomposition)来压缩CNN模型的:剪去影响较小的连接、SVD的使用很经常用于减少内存占用、SVD与滤波器聚类的加速方法、考虑非线性单元参数低秩分解方法、使用秩1滤波器来近似原始滤波器

Data Quantization

先前的大多工作使用16bit的量化策略;但是没有对不同的量化策略进行全面的分析

CNN Accelerator

分两类:一类集中在计算引擎,一类致力于优化存储系统

动态可配置架构,使用专用开关实现跨层配置的设计空间探索,提出辅助编译器探索负载之间的并行性;分块策略和专用buffer提高数据复用并减少总通信流量;多片超级计算提供充足容量存储所有权重

Motivation

大型模型放不下,如果放下需要额外存储且有带宽问题;之前的工作只加速了卷积层,没有全连接层;文章对conv和fc都考虑了加速,使得可以放full model;

conv和fc的限制问题不同,一个是计算限制一个是存储限制(带宽限制)

COMPLEXITY ANALYSIS OF CNN

时间复杂度:

image-20221120163527220

image-20221120163537876

空间复杂度:

image-20221120163557307

image-20221120163604795

根据上面复杂度的理论公式计算出各个层的占比得到下图,说明了:

(a)卷积计算占整个模型所有计算的大部分;(b)全连接的权重数据占整个模型所有权重的大部分

image-20221120163643433

所以,使用SVD对FC的权重矩阵降维可以减少存储的权重数据量

FC的权重W使用奇异值分解:image-20221120164133464

空间复杂度降低为:image-20221120164453592 -> image-20221120164340759

SVD有效性的证明:

image-20221120164722676

DATA QUANTIZATION

定点数的表示:

image-20221120165703236

与以往的静态精度量化策略不同,在本文提出的数据量化流程中,fl对不同层和特征映射集是动态的,而在一层是静态的,以最小化每层的截断误差

文章提出的动态精度量化流:(分为两步:权重量化和数据量化)

image-20221120170022259

The weight quantization phase

image-20221120171002229

The data quantization phase

image-20221120171128410

Analysis of Different Strategies

我们在CaffeNet、VGG16和VGG16- svd网络中探索了不同的数据量化策略,结果如表3所示。所有的结果都是在Caffe框架[28]下得到的。

image-20221120171813841

使用动态精度量化,我们可以使用更短的位宽表示,同时仍然可以达到相当的精度

SYSTEM DESIGN

image-20221120191913439

image-20221120191953873

使用CPU+FPGA异构结构,整个系统分为两部分:the Programmable Logic (PL) and the Processing System (PS)

  • PL :PL就是FPGA芯片,放置了计算单元,控制器,输入输出buffer,DMA

    • Computing Complex : 完成模型的计算部分, conv, fc,pool

    • Controller: 从External memory中取指令并解码,用以调度片上模块

    • DMA:用于在PS端外部存储器和PL端片上缓冲区之间传输数据和指令

  • PS :通用处理器和外部存储器组成

    • External memory: 存储所有CNN模型参数、数据和指令
    • CPU处理器运行裸金属程序,并通过配置dma帮助编排整个推断阶段。
    • 还在CPU上实现Softmax,它的FPGA实现将带来设计开销,性能几乎没有提高,因为该功能只在整个CNN的最后一层调用。

  • Data Preparation :计算所需的所有数据,包括图像数据、模型数据和控制数据(DMA使用的缓冲区描述符BD和控制指令)都存储在外部存储器中

  • Data Processing : 根据BD配置DMA,DMA加载数据和指令给控制器,触发PL中计算处理

    Each time a DMA interrupt is asserted, CPU host adds up the self-maintained pointer address for each DMA’s BD list and configures them with new BDs. This phase works until the last BD has been transferred.(?)

  • Result Output :处理器主机接收到DMA的最后一个BD中断后,对PEs的最终结果应用Softmax功能,并将结果输出到UART端口(?)

    通用异步收发器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种串行、异步、全双工的通信协议

PE Architecture

image-20221120200833222

image-20221120211219615

PE包含五个部分:卷积计算部分、加法树、Non-Linearity module, the Max-Pooling module, and the Bias Shift

  • Convolver Complex使用文献[29]的线性buffer设计

conv: 输入数据按行布局通过缓冲区,窗口选择器函数选择计算的数据给乘法器和加法器得到卷积计算结果

fc: 全连接有带宽瓶颈,使用该模块计算FC层的矩阵向量乘法效率不高,在每一行的末尾使用一个MUX,将行缓冲区中每一行的延迟设置为与内核大小相同

Since the bottleneck of FC layers appears at the bandwidth, we use this module to compute matrix-vector multiplication for FC layers even the efficiency is not good. To realize this function, we set the delay of each line of the line buffer the same as the kernel size by using a MUX at the end of each line.(?)

(延迟等于卷积核大小,每kernel_size个周期,窗口移动到新的数据,数据选择器每行选出kernel_size个数据,然后给乘法器做内积?)

image-20221120210523306

(c) the convolver in the processing element. 
  • Bias Shift module and Data Shift module :用于支持动态量化,根据每层的量化结果使用Bias Shift和Data Shift 分别对偏置和输出数据进行偏移

Implementation Details

Workloads Schedule

  • Parallelism: operator-level (finegrained) parallelism, intra-output parallelism (multiple input features are combined to create a single output), and inter-output parallelism (multiple independent features are computed simultaneously) [11]
  • Tiling and Reuse :

image-20221121105132054

Controller System

计算阶段,控制器解码一个16位指令,为片上缓冲器和pe生成控制信号。一条指令由下列信号组成:

  • Pool Bypass & NL Bypass: 用于绕过Pool和NL模块

  • Zero Switch: 用于选择零或偏置数据添加到加法器树的结果中

  • Result Shift & Bias Shift: 描述数据移位的方向和bit位,用于动态数据量化

  • Write En:用于将数据从output Buffer 切换到External memory或PE进行重用

  • PE En: 设置PE数量,用于节约能源

  • Phase Type : 帮助控制器区分不同的步骤和发出相应的信号

  • Pic Num & Tile Size/Layer Type: 帮助控制器配置输入输出buffer

在Matlab上开发编译器自动生成指令,表4显示了使用图5 (a)中的示例生成的指令

image-20221121110051463

  1. 根据Phase Type signal把数据加载到input buffer. PE En=2, Pic Num=2所以Ti=2

  2. 指令2开始计算四个tile块,Output Buffer 缓存中间结果

  3. Write En=PE使得输出buffer缓存的中间结果发送到PE

  4. Write En=DDR使得输出结果到外部存储器

MEMORY SYSTEM

Buffer Design

有两种Buffer, Input和Output;image data 和 weight 分别存储在input buffer,bias存储在data buffer中。每个缓冲区的总带宽由相应的端口数量乘以数据宽度(D_W)定义;FC层的Input Buffer的数据和权重的buffer反过来了

image-20221121111912995

Data Arrangement for CONV layers

通过最大化每个DMA事务的突发长度减少访问延迟,优化外部存储器中数据的存储模式。在每个阶段,可以连续加载所有的输入tile进行计算。输出特征映射将是下一层的输入特征映射,因此,同样的存储模式也适用。

(怎么确定Tr, Tc,Ti, To的值?)

有池化的CONV层和其他层之间有轻微的区别。计算顺序Out(1,1)=>Out(2,1)=>... 所以按照生成结果的顺序存储是不连续的,就在Out(1,2)生成之前把Out(1,1)缓存放在Out(4,1)的位置,然后把Out(1,1)和Out(1,2)放在一起(?)

(池化怎么做?竖着池化的吗?,所以先生成Out(2,1)?为什么一定是Out(4,1))

Data Arrangement for FC Layers

一个PE中的64个Compute Complex分配一个长度为900的缓冲区,等于T r× T r。在计算CONV层时,缓冲区是逐个填充的。

为了减少填充缓冲区时额外的数据路由逻辑,同时在获取数据计算FC层时保持较长的突发长度,我们在外部存储器中安排了权重矩阵。首先用64×9列和100行的块分割整个矩阵,这样一个块可以在一个阶段中处理。在每个块中,数据的排列如图9 (b)所示。

没有FC层的数据安排(如图9 (a)所示),我们需要64×100 DMA事务来加载一个块,而突发长度仅为9。通过安排如图9 (b)所示的数据,我们只需要一个DMA事务来加载整个块,并且较长的突发长度确保了对外部内存带宽的高利用率。

image-20221121113451866

SYSTEM EVALUATION

CPU platform is Intel Xeon E5-2690 CPU@2.90GHz

GPU platform is Nvidia K40 GPU (2880 CUDA cores with 12GB GDDR5 384-bit memory)

mGPU platform is the Nvidia TK1 Mobile GPU development kit (192 CUDA cores)

FPGA: Xilinx Zynq ZC706 (Xilinx Kintex-7 FPGA, dual ARM Cortex-A9 Processor, and 1 GB DDR3 memory,bandwidth of 4.2GB/s.)

在资源和带宽的约束下,选择最优的参数组使吞吐量最大化。参数和资源利用率如表5所示

image-20221121113627333

Theoretical Estimation

For CONV layer : 一个卷积层需要的步骤数量:

image-20221122181546031

To = reuse_times × P E_num ;T c = T r

各阶段计算时间和加载数据时间分别为:

image-20221122181658931

image-20221122181755625

CONV层通常是计算密集型的。因此,为了保持乒乓机制的工作,\(t_{load}\)通常小于\(t_{compute}\),因此应该存在

image-20221122181950950

在每个阶段,数据将被重用reuse_times次,每个数据都附带一组新的权重,对于权重:

image-20221122182056323

根据图6所示的工作负载调度,dataout_port_num的约束为:

image-20221122182202382

image-20221122182144304

为了使带宽消耗最小化,我们考虑选择尽可能少的weightin_port_num和datain_port_num。在上述约束条件下,我们可以估计一个CONV层的计算时间:

image-20221122182249702

考虑CONV层中的ti = convolver_num, T r = tile_size, T o = reuse_times × pe_num,进一步得到

image-20221122182338403

For FC layers

不同任务的阶段数和时间可以用以下公式估计:

image-20221122182408206

个FC层所需的总周期可以估计为:

image-20221122182428403

综上所述,在给定约束条件下,可通过式13和式12估计CONV层和FC层的运行时间:

image-20221122182448809

如式13所示,CONV层受到带宽和计算资源的限制。对于FC层,如公式12所示,它只受带宽限制。因此,更高的带宽有助于减少FC层的运行时间。

Performance Analysis

VGG16-SVD网络需要30.764个gop,包括乘法、加法和非线性函数

CONV

CONV层的平均性能为187:80 GOP/s,整个网络的平均性能为136:97 GOP/s。我们的系统帧率为4:45 fps

比CPU和mGPU平台(CPU和mGPU的功率分别为135W和9W)快1.4×和2.0×。

GPU的整体性能比我们的实现高13.0×,但与嵌入式FPGA相比(250W比9.63W),它消耗了26.0×的功率。

FC

FC层所需的操作数仅为0.0024× CONV层,FC层运行时间为0.374× CONV层。由于带宽有限,mGPU平台也存在同样的问题。

image-20221122182653754

Design Comparison

以往设计的所有性能结果都仅从CONV层获得。如果我们只考虑CONV层,我们的系统的平均性能是187.80GOP/s这比之前的设计高几倍。在完整的VGG16-SVD网络下,系统的性能为136.97 GOP/s。

image-20221122183001365

image-20221122183113172

posted @ 2022-11-22 21:31  xiongyuqing  阅读(101)  评论(0编辑  收藏  举报