2. FINN开发环境搭建:安装Docker、拉取FINN镜像、配置Vivado与XRT环境

好,咱们直接进入正题。环境搭建这事儿,说难不难,说简单吧,坑也不少。我见过太多人卡在第一步——装了半天,最后发现是Docker版本不对,或者Vivado路径没配好。今天我就把这几步拆开揉碎了讲,你跟着走一遍,基本不会出问题。

2.1 为什么非得用Docker?

你可能想问:为什么FINN非要跑在Docker里?我自己装一套Python环境不行吗?

嗯,理论上可以。但FINN的依赖链太长了——PyTorch、ONNX、Vivado HLS、XRT库……版本稍微一错,编译就崩。我早期做项目时,为了给团队统一环境,折腾了整整两天。后来换成Docker,一句话搞定。

说白了,Docker就是给你一个“干净的、别人验证过的”运行环境。你不需要关心底层库怎么装,镜像里全配好了。

核心思路: FINN的Docker镜像 = 预装好的Python + Vivado HLS工具链 + XRT运行时。你只需要拉下来,挂载你的工程目录,就能直接跑。

2.2 安装Docker

这一步其实没什么技术含量,但有几个细节要注意。

2.2.1 检查你的系统

Docker对Linux支持最好。我个人习惯用Ubuntu 20.04或22.04。Windows也能跑,但需要WSL2,性能会打点折扣。

先确认内核版本:

uname -r
# 建议 5.4 以上

2.2.2 安装Docker Engine

别用apt直接装,版本太旧。去官网走官方源:

# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc

# 安装依赖
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release

# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 设置稳定版仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

小技巧: 装完后记得把当前用户加入docker组,不然每次都要sudo:

sudo usermod -aG docker $USER
newgrp docker

然后重启一下终端,试试 docker ps,不报错就对了。

2.2.3 验证安装

docker --version
# 输出类似:Docker version 24.0.7, build afdd53b

docker run hello-world
# 看到 "Hello from Docker!" 就说明OK了

我曾经遇到过一个问题:装完Docker后,拉镜像特别慢。后来发现是没配国内镜像源。你可以在 /etc/docker/daemon.json 里加上:

{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

然后重启Docker:sudo systemctl restart docker。速度能快好几倍。

2.3 拉取FINN镜像

FINN的官方镜像托管在Docker Hub上。你直接拉就行:

docker pull xilinx/finn:latest

这个镜像大概有3-4GB,取决于网络状况,可能要等一会儿。你可以趁这个时间去喝杯咖啡。

拉完之后,检查一下:

docker images
# 应该能看到 xilinx/finn 这个镜像

注意: 如果你用的是Vivado 2022.1或更早版本,建议拉取带版本号的镜像,比如 xilinx/finn:v0.8。最新版镜像默认对应Vivado 2023.1。版本不匹配的话,编译HLS时会报奇奇怪怪的错误。

2.4 配置Vivado与XRT环境

这一步是很多人翻车的地方。FINN在Docker里跑,但Vivado和XRT需要安装在宿主机上。为什么?因为Docker里装Vivado太占空间了,而且许可证管理也麻烦。

所以,正确的做法是:宿主机装Vivado,Docker通过挂载目录来调用它。

2.4.1 安装Vivado

这个我就不细讲了,Xilinx官网下载安装包,一路Next就行。注意几点:

  • 安装路径不要有中文或空格。我习惯装到 /tools/Xilinx 下。
  • 勾选“Vivado HL WebPACK”或“Vivado HL Design Edition”,确保包含HLS工具。
  • 安装完成后,设置环境变量:
echo 'source /tools/Xilinx/Vivado/2023.1/settings64.sh' >> ~/.bashrc
source ~/.bashrc

验证一下:

vivado -version
# 应该能看到版本信息

2.4.2 安装XRT

XRT是Xilinx Runtime,用于FPGA与主机通信。如果你用的是Alveo加速卡或Versal开发板,这一步必须做。

安装XRT:

# 下载对应版本的XRT安装包
wget https://www.xilinx.com/bin/public/openDownload?filename=xrt_202320.2.17.0_Ubuntu_22.04-amd64-xrt.deb

# 安装
sudo apt install ./xrt_202320.2.17.0_Ubuntu_22.04-amd64-xrt.deb

# 设置环境变量
echo 'source /opt/xilinx/xrt/setup.sh' >> ~/.bashrc
source ~/.bashrc

验证:

xbutil examine
# 如果能看到设备信息,说明XRT工作正常

避坑指南: 我曾经在Ubuntu 22.04上装XRT 2022.1版本,结果死活不认设备。后来发现是内核版本太高,XRT的驱动不兼容。解决办法是降级内核到5.15,或者升级XRT到2023.1。你装之前最好查一下兼容性列表。

2.4.3 让Docker识别Vivado和XRT

现在,宿主机上Vivado和XRT都装好了。但Docker容器里还看不到它们。你需要用 -v 参数挂载目录:

docker run -it \
  -v /tools/Xilinx:/tools/Xilinx \
  -v /opt/xilinx:/opt/xilinx \
  -v /your/project/path:/workspace \
  xilinx/finn:latest /bin/bash

解释一下:

  • -v /tools/Xilinx:/tools/Xilinx:把宿主机Vivado挂进容器。
  • -v /opt/xilinx:/opt/xilinx:把XRT挂进去。
  • -v /your/project/path:/workspace:你的工程目录,方便在容器里读写代码。

进入容器后,执行:

source /tools/Xilinx/Vivado/2023.1/settings64.sh
source /opt/xilinx/xrt/setup.sh
which vivado
# 应该输出 /tools/Xilinx/Vivado/2023.1/bin/vivado

看到这个路径,就说明环境通了。

2.5 验证FINN环境

最后一步,跑一个简单的测试,确认FINN能正常工作:

# 在容器内
cd /workspace
python -c "import finn; print(finn.__version__)"
# 应该输出类似 0.8.0 的版本号

如果没报错,恭喜你,环境搭好了。如果报错说找不到模块,检查一下Python路径——FINN的镜像默认Python 3.8,别搞混了。

总结一下: 环境搭建就三步——装Docker、拉镜像、配Vivado+XRT。每一步都有坑,但按我上面写的来,基本一次过。我当年第一次搭的时候,卡在XRT驱动上折腾了一下午。现在你有了这份指南,应该半小时搞定。

下一章,我们会真正开始用FINN跑一个简单的神经网络。到时候你会发现,环境搭好了,后面的事就顺了。