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 + MPSocAlveo (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构建

·       git clone --recurse-submodules https://github.com/Xilinx/Vitis-AI
·       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)

可以单独安装所有这些软件组件,已提供了一个脚本来立即自动安装它们。为此:

  • 运行以下命令:
  • 重新启动系统。
  • Clone tvm repo和pyxir repo
  • 构建并启动tvm运行时Vitis-AI Docker容器。
  • 安装PyXIR
  • 使用Vitis-AI在容器内构建TVM
  • 安装TVM
·       cd Vitis-AI/alveo/packages
·       sudo su
·       ./install.sh
·       git clone --recursive https://github.com/apache/tvm.git
·       git clone --recursive https://github.com/Xilinx/pyxir.git
·       ./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
·       . $VAI_ROOT/conda/etc/profile.d/conda.sh
·       conda activate vitis-ai-tensorflow
·       cd pyxir
·       python3 setup.py install --use_vai_rt_dpucadx8g --user
·       cd tvm
·       mkdir build
·       cp cmake/config.cmake build
·       cd build
·       echo set\(USE_LLVM ON\) >> config.cmake
·       echo set\(USE_VITIS_AI ON\) >> config.cmake
·       cmake ..
·       make -j$(nproc)
·       cd tvm/python
·       pip3 install -e . --user

边端(DPUCZDX8G)

对于边端部署,使用主机和边端的两个系统。该主机系统在第一离线步长负责量化和神经网络模型的编辑。之后,该模型将在端系统上部署 。

主机要求

下表列出了运行TVM-Vitis-AI docker容器的系统要求。

主机设置和Docker构建

  • Clone tvm repo
  • 构建并启动tvm运行时Vitis-AI Docker容器。
  • 安装PyXIR
  • 使用Vitis-AI在容器内构建TVM。
  • 安装TVM
·       git clone --recursive https://github.com/apache/tvm.git
·       cd tvm
·       ./tvm/docker/build.sh demo_vitis_ai bash
·       ./tvm/docker/bash.sh tvm.demo_vitis_ai
·        
·       #Setup inside container
·       . $VAI_ROOT/conda/etc/profile.d/conda.sh
·       conda activate vitis-ai-tensorflow
·       git clone --recursive https://github.com/Xilinx/pyxir.git
·       cd pyxir
·       python3 setup.py install --user
·       cd tvm
·       mkdir build
·       cp cmake/config.cmake build
·       cd build
·       echo set\(USE_LLVM ON\) >> config.cmake
·       echo set\(USE_VITIS_AI ON\) >> config.cmake
·       cmake ..
·       make -j$(nproc)
·       cd tvm/python
·       pip3 install -e . --user

边端要求

DPUCZDX8G可以部署在Zynq Ultrascale + MPSoc 平台上。可以直接使用以下开发板:

边端硬件设置

本节提供了使用Pynq平台进行设置的说明,也支持基于Petalinux的流程。

·       python3 -c 'from pynq_dpu import DpuOverlay ; overlay = DpuOverlay("dpu.bit")'
·       dexplorer -w

Edge TVM设置

当在Petalinux而不是Pynq上工作时,以下步骤可能需要更多的手动工作(例如,从源代码构建hdf5)。而且,TVM具有scipy依赖性,从源代码或规避的角度构建。在流程中不依赖scipy。

构建TVM取决于Xilinx PyXIR软件包。PyXIR充当TVM和Vitis-AI工具之间的接口。

  • 首先安装PyXIR h5py和pydot依赖项:
  • 安装PyXIR
  • 用Vitis-AI构建TVM
  • 安装TVM
  • 检查在Python Shell中安装是否成功:
·       apt-get install libhdf5-dev
·       pip3 install pydot h5py
·       git clone --recursive https://github.com/Xilinx/pyxir.git
·       cd pyxir
·       sudo python3 setup.py install --use_vai_rt_dpuczdx8g
·       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
·       cd tvm/python
·       pip3 install -e . --user
·       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 VariablePX_QUANT_SIZE,PX_BUILD_DIR

Default if unset128Use the on-the-fly quantization flow

ExplanationThe 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"](tvm.cpu()))
 
# 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"](tvm.cpu()))
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"](tvm.cpu()))
 
# 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"](tvm.cpu()))
module.set_input(name, data)
module.run()

https://tvm.apache.org/docs/deploy/vitis_ai.html

