DPU 架构扩展与 DPU-only 测评操作指南

ZCU104 DPU 架构扩展与 DPU-only 测评操作指南

1. 文档目的

这份文档面向普通用户,目标是教你如何基于现有 DPU-PYNQ 工程,为 ZCU104 扩展不同的 DPUCZDX8G 架构,并在板端做 DPU-only 推理测评。

本文默认你的目标不是运行时切换架构,而是:

  1. 在主机端修改 DPU 配置。
  2. 重新生成新的 bit/hwh/xclbin
  3. 使用匹配的新 arch.json 重新编译 xmodel
  4. 将新产物放到板子上。
  5. 用统一脚本测量纯 DPU 推理时延。

2. 先说清楚几个关键结论

2.1 你现在手里的 DPU IP 能不能继续用?

可以。

你本机已经有完整的 DPU IP 和 ZCU104 工程,不需要再去外部重新找一套新的 DPU 源码包。

关键路径如下:

2.2 改架构后,能不能不重新编译,直接生成新 bitstream?

不可以。

只要你修改了 DPU 架构参数,例如:

  • B4096 改成 B2304
  • 1 core 改成 2 cores
  • RAM_USAGE
  • CHANNEL_AUGMENTATION

就必须重新跑硬件构建流程。也就是说:

  • 需要重新综合
  • 需要重新实现
  • 需要重新链接
  • 最终重新生成新的 dpu.bit / dpu.hwh / dpu.xclbin

2.3 改了 DPU 架构后,旧 xmodel 还能继续用吗?

原则上不要继续用。

最稳妥的做法是:

  • 每个 DPU 变体使用自己的 arch.json
  • 每个 arch.json 对应重新编译一份 xmodel

即使只是改核数,也建议统一按"新硬件对应新 arch.json,再重编 xmodel"处理,避免模型和硬件不匹配。

3. DPU 架构有哪些

DPUCZDX8G 支持的卷积架构一共 8 种:

  • B512
  • B800
  • B1024
  • B1152
  • B1600
  • B2304
  • B3136
  • B4096

你本地仓库中也能看到这 8 档定义:

对于 ZCU104DPU-PYNQ 官方 README 中给出的已验证配置是:

  • B4096
  • 2 cores

参考:

4. 你现在已经有的基线

你已经确认并验证通过了一套官方 DPU-only 基线目录:

  • 板端目录:
    • /home/xilinx/dpu_arch_eval/zcu104_b4096_2core_official

其中包含:

  • dpu.bit
  • dpu.hwh
  • dpu.xclbin
  • ZCU104_CustomResNetDPUFixed.xmodel
  • test_dpu_only.py

这个目录现在可以作为后续所有 DPU 变体测试的参考模板。

5. 推荐的目录组织方式

5.1 主机端目录

建议每个变体在主机端保留独立目录,不要所有版本都混在 boards/zcu104 一个目录里。

推荐组织如下:

text 复制代码
E:\0Project\DPU-PYNQ\boards\
  zcu104_b4096_2core_official\
  zcu104_b4096_1core\
  zcu104_b2304_1core\
  zcu104_b1600_1core\
  zcu104_b1024_1core\

每个目录都保留自己的一套:

  • dpu_conf.vh
  • prj_config
  • platform.xsa
  • scripts/
  • 最终产物 dpu.bit / dpu.hwh / dpu.xclbin
  • 导出的 arch.json

5.2 板端目录

建议板端保持和主机端同名的变体目录:

text 复制代码
/home/xilinx/dpu_arch_eval/
  common/
    input_tensor.npy
    test_dpu_only.py

  zcu104_b4096_2core_official/
    dpu.bit
    dpu.hwh
    dpu.xclbin
    arch.json
    ZCU104_CustomResNetDPUFixed.xmodel
    results/

  zcu104_b2304_1core/
    ...

  zcu104_b1600_1core/
    ...

这种组织方式的优点是:

  • 每个变体自成一套,不会串文件。
  • bit/hwh/xclbin/arch.json/xmodel 能严格一一对应。
  • 后续做论文表格和实验复现更方便。

6. 推荐的扩展顺序

第一轮不要把所有变量一起扫完。

推荐先做:

  1. B4096_2core_official
    说明:你已经有了,可作为基线。
  2. B4096_1core
    说明:先拆出核数影响。
  3. B2304_1core
    说明:中高档。
  4. B1600_1core
    说明:中档。
  5. B1024_1core
    说明:较小档。

