Vitis-AI集成
Vitis-AI是Xilinx的开发堆栈,用于在Xilinx平台(包括边端设备和Alveo卡)上进行硬件加速的AI推理。它由优化的IP,工具,库,模型和示例设计组成。设计时考虑到了高效率和易用性,充分发挥了Xilinx FPGA和ACAP上AI加速的全部潜力。
TVM内部当前的Vitis-AI Byoc流可加速边端和云端的神经网络模型推理。支持的边端和云端深度学习处理器单元(DPU)的算子分别是DPUCZDX8G和DPUCADX8G。DPUCZDX8G和DPUCADX8G是 分别 在Xilinx Zynq Ultrascale + MPSoc Alveo (U200 / U250)平台上用于卷积神经网络(CNN)的硬件加速器。有关DPU算子的更多信息,参见DPU命名信息部分。
会找到有关如何 使用Vitis-AI构建TVM以及如何开始使用示例的信息。
DPU命名信息
DPU深度学习处理单元
应用C: CNN R: RNN
硬件平台AD: Alveo DDR AH: Alveo HBM VD: Versal DDR with AIE & PL ZD: Zynq DDR
量化方法X: DECENT I: Integer threshold F: Float threshold R: RNN
量化位宽4: 4-bit 8: 8-bit 16: 16-bit M: Mixed Precision
设计目标G: General purpose H: High throughput L: Low latency C: Cost optimized
Build instructions说明
本节列出了使用Vitis-AI针对云端和Edge端构建TVM的说明。
云端(DPUCADX8G)
对于Vitis-AI,必须在Xilinx Alveo平台之上构建TVM。
系统要求
下表列出了运行docker容器和Alveo卡的系统要求。

硬件设置和Docker构建
• Clone Vitis AI存储库:
• git clone --recurse-submodules https://github.com/Xilinx/Vitis-AI
• 安装Docker,将用户添加到Docker组。将用户链接到以下Docker网站上的Docker安装说明:
• https://docs.docker.com/install/linux/docker-ce/ubuntu/
• https://docs.docker.com/install/linux/docker-ce/centos/
• https://docs.docker.com/install/linux/linux-postinstall/
• 使用以下命令下载最新的Vitis AI Docker。该容器在CPU上运行。
• docker pull xilinx/vitis-ai:latest
为了加速量化,可以选择使用Vitis-AI GPU docker image映像。使用以下命令构建Vitis-AI GPU docker容器:
cd Vitis-AI/docker
./docker_build_gpu.sh
• 设置Vitis AI以定位Alveo卡。将带有Vitis AI的Alveo卡定位为机器学习工作负载,必须安装以下软件组件:
• Xilinx运行时(XRT)
• Alveo部署shell(DSA)
• Xilinx资源管理器(XRM)(xbutler)
• Xilinx Overlaybins(用于动态加载的加速器-二进制编程文件)
• Xilinx Runtime (XRT)
• Alveo Deployment Shells (DSAs)
• Xilinx Resource Manager (XRM) (xbutler)
• Xilinx Overlaybins (Accelerators to Dynamically Load - binary programming files)
可以单独安装所有这些软件组件,已提供了一个脚本来立即自动安装它们。为此:
• 运行以下命令:
• cd Vitis-AI/alveo/packages
• sudo su
• ./install.sh
• 重新启动系统。
• Clone tvm repo和pyxir repo
• git clone --recursive https://github.com/apache/tvm.git
• git clone --recursive https://github.com/Xilinx/pyxir.git
• 构建并启动tvm运行时Vitis-AI Docker容器。
• ./tvm/docker/build.sh demo_vitis_ai bash
• ./tvm/docker/bash.sh tvm.demo_vitis_ai

