跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Vitis AI 在 ZCU102 上的推理部署实录

Vitis AI 适合把量化后的深度学习模型部署到 FPGA 上做边缘推理,重点在于低功耗和低时延。文章梳理了从模型导出、INT8 量化、DPU 编译到 ZCU102 板端运行的完整流程,并解释了 DPU 的定位、常见型号和资源特征。实践里最容易出问题的是校准集、动态 shape 和不受支持的算子;优化上则更适合选轻量模型、把预处理放在 PS 端、必要时用多 DPU 并行。整体上,这条链路不是最通用,但在摄像头、人脸识别这类场景里很实用。

山野诗人发布于 2026/6/300 浏览

从模型到硬件:Vitis AI 的部署路径

在边缘计算里,推理通常不是算力不够,而是功耗、时延和板卡成本一起卡住了。训练好的 PyTorch 模型跑在嵌入式 CPU 上,300ms 级别的延迟很常见;换到 FPGA + Vitis AI 之后,单帧做到十几毫秒,系统功耗也能压下来。这个方向之所以成立,不是因为 FPGA'更强',而是它更适合固定图结构、重复计算多的推理任务。

为什么很多场景会选 FPGA

如果只看训练,GPU 还是首选;但到了推理,尤其是边缘侧,事情就变了。

FPGA 的优势主要落在三件事上:功耗低、数据流可定制、硬件资源能围着模型去排布。Jetson 这类方案当然也能跑,开发体验还更顺手,但在对功耗特别敏感的场景里,FPGA 往往更稳。DPU(Deep Learning Processing Unit)就是 Vitis AI 里干这件事的核心:它不是通用处理器,而是专门给 CNN 前向推理准备的协处理器。

典型的收益可以理解成这样:ResNet-50 在 ARM A53 上跑到 300ms 左右,经 DPU 加速后降到 15ms 以下,这种差距对摄像头、检测器、门禁终端这类设备很关键。

Vitis AI 的工作方式

Vitis AI 本质上是一套软硬协同工具链,目标是把量化后的模型编译成 DPU 能直接执行的形式。它的层次比较清楚:应用层通过 Python/C++ API 调用运行时,VART 负责任务调度和数据搬运,编译层把模型转成 DPU 认识的指令,量化层负责把 FP32 压到 INT8,最底下是 DPU IP 和 FPGA 逻辑。

工作流程通常是四步:先把训练好的模型导出成 .onnx 或 .pb,再做 INT8 量化,接着编译成 .xmodel,最后在板端加载模型执行推理。名字听起来像'一键部署',但真正省事的地方其实在后两步,前面的导出和量化还是要老老实实处理好。

DPU 是什么

可以把 DPU 理解成'给卷积网络准备的专用 CPU',但它比这个说法更偏硬件一些。卷积、激活、池化这类操作都做了针对性优化,BatchNorm 也会尽量融合进卷积里,减少不必要的数据搬运。

[控制器] ← 解析 DPU 指令 ↓ [卷积引擎] ← 并行 MAC 阵列(如 1024 MACs/cycle) ↓ [激活单元] ← 支持常见非线性函数 ↑↓ [片上缓存] ← ~4MB BRAM,减少 DDR 访问 ↑ [AXI DMA] ← 数据搬移通道 

常见的 DPU 型号里,Zynq UltraScale+ MPSoC 上用得最多的是 DPUCZDX8G,Alveo 上是 DPUCAHX8H,Versal 上则是 DPUCVDX8G。不同平台的差异主要在资源和吞吐,不是接口名字多漂亮。

以 DPUCZDX8G 为例,它的峰值算力大约是 1024 MACs/cycle,默认推荐 INT8,输入尺寸上限是 4096×4096,片上缓存约 4MB,功耗一般在 1–5W 之间。这个配置很适合无风扇设备,也解释了为什么很多边缘项目会先看它。

开发环境怎么搭

我更倾向于直接用官方 Docker 镜像,少折腾宿主机环境。量化和编译阶段的依赖比较杂,容器化能省掉一堆版本冲突。

# 拉取最新镜像(支持 GPU 加速量化)
docker pull xilinx/vitis-ai:latest

