软件开发|编程技术|编程代码|编程入门先学什么—程序设计语言

在ZYNQ上怎么加速CNN

ZYNQ简介

ZYNQ系列是Xilinx推出的高端嵌入式SoC,其在片上集成了ARM处理器和FPGA。ZYNQ与传统的嵌入式CPU相比,具有强大的并行处理能力。开发人员利用FPGA强大的并行处理能力,不仅可以解决多种不同信号处理应用中的大量数据处理问题,而且还能通过加入更多外设来扩展处理系统的功能。ZYNQ通过引入最新的高速AXI-4总线,可轻松实现外设的扩展与高速互访。

ZYNQ SoC十分适用于硬件加速,最典型的架构就是将需要加速的大运算量逻辑部署到FPGA上,而将流程控制的逻辑部署到arm上。典型的ZYNQ SoC结构如图1。

CNN简介

       CNN全称卷积神经网络,包括卷积层(convolutional layer)和池化层(pooling layer)。此处不对CNN算法原理进行赘述,仅对网络结构进行简单描述。

图2是一个卷积神经网络的高层次视图。通常情况下,CNN网络会在卷积层和池化层后加入全连接层。

卷积层和池化层的功能是对输入原始图片进行特征提取,而全连接层的功能则是对提取到的特征进行特征映射。除此之外,在全连接层后还需要加入一个功能函数以实现整个网络的功能。对于监督学习来说,有分类和回归两大功能。例如,在 VGG和Google Net中,在最后都使用了Softmax实现分类;在R-CNN中,在网络后加入Bounding-box regression实现了预选框微调的回归功能。对于功能函数,行业中一派认为应该属于神经网络的一部分,一派认为独立于神经网络之外。

在图2中,输入图片与第一层卷积层的卷积核做卷积操作,形成一排Feature maps。在池化层,对每个map进行下采样,形成一排尺寸更小的Feature maps。在接下来的第二层的卷积层和池化层中,以第一层输出的Feature maps作为输入,再进行一次卷积和池化计算。CNN的卷积和池化操作将输入的图片的特征提取并抽象到更高的层级。之后的全连接层以Feature maps中所有特征值作为输入,将提取到的特征映射到所需要的特征空间。

本文以一个简单的手写体识别网络LeNet5为例,提出一种在ZYNQ上加速CNN的工程方法。LeNet5在两层CNN后加入了全连接层和softmax分类器,实现了对10种数字手写体的分类。

系统框架

ZYNQ上FPGA可编程逻辑部分成为PL端,以arm为核心的处理器部分成为PS端。本系统中,CNN在PL端的FPGA上实现,通过DMA与PS端的Linux交换数据。Linux将CNN参数和输入数据dma到CNN,CNN计算完成后将计算结果dma回Linux。CNN通过vivado HLS设计,各层以数据流方式实现数据传递,可实现全网络流水。通过HLS优化,可将百万级周期的计算环节优化为万级周期。

Linux中,通过DMA驱动控制DMA的数据读写,通过socket与PC交换数据。

在PC的windows中开发上位机。上位机通过以太网将CNN参数下发给Zynq端的Linux应用程序。将输入的图片下发到Zynq端的Linux应用程序,接收Zynq回传的计算结果。

开发环境

       硬件环境

       硬件环境包括一台PC电脑和一块搭载有Zynq SoC的开发板,开发板和PC通过网线和串口连接。

软件环境

       本文中用到的软件开发工具有:TensorFlow,Vivado HLS ,Vivado,PetaLinux,Visual Studio。

TensorFlow是Google公司开源的深度学习框架,在本文中用于算法的仿真和参数的训练。

Vivado HLS和Vivado 是Xilinx公司Vivado Design Suite套件中的两个软件。vivado-HLS可以将 C,C++ 以及 System C 等高层次语言综合生成HDL级的IP核。Vivado可以将HDL级的文件综合成RTL网表文件,并根据网表文件布局布线生成.bit文件。.bit文件可以直接下载到FPGA中,实现FPGA功能。

PetaLinux工具提供在 Xilinx 处理系统上定制、构建和调配嵌入式 Linux 解决方案所需的所有组件。PetaLinux与 Xilinx 硬件设计工具协同工作,为 Zynq® UltraScale+™ MPSoC、 Zynq®-7000 SoC、和 MicroBlaze™ 简化了 Linux 系统的开发。

Visual Studio在此不做过多介绍,笔者用的是VS2012,使用C#语言开发上位机。上位机通过网络将CNN参数下发给Zynq端的Linux应用程序。将输入的图片下发到Zynq端的Linux应用程序,接收Zynq回传的计算结果。

开发流程