• #Setup inside container
• source /opt/xilinx/xrt/setup.sh
• . KaTeX parse error: Can't use function '\(' in math mode at position 250: …uild • echo set\̲(̲USE_LLVM ON\) >…(nproc)
• 安装TVM
• cd tvm/python
• pip3 install -e . --user
边端(DPUCZDX8G)
对于边端部署,使用主机和边端的两个系统。该主机系统在第一离线步长负责量化和神经网络模型的编辑。之后,该模型将在端系统上部署 。
主机要求
下表列出了运行TVM-Vitis-AI docker容器的系统要求。

主机设置和Docker构建
• Clone tvm repo
• git clone --recursive https://github.com/apache/tvm.git
• 构建并启动tvm运行时Vitis-AI Docker容器。
• cd tvm
• ./tvm/docker/build.sh demo_vitis_ai bash
• ./tvm/docker/bash.sh tvm.demo_vitis_ai

• #Setup inside container
• . KaTeX parse error: Can't use function '\(' in math mode at position 288: …uild • echo set\̲(̲USE_LLVM ON\) >…(nproc)
• 安装TVM
• cd tvm/python
• pip3 install -e . --user
边端要求
DPUCZDX8G可以部署在Zynq Ultrascale + MPSoc 平台上。可以直接使用以下开发板:

边端硬件设置
本节提供了使用Pynq平台进行设置的说明,也支持基于Petalinux的流程。
• 下载适用于目标的Pynq v2.5映像(根据板卡版本,将Z1或Z2用于Ultra96目标)链接至映像:https : //github.com/Xilinx/PYNQ/releases/tag/v2.5
• 遵循Pynq的说明来设置电路板:pynq设置
• 连接到开发板后,确保以root用户身份运行。执行 su
• 请按照以下步骤在Pynq上设置DPU:DPU Pynq setup
• 运行以下命令下载DPU比特流:
• python3 -c ‘from pynq_dpu import DpuOverlay ; overlay = DpuOverlay(“dpu.bit”)’
• 检查DPU内核是否处于活动状态:
• dexplorer -w
Edge TVM设置
当在Petalinux而不是Pynq上工作时,以下步骤可能需要更多的手动工作(例如,从源代码构建hdf5)。而且,TVM具有scipy依赖性,从源代码或规避的角度构建。在流程中不依赖scipy。
构建TVM取决于Xilinx PyXIR软件包。PyXIR充当TVM和Vitis-AI工具之间的接口。
• 首先安装PyXIR h5py和pydot依赖项:
• apt-get install libhdf5-dev
• pip3 install pydot h5py
• 安装PyXIR
• git clone --recursive https://github.com/Xilinx/pyxir.git
• cd pyxir
• sudo python3 setup.py install --use_vai_rt_dpuczdx8g
• 用Vitis-AI构建TVM
• git clone --recursive https://github.com/apache/tvm
• cd tvm
• mkdir build
• cp cmake/config.cmake build
• cd build
• echo set(USE_VITIS_AI ON) >> config.cmake
• cmake …
• make
• 安装TVM
• cd tvm/python
• pip3 install -e . --user
• 检查在Python Shell中安装是否成功:
• python3 -c ‘import pyxir; import tvm’
开始
本节说明如何将TVM与Vitis-AI一起使用。为此,要了解为定点算术中的Vitis-AI实现,对神经网络模型进行了量化。这里采用的方法是使用前N个输入on-the-fly动态量化,如下一节所述。
即时量化
通常,为了能够使用Vitis-AI DPU加速器加速神经网络模型的推理,这些模型需要预先量化。在TVM-Vitis-AI流程中,利用即时量化来删除此额外的预处理步骤。在此流程中,无需预先量化模型,可以使用典型的推理执行调用(module.run),使用提供的前N个输入来实时量化模型。将设置并校准Vitis-AI DPU,此后,将加快所有下一个输入的推理。注意,边端流与所说明的流略有不同,因为在前N个输入之后,推理不会加速,但是模型已经过量化和编译,可以移至边端设备进行部署。有关更多信息,请参见下面的边端使用说明。
配置/设置
可以使用几个环境变量来自定义Vitis-AI Byoc流。
Environment Variable:PX_QUANT_SIZE,PX_BUILD_DIR
Default if unset:128,Use the on-the-fly quantization flow
Explanation:The number of inputs that will be used for quantization (necessary for Vitis-AI acceleration),Loads the quantization and compilation information from the provided build directory and immediately starts Vitis-AI hardware acceleration. This configuration can be used if the model has been executed before using on-the-fly quantization during which the quantization and comilation information was cached in a build directory.
云端使用
本节介绍了如何在云端上使用Vitis-AI加速TVM中的卷积神经网络模型。
为了能够定位Vitis-AI云DPUCADX8G目标,首先必须将目标导入PyXIR。此PyXIR软件包是TVM用来与Vitis-AI堆栈集成的接口。另外,将典型的TVM和Relay模块以及Vitis-AI contrib模块导入TVM内。
import pyxir
import pyxir.contrib.target.DPUCADX8G
import tvm
import tvm.relay as relay
from tvm.contrib.target import vitis_ai
from tvm.contrib import util, graph_runtime
from tvm.relay.build_module import bind_params_by_name
from tvm.relay.op.contrib.vitis_ai import annotation
使用常用的Relay API导入卷积神经网络模型后,为给定的Vitis-AI DPU目标标记Relay表达式并划分图。
mod[“main”] = bind_params_by_name(mod[“main”], params)
mod = annotation(mod, params, target)
mod = relay.transform.MergeCompilerRegions()(mod)
mod = relay.transform.PartitionGraph()(mod)
现在,可以构建TVM运行时runtime库来执行模型。TVM目标为“ llvm”,因为DPU无法处理的算子在CPU上执行。Vitis-AI目标是DPUCADX8G,因为目标是云DPU,并且该目标作为配置传递给TVM构建调用。
tvm_target = ‘llvm’
target=‘DPUCADX8G’
with tvm.transform.PassContext(opt_level=3, config= {‘relay.ext.vitis_ai.options.target’: target}):
lib = relay.build(mod, tvm_target, params=params)
在用TVM中的Vitis-AI加速模型之前,又需要迈出一步,必须对模型进行量化和编译,以便在DPU上执行。为此,利用了即时量化。使用此方法,无需预先量化其模型,而可以使用典型的推理执行调用(module.run)使用提供的前N个输入来即时校准模型。在前N次迭代之后,将在DPU上加速计算。现在将N个输入馈入TVM运行时模块。注意,这些前N个输入将花费大量时间。
module = graph_runtime.GraphModule(lib"default")
# First N (default = 128) inputs are used for quantization calibration and will
# be executed on the CPU
# This config can be changed by setting the ‘PX_QUANT_SIZE’ (e.g. export PX_QUANT_SIZE=64)

for i in range(128):
module.set_input(input_name, inputs[i])
module.run()
之后,将在DPU上加速推理。
module.set_input(name, data)
module.run()
要保存和加载已构建的模块,可以使用典型的TVM API:
lib_path = “deploy_lib.so”
lib.export_library(lib_path)
从编译文件中加载模块并运行推理
# load the module into memory
loaded_lib = tvm.runtime.load_module(lib_path)
module = graph_runtime.GraphModule(lib"default")
module.set_input(name, data)
module.run()
边端使用
本节说明如何在边端以Vitis-AI加速TVM中的卷积神经网络模型。前几步将必须在主机上运行,并要进行量化和编译,以便在边端进行部署。
Host步骤
为了能够定位Vitis-AI云DPUCZDX8G目标,首先必须将目标导入PyXIR。此PyXIR软件包是TVM用来与Vitis-AI堆栈集成的接口。另外,将典型的TVM和Relay模块以及Vitis-AI contrib模块导入TVM内。
import pyxir
import pyxir.contrib.target.DPUCZDX8G
import tvm
import tvm.relay as relay
from tvm.contrib.target import vitis_ai
from tvm.contrib import util, graph_runtime
from tvm.relay.build_module import bind_params_by_name
from tvm.relay.op.contrib.vitis_ai import annotation
使用常用的Relay API导入卷积神经网络模型后,为给定的Vitis-AI DPU目标标注Relay表达式并划分图。
mod[“main”] = bind_params_by_name(mod[“main”], params)
mod = annotation(mod, params, target)
mod = relay.transform.MergeCompilerRegions()(mod)
mod = relay.transform.PartitionGraph()(mod)
现在,可以构建TVM运行时runtime库来执行模型。TVM目标为“ llvm”,因为DPU无法处理的操作在CPU上执行。此时,这意味着主机上的CPU。Vitis-AI目标是DPUCZDX8G-zcu104,因为目标是ZCU104板上的边端DPU,该目标作为配置传递给TVM构建调用。注意,可以为不同的目标传递不同的算子,请参阅边端目标信息。此外,提供了“ export_runtime_module”配置,该配置指向可以将Vitis-AI运行时runtime模块导出到的文件。这样做,因为在构建用于边端部署的模型之前,将首先在主机上编译和量化模型。稍后,导出的运行时runtime模块将传递到边端版本,以便可以包含Vitis-AI运行时runtime模块。
from tvm.contrib import util
temp = util.tempdir()
tvm_target = ‘llvm’
target=‘DPUCZDX8G-zcu104’
export_rt_mod_file = temp.relpath(“vitis_ai.rtmod”)
with tvm.transform.PassContext(opt_level=3, config= {‘relay.ext.vitis_ai.options.target’: target,
‘relay.ext.vitis_ai.options.export_runtime_module’: export_rt_mod_file}):
lib = relay.build(mod, tvm_target, params=params)
将使用主机上的实时量化对模型进行量化和编译,以便在DPU上执行。利用TVM推理调用(module.run)来量化具有前N个输入的主机上的模型。
module = graph_runtime.GraphModule(lib"default")
# First N (default = 128) inputs are used for quantization calibration and will
# be executed on the CPU
# This config can be changed by setting the ‘PX_QUANT_SIZE’ (e.g. export PX_QUANT_SIZE=64)

for i in range(128):
module.set_input(input_name, inputs[i])
module.run()
保存TVM lib模块,以便Vitis-AI运行时runtime模块也将被导出(到先前作为配置传递的“ export_runtime_module”路径)。
from tvm.contrib import util
temp = util.tempdir()
lib.export_library(temp.relpath(“tvm_lib.so”))
在使用前N个输入对Vitis-AI加速模型进行量化和编译之后,可以构建模型以在ARM边端设备上执行。在这里,传递了以前导出的Vitis-AI运行时模块,因此可以将其包含在TVM版本中。
# Export lib for aarch64 target
tvm_target = tvm.target.arm_cpu(‘ultra96’)
lib_kwargs = {
‘fcompile’: contrib.cc.create_shared,
‘cc’: “/usr/aarch64-linux-gnu/bin/ld”
}
with tvm.transform.PassContext(opt_level=3,
config={‘relay.ext.vitis_ai.options.load_runtime_module’: export_rt_mod_file}):
lib_arm = relay.build(mod, tvm_target, params=params)
lib_dpuv2.export_library(‘tvm_dpu_arm.so’, **lib_kwargs)
现在,将TVM构建文件(tvm_dpu_arm.json,tvm_dpu_arm.so,tvm_dpu_arm.params)移动到边端设备。有关设置边端设备的信息,请查看边端设置 部分。
边端步长
在边端设备上使用Vitis-AI设置TVM之后,可以将TVM运行时模块加载到内存中,并提供输入以进行推理。
ctx = tvm.cpu()
# load the module into memory

lib = tvm.runtime.load_module(“tvm_dpu_arm.so”)
module = graph_runtime.GraphModule(lib"default")
module.set_input(name, data)
module.run()
https://tvm.apache.org/docs/deploy/vitis_ai.html

Vitis-AI集成相关推荐

  1. 干货! AI 推断解决方案栈 Vitis AI 全流程独家解析

    2019年,擅长FPGA赛道的赛灵思发布了Vitis统一软件平台,旨在为不熟悉硬件编程与FPGA开发的软件开发人员提供便利.其中的Vitis AI开发环境,一经发布就备受AI开发者关注. 在赛灵思的定 ...

  2. 基于ZCU106平台部署Vitis AI 1.2/2.5开发套件【Vivado+Vitis+Petalinux2020/2022】

    Vitis AI是 Xilinx 的开发平台,适用于在 Xilinx 硬件平台(包括边缘设备和 Alveo 卡)上进行人工智能算法推理部署.它由优化的IP.工具.库.模型和示例设计组成.Vitis A ...

  3. 继AutoML后,第四范式发布软硬一体化AI集成系统SageOne

    作者 | 夕颜 出品 | AI科技大本营(ID:rgznai100) 6 月 20 日,AI产品和服务提供商第四范式宣布发布最新 AI 系列产品SageOne Appliance软硬一体化AI集成系统 ...

  4. 硬件厂商纷纷“变软”:FPGA行业巨头Xilinx推出Vitis AI平台,并在GitHub上开源

    晓查 发自 盘古大观 量子位 报道 | 公众号 QbitAI 今天,FPGA芯片厂商赛灵思(Xilinx)在北京发布了Vitis统一软件平台,支持赛灵思多种可编程逻辑器件(如FPGA.ACAP.MPS ...

  5. Vitis AI(01) Overview

    研究Vitis AI好几个月了,终于实现了在VitisAI平台上部署神经网络模型并成功运行的目标,搞清楚了在整个全流程中如何做自定义,这里的自定义主要包括以下几个方面 硬件平台自定义:这里的硬件平台指 ...

  6. 聊聊国外医学影像AI集成平台(上)

    欢迎扫码关注微信公众号<医影杂记> 医学影像AI是利用人工智能技术对医学影像进行自动处理和分析,例如,自动发现病灶,或自动对疾病进行分类和评级.影像AI好比是影像医生的智能助手,能够让医生 ...

  7. 在Vitis中编译Vitis AI Library应用

    如何将Vitis AI Library应用加入Vitis进行编译,生成可执行文件? Vitis AI Library应用编译 在不使用vitis的情况下,vitis ai library编译方法如下: ...

  8. Appian宣布将Google AI 集成到RPA中

    https://www.toutiao.com/a6695930020184982024/ 在上周圣地亚哥举行的Appian World活动上,首席执行官Calkins表示:"Appian已 ...

  9. 专访厦门第二医院影像科主任郭岗:基于 IBM 推出的 AI 集成解决方案,如何给医生减负增效?...

    7月20日,国务院发布关于人工智能的发展规划,其中就要求发展"智能医疗".理想中的智慧医疗场景是:病人进入医院,在大厅里可以通过机器人来咨询要挂哪个科:医生在跟病人的问诊过程中,系 ...

  10. 场景化封装,一站式使用,普惠AI集成 ——阿里云发布智能媒体管理产品

    摘要: 导语 近日,阿里云发布了智能媒体管理(Intelligent Media Management)服务, 通过离线处理能力关联授权的云存储,提供便捷的海量多媒体数据一键分析,并通过该分析过程构建 ...

最新文章

  1. LLDB命令查看内存的分配历史
  2. Docker 容器技术 — 容器网络
  3. 如何学习Flex Framework
  4. Windows平台WebRTC编译-VS2017
  5. [技术回顾系列]--认识WebService全貌
  6. Opencv--学习Opencv比较好的网址
  7. iOS 手记 - 计算文字高度/宽度:- (CGSize)sizeWithAttributes:(NSDictionaryNSString *,id *)attrs...
  8. Java基础(三):常用对象
  9. HTML实现倒计时插件
  10. 2018年,数万款小程序暴毙在路上
  11. js实现显示系统时间的表盘
  12. uniapp判断是不是微信浏览器
  13. My Fifty-Sixth Page - 子集Ⅱ - By Nicolas
  14. 在安装office2003时,出现安装程序包的语言不受系统支持的错误,如何解决?
  15. Disparity Map
  16. 各种芯片复位电路分析
  17. 曾国藩:凡读书,不必苦求强记
  18. 前端单元测试到底要怎么写?看这一篇就够了
  19. 【图形学数学基础】第一章
  20. 文件储存器 - IP通讯技术

热门文章

  1. Maven安装与配置(最实用!!!)eclipse中配置maven
  2. 2022-2028年中国农副产品行业市场供需规模及未来前景分析报告
  3. EDA电子设计技术与应用
  4. Deeplearning知识蒸馏
  5. Imec推出高性能芯片的低成本冷却解决方案
  6. 10分钟内基于gpu的目标检测
  7. TCP/UDP协议基本概念
  8. [JS]请填充代码,使mySort()能使传入的参数按照从小到大的顺序显示出来。
  9. Python 删除list 里面的空值
  10. Python TypeError: ‘int‘ object is not iterable