# 启动容器(启用 GPU、GUI 支持)
docker run -it --gpus all \
--device-cgroup-rule='c 189:* rmw' \
-v /tmp/X11-unix:/tmp/X11-unix \
-e DISPLAY=$DISPLAY \
--shm-size=8g --ulimit memlock=-1 --ulimit stack=67108864 \
--name vitis-ai-dev \
xilinx/vitis-ai

进容器后,按框架切换环境即可:

# 如果用 TensorFlow
conda activate vitis-ai-tensorflow
# 如果用 PyTorch
conda activate vitis-ai-pytorch

量化:从 FP32 到 INT8

Vitis AI 提供 QAT 和 PTQ 两条路。大多数工程里先走 PTQ,更快,也更符合'先把系统跑通'的现实节奏。QAT 适合对精度特别敏感的模型,但代价是训练链路更重。

下面这段代码先把 PyTorch 模型导出成 ONNX:

import torch
from torchvision.models import resnet50

# 加载模型
model = resnet50(pretrained=False)
model.load_state_dict(torch.load("resnet50.pth"))
model.eval()

# 导出为 ONNX
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(
    model, dummy_input, "resnet50.onnx",
    input_names=["input"], output_names=["output"], opset_version=11
)

量化命令如下:

vai_q_onnx quantize \
--model resnet50.onnx \
--calibration_data calibration_dataset/ \
--quant_mode calib \
--deploy_model_dir quantized/

这里最容易踩坑的地方是校准集。太少,或者分布不对,量化后精度掉得会很明显。自定义 OP 也经常卡住流程,比如 ROIAlign 这类算子,通常要么替换,要么让它卸载到 CPU。还有一个老问题是动态 shape,ONNX 导出时如果没处理干净,后面编译经常直接失败。

编译:把模型变成 .xmodel

量化后的模型还不能直接给 DPU 跑,需要再过一遍编译器:

vai_c_xir \
--xmodel_file quantized/resnet50_int.xmodel \
--arch /opt/vitis_ai/compiler/arch/DPUCZDX8G/ZCU102.json \
--output_dir compiled/

ZCU102.json 里定义了 DPU 的硬件约束,比如 MAC 数量、输入尺寸限制等。编译成功后,compiled/ 目录里通常会有 deploy.model 和 compile_summary.html。后者我一般会顺手打开看一下,哪些层上了 DPU,哪些层被留在 CPU,报告里都写得很直白。

板端部署

如果目标板是 ZCU102,准备好 SD 卡镜像后,把 .xmodel、测试图片和推理脚本拷过去就能开始跑。这里没有什么魔法,真正要盯的是数据预处理和 runner 的调用方式。

import vitis_ai_library as vai
import numpy as np
from PIL import Image

# 初始化 runner
runner = vai.dpu_runner("resnet50.xmodel")

# 预处理函数
def preprocess(image_path):
    img = Image.open(image_path).resize((224, 224))
    rgb_np = np.array(img).astype(np.float32) / 255.0
    norm_np = (rgb_np - [0.485, 0.456, 0.406]) / [0.229, 0.224, 0.225]
    return np.expand_dims(norm_np, axis=0)

# 推理
input_data = preprocess("test.jpg")
outputs = runner.execute_async(input_data)
logits = outputs[0]

# 后处理
top_k = np.argsort(logits)[::-1][:5]
print("Top-5 predictions:", top_k)

几个比较实用的优化点

模型结构别选得太'学术'。MobileNetV2/V3、EfficientNet-Lite、YOLOv4-Tiny、ShuffleNet 这类更适合往 DPU 上塞;那种小卷积很多、shape 变化频繁、算子又不标准的网络,编译和部署都会更别扭。

如果板卡资源够,多实例化几个 DPU Core 也很实在。比如配置里写成:

"DPU_NUM": 2

这样可以把两路视频流并行起来,吞吐会更好看。不过这类优化前提是别把 PL 资源吃光,不然得不偿失。

