少女祈祷中...

前言

为了在FPGA上快速部署QNN,我决定尝试Brevitas+FINN的开发流程:软件测在Pytorch上通过Brevitas量化库实现QNN的训练和模型ONNX导出,随后使用FINN工具链对网络进行微调,最后生成HLS工程,在vivado上生成对应硬件侧比特流。

对于FINN而言我也是初心者,因此尽量跟随官方文档走,这两周的目标是把例程(pynq上部署e2e小型qnn)跑起来。但是稍微操作了一下,发现属实不简单。光是FINN这个东西的环境配置就够我喝一壶了。

下面是Quickstart,现在的目标是完成前四步(环境配置),并尝试把第五步里的例程跑起来。

github工程地址:https://github.com/Xilinx/finn
最新官方文档:https://finn.readthedocs.io/en/latest/


快速教程

可以跟着网上一个教程走,实测有效:

下载安装Vivado2022.2和对应版本Vitis

注意:推荐下载2022.2版本vivado,而不是最新。最新的vivado2024.2或2025版本无法适配FINN编译器。

另外,vivado2022.2需要license才能使用。而幸运的是xilinx提供了免费的license生成地址,不需要去网络上找盗版license!
(https://www.xilinx.com/member/forms/license-form.html)

下载安装docker

这里就跟着教程走,一步一步配置即可。

注意:每次要运行FINN前,先检查docker是否已经开启。(点击docker图标即可)

这里贴出docker的一些常用命令:


系统环境配置(bashrc)

需要在~/.bashrc里配置FINN_XILINX_PATH和FINN_XILINX_VERSION。由于我使用的是zsh,因此配置的是~./zshrc。

finn/run-docker.sh 环境配置

finn工程目录下的run-docker.sh会在FINN每次运行时运行一次,设置基本参数等。

这里我建议修改FINN_BUILD_DIR(=$FINN_HOST_BUILD_DIR)至自己的目录下。
因为FINN会把中间编译结果存放在FINN_BUILD_DIR目录下,而中间的一些模型结果(onnx和qonnx)我们也需要。默认的是/tmp目录,容易丢失。

---------------------------

运行quicktest检查

在git下来的finn目录下能够执行quicktest,检查环境是否已经完备。

1
sudo bash run-docker.sh quicktest

如果环境无误,会显示977个pass的检查项目,如图所示。(虽然后面有failed,不过没事)


在docker上运行Jupyter,打开官方例程

最后,在finn路径下借助run-docker.sh脚本打开jupyter,通过点击生成的本地链接地址,可以进入jupyter工程。

1
bash ./run-docker.sh notebook

最后,我们终于可以看到finn-docker上的Jupyter成功运行:

如果这一步执行后仍旧报错,且终端没有弹出地址(直接结束了docker的本次进程),说明前面的环境配置有一步出了问题,或者可能是端口被占用。
请耐心找出问题或从头再来!


端口占用报错的排查和解决方法

在执行bash ./run-docker.sh notebook时,
此时可能会报错Bind for 0.0.0.0:8081 failed: port is already allocated。这说明有其他进程已经占用了端口8081,导致现在执行的notebook进程无法使用。通过终端信息,我发现是Jupyter(可能是之前没关闭的)和Netron(用于ONNX可视化)分别占用了端口8888和8081。
我们换一个Jupyter和Netron端口就行了:

1
JUPYTER_PORT=8890 NETRON_PORT=8082 bash ./run-docker.sh notebook

另外,如果端口持续被占用,也可以通过命令查看占用的进程,然后将其杀死:

1
2
sudo lsof -i:8890
sudo kill -9 <PID>

结语

这次FINN环境配置,痛苦程度不亚于当初本科毕设配置ns-3,搞了整整三天才跑起来。真是醉了:)