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存儲庫:
- 安裝Docker,將用戶添加到Docker組。將用戶鏈接到以下Docker網站上的Docker安裝說明:
- 使用以下命令下載最新的Vitis AI Docker。該容器在CPU上運行。
· 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的流程。
- 下載適用於目標的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比特流:
- 檢查DPU內核是否處於活動狀態:
· 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 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"](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