预处理通常放在 PS 端更划算。缩放、归一化这类事没必要占 DPU 带宽,ARM 上用 OpenCV 处理就够了。最后,xbutil query 这类工具最好养成习惯性查看,温度、利用率、已加载模型数量都能直接看到。

xbutil query

一个智能摄像头场景

比较典型的例子是人脸识别摄像头:USB Camera 进来之后,先用 OpenCV 做人脸检测,再裁剪人脸区域,送到 DPU 上做 FaceNet 特征提取,最后用余弦相似度做比对,返回身份信息。链路不复杂,但每一段都得讲究时延,不然实时性就会掉下来。

方案推理延迟整机功耗是否实时
ARM CPU(ResNet-50)~300ms~5W❌
Jetson Nano~80ms~10W✅(勉强)
ZCU102 + DPU~12ms~2.5W✅✅✅

这套方案还有一个实际好处:.xmodel 可以远程更新,很多时候不需要重新烧录 FPGA bitstream,维护成本会低不少。

遇到问题时先看这几个点

Unsupported operator: ScatterND 这种报错,基本就是算子不在 DPU 支持范围里。处理思路通常是换实现,或者把这部分剥离出去交给 CPU。

量化后精度掉得太多,先别急着怀疑工具链,先看校准集、再看敏感层。vai_q_summary 这类工具能帮你定位问题层,必要时对关键层保留 FP32。

想确认某一层有没有上 DPU,就直接打开 compile_summary.html,搜 layer name,看 Offload 列是不是 Yes。这个比猜快得多。

运行时切换模型也是支持的,VART 可以动态加载多个 .xmodel。如果设备要同时干白天人脸、晚上行为识别,这种做法就比较顺手。

结尾

Vitis AI 把 FPGA 上做推理这件事拉回到了'工程可落地'的区间。它不是最通用的方案,也不是最省心的方案,但在功耗、时延和长期维护这几项同时受限的时候,确实有它的位置。模型量化、编译、板端部署这条链路一旦打通,后续换模型、调性能、做远程更新,都会比从头搭一套硬件友好得多。

目录

  1. 从模型到硬件:Vitis AI 的部署路径
  2. 为什么很多场景会选 FPGA
  3. Vitis AI 的工作方式
  4. DPU 是什么
  5. 开发环境怎么搭
  6. 拉取最新镜像(支持 GPU 加速量化)
  7. 启动容器(启用 GPU、GUI 支持)
  8. 如果用 TensorFlow
  9. 如果用 PyTorch
  10. 量化:从 FP32 到 INT8
  11. 加载模型
  12. 导出为 ONNX
  13. 编译:把模型变成 .xmodel
  14. 板端部署
  15. 初始化 runner
  16. 预处理函数
  17. 推理
  18. 后处理
  19. 几个比较实用的优化点
  20. 一个智能摄像头场景
  21. 遇到问题时先看这几个点
  22. 结尾
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 大模型上下文窗口 200k 到底是什么
  • 用 Rust 和 GLM-5 做一个流式翻译 CLI
  • Hunyuan-MT-7B-WEBUI 多语言翻译系统搭建与体验
  • Web25 中 php_mt_seed 的爆破思路
  • 8 个 AI 平台的速度和 Token 消耗实测
  • MySQL 8.0.41 安装、配置与入门操作
  • ControlNet-sd21 的入门与实战思路
  • 前缀和解子数组计数:和为 K 与可被 K 整除
  • HTML 入门:结构、常用标签与 HTML5 要点
  • 用 PyMobileDevice3 管理 iOS 设备
  • LeetCode 962 最大宽度坡的 C 语言做法
  • 用 Python 把 CSV 导入 Neo4j 的实操记录
  • VNCTF 2026 Web 题解整理
  • Qwen3 30B A3B Python Coder 使用笔记
  • Ubuntu 24.04 LTS 虚拟机安装与常用配置
  • 用 Python 把 CSV 导进 Neo4j
  • Windows 下升级 Python 3.12 与多版本管理
  • 用 AWS EC2 免费层搭建 ClawdBot 自托管助手
  • ROS 2 机器人集群分布式控制实践
  • 麒麟服务器 V10 上搭建 ARM64 Docker 环境

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online