您的位置 首页 国产IC

PYNQ中完成SoftMax函数加速器

孙齐伟(西南交通大学 信息科学与技术学院,四川 成都 611756)摘要:SoftMax函数通常在深度学习中作为激活函数使用,但其计算涉及自然指数和除法运算,传统PC机上计算较慢,拖累了一

  孙齐伟

  (西南交通大学 信息科学与技术学院,四川 成都 611756)

  摘要:SoftMax函数一般在深度学习中作为激活函数运用,但其核算触及天然指数和除法运算,传统PC机上核算较慢,拖累了一个神经网络的练习。本文针对天然指数运算的特色,提出了一种名为基底拆分法的新办法。该办法将SoftMax函数中天然指数核算拆分为多个由查找表完结的特定基底上,经过这种办法,一个杂乱的天然指数核算进程即可由查找表进程和乘法进程完结。这种办法有用的降低了硬件杂乱度以及逻辑传达延时。因为该办法中运用了自定义的数据结构,因而本文选用了CPU + FPGA的架构,经过合理分工,加快SoftMax函数核算。一起,本文将依据这种办法规划的IP核在PYNQ-Z2开发板前进行了板级调试。

  要害词:PYNQZYNQ,SoftMax,AXI总线异构核算

  * 本著作取得第二届“全国大学生集成电路立异创业大赛”全国一等奖

  0 导言

  Xilinx推出的ZYNQ系列FPGA中嵌入了一颗双核ARM,既能发挥FPGA的定制特性,也能发挥处理器的通用特性,并且两个部分之间接口丰厚、官方文档完全,可玩性极高。一起相应的开发板也许多。传统的ZYNQ开发板(Zedboard等)需求结合vivado和SDK两大东西别离对PL、PS端进行硬件和软件开发。本次我介绍的渠道为PYNQ开发板可运用Python将软件操作和硬件操控进行无缝联接,现在现已出到Z2版别,由依元素进行署理出售,999块极具性价比。

1.png

  PYNQ是Xilinx一项旨在运用Python和一些lib让SoC开发愈加简略的开源项目,以我的了解其本质是Python的一些第三方库,是对PS端操作的封装。传统的ZYNQ开发板也能使其变为PYNQ开发板,当引进Python后就能够运用一些Python中强壮的第三方库了例如Numpy、Matplotlib等。

  1 SoftMax函数介绍及核算计划介绍

  SoftMax 函数是神经网络中的一种输出层函数,核算输出层的值,首要用于神经网络终究一层。其表达式如下所示:

2.png

  规划中的要害问题是 天然指数的核算 ,传统的计划有:

  (1)查表法:平等标准定点数下精度极高,但若要在较大规模上核算需求耗费许多资源。

  (2)CORDIC:运用迭代特性,资源复用,占用资源极小,常用于核算器中,但在大规模核算中需求进行流水线化改造,且需求想办法战胜最大旋转视点约束的问题。

  (3)泰勒级数打开:也即多项式拟合,该法较为灵敏,多项式次数越高精度越高,区分区间越细精度越高,是较为常用的办法。

  本文针对指数核算的特性,规划了一种原理简略的核算计划,并且经过了板级测验。依据其核算特性称其为基底查表法。

1559616708925171.jpg

1559616708645912.jpg