这样可以先回答最关键的问题:

  • 固定模型和输入时,T_DPU 如何随架构变化
  • 同一架构下,核数变化是否主要影响吞吐而非单次时延

7. 实际操作流程

下面以新增一个变体 zcu104_b2304_1core 为例。

步骤 1:复制一份新的 ZCU104 工程目录

不要直接在原始 boards/zcu104 上改。

推荐从当前 boards/zcu104 复制出一个新的变体目录:

powershell 复制代码
Copy-Item -Recurse E:\0Project\DPU-PYNQ\boards\zcu104 E:\0Project\DPU-PYNQ\boards\zcu104_b2304_1core

如果磁盘空间紧张,也可以复制最小必要文件,但对普通用户来说,直接整目录复制最不容易漏文件。

步骤 2:修改 DPU 架构配置

编辑新目录中的:

  • E:\0Project\DPU-PYNQ\boards\zcu104_b2304_1core\dpu_conf.vh

将:

verilog 复制代码
`define B4096

改为:

verilog 复制代码
`define B2304

对第一轮实验,建议保持以下项不变:

  • URAM_ENABLE
  • RAM_USAGE_LOW
  • CHANNEL_AUGMENTATION_ENABLE
  • DSP48_USAGE_HIGH

原因是你这轮的目标是比较架构本身,不要同时改太多开关。

步骤 3:选择核数模板

你当前 boards/zcu104/prj_config 已经被你改成了集成 hls_search 的版本,不适合直接拿来做 DPU-only

DPU-only 时,请从官方模板复制:

如果你要做 B2304_1core

  • prj_config_1dpu 覆盖新目录中的 prj_config

如果你要做 B4096_2core

  • prj_config_104_2dpu 覆盖新目录中的 prj_config

步骤 4:不要把 packaged_kernel_* 当主编辑入口

你可以参考:

但对普通用户来说,不建议直接修改这个目录后就开始构建。

更稳的做法是:

  • 修改变体目录里的 dpu_conf.vh
  • 修改变体目录里的 prj_config
  • 然后基于这个变体目录跑整套构建

原因是:

  • packaged_kernel_* 更像已经打包好的 DPU kernel 中间产物
  • boards/<variant> 才是更适合作为"项目入口"的目录

步骤 5:进入 Vivado / Vitis 构建环境

这一步必须要用 Vivado / Vitis。

推荐使用与你现有工程一致的版本线:

  • Vivado 2022.1
  • Vitis 2022.1
  • XRT

如果你用的是 Linux shell,官方写法是:

bash 复制代码
source <vitis-install-path>/Vitis/2022.1/settings64.sh
source <xrt-install-path>/xilinx/xrt/setup.sh

如果你用的是 Windows,本质上也是一样,只是通常是在:

  • AMD 提供的 Vitis 2022.1 命令行环境里执行
  • 或你已经验证可用的本地构建命令窗口里执行

步骤 6:生成硬件产物

官方 DPU-PYNQ 的文档入口是:

官方推荐方式是:

bash 复制代码
make BOARD=<变体目录名>

例如:

bash 复制代码
make BOARD=zcu104_b2304_1core

如果你的本地工程已经不是走纯 make,而是走你现有的 Vivado + v++ 手动流程,也可以继续沿用。但最终必须拿到以下 3 个文件:

  1. dpu.bit
  2. dpu.hwh
  3. dpu.xclbin

这是硬件侧最小交付物。

步骤 7:导出并保存 arch.json

每个硬件变体都要留自己的 arch.json

常见来源包括:

  • 构建后生成的 DPU IP 目录
  • Vivado 工程中对应的 DPU 实例目录

你本地已经看到过类似路径:

建议把该变体对应的 arch.json 复制到变体目录根部,和 dpu.bit 放在一起:

text 复制代码
E:\0Project\DPU-PYNQ\boards\zcu104_b2304_1core\
  dpu.bit
  dpu.hwh
  dpu.xclbin
  arch.json

步骤 8:重新编译匹配的 xmodel

这一步通常在 Linux 或 Vitis AI Docker/VM 中完成。

不要把旧变体的 xmodel 直接拿来复用。

你本地 DPU-PYNQ 里已有一个辅助脚本:

它的默认逻辑也说明了一个事实:

  • 编译时必须指定目标 arch.json

如果你是 model zoo 模型,可以用它。

如果你是自己的前端模型,核心原则一样:

  • 用新变体的 arch.json
  • 重新编译得到新 xmodel

常见命令形式如下:

bash 复制代码
vai_c_xir --xmodel <量化后的输入模型> \
          --arch <新变体的 arch.json> \
          --output_dir <输出目录> \
          --net_name <模型名>

