新聞中心

EEPW首頁 > 設計应用 > 瑞彩祥云

瑞彩祥云

作者:孫齊偉時間:2019-05-29來源:電子産品世界收藏

  孫齊偉

本文引用地址:/article/201905/401026.htm

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

  摘要:函數通常在深度學習中作爲激活函數使用,但其計算涉及自然指數和除法運算,傳統PC機上計算較慢,拖累了一個神經網絡的訓練。本文針對自然指數運算的特點,提出了一種名爲基底拆分法的新方法。該方法將函数中自然指数计算拆分为多个由查找表实现的特定基底上,通过这种方法,一个复杂的自然指数计算过程即可由查找表过程和乘法过程实现。这种方法有效的降低了硬件复杂度以及逻辑传播延时。由于该方法中使用了自定义的数据结构,因此本文采用了CPU + FPGA的架构,通过合理分工,加速函数计算。同时,本文将基于这种方法設計的IP核在-Z2開發板上進行了板級調試。

  關鍵詞:,SoftMax,

  * 本作品获得第二届“全国大学生集成電路创新创业大赛”全国一等奖

  0 引言

  Xilinx推出的系列FPGA中嵌入了一顆雙核ARM,既能發揮FPGA的定制特性,也能發揮處理器的通用特性,而且兩個部分之間接口豐富、官方文檔齊全,可玩性極高。同時相應的開發板也很多。傳統的開發板(Zedboard等)需要結合vivado和SDK兩大工具分別對PL、PS端進行硬件和軟件開發。本次我介紹的平台爲開發板可使用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_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頁,歡迎您寫論文時引用,並注明出處




評論


相關推薦

技術專區

關閉