5.png

  在十进制中,若要核算3.68的天然指数咱们能够经过公式(1)别离核算e3,e0.6,e0.08,所以能够事先将需求的天然指数值存在ROM表中,核算时将待核算数字经过基底拆别离离得到个位、非常位、百分位,并作为ROM的寻址地址,终究将查表得到的值进行乘法操作即可得到终究成果。但数字电路中完结十进制取整取余操作时较为杂乱的,因而实际运用时对二进制状况进行了优化。

  图2为依据二进制移位操作的基底拆分示意图,待核算的16bit数据,高三位表明的是小数点的方位信息,低十三位为数据位。经过左移并按照人为规划的格局输出即可复原数据。这种办法仅选用移位操作进行基底区分,因而硬件结构简略、传达延时小。

  工程中规划的IP核内部结构,见图3。

  其间的要害流水线如图4。

  大致原理便是如此,能够看出这种办法也是很灵敏的,能够经过简略地添加ROM和乘法器数量即可扩展核算规模,并且精度能够经过增减ROM表存储的定点数位宽进行改动,乘法器能够运用ZYNQ中的DSP资源来前进功用。本次规划的规模针对[-10,10]。

  2 差错成果

  测验时别离运用[-10,10],[-5,5]两个区间中4096个点进行差错剖析,大致进程如图5。

  终究得到的绝对差错图,见图6。

  差错在10^-7数量级上,能够说是很小了。

  3 IP核接口介绍

  深度学习又被称为炼丹,究其原因便是其练习速度较慢,因而考虑深度学习中的加快问题非常有意义。FPGA因为其定制特性,能够经过逻辑门电路非常高效的完结核算进程。

1559616546480625.jpg

  本次我运用FPGA完结了一款AXI接口的激活函数softmax的加快器,并且经过PYNQ开发板对其进行验证一起完结了精度测验。输入输出均为AXI总线方式,内部选用了一个AXI_S和一个AXI_M,其间,输入AXI_S用于ARM端向ip核传递写地址、读地址、数据个数、输出数据16/8bit切换,AXI_M完结对PS端DDR的读写操作,这样规划的意图是为了最大化减小ARM端的作业量,使整个体系愈加高效,因为AXI_M能够自动的读写AXI_S并且AXI_S只能被迫的被AXI_M进行读写,这个进程规划好后无需ARM端干涉。其结构图如图7所示。

  因而触及的操作为 GPIO口操作,AXI写操作,DDR操作。这儿本来规划选用ZYNQ上的AXI-HP端口,可是调试时发现该端口在数据格局装备为32 bit时仍选用的64bit数据位,估量是个bug,因而不得不换成AXI-GP端口了。

  (1)从ARM引出的两个GPIO一个作为复位信号,另一个作为触发信号

  (2)AXI_M接口,用于装备ip核的一些信息。

  4 使命区分

  为了充分发挥ARM对通用使命的处理特性以及PL的定制特性,本次规划的体系中PS完结了读取数据、数据的定点化和数据移动使命,PL端运用其定制化特性完结核算的加快。全体结构框图如图8。

  图中的CPU即为ARM,作业时将模仿输入的数据写入DDR,并且完结定点化作业。图中硬件即为PL端规划的加快器,其作业分为两个阶段,一是核算元素的天然指数值并对其进行求和,二是运用第一个阶段的天然指数值和和做除法求得每个元素的softmax值。

  5 PYNQ渠道的优势

  我的规划在曾在传统的ZYNQ开发板前进行过调试。规划好硬件后需求结合SDK东西对ARM核进行C言语开发,成果终究需求经过串口回来PC机进行处理。

  在SDK中回来的数据,回来的数据经过上位机的处理才干得到想要的差错数据,较为繁琐。

  但PYNQ不一样,PYNQ上运用了Jupyter能够运用浏览器进行在线Pyhthon编程,并且Python中numpy科学核算库能够只运用3句话就完结softmax的高精度核算,结合pynq的相应库能够完结软件处理和硬件操控的无缝联接,PL端加载bit文件、PL端操控、软件核算、matplotlib制作均运用Python完结,终究的成果都能够在网页中显示出来,极端便利。

  图中我运用了matplotlib库将软件核算成果与硬件核算成果进行了绝对差错核算,可直接在网页中显示出图画,愈加形象化。本次我的规划中,运用PYNQ完结了 从SD卡中读入数据,数据定点化,数据写入DDR,操控PL端进行加快核算,读DDR,将软件成果与硬件成果比照经过差错散点图来测验规划的IP核的精度。

  ZYNQ与PYNQ渠道的差异可经过比照两个渠道的体系框图得到

  能够看出,传统ZYNQ一般为裸机开发,并且PYNQ一般为在本身运转的Ubuntu前进行Python开发,因而PYNQ相对而言上手简略加上一些强壮的第三方库的支撑运用起来也非常便利、风趣。

  6 PYNQ运用办法

  一些根底操作能够参阅官方Get Start我总结有如下过程:

