本系列是北航计算机学院于 2024 年春季学期开设的一般专业课《FPGA多核并行计算》课程的实验报告记录,由于学习过程中掌握并不牢靠,如有错误请读者不吝赐教!

PYNQ与深度学习

实验说明与实验相关内容上传在 Github 仓库中。实验过程中使用到的环境与程序:

实验分析

配置QNN实验环境

任务说明:了解FPGA平台所能运行的神经网络类型(BNN、QNN)

首先将 QNN-MO-PYNQ 以及 darknet 两个压缩包上传至开发板的 jupyter 开发环境。然后按照实验说明的要求实现拷贝文件与配置文件修改的操作;其中 darknet 压缩包需解压至 QNN-MO-PYNQ 的内部,配置文件需要注释检查 PLATFORM 的三处代码(位于),并将 git clone 的相关指令删除。

  • 拷贝rapidjsonqnn/src/library目录下

    cp -r QNN-MO-PYNQ-master/library/rapidjson QNN-MO-PYNQ-master/qnn/src/library

修改配置文件 QNN-MO-PYNQ-master/setup.pyQNN-MO-PYNQ-master/qnn/dorefanet.pytineryolo.py 的 PLATFORM 检查代码并设定为 PLATFORM = pynqZ1-Z2

配置完成后进入 QNN-MO-PYNQ-master/qnn/src/network 目录执行 make lib_hw 指令生成 lib_hw.so 库文件,并将其转移至库文件的目录中。

cd QNN-MO-PYNQ-master/qnn/src/network
make lib_hw
cp QNN-MO-PYNQ-master/qnn/src/network/output/lib_hw.so QNN-MO-PYNQ-master/qnn/libraries/pynqZ1-Z2/lib_hw.so

最后对根目录中的 setup.py 执行安装操作即可完成 QNN 实验环境的配置。

$ python3 setup.py install

image-20240320194205423

使用Tiny-Yolo进行目标检测

任务说明:掌握 PYNQ 平台下 Tiny-Yolo 网络的基本搭建方法

直接使用 QNN-MO-PYNQ-master/qnn/notebooks 下的 tiny-yolo-image.ipynb 文件进行处理,对随机取出的图片进行物体识别,在调用库的过程中出现了 No such file of directory 的错误,进入 python 的 dist-package 中进行核查,发现原本调用 qnn 的目录变为 gnn_loopback-0.1-py3.6.egg/qnn,在代码中全部对路径的引用进行修改即可正常运行。

image-20240320200815921

执行后的返回结果如下:

class: car   probability: 86%
class: dog probability: 86%
class: bicycle probability: 78%

img

实验思考

自行下载调试 BNN 环境,完成 notebooks/CNV-BNN_Cifar10.ipynb 的实验结果

从 BNN 官方仓库中获取 BNN-PYNQ 代码并上传并解压至开发板的 jupyter notebook 环境中。仿照 QNN-PYNQ 的安装思路,修改 setup.py 以及 bnn/bnn.py 中对于开发板 PLATFORM 的判定,然后在项目根目录运行 python3 setup.py install 即可安装 BNN 环境。安装完成后即可对 CNV-BNN_Cifar10.ipynb 的内容进行运行验证

Inference took 527.00 microseconds
Classification rate: 1897.53 images per second
Class number: 4
Class name: Deer

根据配置构建比特流文件

下面的操作将回到远程桌面中执行。

依赖文件安装

同样地,在远程桌面中解压BNN-PYNQ项目,并修改其PLATFORM的判定过程,完成项目的基本配置。然后根据实验说明,分别从xilinx-tiny-cnnfinn-hlslib 获取了必备的依赖文件,文件的放置路径如下:

xilinx-tiny-cnn:${XILINX_BNN_ROOT}/xilinx-tiny-cnn/"
finn-hlslib:${XILINX_BNN_ROOT}/library/finn-hlslib

配置环境变量

首先在终端中打开 ~/.bashrc 进行环境变量的修改,在文件末尾添加两行:

XILINX_BNN_ROOT=~/Desktop/BNN-PYNQ-master/qnn/src
PATH=$PATH:/tools/Xilinx/Vivado/2018.3/bin

添加过后使用 source ~/.bash_rc 对环境变量进行更新,如果能正确 echo 对应路径则说明环境变量添加成功

image-20240320203752955

运行脚本制作镜像

在运行脚本前先参考了实验说明以及指向的补丁说明,在 Vivado 的安装路径中执行了补丁 python 脚本,完成了漏洞修复,解决了 ip 导出失败的问题。

cd BNN-PYNQ-master/qnn/src/network/output
./make-hw.sh W1A3 pynqZ1-Z2 a

然后再运行脚本制作镜像,在制作的过程中出现了众多输出,其中可以注意到制作过程中的部分 log 输出路径,这正好也是实验报告需提交内容的一部分:

image-20240320212909333

最终等待镜像制作结束,本次实验的所有内容就完成了。

image-20240320214633188

实验总结

实验过程中,主要出现的问题分为两类:一类关于开发板的环境处理,另一类关于远程桌面的管理。

首先在完成训练1时就出现了文件上传、解压的问题,对jupyter notebook的不熟练导致在将文件加载到开发板训练环境中时延误了大量时间,其次在开发板上对终端的使用也不熟练,对工作目录的划分不明确。

本次实验直至思考题2才使用远程桌面的开发环境作为实验环境,但其中的环境配置和错误处理也占了实验时间的相当大一部分;而且这次实验图方便没有将文件存放在持久化目录下,下次实验开始会注意对实验数据进行保存,以防出现实验进度、结果丢失的情况,感谢在实验课上提醒我的助教学长!

本次实验实现了将QNN、BNN环境通过PYNQ部署到FPGA开发板的整个过程,并实现了Tiny-Yolo的基本识别流程,完成了深度学习相关代码从PC机迁移到FPGA设备上的操作。FPGA虽然硬件算力与PC相差较多,但出乎意料的是,从Tiny-Yolo的使用情况来看,模型训练后应用的实际效果并没有下滑太多,仍然能够进行基本的图像识别功能,这也体现了FPGA在并行加速方面的优势。

实验2-2:PYNQ与深度学习