Vitis-AI集成的更多相关文章

  1. 微软 Build 2017 开发者大会:Azure 与 AI 的快速发展

    欢迎大家持续关注葡萄城控件技术团队博客,更多更好的原创文章尽在这里~~ 一年一度的微软 Build 大会准时起航,本年度大会从旧金山移师西雅图,一个近年来凭借女神汤唯而在中国家喻户晓的美国西部海滨城市 ...

  2. AI零基础入门之人工智能开启新时代—下篇

    人工智能概述 人工智能的定义 · 人工智能是通过机器来模拟人类认识能力的一种科技能力 · 人工智能最核心的能力就是根据给定的输入做出判断或预测 · 思考:通过什么途径才能让机器具备这样的能力? · 举 ...

  3. Microsoft Visual Studio Tools for AI

    https://www.visualstudio.com/zh-hans/downloads/ai-tools-vs/ 开发.调试和部署深度学习和 AI 解决方案 Visual Studio Tool ...

  4. Azure 与 AI

    微软 Build 2017 开发者大会:Azure 与 AI 的快速发展   欢迎大家持续关注葡萄城控件技术团队博客,更多更好的原创文章尽在这里~~ 一年一度的微软 Build 大会准时起航,本年度大 ...

  5. AoE 搭档 TensorFlow Lite ,让终端侧 AI 开发变得更加简单。

    AoE( AI on Edge , https://github.com/didi/AoE ) 是滴滴近期开源的终端侧 AI 集成运行时环境 ( IRE ). 随着人工智能技术快速发展,近几年涌现出了 ...

  6. Vitis AI--个人调试篇

    一.下载VITIS-AI的仓库 单独git clone很慢,因此先将其导入到gitee平台,再执行clone 1. Import VITIS-AI github repo into gitee rep ...

  7. Xilinx FPGA全局介绍

    Xilinx FPGA全局介绍 现场可编程门阵列 (FPGA) 具有诸多特性,无论是单独使用,抑或采用多样化架构,皆可作为宝贵的计算资产:许多设计人员并不熟悉 FPGA,亦不清楚如何将这类器件整合到设 ...

  8. Gartner:2018人工智能技术成熟度曲线

    https://www.secrss.com/articles/4392 人工智能被广为关注,但是一些想法恐难达到预期.本成熟度曲线将追踪AI基本趋势和未来创新,以确定人工智能技术发展的范围.状态.价 ...

  9. AOE工程实践-NCNN组件

    作者:杨科 NCNN是腾讯开源的一个为手机端极致优化的高性能神经网络前向计算框架.在AOE开源工程里,我们提供了NCNN组件,下面我们以SqueezeNet物体识别这个Sample为例,来讲一讲NCN ...

随机推荐

  1. Python2中的urllib、urllib2和 Python3中的urllib、requests

    目录 Python2.x中 urllib和urllib2 常用方法和类 Python3.x中 urllib requests Python2.x中 urllib和urllib2 urllib 和 ur ...

  2. hdu1530 最大团简单题目

    题意:       给你一个无向图,让你找到这个图里面的最大团是多少. 思路:       最大图案是NP问题,直接暴力搜索,如果当前的这个点可以加入当前最大团,那么就选择加入或者舍去,如果不能加入, ...

  3. Portswigger web security academy:DOM-based vulnerabilities

    DOM-based vulnerabilities 目录 DOM-based vulnerabilities 1 - DOM XSS using web messages 2 - DOM XSS us ...

  4. 【Git】5. 远程库(GitHub)相关操作

    之前也提到了,在整个协作的过程中,必不可少的就是远程库了.Github作为一个全球最大的同性交友网站,同样也是一个非常强大的远程库. 现在希望将本地的hello.txt文件也推到github上去,那首 ...

  5. 【JavaScript】Leetcode每日一题-矩形区域不超过K的最大值和

    [JavaScript]Leetcode每日一题-矩形区域不超过K的最大值和 [题目描述] 给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大 ...

  6. 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第n次落地时,共经过多少米?第n次反弹多高?(n<=10)

    单纯考逻辑 题目: 一球从100米高度自由落下,每次落地后反跳回原高度的一半:再落下,求它在第n次落地时,共经过多少米?第n次反弹多高?(n<=10) 输入描述: 一行,一个整数n (1< ...

  7. maven 中setting.xml

    <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http:/ ...

  8. Hive企业级性能优化

    Hive作为大数据平台举足轻重的框架,以其稳定性和简单易用性也成为当前构建企业级数据仓库时使用最多的框架之一. 但是如果我们只局限于会使用Hive,而不考虑性能问题,就难搭建出一个完美的数仓,所以Hi ...

  9. 脱壳入门----脱ASPack壳保护的DLL

    前言 结合脱dll壳的基本思路,对看雪加密解密里的一个ASPack壳保护的dll进行脱壳分析. 脱壳详细过程 寻找程序的OEP 先将目标DLL拖入OD,来到壳的入口处. 然后利用堆栈平衡原理在push ...

  10. 【Linux】 Linux网络编程

    作者:李春港 出处:https://www.cnblogs.com/lcgbk/p/14779410.html 目录 前言 (一). 回顾系统编程进程的通信方式 (二). 网络编程大纲 (三). 网络 ...