【Vitis AI】Zynq UltraScale+ MPSoC DPU TRD 流程 Vivado 2022.1

#【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 软件

必需:


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 ClockComputation ClockClocking

REG_CLK_MHz

修改 scripts/trd_prj.tcl 以修改 Register Clock 的频率

dict set dict_prj dict_param  REG_CLK_MHz {100}

有关详细信息,请参阅 PG338 第 4 章 DPU 配置中的 Register ClockClocking

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 OptionsNumber 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 OptionsArchitecture 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 OptionsRAM 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 OptionsChannel 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 OptionsReLU Type

**注意:**它与模型有关。如果更改,必须更新模型。
DPU_ALU_PARALLEL_USER

ALU 并行性:深度卷积由 ALU 引擎执行,以及池化。ALU 并行性范围从 1 到 PP,建议设置为 PP/2。

有关详细信息,请参阅 PG338 第 4 章 DPU 配置中的 Configuration OptionsDepthwiseConv (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 OptionsReLU 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 OptionsSoftmax

DPU_SAXICLK_INDPD

有关详细信息,请参阅 PG338 第 4 章 DPU 配置中 Advanced TabS-AXI Clock Mode

DPU_CLK_GATING_ENA

有关详细信息,请参阅 PG338 第 4 章 DPU 配置中 Advanced Tabdpu_2x Clock Gating

DPU_DSP48_MAX_CASC_LEN

有关详细信息,请参阅 PG338 第 4 章 DPU 配置中 Advanced TabDSP 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 TabDSP Usage

DPU_URAM_PER_DPU

有关详细信息,请参阅 PG338 第 4 章 DPU 配置中 Advanced TabUltraRAM

6 运行 Vitis AI 库

有关 Vitis AI 库的介绍,请参阅此页面 Vitis AI 库Quick Start For Edge

7 已知问题

  1. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值