1560412924331554.jpg

  (1)vivado中规划PL端的硬件结构–PC操作,如图13。

  (2)vivado导出规划tcl文件和bit文件–PC操作

  write_bd_tcl -force C:/Users/Administrator/Desktop/test.tcl

  (3)将tcl文件和bit文件放入PYNQ中–PC操作,如图14。

  windows上运转 \\pynq 即可经过sdb功用衔接PYNQ开发板,进行文件移动

  (4)运用Overlay将bit文件进行加载–PYNQPython操作

  overlay = Overlay('/home/xilinx/pynq/overlays/softmax/design_1.bit')

  至此规划就初始化在PL端,运用Python操控相应外设即可。

  7 Python中相关lib的根本运用

  1.Overlay

  from pynq import Overlayov

  overlay = Overlay('/home/xilinx/pynq/overlays/softmax/design_1.bit')

  用于加载比特流文件至PL端

  2.GPIO

  from pynq import GPIO

  rst = GPIO(GPIO.get_gpio_pin(0), 'out')

  triggle = GPIO(GPIO.get_gpio_pin(1), 'out')

  triggle.write(1)

  rst.write(1)

  rst.write(0)

  rst.write(1)

  操作PS端的GPIO口,操作的是64bit的PS-PL端的EMIO

  3.Xlnk

  from pynq import Xlnk

  xlnk = Xlnk()

  buf = xlnk.cma_array(shape=(num,), dtype=np.uint32, cacheable=0)

  addr = buf.physical_address

  结合numpy在DDR中分配空间,用于PL端AXI_M运用其间physical_address能够得到DDR中的物理地址在分配空间时,有个cacheable特点,因为PS和PL端都要对DDR进行操作,所以为了避免PS的cache导致读到的数据未被更新,所以一般需求封闭缓存功用。

  4.AXI从端操作

  myip = overlay.axi_s_control_0

  myip.write(0x00,addr)

  myip.write(0x04,addr)

  myip.write(0x08,num)

  myip.write(0x0c,bool_16)

  myip.read(0x08)

  其间axi_s_control_0是我AXI_S的模块称号,这个是python从导出的原理图tcl文件读出的,因而需求确保tcl和bit文件的一致性,并且需求两者同名

  注:这些信息都在上文说到的Get Start衔接中能够找到,详细请参阅官方的阐明。

  8 定论

  此次凭借“全国大学生集成电路立异创业大赛”关键,咱们别离在传统ZYNQ和PYNQ渠道上完结了SoftMax函数的异构核算加快,取得了比较好的作用。

  在传统的ZYNQ渠道上开发SoC需求具有数字电路和ARM嵌入式开发常识,比较倾向于底层。反观PYNQ渠道,运用Python这一美丽的言语对ZYNQ操作的封装极大的降低了开发难度,一起结合Python强壮的第三方库,可玩性极高。

  当今数字电路工程师只是把握数字集成电路的常识是远远不够的,项目开发愈加需求复合型人才。我在项目中选用Verilog作为硬件开发言语,运用HLS做雏形开发,一起运用Python及Matlab进行建模及数据剖析,运用的软件东西有Xilinx的VIVADO、ISE,以及Synopsys的DC,ICC,Synplify。能够看出只是把握一门技术是远远不够支撑一个项意图。年代在前进,科技在开展,因而数字IC工程师应该坚持住学习的状况,就比如说近几年大火的深度学习,十几年前这个范畴仍是没有人乐意去碰的,但现在该范畴现已让许多停滞不前的方向又迎来新春。

  世界上仍是存在许多时机的,但时机都是留给有预备的人。

  附件:本文规划的softmax ip核在PYNQ运转所需的一切文件https://pan.baidu.com/s/1OuaoS34nIp4Ci96gMCEmug 暗码:ifme

  本文来源于科技期刊《电子产品世界》2019年第6期第69页,欢迎您写论文时引证,并注明出处

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/ic/128236.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部