#【Vitis AI】 Zynq UltraScale+ MPSoC DPU TRD V4.0 Vivado 2022.1 FPGA开发
目录
1 修订历史
更新日志:
V4.0 更新日志:
- Vitis AI v2.5
- 新的 ALU 引擎来取代 Pool 引擎和 Dwcv 引擎
- ALU: 支持大内核尺寸的 MaxPool 和 AveragePool
- ALU: 支持矩形内核尺寸的 AveragePool
- ALU: 支持 16 位常量权重
- ALU: 支持 HardSigmoid 和 HardSwish
- ALU: 支持 DepthWiseConv + LeakyReLU
- ALU: 解锁了并行配置
- ALU: 始终启用 AveragePool
- ALU: 始终启用 DepthWiseConv
- ALU: 始终启用 Elew-Multiply
- 优化了资源和时序
V3.4 更新日志:
- 更新了 IP 名称.
- 更新了中断连接.
V3.3 更新日志:
- 支持 4 到 8 的卷积步长范围.
- 支持 Pool MaxReduce.
- 支持 Elew Multiply.
V3.2 更新日志:
- 更新了 IP 名称.
- 支持 Bias-right-shift.
- 支持最多 4 核 DPU
V3.1 更新日志:
- Vivado DPU TRD 的第一个版本.
2 概述
本教程包含以下信息:
- 如何设置 ZCU102 评估板并运行 TRD.
- 如何更改 DPU 的配置.
3 软件工具和系统要求
3.1 硬件
必需:
-
ZCU102 评估板
-
Micro-USB 电缆,连接到笔记本电脑或台式机用于终端仿真器
-
SD 卡
3.2 软件
必需:
- Vivado 2022.1 Vivado 设计工具
- Petalinux 2022.1 嵌入式设计工具
- Vitis AI 用于运行 Resnet50 之外的模型, 可选
4 设计文件
设计组件
顶层目录结构显示了主要的设计组件。TRD 目录提供了基本的 README 和法律声明文件。
├── app
│ └── dpu_sw_optimize.tar.gz
├── dpu_ip
│ ├── DPUCZDX8G_v4_0_0
│ └── Vitis
└── prj
└── Vivado
├── constrs
├── doc
├── scripts
│ ├── base
│ └── trd_prj.tcl
└── xilinx_zcu102_bsp
5 教程
5.1 开发板设置
必需:
-
将电源连接到 12V 电源连接器。
-
将 micro-USB 电缆连接到 USB-UART 连接器,使用以下设置用于终端仿真器:
- 波特率:115200
- 数据:8 位
- 奇偶校验:无
- 停止:1 位
- 流量控制:无
-
插入 SD 卡 (FAT 格式)。
跳线和开关:
- 将启动模式设置为 SD 卡:
- Rev 1.0:SW6[4:1] - OFF,OFF,OFF,ON
- Rev D2:SW6[4:1] - ON,OFF,ON,OFF
5.2 构建和运行 TRD 流程
以下教程假定 $TRD_HOME 环境变量已设置为如下所示。
%export TRD_HOME=<Vitis AI 路径>/DPU_TRD
**注意:**建议按顺序执行构建步骤。
5.2.1 构建硬件设计
我们需要安装 Vivado 开发环境。
以下教程假定 Vivado 环境变量已设置为如下所示。
打开 Linux 终端。将 Linux 设置为 Bash 模式。
% source <Vivado 安装路径>/Vivado/2022.1/settings64.sh
DPU 的默认设置是 3 核 B4096,带有 RAM_USAGE_LOW、CHANNEL_AUGMENTATION_ENABLE、DWCV_ENABLE、POOL_AVG_ENABLE、RELU_LEAKYRELU_RELU6、Softmax。
修改 $TRD_HOME/prj/Vivado/scripts/trd_prj.tcl 文件可以更改默认设置。
构建硬件设计。
% cd $TRD_HOME/prj/Vivado
% vivado -source scripts/trd_prj.tcl
执行脚本后,Vivado IPI 模块设计将会出现,如下图所示。
- 单击“Generate Bitstream”。
**注意:**如果用户收到任何带有“No implementation Results available”的弹出窗口。单击“Yes”。然后,如果出现任何带有“Launch runs”的弹出窗口,单击“OK”。
完成生成比特流后。
-
转到 File > Export > Export Hardware
-
在“导出硬件”窗口中,选择“Include bitstream”,然后单击“OK”。
XSA 文件在 $TRD_HOME/prj/Vivado/prj/top_wrapper.xsa 创建。
**注意:**实际结果在图形上可能与显示的图像有所不同。
5.2.2 获取 Json 文件
Json 文件是 VAI 编译器所需的重要文件。该文件在 Vivado 工具编译时创建。它与 VAI 编译器协同工作,以支持各种 DPU 配置下的模型编译。
用户可以在以下路径中获取 arch.json 文件。
$TRD_HOME/prj/Vivado/srcs/top/ip/top_DPUCZDX8G_0/arch.json
5.2.3 DPU PetaLinux BSP
本教程介绍如何使用 PetaLinux 构建工具构建 Linux 镜像和启动镜像。
PetaLinux 工作环境设置:有关安装信息,请参阅 PetaLinux 工具文档 (UG1144)。
对于 Bash 作为用户登录 shell:
$ source <已安装的 PetaLinux 的路径>/settings.sh
对于 C shell 作为用户登录 shell:
$ source <已安装的 PetaLinux 的路径>/settings.csh
验证是否已设置工作环境:
$ echo $PETALINUX
配置并构建 PetaLinux 项目
对于用户定义的设计:
$ cd $TRD_HOME/prj/Vivado/xilinx_zcu102_bsp
$ petalinux-config --get-hw-description=$TRD_HOME/prj/Vivado/prj/ --silentconfig
$ petalinux-build
对于预构建的设计:
$ cd $TRD_HOME/prj/Vivado/xilinx_zcu102_bsp
$ petalinux-build
创建一个启动镜像 (BOOT.BIN),包括 FSBL、ATF、比特流和 u-boot。
$ cd images/linux
$ petalinux-package --boot --fsbl zynqmp_fsbl.elf --u-boot u-boot.elf --pmufw pmufw.elf --fpga system.bit --force
生成用于 SD 卡的 WIC 镜像
$ petalinux-package --wic --bootfile "BOOT.BIN boot.scr Image system.dtb" --wic-extra-args "-c gzip"
所有相关文件已打包在 $TRD_HOME/prj/ivado/xilinx_zcu102_bsp/images/linux/petalinux-sdimage.wic.gz 中。请使用 Ether 刷写 SD 卡。有关详细信息,请参阅 UG1414 中的“将操作系统镜像刷写到 SD 卡”。
5.2.4 运行 Resnet50 示例
TRD 项目已在 $TRD_HOME/app 路径中生成与默认设置匹配的模型文件。如果用户更改了 DPU 设置。则需要重新创建模型。
本部分介绍如何从源代码运行 Resnet50 示例。
在 RootFs 分区中执行以下命令:
root@xilinx-zcu102-trd:~# cd app/
root@xilinx-zcu102-trd:~/app# cp model/resnet50.xmodel .
root@xilinx-zcu102-trd:~/app# env LD_LIBRARY_PATH=samples/lib samples/bin/resnet50 img/bellpeppe-994958.JPEG
score[945] = 0.992235 text: bell pepper,
score[941] = 0.00315807 text: acorn squash,
score[943] = 0.00191546 text: cucumber, cuke,
score[939] = 0.000904801 text: zucchini, courgette,
score[949] = 0.00054879 text: strawberry,
root@xilinx-zcu102-trd:~/app#
**注意:**如果要运行其他网络。请参阅 Vitis AI Github。
5.3 配置 DPU
DPU IP 提供了一些用户可配置的参数,以优化资源利用率并自定义不同的功能。可以根据可用可编程逻辑资源的数量选择不同的配置用于 DSP 切片、LUT、块 RAM (BRAM) 和 UltraRAM 利用率。还有用于添加功能的选项,例如通道增强、平均池化、深度卷积。
TRD 还支持 softmax 功能。
有关 DPU 的更多详细信息,请阅读 DPU IP 产品指南。
5.3.1 修改频率
DPU_CLK_MHz
修改 scripts/trd_prj.tcl 以修改 Data Controller Clock 的频率。Computation Clock 的频率是 Data Controller Clock 的两倍。
dict set dict_prj dict_param DPU_CLK_MHz {325}
有关详细信息,请参阅 PG338 第 4 章 DPU 配置中的 Data Controller Clock 和 Computation Clock 的 Clocking。
REG_CLK_MHz
修改 scripts/trd_prj.tcl 以修改 Register Clock 的频率
dict set dict_prj dict_param REG_CLK_MHz {100}
有关详细信息,请参阅 PG338 第 4 章 DPU 配置中的 Register Clock 的 Clocking。
5.3.2 修改参数
修改 scripts/trd_prj.tcl 以修改也可以在 GUI 上修改的参数。
TRD 支持修改以下参数。
- DPU_NUM
- DPU_ARCH
- DPU_RAM_USAGE
- DPU_CHN_AUG_ENA
- DPU_CONV_RELU_TYPE
- DPU_ALU_PARALLEL_USER
- DPU_ALU_LEAKYRELU
- DPU_SFM_NUM
- DPU_DSP48_USAGE
- DPU_URAM_PER_DPU
如果修改了以下参数之一,则需要重新编译相应的模型。
- DPU_ARCH
- DPU_RAM_USAGE
- DPU_CHN_AUG_ENA
- DPU_CONV_RELU_TYPE
- DPU_ALU_PARALLEL_USER
- DPU_ALU_LEAKYRELU
DPU_NUM
DPUCZDX8G 核心的数量:一个 DPUCZDX8G IP 中最多可以选择四个核心。
可以选择 1-4,默认设置为 3。
dict set dict_prj dict_param DPU_NUM {3}
有关详细信息,请参阅 PG338 第 4 章 DPU 配置中的 Configuration Options 的 Number of DPUCZDX8G Cores。
注意: DPU 需要大量的 LUT 和 RAM。使用 3 个或更多 DPU 可能会导致资源和时序问题。
DPU_ARCH
DPUCZDX8G 的架构:DPUCZDX8G IP 可以配置有各种卷积架构,这些架构与卷积单元的并行性相关。
DPUCZDX8G IP 的架构包括 B512、B800、B1024、B1152、B1600、B2304、B3136 和 B4096。
可以选择 512/800/1024/1152/1600/2304/3136/4096。
dict set dict_prj dict_param DPU_ARCH {4096}
有关详细信息,请参阅 PG338 第 4 章 DPU 配置中的 Configuration Options 的 Architecture of the DPUCZDX8G。
**注意:**它与模型有关。如果更改,必须更新模型。
DPU_RAM_USAGE
RAM 使用率:该选项确定 DPU 上的 RAM 使用率是否高。
低
dict set dict_prj dict_param DPU_RAM_USAGE {low}
高
dict set dict_prj dict_param DPU_RAM_USAGE {high}
有关详细信息,请参阅 PG338 第 4 章 DPU 配置中的 Configuration Options 的 RAM Usage。
DPU_CHN_AUG_ENA
通道增强:该选项确定是否在 DPU 上执行通道增强操作。
启用
dict set dict_prj dict_param DPU_CHN_AUG_ENA {1}
禁用
dict set dict_prj dict_param DPU_CHN_AUG_ENA {0}
有关详细信息,请参阅 PG338 第 4 章 DPU 配置中的 Configuration Options 的 Channel Augmentation。
**注意:**它与模型有关。如果更改,必须更新模型。
DPU_CONV_RELU_TYPE
Conv ReLU 类型:该选项确定 DPU 中可以使用哪种 ReLU 函数。默认情况下支持 ReLU 和 ReLU6。
RELU_RELU6
dict set dict_prj dict_param DPU_CONV_RELU_TYPE {2}
RELU_LEAKRELU_RELU6
dict set dict_prj dict_param DPU_CONV_RELU_TYPE {3}
有关详细信息,请参阅 PG338 第 4 章 DPU 配置中的 Configuration Options 的 ReLU Type。
**注意:**它与模型有关。如果更改,必须更新模型。
DPU_ALU_PARALLEL_USER
ALU 并行性:深度卷积由 ALU 引擎执行,以及池化。ALU 并行性范围从 1 到 PP,建议设置为 PP/2。
有关详细信息,请参阅 PG338 第 4 章 DPU 配置中的 Configuration Options 的 DepthwiseConv (ALU)。
**注意:**它与模型有关。如果更改,必须更新模型。
DPU_ALU_LEAKYRELU
ALU LeakReLU:该选项确定是否由 ALU 引擎执行 LeakReLU。
启用
dict set dict_prj dict_param DPU_ALU_LEAKYRELU {1}
禁用
dict set dict_prj dict_param DPU_ALU_LEAKYRELU {0}
有关详细信息,请参阅 PG338 第 4 章 DPU 配置中的 Configuration Options 的 ReLU Type。
**注意:**它与模型有关。如果更改,必须更新模型。
DPU_SFM_NUM
Softmax:此选项允许在硬件中实现 softmax 函数。
仅使用 DPU
dict set dict_prj dict_param DPU_SFM_NUM {0}
使用 DPU 和 Softmax
dict set dict_prj dict_param DPU_SFM_NUM {1}
有关详细信息,请参阅 PG338 第 4 章 DPU 配置中的 Configuration Options 的 Softmax。
DPU_SAXICLK_INDPD
有关详细信息,请参阅 PG338 第 4 章 DPU 配置中 Advanced Tab 的 S-AXI Clock Mode。
DPU_CLK_GATING_ENA
有关详细信息,请参阅 PG338 第 4 章 DPU 配置中 Advanced Tab 的 dpu_2x Clock Gating。
DPU_DSP48_MAX_CASC_LEN
有关详细信息,请参阅 PG338 第 4 章 DPU 配置中 Advanced Tab 的 DSP Cascade。
DPU_DSP48_USAGE
DSP 使用率:这允许您选择是否将 DSP48E 切片用于 DPU 卷积模块中的累加。
高
dict set dict_prj dict_param DPU_DSP48_USAGE {high}
低
dict set dict_prj dict_param DPU_DSP48_USAGE {low}
有关详细信息,请参阅 PG338 第 4 章 DPU 配置中 Advanced Tab 的 DSP Usage。
DPU_URAM_PER_DPU
有关详细信息,请参阅 PG338 第 4 章 DPU 配置中 Advanced Tab 的 UltraRAM。
6 运行 Vitis AI 库
有关 Vitis AI 库的介绍,请参阅此页面 Vitis AI 库 的 Quick Start For Edge。
7 已知问题
- DDR QOS
当 AXI HP0 端口连接到 DPU 并使用 DisplayPort 显示时,如果未修改 QoS 设置,DisplayPort 传输可能会欠载运行,从而在 DPU 运行时断断续续地产生黑帧或屏幕闪烁。除了 QoS 设置外,增加连接 DPU 的 AXI FIFO 接口 S_AXI_HPC{0, 1}_FPD 或 S_AXI_HP{0:3}_FPD 或 S_AXI_LPD 的读写发出能力(未完成的命令)可能会使端口始终忙于队列中的某些请求,这可以大大提高 DPU 性能。解决方案
解决方案
用户可以在目标板上执行 zynqmp_dpu_optimize.sh 以解决此问题。
将 $TRD_HOME/app/dpu_sw_optimize.tar.gz 复制到目标板,在 Linux 启动后,运行:
% tar -zxvf dpu_sw_optimize.tar.gz
% ./dpu_sw_optimize/zynqmp/zynqmp_dpu_optimize.sh
(有关更多信息,请参阅 dpu_sw_optimize/zynqmp/README.md)
Copyright© 2022 Xilinx