步骤 9:把新变体上传到板子

板端建议新建对应目录,例如:

text 复制代码
/home/xilinx/dpu_arch_eval/zcu104_b2304_1core/

上传以下文件:

  • dpu.bit
  • dpu.hwh
  • dpu.xclbin
  • arch.json
  • 对应新变体编译的 xmodel
  • test_dpu_only.py

步骤 10:在板上做 DPU-only 测试

你已经有一份可用的 DPU-only 测试脚本样例:

  • 板端示例:
    • /home/xilinx/dpu_arch_eval/zcu104_b4096_2core_official/test_dpu_only.py
  • 本地样例:

运行时注意两点:

  1. 要使用 PYNQ venv
  2. 要用 sudo,因为下载 overlay 到 PL 需要 root

板端运行命令示例:

bash 复制代码
cd /home/xilinx/dpu_arch_eval/zcu104_b2304_1core
echo xilinx | sudo -S env XILINX_XRT=/usr /usr/local/share/pynq-venv/bin/python test_dpu_only.py

建议每个变体记录以下结果:

  • overlay_load_ms
  • model_load_ms
  • input_shape
  • output_shape
  • latency_mean_ms
  • latency_median_ms
  • latency_stdev_ms

8. 哪些改动必须重编 xmodel

以下改动,统一按"必须重编 xmodel"处理:

  • B512/B800/.../B4096
  • DPU core count
  • RAM_USAGE
  • CHANNEL_AUGMENTATION
  • ALU_PARALLEL
  • CONV/ALU RELU 类型

以下改动通常更偏硬件资源/实现层,但为了避免混淆,建议也把它们记录到变体信息里:

  • URAM_ENABLE / URAM_DISABLE
  • DRAM_ENABLE / DRAM_DISABLE
  • DSP48_USAGE
  • LOWPOWER

9. 普通用户最容易踩的坑

9.1 直接改 boards/zcu104

不建议。

原因是你后面会很快分不清:

  • 哪个版本是 DPU-only
  • 哪个版本是 DPU+KNN 集成
  • 哪个版本是 B4096
  • 哪个版本是 B2304

9.2 拿错 prj_config

这是目前最危险的坑之一。

你当前 boards/zcu104/prj_config 已经被改成了带 hls_search 的版本。

如果你要做 DPU-only,不要直接拿它用。

9.3 旧 xmodel 直接复用

不要这样做。

最稳的规则是:

  • 新硬件变体
  • arch.json
  • xmodel

9.4 只保留 bit,不保留 arch.json

这会让后面模型编译和实验复现非常被动。

建议每个变体目录必须同时保留:

  • bit
  • hwh
  • xclbin
  • arch.json
  • xmodel

10. 给你的实际建议

如果你现在就要开始扩展,不要一次做 8 个。

第一批建议只做:

  1. zcu104_b4096_2core_official
  2. zcu104_b4096_1core
  3. zcu104_b2304_1core
  4. zcu104_b1600_1core
  5. zcu104_b1024_1core

这样工作量可控,而且已经足够支撑:

  • 前端 T_DPU 对比
  • 不同架构下的时延差异
  • 后续论文里的资源与性能分析

11. 参考资料

相关推荐
SmartBrain4 小时前
基于 Spring AI + Skill 工程 + MCP 技术方案研究
人工智能·spring·架构·aigc
亚马逊云开发者5 小时前
【Bedrock AgentCore】AI Agent 回答不一致怎么办?双 Memory 架构实现服务标准化(附完整代码)
大数据·人工智能·架构
拾薪6 小时前
[SuperPower] Brainingstorm - 流程控制架构分析
网络·人工智能·ai·架构·superpower·brainstorming
黄俊懿7 小时前
【架构师从入门到进阶】第五章:DNS&CDN&网关优化思路——第一节:DNS优化
网络·计算机网络·架构·系统架构·cdn·dns·架构设计
eSsO KERF8 小时前
湖仓一体架构解析:数仓架构选择(第48天)
架构
程序员小胖胖10 小时前
来聊聊我为什么放弃了三层架构
架构
Jiude11 小时前
当给飞书里的 OpenClaw 机器人发一条消息后,到底发生了什么?
架构
淡定o12 小时前
Redis List 换成 Streams,以为能睡安稳觉了——结果消息还是在丢
架构
沛沛rh4512 小时前
用 Rust 实现用户态调试器:mini-debugger项目原理剖析与工程复盘
开发语言·c++·后端·架构·rust·系统架构